OmniAICreator/Qiita-1.07M huggingface dataset:
LlamaIndexで作った質問回答botを検証してみた

## はじめに
ChatGPTは流暢な文章を生成してくれるため非常に有用ですが、2021年9月までのテキストデータでしか学習されておらず、それ以降の事項については出力に反映されることはありません。
先日ChatGPTにブラウジング機能が追加され、この問題は解決されましたが、Web上でオープンになっている情報しか用いることができません。
そこで今回は、自分で用意した外部の情報を、LlamaIndexというライブラリを用いてLLM（大規模言語モデル）に組み込む方法について検証します。

## LlamaIndexとは
まずはじめに、LlamaIndexとはどのようなものなのでしょうか。こんな時はChatGPT（ブラウジング）に聞いてみましょう。
![スクリーンショット 2023-06-02 10.50.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3459163/0d836750-d28c-0749-899f-39c8b924d031.png)
簡潔にまとめると、公のデータで学習されたLLMと独自に用意したデータとを円滑に繋ぐためのツールであることがわかります。

## 検証方法
#### データの準備
今回は、ChatGPTに出力してもらった架空のTech系ベンチャーで行われた架空の会議の議事録を用いることにします。
出力してもらったものをテキストファイルにコピー&ペーストしてデータの準備は完了です。
なお、今回用いるデータは以下のものです。
![スクリーンショット 2023-06-02 11.00.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3459163/8fa568e2-9c68-7226-ded9-7f3e36990bb8.png)
![スクリーンショット 2023-06-02 11.01.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3459163/f490f8c0-02c6-3f9f-a8b9-5b829ce16370.png)


#### APIキーの取得
今回の検証ではOpenAIのAPI（有料）を用います。[こちらのページ](URL "https://platform.openai.com/account/api-keys")にアクセスし"Create new secret key"というボタンからAPIキーを取得し、忘れずにメモしておきます。

#### ライブラリのインストール
今回はGoogle Colaboratoryを使って検証していきたいと思います。以下を実行してLlamaIndexをインストールします。
```python:Python
!pip install llama-index
```
#### APIキーの設定
先ほど取得したOpenAIのAPIキーを設定します。
```python:Python
import os
os.environ["OPENAI_API_KEY"] = "具体的なAPIキー"
```
#### インデックスの作成
データを読み込み・変換し、インデックスを作成しています。
また、先ほど作成したテキストデータは、"data"というフォルダを作成しその中に置いてあります。

```python:Python
from llama_index import SimpleDirectoryReader
from llama_index import GPTVectorStoreIndex

documents = SimpleDirectoryReader(input_dir="./data").load_data()

index = GPTVectorStoreIndex.from_documents(documents)
```
#### クエリエンジンの作成と質問応答
最後に、クエリエンジンを作成し、入力した質問に応答するBotの完成です。
```python:Python
query_engine = index.as_query_engine()

while True:
  Q = input("Q: ")

  if Q == "exit":
    break

  response = query_engine.query(Q)
  answer = response.response
  print("A: " + answer[1:])
```

## 検証結果
最後のセルを実行すると、以下のように質問を入力できるようになります。
![スクリーンショット 2023-06-02 12.54.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3459163/aa8d48b5-e7de-325e-5c02-4362134d35f4.png)

いくつか質問を投げかけてみた回答を以下に貼り付けます。なお、"exit"と入力すると終了します。
```
Q: 今回の会議のメンバーは？
A: 今回の会議のメンバーは、CEO（鈴木）、CTO（佐藤）、CFO（田中）、CMO（高橋）、プロダクトマネージャー（中村）、ビジネス開発（山本）です。
Q: どんな結論になった？
A: 結論として、スマートシティへの進出を決定したことになりました。インフラ投資は大きな課題ですが、社会的影響力とブランドイメージの向上は大きな魅力であるということが確認されました。
Q: 最終的に誰がどんな役割を担うことになった？
A: CEO（鈴木）がプロジェクトを管理する役割を担い、CTO（佐藤）がAIとIoT技術の統合と最適化に全力を注ぐ役割を担い、CFO（田中）がパートナーシップや補助金を見つける役割を担い、CMO（高橋）がプロジェクトのマーケティングを担う役割を担うことになりました。
Q: エンタメ業界進出を提案したのは誰？
A: プロダクトマネージャー（中村）がエンタメ業界進出を提案したのです。
Q: フィンテックに進出する際に懸念されることは？
A: フィンテックに進出する際に懸念されることは、規制が厳しい業界であること、消費者の信頼を得るのが難しいこと、そしてリスク管理策を考える必要があることです。
Q: exit
```

「最終的に誰がどんな役割を担うことになった？」に対する回答では中村さんと山本さんがハブられていますが、その他の質問にはある程度の精度で回答してくれているように思います。

## まとめ
今回の記事では、LlamaIndexを用いて作った議事録の質問回答botの検証についてご紹介しました。カスタマイズできる余地は多くありますが、それなりのパフォーマンスを発揮してくれたように思います。
今回の記事が皆様のご参考になれば幸いです。

---
NOVEL株式会社では、業務委託パートナーを募集しています。AIやLLMに興味があるエンジニアやPMの方、大歓迎です。副業としてでも問題ありませんので、ご興味を持たれた方はぜひこちらのフォームよりご応募ください。

https://forms.gle/P7JmYGFVrit1R8kH9
ChatGPTでプロンプト自体を作成する方法

## はじめに
ChatGPTを有効活用するにあたって、プロンプトの良し悪しがパフォーマンスに大きく影響することはいうまでもありません。
そこで、本記事では、ChatGPTにプロンプト自体の作成を任せる方法について紹介してみたいと思います。もはや複雑なプロンプトを自分の頭のみで考える必要はありません。
ChatGPTの力を借りて素晴らしいプロンプトを作成する方法を見ていきましょう。

## プロンプト作成の方法
プロンプト作成の方法としては、以下の「プロンプト改善用プロンプト」をによって得られた出力を再び「プロンプト改善用プロンプト」の入力欄に投入し出力を得て、、、ということを満足のいくプロンプトが得られるまで繰り返すというものです。
```
###指示###
あなたはChatGPTを操るプロのプロンプトエンジニアです。制約条件に従って、入力として与えたChatGPTに投げかけるための{入力してください}用のプロンプトを改善したものを提供してください。

###制約条件###
- ChatGPTが理解しやすいプロンプトとすること
- {入力してください}

###入力###
{入力してください}
```
このプロンプトの{入力してください}となっている部分を書き換えて使います。
なお、「プロンプト改善用プロンプト」において、指示や制約条件、入力を表す部分が「###」で区切られているのは、以下の記事で紹介した「Prompt Engineering Guide」を参考にしたものです。

https://qiita.com/SAKUBUN/items/e1d09ba3cc7494837b3c


## 具体例
ここでは、メール作成に使えるプロンプトをChatGPTに考えさせた例を紹介します。
ちなみに、以下の記事で紹介したメール作成用のプロンプトも、今回紹介する方法を用いて改善を行いました。

https://qiita.com/SAKUBUN/items/2dc9934d5173d93e6b80


#### 1サイクルめ
最初は雑に考えた1文を入力に与えてやりました。

プロンプト
![スクリーンショット 2023-05-30 16.07.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3459163/37a7fb75-6c16-a95f-fe15-b5573b7d2a44.png)

出力
![スクリーンショット 2023-05-30 16.08.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3459163/6271ae53-9e4a-0017-8f89-5645c01d140c.png)


#### 2サイクルめ
より詳細に条件を指定できるよう、変数を増やしてもらいました。
なお、1サイクル目で得られたプロンプトを、指示と入力情報をしっかりと区切るよう手直ししました。

プロンプト
![スクリーンショット 2023-05-30 16.08.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3459163/5018dfc3-d67a-8a4d-f6cb-27ab5d9c6c04.png)

出力
![スクリーンショット 2023-05-30 16.09.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3459163/5e35e3dd-81a6-0930-b89b-2285abb46017.png)


#### 3サイクルめ
さらに変数を増やしてもらいました。

プロンプト
![スクリーンショット 2023-05-30 16.09.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3459163/f3a04733-2a94-81e7-f435-63aa87d904ec.png)

出力
![スクリーンショット 2023-05-30 16.10.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3459163/2a68c839-4c54-46b7-28d6-315cca071b89.png)


#### 4サイクルめ
変数が多くなり、埋まらないものが出てくる可能性を考え、「入力情報のある項目が不明な場合の対処を明確にすること」という制約条件を追加しました。

プロンプト
![スクリーンショット 2023-05-30 16.10.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3459163/5ff1b543-e2c9-fa04-a672-7ddf34486522.png)

出力
![スクリーンショット 2023-05-30 16.10.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3459163/10033555-91b8-82b8-3a88-e2c3258495e1.png)


これにより、変数を全て埋めるのが面倒な場合にもある程度対応できるようになりました。

#### 5サイクルめ
変数が多くなりごちゃごちゃしてきたので、整理してもらうことを期待して「より良いプロンプトとするために、必要であればプロンプトの構成を大きく変更すること」という制約条件をつけました。

プロンプト
![スクリーンショット 2023-05-30 16.10.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3459163/e2328d36-d6fb-4e81-e1f3-b04840fbad59.png)

出力
![スクリーンショット 2023-05-30 16.11.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3459163/ffed455b-04bd-38e3-3024-46644f459d8c.png)


期待通り、変数を項目別にまとめてくれました。



このようにして、メール作成用のプロンプトを作成することができました。

## まとめ
いかがでしたか。今回は複雑なプロンプトをChatGPTを使って作成する方法をご紹介してきました。今回の記事を参考にして、皆様のプロンプトの作成・改善に活用していただけたらと思います。
最後までお読みいただきありがとうございました。


---
NOVEL株式会社では、業務委託パートナーを募集しています。AIやLLMに興味があるエンジニアやPMの方、大歓迎です。副業としてでも問題ありませんので、ご興味を持たれた方はぜひこちらのフォームよりご応募ください。

https://forms.gle/P7JmYGFVrit1R8kH9
テーブル定義変更後、データベースに情報が登録されない[CakePHP]

CakePHPで開発中、途中でテーブル定義を変更(新規カラムを追加)したところ、
フォーム画面から入力した情報が途中追加した新規カラムに入らないという事象ではまりました。。

どうやら、CakePHP2はキャッシュがキープされる時間が非常に長く、
DB更新後はキャッシュの削除する必要があるようです。

app/tmp/cache/modelsに格納されているキャッシュを削除することで解決しました。

参考にさせていただきました：
https://yikes.co.jp/archives/70
https://brtriver.hatenadiary.org/entries/2007/01/15
Nginx: 認証サーバーを使う (Alpine)

こちらで行っていることを、lxc の Alpine コンテナで行いました。
[Nginx: 認証サーバーを使う](Nginx: 認証サーバーを使う)
Nginx と Flask （認証サーバー）が同じホストにあることになります。

nginx の設定ファイル以外は、同じです。

## 必要なソフトのインストール

```bash
sudo apk add nginx
sudo apk add python3
sudo apk add py3-pip
```

flask のインストール

```bash
pip install flask
```

PATH の設定

```bash
export PATH=$PATH:$HOME/.local/bin
```

## nginx の設定

```text:/etc/nginx/http.d/default.conf
server {
        listen 80 default_server;
        listen [::]:80 default_server;
                                      
        root /var/www/localhost/webroot;
                                        
        # Everything is a 404
                             
location /private/ {
        auth_request /auth/is_login;
    }                               
     
    location /auth {
        proxy_pass http://localhost:8888;
        proxy_redirect off;              
        proxy_set_header Host $http_host;
    }                                    
     
        # You may need this to prevent return 404 recursion.
        location = /404.html {           
                internal;                
        }
} 
```

ページの配置

```text
$ tree /var/www/localhost/webroot/
/var/www/localhost/webroot/
├── index.html
└── private
    ├── aaa
    │   └── index.html
    ├── bbb
    │   └── index.html
    ├── cat.jpg
    └── index.html
```

nginx の起動

```bash
sudo service nginx start
```

## Flask の設定

フォルダー構造

```text
$ tree src
src
└── app.py
```

起動コマンド

```bash
FLASK_APP=src/app.py flask run -h 0.0.0.0 -p 8888
```

起動した時の状況

```text
$ FLASK_APP=src/app.py flask run -h 0.0.0.0 -p 8888
 * Serving Flask app 'src/app.py'
 * Debug mode: off
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
 * Running on all addresses (0.0.0.0)
 * Running on http://127.0.0.1:8888
 * Running on http://10.39.166.140:8888
Press CTRL+C to quit
```

## 参考情報

[LXD で Alpine を使う](https://qiita.com/ekzemplaro/items/ee25b21d24127671108a)
AWS lambda関数をVPC内に設置する

# 概要

- lambda関数を既存のVPC内部に設置する方法をまとめる

# 前提

- lambda関数を設置するVPCやサブネットなどは作成済み　& 設定済みと仮定する。

# 方法

## ロールの追加

1. 対象のlambdaのページ移動する。
1. 「設定」タブの「アクセス権限」のロール名をクリックする。

    ![Cursor_と_secret-manager-get-test_-_Lambda.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/000b8e9d-045f-53ab-fb30-625ab8748149.png)

1. 「許可を追加」→「ポリシーをアタッチ」で「AWSLambdaVPCAccessExecutionRole」を検索し、アタッチする。

    ![Cursor_と_IAM_Management_Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/51d87c2d-e00a-22ea-857b-a0030eaa1c9c.png)

## lambdaの設定変更

1. 対象のlambdaのページ移動する。
1. 「設定」タブの「VPC」の「編集」をクリックする。

    ![Cursor_と_secret-manager-get-test_-_Lambda.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/3b96bdab-f416-fda4-9776-2a0d8a377404.png)

1. VPC、サブネット、セキュリティグループをそれぞれ選択し「保存」をクリックする。

    ![Cursor_と_VPC_の編集__secret-manager-get-test__-_Lambda.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/e5d55640-2925-fcc6-3967-560dd8b084f1.png)

1. 設定完了

    ![Cursor_と_secret-manager-get-test_-_Lambda.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/e510a049-d409-260e-a438-08635ab45372.png)
dockerコンテナのメモリ、CPU使用状況

 （メモリ不足には、メインメモリが不足して[swap](#swapメモリを増やす方法)も不足している場合もある）

yolo v8のコンテナを動かしていたらshmメモリが足りないと言われたので、回り道しつつ解決した。

以下のコマンドでメモリとCPUの使用状況をリアルタイムで表示
これは、コンテナ外の、通常の端末で実行。
```
docker container stats
```


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1520250/1947b010-962b-8804-cf01-443923a19056.png)

以降は、Dockerコンテナ内で実行する。
ストレスをかけた場合に、数値が上昇することを確認

## stressコマンドのインストールと利用
https://blog.amedama.jp/entry/stress-commandを参考

```
sudo apt install stress
```

## メモリを試す
メモリを６４G使ってみる。
stress -m 1 --vm-bytes 64G --vm-hang 0 -v

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1520250/b0bedd3e-72c2-8c05-398a-bbff8419a159.png)

１２０Gでも大丈夫だった。
stress -m 1 --vm-bytes 120G --vm-hang 0 -v

## CPUを試す

あらかじめ、CPUのコア数を調べる
```
cat /proc/cpuinfo | grep processor | wc -l
```

stress -c 4
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1520250/9f21cc6b-02c4-66a6-4921-05f2b32f522f.png)

stress -c 32
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1520250/727e7dcf-0dc0-82f5-df8b-fa6294fb0f80.png)


以上から、今回作成したコンテナは母艦のメモリとCPUをいっぱいまで使えそうということが分かった。


## shmメモリ不足の対応
yolo v8のコンテナを動かしていたら以下のようなエラーが出る。上記のメモリは十分なのに。なぜ？どうやら、メモリと言っているものと、shmと言っているメモリは別物なのか。
shmメモリのサイズはデフォルトで６４Mとなっているらしく、このコンテナでも
df -h で確認できた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1520250/226ce1e2-3e79-4d69-0fc7-acddfcfa5dc4.png)


Docker公式サイトでshmメモリサイズをdocker-compose.ymlファイルでの設定方法を見ると以下のようであるが、機能しない。
https://docs.docker.jp/compose/compose-file/compose-file-v3.html#shm-size
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1520250/bca647ab-086f-ccd1-73d0-4ef1b14ffa8f.png)

公式サイトのインデントが間違っているようで、以下のようにbuildと同じレベルに合わせたら、うまく行った。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1520250/6b1cb115-148a-f9e3-c6f8-df386332cd46.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1520250/fe640d07-4d90-5f6d-f7fd-cbb9740e1bea.png)

これまで、tensorflowの学習などは特に変更せずに使えていたので不思議。

なお、コマンドラインからの起動オプションはネットに記事多数。


## swapメモリを増やす方法
DL学習時にkillメッセージが出て止まってしまうことがある。

#### 先ずは、Swapファイルの作成と設定
```
gnome-system-monitor #リソースの使用状況をGUIで確認

sudo swapon --show #スワップファイル状況表示
sudo fallocate -l 64G /swapfile3 #スワップファイルの作成

sudo chmod 600 /swapfile3 #アクセス権の変更
sudo mkswap /swapfile3 #作成したファイルをスワップとして設定
sudo swapon /swapfile3 #設定後に有効化が必用

sudo swapon --show #再度確認し、スワップとして認識されること

```

#### 次に永続化（再起動しても設定が残るように）
エディタを管理者権限で起動（/etc/fstabの編集）。例えば
sudo gedit /etc/fstab
最終行に以下を加える
/swapfile3 none swap sw 0 0

以上。

#### swapを消したり、消してサイズを変更して再作成するとき


sudo swapoff /swapfile3
sudo rm /swapfile3
さらに、/etc/fstabの編集を元に戻す
CF7を利用した問い合わせフォーム送信時にコンテンツを消す方法

# はじめに
先日WordPressでサイトを作成する業務があり、そのときに、Contact Form 7で作成した問い合わせフォームの送信後に、問い合わせフォームを消す方法を調べたのでその2つを紹介します。

## Before
問い合わせフォームが残ったまま、下に小さく送信メッセージが表示される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2472147/26b49768-72c9-a846-7edb-e5c6f7a9e767.png)


## After
問い合わせフォームが消え、送信メッセージが目立つ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2472147/0ee0f6b0-dde4-72c7-0e81-d5a33cd283d6.png)


# Contact Form 7とは
https://ja.wordpress.org/plugins/contact-form-7/

Contact Form 7は、お問い合わせフォームなどのフォームの作成や管理を簡単に行うことができる、WordPressの拡張プラグインです。

非常に多く利用されており、Contact Form 7のための拡張プラグイン(Flamingoなど)も充実しています。

# 1. form.sent p{display:none}を追加CSSに記入する
お問い合わせフォームが送信されると、classにsentが追加されることを利用して送信ボタンまで含めた問い合わせフォーム全体を非表示にできます。
送信ボタンや入力欄もp要素を親要素に持っているため、form.sent pを指定することで全て消すことができます。

自分でフォーム内にp要素以外を追加していてそれも消したい場合は、テーマの追加CSSに並べて記入します。
```css
/*<div class="hoge">も消したい場合*/
form.sent p,
form.sent div.hoge {
    display: none;
}
```

<a id="#Chapter2"></a>
# 2. フォーム内にJavaScriptを記入する
CF7のお問い合わせフォームではJavaScriptの記述が可能なため、こちらの方法でもコンテンツを消すことができます。

記述が少し多くなりますが、こちらの方法ですと消す範囲を細かく指定することも可能です。
```html
<!-- 送信後にfugafugaだけ残したい場合 -->
<div class="disappear">
    hogehoge
</div>
fugafuga
<div class="disappear">
    hogihogi
</div>
<!-- 送信ボタンも囲う -->
<div class="disappear">
    [submit "送信"]
</div>
<script>
    document.addEventListener('wpcf7mailsent', () => {
        document.querySelectorAll(".disappear").forEach((e) => { e.style.display = "none" })
    }, false);
</script>
```
今回はメール送信時の`wpcf7mailent`を指定しましたが、その他のDOMイベントについてはこちらに載っています。(https://contactform7.com/ja/dom-events/)
ChatGPTにメールを書かせる汎用プロンプト

## はじめに
ChatGPTを使えば非常に自然で丁寧な文体の日本語を出力することができます。そのため、社会人の方を中心にChatGPTを使ってビジネスメールを書かせてみようと試みる方も多くいらっしゃることでしょう。
しかし、中には思うようなメール文章を得られずに諦めてしまった方もいらっしゃるのではないでしょうか。
今回はそんな方々のヒントとなるよう、ChatGPTを使ってメールを作成するためのプロンプトを作成しました。様々な目的に対応可能な汎用プロンプトとなっておりますので、ご参考になれば幸いです。

## 汎用プロンプト
早速本題に入ります。今回作成したプロンプトは以下のものになります。
```
###指示###
私の名前は {sender_name}、役職は {sender_title}、組織名は {sender_organization} で、受取人の名前は {recipient_name}、その役職は {recipient_title}、組織名は {recipient_organization} です。メールの目的は {email_purpose} で、追加の詳細または要求は {additional_details} にリストされています。これらの情報を元に、プロフェッショナルなビジネスメールを作成してください。

###入力###
sender_name = “入力してください”
sender_title = “入力してください”
sender_organization = “入力してください”
recipient_name = “入力してください”
recipient_title = “入力してください”
recipient_organization = “入力してください”
email_purpose = “入力してください”
additional_details:
- 入力してください
- 入力してください
- 入力してください
```
「###入力###」以降の「入力してください」となっている部分を具体的な名前や所属、要件等に変えてご使用ください。不明な場合は空欄のままで使用可能です。
また、「additional_details」という、追加情報を書き込む部分は項目数を適宜変更可能です。

## 具体的な作成事例
ここからは、先ほどご紹介したプロンプトを実際に使って文章を作成した結果をお見せいたします。

#### 事例1. 日程調整
プロンプト
![スクリーンショット 2023-05-29 14.39.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3459163/8f29ba0e-a9a1-1cde-7097-7c08aedc92da.png)

出力
![スクリーンショット 2023-05-29 14.39.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3459163/5161c9f7-610c-e178-5d10-190626953d3c.png)


#### 事例2. 催促
プロンプト
![スクリーンショット 2023-05-29 15.10.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3459163/cb91fc95-6337-eb61-4cc3-6681144a5c73.png)

出力
![スクリーンショット 2023-05-29 15.09.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3459163/97543488-572c-0f10-27fe-7e71c86a307f.png)




ここまで、今回作成した汎用プロンプトの活用事例を2つ見てまいりました。追加で手直しは必要ですが、ある程度の労力節約になるのではないでしょうか。



## おわりに
最後までご覧いただきありがとうございました。今回の記事が、メール作成プロンプトを考える際のヒントとなることを願っています。


---
NOVEL株式会社では、業務委託パートナーを募集しています。AIやLLMに興味があるエンジニアやPMの方、大歓迎です。副業としてでも問題ありませんので、ご興味を持たれた方はぜひこちらのフォームよりご応募ください。

https://forms.gle/P7JmYGFVrit1R8kH9
`pandas.DataFrame`の`columns`引数にtupleのlistを渡しても、MultiIndexな列にはらない

# 環境
* Python 3.11.2
* pandas 2.0.2

# 起きたこと

`pandas.DataFrame`にkeyがtupleであるdictを渡すと、MultiIndexな列を持つDataFrameを生成できます。

```
In [94]: data = {("japan","male"):[1,2,3], ("japan","female"):[11,12,13], ("u.s.","male"):[2,3,4]}

In [94]: data
Out[95]: 
{('japan', 'male'): [1, 2, 3],
 ('japan', 'female'): [11, 12, 13],
 ('u.s.', 'male'): [2, 3, 4]}

In [96]: df1 = pandas.DataFrame(data)

In [97]: df1
Out[97]: 
  japan        u.s.
   male female male
0     1     11    2
1     2     12    3
2     3     13    4

In [98]: df1.columns
Out[98]: 
MultiIndex([('japan',   'male'),
            ('japan', 'female'),
            ( 'u.s.',   'male')],
           )
```


生成されたDataFrameの列を絞り込むため、`columns`引数に列名を指定します。
以下は`columns`引数の説明です。
>Column labels to use for resulting frame when data does not have them, defaulting to RangeIndex(0, 1, 2, …, n). If data contains column labels, will perform column selection instead. [^1]

[^1]: https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.html


`columns`引数にtupleのlistを渡したら、生成されたDataFrameの列は`MultiIndex`ではなく通常の`Index`になってしまいました。

```
In [102]: df2 = pandas.DataFrame(data, columns=[("japan","female"),  ("u.s.","male")])

In [103]: df2
Out[103]: 
   (japan, female)  (u.s., male)
0               11             2
1               12             3
2               13             4

In [104]: df2.columns
Out[104]: Index([('japan', 'female'), ('u.s.', 'male')], dtype='object')
```

# 解決
`MultiIndex`の列を生成するには、`columns`引数に`MultiIndex`を渡す必要がありました。


```
In [107]: target_columns = pandas.MultiIndex.from_tuples([("japan","female"),  ("u.s.","male")])

In [108]: target_columns
Out[108]: 
MultiIndex([('japan', 'female'),
            ( 'u.s.',   'male')],
           )

In [109]: df3 = pandas.DataFrame(data, columns=target_columns)

In [110]: df3
Out[110]: 
   japan u.s.
  female male
0     11    2
1     12    3
2     13    4

In [111]: df3.columns
Out[111]: 
MultiIndex([('japan', 'female'),
            ( 'u.s.',   'male')],
           )
```
Ruby silver 模擬問題解説7

Ruby silverの模擬問題を抜粋して解説をしていきます。

下記コードの実行結果を4択から選ぶ問題になっています。
```ruby
a = [2, 3, 6, 8, 12].map{ |d| d / 3 }
print a
```
1.[0, 1, 2, 2, 4]
2.[2, 3, 6, 8, 12]
3.[3, 6, 12]
4.エラーになる

まず、'.map'メソッドは元の配列の要素を変換した新しい配列を作成するメソッドになっています。
['.map'公式リファレンス](https://docs.ruby-lang.org/ja/latest/class/Array.html#I_COLLECT)

ブロック内にある'|d|'は'.map'メソッドが各要素を順番に参照するための変数になっています。

配列内にある各要素を3で割った結果を新しい配列に格納をするようになっています。
```
2/3 = 0.66...
3/3 = 1.0
6/3 = 2.0
8/3 = 2.66...
12/3 = 4
→[0,1,2,2,4]　という配列が作られる。
```

最後に変数'a'を'print.a'で配列をコンソールに表示するように指示をしています。
```ruby
print a
→[0,1,2,2,4]
```

最終的に、１番が解答になります。
2023年6月 AIOps 定点観測

# 概要
AIOps の動向や学習のため、Google で AIOps を検索した結果を記録している記事です。

# 2023年6月2日の検索結果 (リスティング広告)

![20230602_AIOps_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2345504/a220b8d5-05c2-1729-eb67-065690d424f0.png)

* IBM
* PureStorage
* ServiceNow

今月も IBM がトップです。 PureStorage と ServiceNow が続いています。ページの上部にはスポンサーの表示が3件ありますが、ページの下部にスクロールするとさらにスポンサーの表示があります。

![20230602_AIOps_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2345504/c07582e1-2aa3-b6ca-7f97-9b28176aa1dc.png)

* Dynatrace

そこでは Dynatrace が続いています。

先月の結果はこちら --> [2023年5月 AIOps 定点観測](https://qiita.com/mkodera/items/e954df11ffabc4accfd2)

# 2023年6月2日の検索結果 (広告以外)

![20230602_AIOps_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2345504/0ca60693-980a-1950-7c69-1d1ef1fd2fa7.png)

* HPE
* Splunk
* IBM
* 日立製作所
* ServiceNow


広告以外では HPE が強調スニペットでトップに表示されています。 その後に Splunk、IBM が続いています。

先月の結果はこちら --> [2023年5月 AIOps 定点観測](https://qiita.com/mkodera/items/e954df11ffabc4accfd2)
セレファチーム（SelefraTeam）- ポリシーとしてのコードによるセキュリティとリソース管理を革新する

![banner.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3286109/0160088b-2c2c-2a27-8845-372c6f426291.png)

SelefraTeam（セレフラチーム）は、革新と卓越に対する共有の情熱によって駆動される、ダイナミックな専門家チームです。私たちは、クラウドサービスとSoftware-as-a-Service（SaaS）の複雑な環境におけるセキュリティとリソース管理の絶えず変化する課題に対応する、最先端のソリューションの開発を得意としています。

私たちの提供するものの核には、PolicyAsCodeがあります。これはセキュリティと柔軟性をシームレスに統合する画期的なツールです。効率的で堅牢なGoプログラミング言語によって動力を得ている私たちのGitHub上のオープンソースプロジェクトは、活気に満ちた包括的なコミュニティを育成し、積極的な参加と協力を促しています。

透明性、信頼性、協力性が私たちの哲学の基盤です。私たちは30以上のプロバイダーをホストし、ユーザーに多様な選択肢を提供することを誇りに思っています。また、ユーザーが自分自身のプロバイダーを開発・貢献できる環境を育成し、すべての利益のためにオープンソースエコシステムを豊かにしています。

私たちのPolicyAsCodeツールの特長は、ルールを簡潔かつ明確なYAML形式で表現し、異なるクラウドサービスにシームレスに適用できる能力です。セキュリティチェックの実行、コスト設定の最適化、アーキテクチャのレビューなど、私たちのツールはユーザーの絶えず変化する要求に対応する堅牢で柔軟な機能を提供します。

しかし、私たちのビジョンは単なるソリューションの提供を超えています。私たちは各ユーザーを力に満ちた存在にし、彼らが独自のクラウドサービスの要件に合わせてポリシーを独自に作成できるようにすることを目指しています。検出とレビューのための包括的なオープンソースポリシーライブラリを利用するだけでなく、ユーザーはポリシーをカスタマイズして特定のニーズに合わせる自由を持ち、個別のセキュリティ管理とリソース最適化を確保できます。

セレフラチームとして、私たちは協力を促進し、ユーザーの声を積極的に聞き入れることに取り組んでいます。ユーザーのニーズを理解し、ツールのパフォーマンスと機能を継続的に改善することで、優れた製品とサービスを提供することを目指しています。ユーザーや広範なオープンソースコミュニティとの強力なパートナーシップを通じて、私たちは共同の成功を信じ、クラウドサービスとSaaSセキュリティの領域を再定義しようとしています。

セレフラチームを選ぶことは、業界をリードする専門知識、揺るぎないプロフェッショナリズム、セキュアで効率的かつ柔軟なソリューションの提供に対するコミットメントを選ぶことです。大規模な組織であろうと個々の開発者であろうと、デジタル時代のクラウドサービスとSaaSセキュリティの領域を航海するための信頼できるパートナーとして、私たちは皆様のそばにいます。PolicyAsCodeとともにセキュリティとリソース管理の未来を創造するこのエキサイティングな旅にご参加ください。
GitHub:https://github.com/selefra/selefra
VisualScriptingのVariablesの記載先（備忘録）

# きっかけ

Application　Variablesを定義したのにGithubでダウンロードした別なPCで使えない
（Save変数も同じ）

# Application及びSaved variables
## 保存されるフォルダ

Assets/Unity VisualScripting Generated/VisualScripting.Core/Variables/Resources
### ファイル名
ApplicationValiables.asset
SaveVariables.asset


# Object Variables
→Prefabファイルに記載
埋め込みの場合は親Prefabに記載されるので、あとから追加したら全部手動で追加（涙

# Graph VariablesとFlowVarialbes
GraphのAssetファイルに記載

## GitHubとか・・・

ApplecationとSavedはGeneratedな場所にあるので除外されてるのだけど、ここだけいれてよいのかな・・・
バージョン確認コマンドまとめ

## 概要
バージョン確認のコマンドをメモ程度に列挙します。

## プログラミング言語/フレームワーク
### Node.js
```zsh:Node.js
$　node -v
$　node --version
```
```zsh:Express
$　npm list -g express
```
※Expressの上記コマンドは正常に確認出来ていてもエラーとして認識されることがあります。

### Go
```zsh:Go
$　go　version
```

### Python
```zsh:Python
$　python3 --version
```
```zsh:Flask
$　flask --version
```

### Ruby
```zsh:Ruby
$　ruby -v
$　ruby --version
```
```zsh:Ruby on Rails
$　rails -v
$　rails --version
```

## データベース
### MySQL
```zsh:MySQL
$　mysql --version
```

### PostgreSQL
```zsh:PostgreSQL
$　psql --version
```

### SQLite3
```zsh:SQLite3
$　sqlite3 --version
```

## ユーティリティ/コマンドラインツール
### Git
```zsh:Git
$　git -v
$　git --version
```
## コンテナ型仮想環境用のプラットフォーム
### Docker
```zsh:Docker
$　docker -v
$　docker --version
```

## パッケージ管理システム
### Homebrew
```zsh:Homebrew
$　brew -v
$　brew --version
```

### npm
```zsh:npm
$　npm -v
$　npm --version
```

### pip
```zsh:pip
$　pip --version
```

### RubyGems
```zsh:RubyGems
$　gem -v
$　gem --version
```
Javaで動的に変わるじゃんけんプログラミングの作成

はじめに
---
![じゃんけん初期画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3248215/fb91fa3a-9a5d-ca85-6abf-c84d01e53e7c.png)

動的に変わるじゃんけんプログラミングを作ってみようと思い、サーブレット、JSPの練習にもなると思い、作成しました。

gitはこちら
https://github.com/TowaMurata/rock_paper_scissors


使用した技術
---
HTML
CSS
Java
サーブレット
JSP

作成したクラス
---
<h6>index.jsp</h6>
初期画面を表示するjsp

![じゃんけん初期画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3248215/1e06c596-9684-0e0b-1caa-dff2807810e7.png)

<h6>rock_paper_scissorsServlet.java</h6>
選択した値を取得して、リクエストスコープに入れる。
ランダムで作った値(コンピュータの手)をリクエストスコープに入れる。
上の二つを勝ち負け判定処理のクラスに渡して、勝ち負け判定をリクエストスコープに入れ、結果を表示する画面にフォワードする。

<h6>rock_paper_scissorsLogic.java</h6>
受けっとった、選択した値とランダムの値をもとに勝ち負け判定して、結果をint型で返す。

<h6>rock_paper_scissors.jsp</h6>
じゃんけん結果の画像を表示するクラス。

![じゃんけん_勝ち.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3248215/039fc18f-dfbc-e2e1-d2dc-872a34fcbfe5.png)

勝ち負け判定処理処理
---

```　　　
　　　　 //selectBottom,random == 0 グー
        //selectBottom,random == 1 チョキ
        //selectBottom,random == 2 パー
		//r = 0:引き分け 1:勝ち 2:負け 3:エラー
		int r = 0;
		if(selectBottom == random) {
			return r;
			
		}else if(selectBottom == 0 && random == 1 ||
				 selectBottom == 1 && random == 2 ||
				 selectBottom == 2 && random == 0
				)
		{
			r = 1;
			return r;		
			
		}else if(selectBottom == 0 && random == 2 ||
				 selectBottom == 1 && random == 0 ||
				 selectBottom == 2 && random == 1 
				)
		{
			r = 2;
		return r;
		}
		r = 3;
		return r;
```

選択した値によって表示画像を返す処理(jsp内でやっている。)

```
 <%
    String myImage = null;
    String mySelect = null;
    if(selectBottom == 0){
    	myImage = "image/RPS_Rock.png";
    	mySelect = "グー";
    }else if(selectBottom == 1){
    	myImage = "image/RPS_Scissors.png";
    	mySelect = "チョキ";
    }else if(selectBottom == 2){
    	myImage = "image/RPS_Paper.png";
    	mySelect ="パー";
    }
    
    String conImage = null;
    String conSelct = "null";
    if(random == 0){
    	conImage = "image/RPS_Rock.png";
    	conSelct = "グー";
    }else if(random == 1){
    	conImage = "image/RPS_Scissors.png";
    	conSelct = "チョキ";
    }else if(random == 2){
    	conImage = "image/RPS_Paper.png";
    	conSelct = "パー";
    }
    
    String messege = null;
    if(result == 0){
    	messege = "残念！あいこです。";
    }else if(result == 1){
    	messege = "おめでとうございます！あなたの勝ちです。";
    }else if(result == 2){
    	messege = "残念！あなたの負けです。";
    }
    %>
```

やってみた感想
---
選択した手の画像を出す処理を、jsp内で条件分岐してやっていて、これでいいのかどうかアドバイスをください。
MUI(v5)でHeaderを上部固定するとコンテンツの上部が隠れる問題の解決法

はじめまして、最近Reactを触り始めた初心者です。

初心者だからこそ同じ初心者が躓くところが分かる！ということで、勉強中に躓いた箇所とその解決法を投稿していこうと思います。

今回は、MUI(v5)でHeaderを上部固定するとコンテンツの上部が隠れる問題に突き当たったので、その解決策を書きます。

# 環境
* "react": "^18.2.0",
* "@mui/material": "^5.13.2",

# 忙しい方向けの結論
```JavaScript
<AppBar position="fixed">
```
ではなく
```JavaScript
<AppBar position="sticky">
```
を使いましょう。

# ヘッダーを上部固定する方法
他のWebサイトを見ると、画面スクロールしてもヘッダーが上部に固定されてついてくるという仕様になっているサイトが多く、真似しようと調べ始めました。

この方法については特に難しくなく、
```JavaScript
<AppBar position="static">
```
ではなく
```JavaScript
<AppBar position="fixed">
```
とpropを変更することで実現できました。

position="static"だと画面スクロール時にヘッダーが隠れてしまいますが、position="fixed"にすると、常にヘッダーが上部固定されるようになりました。

# fixedの弊害
ヘッダー下部のコンテンツがヘッダーの下に隠れてしまいます。
position="fixed"にすると、ヘッダーが一つ上のレイヤーになってしまうようで、本文のコンテンツがそのレイヤー上でy=0だと認識されることで重なるようです。

↓こちらのサイト様に分かりやすい図解があるので合わせて参照してみてください。

https://tanomasaki.com/headernav-fixed/

こちらのサイトでの解決法は、本文コンテンツの上部にHeaderの高さ分のPaddingを履かせるというものでした。

# Material-UI (v4)での解決法
この問題を解決するためにググると、現状はMaterial-UI(v4)での解決法ばかり出てきます。

https://zenn.dev/katagiriso/articles/4ced3f80611c49


https://tech.teshiblog.com/react/react-material-ui-header/

v4でのスタイリング記法であるmakeStylesなどを用いて書く方法はだいたいこんな感じです。

```JavaScript
const useStyles = (theme: Theme) => {
    return makeStyles({
        root: {
            flexGrow: 1
        },
        flex: {
            flex:1
        },
        menuButton: {
            marginLeft: -12,
            marginRight:20
        },
        toolbarMargin:theme.mixins.toolbar
    })
}
```
詳しくは参照サイト様を御覧ください。

# MUI (v5)での解決方法
私が今触っているMUI(Version 5)では、スタイリング記法がsx propに代わったため、どのように書けばよいか分からず右往左往していたのですが、やはり頼りになるのは公式…！

https://mui.com/material-ui/react-app-bar/

こちらの公式ドキュメントに以下のような記述がありました。

<b>Fixed placement</b>
When you render the app bar position fixed, the dimension of the element doesn't impact the rest of the page. This can cause some part of your content to be invisible, behind the app bar. Here are 3 possible solutions:

アプリバーの位置を固定してレンダリングすると、要素の寸法はページの他の部分に影響を与えません。このため、コンテンツの一部がアプリバーの後ろに隠れて見えなくなることがあります。(DeepLで翻訳)

この解決法として3つ紹介されていますが、今回使用したのは1番目の解決策であり、これがいちばん簡単だと思います。
```JavaScript
<AppBar position="sticky">
```
このように指定するとヘッダーが上部に固定されて、かつコンテンツを隠さないようにしてくれます。
この方法の欠点としてIE11に対応していない、という点が書かれていますが、御存知の通りIEのサポートは2022年6月15日に終わっているので、大手を振ってstickyを使えるでしょう。

# おわりに
公式ドキュメントを読もう！！！！！
在宅勤務サバイバル戦略

# [『SOFT SKILLS』](https://www.amazon.co.jp/SOFT-SKILLS-%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E9%96%8B%E7%99%BA%E8%80%85%E3%81%AE%E4%BA%BA%E7%94%9F%E3%83%9E%E3%83%8B%E3%83%A5%E3%82%A2%E3%83%AB-%E7%AC%AC2%E7%89%88-%E3%82%B8%E3%83%A7%E3%83%B3%E3%83%BB%E3%82%BD%E3%83%B3%E3%83%A1%E3%82%BA-ebook/dp/B09S3J33NR/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=2JPDWR15SH20Z&keywords=softskills&qid=1685677996&sprefix=softskills%2Caps%2C463&sr=8-1)読書メモ
＊読むのにかかる時間：1分

# はじめに
第15章　遠隔勤務サバイバル戦略
「「パジャマでお仕事」の現実は、想像していたほど魅力的ではない。」

[課題1：時間管理](#課題1時間管理)
[課題2：内発的モチベーション](#課題2内発的モチベーション)
[課題3：孤独感](#課題3孤独感)

## 課題1：時間管理
- 解決策：できるだけ習慣的で綿密なスケジュールを立てる
　定時以降にだらだら仕事をしない

## 課題2：内発的モチベーション
- 解決策1：「「在宅から外れてしまう」ということだけだ。規律や自己管理で苦労しているなら、在宅勤務をすることはおそらく考え直した方がいい。」
###### 　と言ってしまっては仕方ないので
- 解決策2：スケジュールと習慣の確立

- 解決策3：作業環境からできる限り気晴らしや誘惑の種を取り除く
　　　　　 スマホをしまえ！

- 解決策4：ポモドーロ
    - [ポモドーロとは](https://asana.com/ja/resources/pomodoro-technique)
「ポモドーロテクニックは、仕事を25分ずつのセッションに分け、そのあいだに短い休憩をはさんで行う時間管理術」
　（筆者がいつも使うのは、Focus To-Doというスマホアプリです。スマホ使っちゃうけど…）

（この節の推薦図書：[ダニエル・ピンクの『モチベーション3.0』、講談社+α文庫、2015年](https://www.amazon.co.jp/s?k=%E3%83%A2%E3%83%81%E3%83%99%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3+3.0&adgrpid=124365043348&hvadid=651367814795&hvdev=c&hvqmt=e&hvtargid=kwd-612980994429&hydadcr=14087_13515457&jp-ad-ap=0&tag=yahhyd-22&ref=pd_sl_3ckp72zu8k_e)）

## 課題3：孤独感
- 解決策1：一週間のスケジュールのなかに、家の外に出ざるを得ないような活動を必ず準備する
　　　　（結婚相手と子供は数に入れない）
（例）毎週、毎月ごとのソフトウェア開発者のグループ
　　　喫茶店

- 解決策2：slackのハドルで話そう！！

## 終わり
　在宅勤務の環境整えるのもまじで大事
　おしごと頑張りましょう～
三点リーダーの実装を爆速でやってみる

## 三点リーダーとは
>三点リーダーとは、「文章を省略する意味」と「文章に余韻を持たせたり沈黙を表現したりする意味」で使われる特殊記号です。

```index.html

<div class="mod" style="width: 300px">
        <p class="text">
          ああああああああああああああああああああああああああああああああああああああああああああああああああ
        </p>
      </div>
```
こちらのhtml上で横幅を300pxにしています。ここの部分を各々設定して、下記のCSSを当ててみてください。
```style.css
.text {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
```
このようにしてcssを当てれば、すぐに実装できます。
ぜひ参考にしてみてください。

## 参考サイト
https://estlinks.co.jp/column/leader/
Chrome ExtensionをVSCodeで開発するための環境構築

# 環境構築
## 1. launch.jsonの作成
```json
{
    "version": "0.2.0",
    "configurations": [
        {
            "type": "chrome",
            "request": "launch",
            "name": "Lunch My Chrome Extension",
            "url": "https://XXXXXXXX/XXXXXX",
            "runtimeArgs": ["--load-extension=${workspaceFolder}"],
            "runtimeExecutable": "stable"
        }
    ]
}
```
* typeは起動設定に使用するデバッカーの種類
    * ほかにも、nodeやphpなどがある
* requestはデバッカーのモード選択
    * ほかにも、attachがある
    * 違いは、launchがアプリをデバックモードで起動する。attachは実行中のプロセスにデバッカーを接続する
* nameは設定名
    * わかりやすい名前を付ける
* urlはブラウザが自動で表示する
* runtimeArgsは実行時の引数
    * --load-extension=${workspaceFolder} が今回Chrome Extensionをデバックする際必要な引数
    * workspaceFolderは現在VsCodeが開いているフォルダー
* runtimeExecutableはここではChromeの絶対Pathを記述する
    * stableはデフォルトを使用する
> デバック設定Document
> https://code.visualstudio.com/docs/editor/debugging
> ブラウザーのデバック設定Document
> https://code.visualstudio.com/docs/nodejs/browser-debugging

## 2. manifest.jsonの作成
```json
{
    "manifest_version": 3,
    "name": "プロジェクト名",
    "version": "1.0.0",
    "description": "説明"
    "content_scripts": [
        {
            "js": [
                "scripts/content.js"
            ],
            "css": [
                "css/styles.css"
            ],
            "matches": [
                "https://XXXXXXXX/XXXXXX/*"
            ]
        }
    ]
}
```
* VScodeで開いているフォルダーの下に配置する
* manifest_version、name、versionが必ず必要な設定項目
* action、default_locale、description、iconsが推奨させている設定項目
* content_scriptsはmatchesで指定したURLで動作するJsとCssのパスを記述する
>  manifes.jsonの項目について
>　https://developer.chrome.com/docs/extensions/mv3/manifest/

# まとめ
* 残りは、content_scriptsで指定したパスにJsとCssを配置して実行したいプログラムを記述する
追跡ずみのgitファイルを除外したい

以下でキャッシュを削除
```terminal
git rm --cached .env
```

次に変更をコミット
```
git commit -m"追跡やめます"
```

変更したブランチにプッシュ
```
git push origin some-branch
```

これで追跡を取りやめることができます。

:::note info
developブランチでそのようなファイルがもともとあって、そこからブランチを切っている場合は後々エラーの原因になるので、ブランチ先でも同じように削除すること。
:::
cscの作法 その327

# 概要
cscの作法、調べてみた。
練習問題、やってみた。

# 練習問題
サブフォームからメインフォームへデータを送れ。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/265cb072-e3e7-a28f-1383-d471e056353d.png)


# サンプルコード

```
using System;
using System.IO;
using System.Windows.Forms;
using System.Drawing;

namespace App
{
	public partial  class formSub: Form {
		TextBox bo1;
		public formMain fm;
		public formSub() {
			Text = "formSub";
			ClientSize = new Size(300, 200);
			bo1 = new TextBox();
			bo1.Location = new Point(50, 20);
			bo1.Text = "test desu";
			bo1.Size = new Size(100, 20);
			Controls.AddRange(new Control[] {
				bo1
			});
			Button btn1 = new Button();
			btn1.Location = new Point(50, 100);
			btn1.Text = "test";
			btn1.Click += btn1_Click;
			Controls.AddRange(new Control[] {
				btn1
			});
		}
		void btn1_Click(object sender, System.EventArgs e) {
			if (fm != null)
			{
				fm.ReceiveData = bo1.Text;
			}
		}
	}
	public partial class formMain: Form {
		public string ReceiveData {
			set {
				receiveData = value;
				bo1.Text = receiveData;
			}
			get {
				return receiveData;
			}
		}
		TextBox bo1;
		private string receiveData = "";
		public formMain() {
			Text = "formMain";
			ClientSize = new Size(300, 100);
			bo1 = new TextBox();
			bo1.Location = new Point(50, 20);
			bo1.Size = new Size(100, 20);
			Controls.AddRange(new Control[] {
				bo1
			});
			formSub sub = new formSub();
			sub.fm = this;
			sub.Show();
		}
		[STAThread]
		public static void Main() {
			Application.Run(new formMain());
		}
	}
}





```

以上。
bash_profile

## bash_profile

Bashシェルが起動されるときに読み込まれるスクリプトファイル

Bashシェル：UnixやLinuxシステムで使用されるコマンドラインインターフェース

:::note
bash_profileファイル：ユーザーごとにカスタマイズされた環境設定やシェルの動作を定義するために使用される

主な目的：ユーザーの環境変数、エイリアス（コマンドの別名）、関数、パスなどを設定すること
:::

## bash_profileの例

~~~Bash
# コメント行: ファイルの説明やコメントを追加することができる

# 環境変数の設定
export PATH=/usr/local/bin:$PATH
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64

# エイリアスの定義
alias ll='ls -al'
alias grep='grep --color=auto'

# シェル関数の定義
function myfunc() {
    echo "This is my function"
    # 関数の中でコマンドを実行するなど、任意の処理を記述できる
}

# その他の設定やコマンドなど

~~~


bash_profileファイルを編集することで、ユーザーのシェル環境をカスタマイズすることができる

ファイルはユーザーホームディレクトリに配置され、新しいターミナルセッションが開始されるたびに読み込まれる

☆一部の環境では、bash_profileファイルの代わりにbashrcファイルが使用される場合もある
Google ColaboratoryでseleniumとChrome Driverをインストールする

# 結論
以下のコマンドをセルに記述して実行します。
```
%%shell
# Ubuntu no longer distributes chromium-browser outside of snap
#
# Proposed solution: https://askubuntu.com/questions/1204571/how-to-install-chromium-without-snap

# Add debian buster
cat > /etc/apt/sources.list.d/debian.list <<'EOF'
deb [arch=amd64 signed-by=/usr/share/keyrings/debian-buster.gpg] http://deb.debian.org/debian buster main
deb [arch=amd64 signed-by=/usr/share/keyrings/debian-buster-updates.gpg] http://deb.debian.org/debian buster-updates main
deb [arch=amd64 signed-by=/usr/share/keyrings/debian-security-buster.gpg] http://deb.debian.org/debian-security buster/updates main
EOF

# Add keys
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys DCC9EFBF77E11517
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 648ACFD622F3D138
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 112695A0E562B32A

apt-key export 77E11517 | gpg --dearmour -o /usr/share/keyrings/debian-buster.gpg
apt-key export 22F3D138 | gpg --dearmour -o /usr/share/keyrings/debian-buster-updates.gpg
apt-key export E562B32A | gpg --dearmour -o /usr/share/keyrings/debian-security-buster.gpg

# Prefer debian repo for chromium* packages only
# Note the double-blank lines between entries
cat > /etc/apt/preferences.d/chromium.pref << 'EOF'
Package: *
Pin: release a=eoan
Pin-Priority: 500


Package: *
Pin: origin "deb.debian.org"
Pin-Priority: 300


Package: chromium*
Pin: origin "deb.debian.org"
Pin-Priority: 700
EOF

# Install chromium and chromium-driver
apt-get update
apt-get install chromium chromium-driver

# Install selenium
pip install selenium
```

# 注意
::: note warn
- Google Colabのランタイム環境などの影響により、上記のコマンドが使用できなくなる可能性も今後あるかもしれません。エラーが発生した場合などは最新の情報を確認するようにお願いします。[^1]
- Google Colab上でseleniumを使用するときはブラウザをヘッドレスモードにしないとエラーが発生します。ヘッドレスモードの設定の仕方は以下のコードが参考になります。
   ```py
   options = webdriver.ChromeOptions()
   options.add_argument('--headless')
   driver = webdriver.Chrome("chromedriver",options=options)
   ```
:::

[^1]: 実際にseleniumとChrome Driverインストールする別のコマンドを使用していたのですが、ある日から使用できなくなったという経験があります。

# 参考

https://github.com/kaliiiiiiiiii/Selenium-Profiles/issues/10
SIMスワップ詐欺対策の一環でマイナンバーカードの利用を考える

# はじめに

SIMスワップ詐欺対策の一環で、何かできそうなことはないか考えたので記事にしてみることにしました。

# Who am i ?

しがないエンジニアです。

# この記事の想定読者

- 特になし（雑記のため）

# 背景

最近、「SIMスワップ詐欺」という一種のソーシャルエンジニアリングが流行ってきています。SIMスワップ詐欺はスマフォの電話番号と口座番号orメールアドレスなどを盗み出し、携帯ショップへSIMの再発行をしてもらうことにより、二段階認証or二要素認証を回避しようというものです。

以下のページが比較的わかりやすいです。

https://www.itmedia.co.jp/news/articles/2305/12/news088.html

犯人の目的は「金」であることがポイントで、最近アプリなどで比較的容易に送金が可能になったことと、SIMカード発行のために、本人確認書類のチェックがデジタル化されていないことの不備をついているのがポイントだと思っています。

あとはスマフォの番号を複数持っていることは基本的に少なく、二段階認証or二要素認証のための電話番号と銀行へ登録している電話番号を分けることはあまり考えにくいというのもポイントなのかもしれませんね。
これまで国内の身分証明書としてデファクトスタンダードの立ち位置であった運転免許証ですが、どうやら目視確認のチェックしかされていなかったようです。これはある意味しょうがないのかもしれませんが、本人確認書類が偽造されているという前提が抜けていたというのも人間の弱点なのかもしれません。専用の機械を買うのもコストがかかるので大変ですからね。

今回は本人確認の仕組みについてマイナンバーカードを利用できないかと考えてみたわけです。

# 本題

まず、マイナンバーカードを本人確認書類として使用するメリットについて記載させていただきます。

マイナンバーカードは運転免許証と同じくらいの普及率になってきていますし、本人確認もスマフォがあれば比較的容易に可能です。こういった点からマイナンバーカードは目視の確認だけでなく、機械的なチェックが容易に可能であるというのもポイントになると思っています。

以降で、現時点でマイナンバーカードに関する誤解を記載していきます。

「マイナンバーカードが本人確認書類として認められるか」という問題は少しずつ解消に向かっていっていると良いのですが、自治体によってはまだまだという所もあるのかもしれません。
これは「マイナンバー自体が他人に明かしてはならない秘密の個人情報」と認識されていたことが要因ですよね。だからそのマイナンバーが記載されているマイナンバーカードを身分証として提示しても拒否されるという事象が発生していたと認識しています。この誤解を解くためにあのプラスチックのケースが廃止の検討をされていますよね。

https://www.yomiuri.co.jp/economy/20221105-OYT1T50325/

国内は少しずつ、マイナンバーカードの活用に向けて動き出してきているように思いますので、今後も検討を進めて行って欲しい所です。

https://xtech.nikkei.com/atcl/nxt/column/18/00138/052901295/

参考までに、国外についてはパスポートが依然として本人確認書類として使われているかと思います。パスポートのチェックはデジタル化されていっているのでしょうかね。。こちらについても今後の動向に期待していきたいものです。

マイナンバーカードに関する期待ですが、今後は銀行や郵便局なども本人確認書類としてマイナンバーカードを利活用していくという方針になれば、こういった詐欺対策につながると感じます。もちろん賛否両論あるとは思いますが。

# 最後に

マイナンバーの利活用は今後拡大していくと思われますので、こういったトラブルは少しずつ解消していって欲しいものですね。

https://toyokeizai.net/articles/-/673740?page=2&fbclid=IwAR1iR-afYDi3286jzIXVtV0Wg9FcgV976c-NUcBCAGlyZGDGNExtuS-pPBM

現時点の最新動向も貼っておきます。

https://www.tokyo-np.co.jp/article/253912

銀行口座開設の新規開設（オンライン）について

https://www.nikkei.com/article/DGKKZO71680780W3A600C2PD0000/
mod_proxy_clusterをコンパイルした

## 概要
mod_proxy_clusterをビルドした。

https://github.com/modcluster/mod_proxy_cluster


### 環境
* CentOS Stream 9
* mod_proxy_cluster


### gitからダウンロード
ダウンロードして、nativeディレクトリの下にbuildフォルダを作成して移動する。

```bash
git clone https://github.com/modcluster/mod_proxy_cluster.git
cd mod_proxy_cluster/
cd native/
mkdir build
cd build/
```

### 関連ソフトウェアをインストール
```bash
dnf install cmake
dnf install gcc
dnf install g++
dnf install apr-devel apr-util-devel
dnf install httpd-devel
dnf update
```

### ビルド
nativeフォルダ配下のREADME.mdの記載通りに実行。makeファイルを作成してビルドする。

```bash
cmake ../ -G "Unix Makefiles"
make
ls modules/
mod_advertise.so  mod_cluster_slotmem.so  mod_lbmethod_cluster.so  mod_manager.so  mod_proxy_cluster.so
```
Apache TinkerPop Gremlin(グラフDB) と MySQL(RDB)の違い


データベースには様々な種類が存在し、それぞれ特性と利点があります。

ここでは、Apache TinkerPop Gremlinを使った`グラフデータベース`と、MySQLのような`リレーショナルデータベース（RDB）`の違いについて説明します。

## データ構造の違い

まず、最も大きな違いはデータ構造です。

### グラフデータベース(Gremlin)

グラフデータベースは、`データをノード（頂点）とエッジ（辺）という2つの要素で表現`します。

ノードはエンティティ（例えば、ユーザーや商品など）を、エッジはそれらのエンティティ間の関係を表現します。

これにより、データ間の複雑な関連性を直感的に表現できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/987057/6da93b0f-3087-cb04-d0bc-445d05ff384d.png)
出典： https://www.imagazine.co.jp/12805-2/

> ノード（node）：別名バーテックス、頂点。点や丸で表現されるエンティティー。「ラベル」を付けて種別を分類することが多い。
>
> エッジ（edge）：別名リレーションシップ、辺。ノード間の関係性を表す。方向とタイプを有する。
> 
> プロパティ（property）：別名、属性。ノードとエッジにおける属性情報。データはkey／value形式で保持される。


### リレーショナルデータベース(MySQL)

一方、リレーショナルデータベースは、データをテーブル形式で保存します。

各テーブルは行（レコード）と列（フィールド）で構成され、行と列の交差点には個々のデータが格納されます。

また、テーブル間の関係性は主キーと外部キーを用いて定義されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/987057/69a1d21d-f0c8-dcc3-a6f3-0619475821bd.png)
出典： https://dekiru.net/article/14821/

## 検索性能の違い

次に、データの検索性能について見てみましょう。

### グラフデータベース(Gremlin)

グラフデータベースでは、データ間の関係性を直接的に表現しているため、`関連データの検索が高速`です。


特に、多段階の関連データ（友達の友達など）を検索する場合に優れたパフォーマンスを発揮します。

### リレーショナルデータベース(MySQL)

一方、リレーショナルデータベースでは、テーブル間の結合操作が必要となるため、複雑な関連データの検索は比較的時間がかかります。

しかし、`単純なクエリや集約処理については高速`で、また、データの整合性を保つための機能が豊富に用意されています。

## まとめ

Apache TinkerPop GremlinのようなグラフデータベースとMySQLのようなリレーショナルデータベースは、それぞれ異なるデータ構造と特性を持つため、用途によって適切なものを選ぶことが大切です。

グラフデータベースは、データ間の深い関連性や複雑なネットワーク構造を持つデータの管理に適しています。
一方、リレーショナルデータベースは、一貫性と整合性が必要なビジネスデータの管理や、単純なクエリの処理速度が求められる場合に強みを発揮します。

これらの違いを理解し、プロジェクトの要件に合わせて最適なデータベースを選択することが、データ管理の効率性とパフォーマンスを向上させることができるようになると思います！ぜひ参考にして下さい。
GitHub Actions で .python-version に従った Python を利用する

pyenv とかで `.python-version` ファイルを利用して Python のバージョンを固定している場合に、わざわざ GitHub Actions で使っている Python のバージョン設定を手作業で同期したくないというか、もし仮にそういう作業が大好きでも設定し忘れてて CI が落ちたりします。

という訳で自動的に `.python-version` を読み込むようにしました。

同じ手法は `actions/setup-node@v3` & `.node-version` でも使えます。
(`ruby/setup-ruby@v1` は多分デフォルトで `.ruby-version` を読みそうです。)

```yaml
jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v3

    - uses: actions/setup-python@v4
      with:
        python-version-file: '.python-version'
```

`python-version` に替えて `python-version-file` を使うのがポイントです。

今時は Docker を使ったりするのでやる人も多くないのかも知れませんが、取り回しが良くて手軽ですね。

## ↑の手法に気づく前に示していた手法

頑張って書いたので、愚直に　`$GITHUB_OUTPUT`　でやる場合も残しておきます。

```yaml
jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v3

    - id: get-python-version
      run: echo "python-version=$(cat .python-version)" >> "$GITHUB_OUTPUT"

    - uses: actions/setup-python@v4
      with:
        # !!! 上に示した手法の方が効率的です !!!
        python-version: ${{ steps.get-python-version.outputs.python-version }}
```

`$GITHUB_OUTPUT` に書き込むことで出力パラメータを設定することができる GitHub Actions の仕様を利用しています。

https://docs.github.com/ja/actions/using-workflows/workflow-commands-for-github-actions#setting-an-output-parameter
【AWS Cloud9】Ruby,Railsの導入方法

Cloud９での環境設定を自分用に以下に記載しておきます。

## Rubyをインストールする
まず、今のバージョンを確認するには、

~~~ruby
ruby -v
~~~
<br>

そして、指定のバージョンをインストールしていきます。
~~~ruby
ec2-user:~/environment $ rvm get stable
ec2-user:~/environment $ rvm install 『ここにver.を』
~~~

これで指定のRubyのバージョンがインストールできていると思います。
<br>

<details><summary>インストールしたバーションをデフォルトにする方法はこちら</summary>

~~~ruby
ec2-user:~/environment $ rvm --default use 3.1.2
~~~
この設定を行わないと、ターミナルの再起動後、Cloud9の再起動後には初期Rubyバージョンに戻ってしまいます。
</details>

<br>
<details><summary>現在のRubyのバージョンとデフォルト設定は次のコマンドで確認ができます</summary>

~~~ruby
ec2-user:~/environment $ rvm list
   ruby-2.0.0 [ x86_64 ]
=* ruby-3.1.2 [ x86_64 ]

# => - current
# =* - current && default
#  * - default
~~~
このように表示されていれば問題ありません。
</details>

<br>

## Railsをインストールする
以下の手順でRailsや必要なソフトウェアをインストールしていきます。

１、必要なソフトウェアのインストールコマンドが書かれたシェルスクリプトをダウンロードする
２、ダウンロードしたシェルスクリプトを実行する
３、インストール完了後、ターミナルの実行に必要な設定ファイルを読み込み直す
<br>
まず、以下を実行
~~~rb
username:~/environment $ wget https://wals.s3.ap-northeast-1.amazonaws.com/curriculum/rails/environment.sh 
~~~
wgetとはコマンドの一種で、指定されたURLのファイルをダウンロードする、という役割を持っています。
実際に、このコマンドを実行した後にフォルダを確認してみると、environment.shというファイルがダウンロードされているはずです。
<br>
続けて、ターミナルに以下のように入力して、実際にソフトウェアをインストールします。
~~~rb
username:~/environment $ sh environment.sh
~~~
shは、指定したファイルの中身を実行するためのコマンドです。
今回指定したenvironment.shには、Railsと必要なソフトウェアをインストールするためのコマンドが記述されているため、そのコマンドが実行されます。
インストールが完了するまでには10分ほどかかります。
<br>

## インストールの確認
正しいバージョンがインストールされているかを確認します。ターミナルに以下のように入力しましょう。
~~~rb
username:~/environment $ rails -v
(出力)Rails 6.1.4
~~~
<br>

とりあえす、以上
cscの作法 その326

# 概要
cscの作法、調べてみた。
練習問題、やってみた。

# 練習問題
sqliteで、DataGridViewで表示せよ。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/12528555-07cb-ed3c-1e8e-45548893fad6.png)

# サンプルコード

```
using System;
using System.Text;
using System.IO;
using System.Drawing;
using System.Windows.Forms;
using System.Data.SQLite;

namespace App
{
	class Form1: Form {
		public Form1() {
			this.Width = 400;
			this.Height = 300;
			this.Text = "SQLite Test";
			DataGridView table = new DataGridView();
			table.Dock = DockStyle.Fill;
			table.ColumnCount = 4;
			table.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
			table.Parent = this;
			table.Columns[0].HeaderText = "Id";
			table.Columns[1].HeaderText = "Name";
			table.Columns[2].HeaderText = "Number";
			table.Columns[3].HeaderText = "Price";
			SQLiteConnection conn = new SQLiteConnection("Data Source=db0.sqlite;");
			conn.Open();
			SQLiteCommand command = conn.CreateCommand();
			command.CommandText = "SELECT * FROM fruit";
			SQLiteDataReader reader = command.ExecuteReader();
			while (reader.Read())
			{
				table.Rows.Add(reader.GetInt32(0), reader.GetString(1), reader.GetInt32(2), reader.GetInt32(3));
			}
			conn.Close();
		}
		[STAThread]
		static void Main() {
			Application.Run(new Form1());
		}
	}
}





```

以上。
補助記憶装置

### 1-07　補助記憶装置
主記憶に比べてアクセス速度は遅いですが，大容量，
安価で，電源が切れても記憶内容が消えない不揮発性

磁気ディスク装置（ハードディスク）
磁性体を塗った円盤状のディスクにデータが記録され，磁気ヘッドを移動させながらデータを読み書きする装置（いわゆるHDD）
#### HDDの構造
ディスクは複数枚で構成される。ディスクの表面に記録する最小単位である　セクタ　があり、セクタがいくつか集まって同心円状のトラックがあり、ドラックが幾つか集まって一面を構成する。
中心から等距離にあるトラックの集まりをシリンダといい
この記録方式はセクタ方式
    イメージとしては↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3293109/c9b5933b-f7a3-45ad-4f43-608316a06d45.png)
セクタ方式　データをセクタ単位で読み書き、一つのセクタに収まらない場合は複数のセクタをまたいで記録。一つのセクタには複数のデータを書き込めない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3293109/b2847fb1-aa45-0346-5dcd-4821a0c3d130.png)
#### アクセス時間
アクセス時間 ⁼ 位置決め時間 + 回転待ち時間 + データ転送時間

位置決め時間（シーク時間）(seek time)
磁気ヘッドを目的のデータが存在するトラックまで移動させるのに要する時間。
回転待ち時間（サーチ時間）(seach time)
目的のデータが，磁気ヘッドの位置まで回転してくるのを待つ時間。平均回転待ち時間が使われ，1回転するのに要する時間の1/2が用いられる
データ転送時間
目的のデータが磁気ヘッドを通り過ぎるのに要する時間

例　回転数が4,200回／分で，平均位置決め時間が5ミリ秒の磁気ディスク装置がある。この磁気ディスク装置の平均待ち時間は約何ミリ秒か。
　　4,200回／分＝（60*1000）/4200⇒14.28ミリ秒一回転.平均回転待ち時間は14.28/2＝7.14 7.14+5≒12

#### フラグメンテーション
磁気ディスク装置にデータの追加や削除を繰り返すと，
データが連続した領域に保存されなくなる（断片化する）現象
デフラグで解消できる
#### フラッシュメモリ(USBメモリ.SDカード)
電気的に全部または一部分を消去して内容を書き直せる半導体メモリ
#### SSD（固态硬盘）
SSD（Solid State Drive）は，フラッシュメモリを用いた，磁気ディスク装置の代わりとなる記憶媒体(HHDより小さく、速く、高い)
#### 光ディスク（光盘）
CD (Compact Disc)音楽用のCDをPCのデータ記録用に応用したもの。ソフトウェアなどの配布に用いられる.(最大700M)
DVD (Digital Versatile Disc)PCのデータ記録用だけでなく，映画などの映像を記録できる(最大17.08G)
BD(Blu-ray Disc)青紫色のレーザ光線を使って，ハイビジョン映像を2時間以上記録できる(最大100G)

光ディスクの記憶方式には，再生専用型・追記型・書換え型
再生専用型（USER書込み不可）CD-ROM,DVD-ROM，BD-ROM(Read Only Memory)
追記型（USER書込み可、書き換え不可）CD-R,DVD-R，BD-R(Recordable)
書換え型（書込み可能。書換え可能）CD-RW，DVD-RW(Rewritable)，BD-RE(Rewritable)　同じRewritableだが略称の規則が異なるらしい。
【受験体験記①】テクニカルコミュニケーション技術検定試験（TC技術検定）「3級 テクニカルライティング試験」


**はじめに**

業務でマニュアルやかんたんな文章校正を対応することが多く、個人的にも得意な分野であり、わりと簡単に取れるのではと思い「3級 テクニカルライティング試験」の受験を決めました。

受験体験を数回に分けて投稿しようと思います。

今回は、試験の概要や勉強方法について、テクニカルコミュニケーター協会HP(2023年5月時点)より調べてわかったことをまとめます。

テクニカルコミュニケーション技術検定試験（TC技術検定）とは

https://www.jtca.org/certificate_exam/index.html

**試験概要**

試験の種類は以下

>- 3級 テクニカルライティング試験[TW]
>- 2級 使用情報制作ディレクション試験[DR]
>- 2級 使用情報制作実務試験[MP]
>- 1級（詳細検討中）

3級 テクニカルライティング試験[TW]について

>使用情報の作成に携わる人々だけでなく、実用文の作成に役立つ日本語の文章表現技術を高めたいすべての方々を対象とする試験です。

>文法や文の知識だけでは文書は作成できません。何のために、何を、どう説明するか、もう一度日本語を見直し、伝わる文書力を磨きましょう。

**合格率**

2023年冬(2023年2月)試験の結果は以下。
全体でおよそ300人中140人で、45%程度の合格率となる。
サンプル問題は易しそうなイメージだったが、これを見ると少し不安。

男女別受験者数、合格者数
| | 回答数 | 構成比 | 合格者数 | 合格率 |
|:-:|:-:|:-:|:-:|:-:|
|  男 |   174|  57.2% | 71  |  40.8% |
|  女 | 130  |   42.8%| 68  | 52.3%  |

その他の回の分析データもHPに掲載あり。

https://www.jtca.org/certificate_exam/index.html

**受験費用**

法人会員・個人会員　11,000円
非会員　16,720円
学生　11,000

**会場**

オンライン試験はなく、
東京・大阪・名古屋・福岡・広島・石川の6箇所

**勉強方法**

①TC協会で発行しているテキスト(詳細は次回投稿にて)
②受験対策セミナー

**HPをざっと確認したあとの疑問点**

過去問は公表されていない？

HPには、簡単な数問のサンプル問題のみで、
テキストの目次の最後に「TC技術検定3級[TW]試験の例題」とあるが、試験まるっと1回分の対策ができる量なのか心配。

参考本に過去問など本番形式の問題が掲載されていることを願う。。

〜〜次回、【受験体験記②】では、テキストの内容や試験対策について書きたいと思います〜〜
cscの作法 その325

# 概要
cscの作法、調べてみた。
練習問題、やってみた。

# 練習問題
sqliteで、selectで取得せよ。

# サンプルコード

```
using System;
using System.Text;
using System.IO;
using System.Data.SQLite;

namespace App
{
	public class Program {
		public static void Main(string[] args) {
			SQLiteConnectionStringBuilder ConnectionStr = new SQLiteConnectionStringBuilder();
			ConnectionStr.DataSource = "db0.sqlite";
			using (SQLiteConnection Connection = new SQLiteConnection(ConnectionStr.ToString()))
			{
				Connection.Open();
				using(SQLiteCommand Command = new SQLiteCommand(Connection))
				{
					Command.CommandText = "SELECT * FROM fruit";
					using (SQLiteDataReader Reader = Command.ExecuteReader())
					{
						while (Reader.Read())
						{
							int Id = Reader.GetInt32(0);
							string Name = Reader.GetString(1);
							int Number = Reader.GetInt32(2);
							int Price = Reader.GetInt32(3);
							Console.WriteLine(string.Format("id: {0} name: {1} number: {2} price: {3}", Id, Name, Number, Price));
						}
					}
				}
			}
			Console.WriteLine("ok0");
		}
	}
}




```

以上。