OmniAICreator/Qiita-1.07M huggingface dataset:
Linux技術者認定試験向けかもしれない問題集

AIを使って問題を作成しています。


### Prompt:
`「LPIC」や「LinuC」に出てきそうな問題を作ってください。`


### 問題1 (システム管理)
/etc/shadowファイルにはどの情報が保存されていますか？

1. `システムログ`
1. `パスワードのハッシュと関連情報`
1. `ユーザーのホームディレクトリのパス`
1. `ネットワーク設定`

<details> <summary>解説</summary>

回答: 2. パスワードのハッシュと関連情報

解説: /etc/shadowファイルには、ユーザーアカウントのパスワードハッシュとパスワード関連の情報（パスワードの有効期限など）が保存されています。これはセキュリティを向上させるため、パスワードを平文で保存する代わりに使用されます。

</details>

### 問題2 (シェル)
historyコマンドはどの目的で使用されますか？

1. `プロセスを表示する`
1. `システムの起動時間を確認する`
1. `ユーザーのコマンド履歴を表示する`
1. `ネットワークインターフェースを設定する`

<details> <summary>解説</summary>

回答: 3. ユーザーのコマンド履歴を表示する

解説: historyコマンドは、シェルにおいてユーザーが実行したコマンドの履歴を表示します。これにより、過去に実行したコマンドを再度確認したり再実行することが可能です。

</details>

### 問題3 (ネットワーク)
netstatコマンドの主な機能は何ですか？

1. `ネットワーク統計情報を表示する`
1. `ファイルのアクセス権を変更する`
1. `パッケージをインストールする`
1. `ユーザーを追加する`

<details> <summary>解説</summary>

回答: 1. ネットワーク統計情報を表示する

解説: netstatコマンドは、ネットワーク接続、ルーティングテーブル、インターフェースの統計情報など、ネットワーク関連の統計情報を表示するために使用されます。

</details>

### 問題4 (ファイルシステム)
fsckコマンドはどの目的で使用されますか？

1. `ファイルシステムのチェックと修復`
1. `プロセスの管理`
1. `ソフトウェアのアップデート`
1. `システムのシャットダウン`

<details> <summary>解説</summary>

回答: 1. ファイルシステムのチェックと修復

解説: fsck（File System Consistency Check）コマンドは、ファイルシステムの整合性をチェックし、必要に応じて修復するために使用されます。これにより、ファイルシステムのエラーや不整合を解消することができます。

</details>

### 問題5 (ユーザー管理)
passwdコマンドはどの目的で使用されますか？

1. `新しいユーザーを作成する`
1. `ユーザーのパスワードを変更する`
1. `ユーザーを削除する`
1. `ユーザーのグループを変更する`

<details> <summary>解説</summary>

回答: 2. ユーザーのパスワードを変更する

解説: passwdコマンドは、ユーザーのパスワードを変更するために使用されます。ユーザーは自分のパスワードを変更したり、管理者は他のユーザーのパスワードをリセットすることができます。

</details>

### 問題6 (セキュリティ)
sudoコマンドの役割は何ですか？

1. `ファイルを圧縮する`
1. `プロセスを終了する`
1. `権限を一時的に昇格させる`
1. `ユーザーを削除する`

<details> <summary>解説</summary>

回答: 3. 権限を一時的に昇格させる

解説: sudo（Superuser DO）コマンドは、通常のユーザーが一時的に管理者権限を取得してコマンドを実行するために使用されます。これにより、管理タスクを実行するために必要な権限が一時的に与えられます。

</details>

### 問題7 (ネットワーク)
tracerouteコマンドはどの目的で使用されますか？

1. `ネットワークホストのパスを追跡する`
1. `DNSサーバーを構成する`
1. `ファイアウォールを設定する`
1. `ネットワークインターフェースを表示する`

<details> <summary>解説</summary>

回答: 1. ネットワークホストのパスを追跡する

解説: tracerouteコマンドは、指定したネットワークホストに到達するまでの経路を追跡し、その経路上の各ホップの応答時間を表示するために使用されます。ネットワークの遅延や問題箇所の特定に役立ちます。

</details>

### 問題8 (システム管理)
システムのタイムゾーンを設定するコマンドはどれですか？

1. `date`
1. `timedatectl`
1. `time`
1. `timezone`

<details> <summary>解説</summary>

回答: 2. timedatectl

解説: timedatectlコマンドは、システムのタイムゾーンや日付・時刻の設定を行うために使用されます。このコマンドを使用して、現在のタイムゾーンの表示や新しいタイムゾーンの設定ができます。

</details>

### 問題9 (プロセス管理)
psコマンドの出力結果で、プロセスの親プロセスID（PPID）を表示するオプションはどれですか？

1. `-p`
1. `-u`
1. `-e`
1. `-f`

<details> <summary>解説</summary>

回答: 4. -f

解説: psコマンドの-fオプションは、詳細なフォーマットでプロセス情報を表示し、その中に親プロセスID（PPID）も含まれます。

他のオプションの意味：

-p：特定のプロセスIDを指定する際に使用
-u：特定のユーザーのプロセスを表示
-e：すべてのプロセスを表示

</details>

### 問題10 (ファイルシステム)
Linuxにおいて、リンク（リンクファイル）を作成するコマンドはどれですか？

1. `cp`
1. `ln`
1. `mv`
1. `rm`

<details> <summary>解説</summary>

回答: 2. ln

解説: lnコマンドは、ハードリンクやシンボリックリンクを作成するために使用されます。ln source targetでハードリンクを、ln -s source targetでシンボリックリンクを作成できます。

</details>
Linux技術者認定試験向けかもしれない問題集

AIを使って問題を作成しています。


### Prompt:
`「LPIC」や「LinuC」に出てきそうな問題を作ってください。`


### 問題1 (ネットワーク)
ifconfigコマンドはどの目的で使用されますか？

1. `ネットワークインターフェースの設定と表示`
1. `ファイルシステムのチェックと修復`
1. `プロセスの管理`
1. `ソフトウェアのインストール`

<details> <summary>解説</summary>

回答: 1. ネットワークインターフェースの設定と表示

解説: ifconfigコマンドは、ネットワークインターフェースの設定や表示に使用されます。このコマンドを使用して、IPアドレスやネットマスクの設定、インターフェースの有効化・無効化ができます。

</details>

### 問題2 (パッケージ管理)
yumコマンドはどのパッケージ管理システムに関連していますか？

1. `Debian`
1. `Red Hat`
1. `Ubuntu`
1. `Arch Linux`

<details> <summary>解説</summary>

回答: 2. Red Hat

解説: yum（Yellowdog Updater, Modified）は、Red Hat系Linuxディストリビューション（例: CentOS、Fedora）で使用されるパッケージ管理システムです。

</details>

### 問題3 (プロセス管理)
killコマンドを使用してプロセスを終了する際に、SIGTERMシグナルを送信するためのシグナル番号はどれですか？

1. `1`
1. `9`
1. `15`
1. `19`

<details> <summary>解説</summary>

回答: 3. 15

解説: SIGTERMシグナルは、通常のプロセス終了を要求するシグナルであり、そのシグナル番号は15です。kill -15 [プロセスID]と使用します。
参考として、他のよく知られたシグナルと番号は以下の通りです：

1 - SIGHUP（ハングアップ）
9 - SIGKILL（強制終了、即座に終了）
15 - SIGTERM（通常の終了）
19 - SIGSTOP（プロセスの停止）

</details>

### 問題4 (シェルスクリプト)
シェルスクリプトで変数を使用するためにはどうすればよいですか？

1. `#variable`
1. `$variable`
1. `@variable`
1. `%variable`

<details> <summary>解説</summary>

回答: 2. $variable

解説: シェルスクリプトで変数の値を参照するには、変数名の前に$を付けます。例: echo $variable

</details>

### 問題5 (システム管理)
cronジョブを使用する主な目的は何ですか？

1. `システムのリアルタイム監視`
1. `定期的なタスクの自動化`
1. `ユーザーアカウントの管理`
1. `ネットワークの設定`

<details> <summary>解説</summary>

回答: 2. 定期的なタスクの自動化

解説: cronジョブは、定期的なタスクの自動化を目的としたスケジュール管理ツールです。例えば、バックアップやシステムメンテナンスのスクリプトを定期的に実行するのに使用されます。

</details>

### 問題6 (ディスク管理)
dfコマンドはどの目的で使用されますか？

1. `ファイルのコピー`
1. `ディスク使用状況の表示`
1. `ファイルの削除`
1. `ディレクトリの作成`

<details> <summary>解説</summary>

回答: 2. ディスク使用状況の表示

解説: dfコマンドは、ファイルシステムのディスク使用状況を表示するために使用されます。各ファイルシステムの使用率や空き容量を確認できます。

</details>

### 問題7 (シェル)
echoコマンドはどの目的で使用されますか？

1. `ファイルの内容を表示する`
1. `文字列や変数の内容を標準出力に表示する`
1. `ファイルを削除する`
1. `システムを再起動する`

<details> <summary>解説</summary>

回答: 2. 文字列や変数の内容を標準出力に表示する

解説: echoコマンドは、文字列や変数の内容を標準出力に表示するために使用されます。例えば、echo "Hello, World!"とすると、「Hello, World!」が表示されます。

</details>

### 問題8 (ユーザー管理)
groupaddコマンドはどの目的で使用されますか？

1. `新しいグループを追加する`
1. `グループを削除する`
1. `ユーザーをグループに追加する`
1. `グループの権限を変更する`

<details> <summary>解説</summary>

回答: 1. 新しいグループを追加する

解説: groupaddコマンドは、新しいグループをシステムに追加するために使用されます。例えば、groupadd mygroupとすると、新しいグループ「mygroup」が作成されます。

</details>

### 問題9 (ファイルシステム)
mountコマンドはどの目的で使用されますか？

1. `プロセスを終了する`
1. `ファイルシステムをアンマウントする`
1. `ファイルシステムをマウントする`
1. `ファイルの圧縮を行う`

<details> <summary>解説</summary>

回答: 3. ファイルシステムをマウントする

解説: mountコマンドは、指定したデバイスやパーティションを指定したディレクトリにマウントするために使用されます。例: mount /dev/sda1 /mnt

</details>

### 問題10 (ネットワーク)
SSH接続に使用されるデフォルトのポート番号はどれですか？

1. `20`
1. `21`
1. `22`
1. `23`

<details> <summary>解説</summary>

回答: 3. 22

解説: SSH（Secure Shell）接続に使用されるデフォルトのポート番号は22です。SSHは、リモートホストに安全に接続するためのプロトコルです。

</details>
Linux技術者認定試験向けかもしれない問題集

AIを使って問題を作成しています。


### Prompt:
`「LPIC」や「LinuC」に出てきそうな問題を作ってください。`



### 問題1 (システム管理)
Linuxシステムにおいて、/etc/passwdファイルは何のために使用されますか？

1. `ユーザーアカウント情報の管理`
1. `システムログの記録`
1. `ネットワーク設定の保存`
1. `インストールされたパッケージの一覧`

<details> <summary>解説</summary>

回答: 1. ユーザーアカウント情報の管理

解説: /etc/passwdファイルは、ユーザーアカウント情報を格納するためのファイルです。このファイルには、各ユーザーのユーザー名、ユーザーID、グループID、ホームディレクトリ、ログインシェルなどの情報が含まれています。

</details>

### 問題2 (ファイルシステム)
Linuxファイルシステムにおいて、スーパーブロックはどの役割を果たしますか？

1. `ファイルのアクセス権を管理する`
1. `ファイルシステム全体のメタデータを管理する`
1. `ユーザーのホームディレクトリを指定する`
1. `カーネルモジュールをロードする`

<details> <summary>解説</summary>

回答: 2. ファイルシステム全体のメタデータを管理する

解説: スーパーブロックは、ファイルシステム全体のメタデータを管理します。これは、ファイルシステムのサイズ、使用されているブロック数、空きブロック数などの情報を含みます。

</details>

### 問題3 (ネットワーク)
pingコマンドは主に何のために使用されますか？

1. `IPアドレスを割り当てる`
1. `DNSサーバーを構成する`
1. `ネットワークホストへの接続確認`
1. `ファイアウォールを設定する`

<details> <summary>解説</summary>

回答: 3. ネットワークホストへの接続確認

解説: pingコマンドは、指定したホストに対してICMPエコーリクエストを送信し、その応答時間を計測することで、ネットワークホストへの接続が確認できるかどうかを調べるために使用されます。

</details>

### 問題4 (シェル)
シェルスクリプトにおいて、#!/bin/bashの意味は何ですか？

1. `ファイルの所有者を指定する`
1. `シェルスクリプトの実行環境を指定する`
1. `ファイルの読み取り専用を指定する`
1. `ファイルのパーミッションを変更する`

<details> <summary>解説</summary>

回答: 2. シェルスクリプトの実行環境を指定する

解説: #!/bin/bashは、シェルスクリプトの最初の行に書かれ、スクリプトが実行される際のシェル環境（この場合はBashシェル）を指定するために使用されます。

</details>

### 問題5 (ユーザー管理)
usermodコマンドはどの目的で使用されますか？

1. `新しいユーザーを追加する`
1. `ユーザー情報を変更する`
1. `ユーザーを削除する`
1. `ユーザーのパスワードを変更する`

<details> <summary>解説</summary>

回答: 2. ユーザー情報を変更する

解説: usermodコマンドは既存のユーザーアカウントの情報を変更するために使用されます。例えば、ユーザーのログインシェルやホームディレクトリを変更することができます。

</details>

### 問題6 (パーミッション)
Linuxでファイルのパーミッションを表す755の意味は何ですか？

1. `所有者が読み取り、書き込み、実行でき、グループとその他が読み取りと実行できる`
1. `所有者が読み取り、書き込み、実行でき、グループとその他が書き込みと実行できる`
1. `所有者が読み取り、書き込み、実行でき、グループとその他が読み取りできる`
1. `所有者が読み取り、書き込み、実行でき、グループが読み取り、実行でき、その他が実行できる`

<details> <summary>解説</summary>

回答: 1. 所有者が読み取り、書き込み、実行でき、グループとその他が読み取りと実行できる

解説: 755は、所有者に読み取り（4）、書き込み（2）、実行（1）の全てのパーミッションを与え、グループとその他には読み取り（4）と実行（1）のパーミッションを与えることを意味します。

</details>

### 問題7 (プロセス管理)
Linuxにおいて、プロセスをバックグラウンドで実行するにはどのコマンドを使用しますか？

1. `fg`
1. `bg`
1. `&`
1. `jobs`

<details> <summary>解説</summary>

回答: 3. &

解説: プロセスをバックグラウンドで実行するには、コマンドの最後に&を付けます。例えば、command &と入力すると、そのコマンドはバックグラウンドで実行されます。

</details>

### 問題8 (ログ管理)
/var/logディレクトリは何のために使用されますか？

1. `システムの設定ファイルを保存する`
1. `ユーザーデータを保存する`
1. `システムログを保存する`
1. `アプリケーションのバイナリを保存する`

<details> <summary>解説</summary>

回答: 3. システムログを保存する

解説: /var/logディレクトリは、システムおよびアプリケーションのログファイルを保存するために使用されます。このディレクトリには、システムの動作状況やエラーメッセージなどのログが格納されています。

</details>

### 問題9 (ソフトウェア管理)
apt-getコマンドはどの目的で使用されますか？

1. `プログラムをコンパイルする`
1. `ソフトウェアパッケージを管理する`
1. `システムのバックアップを取る`
1. `ファイルのパーミッションを変更する`

<details> <summary>解説</summary>

回答: 2. ソフトウェアパッケージを管理する

解説: apt-getコマンドは、Debian系Linuxディストリビューションでソフトウェアパッケージを管理するためのコマンドです。インストール、更新、削除などの操作が可能です。

</details>

### 問題10 (セキュリティ)
iptablesコマンドはどの目的で使用されますか？

1. `ファイルシステムを管理する`
1. `ユーザーを管理する`
1. `ネットワークトラフィックをフィルタリングする`
1. `システムのアップデートを管理する`

<details> <summary>解説</summary>

回答: 3. ネットワークトラフィックをフィルタリングする

解説: iptablesコマンドは、LinuxカーネルのパケットフィルタリングフレームワークであるNetfilterを使用して、ネットワークトラフィックをフィルタリングするために使用されます。これにより、セキュリティポリシーを適用したり、特定のトラフィックを許可または拒否することができます。

</details>
ACDLを提唱します。その24

# 概要
ACDLとは、アプリは、クラウド、大切なデータは、ローカルです。
アプリ作ったので、plunkerに上げてみた。

# 機能
シェーダープログラムを実行する。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/cd4c4817-be27-f91f-45bd-d7f253b781e0.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/6458d2b6-c7f2-7ff4-f962-587409fa99cc.png)


# 成果物

https://embed.plnkr.co/plunk/PwYzWDRr32toNR6l


以上
コードを書く時に気を付けること（2024/1201）

問　以下①～⑤のデータを格納する変数を定義したい。
  ① IT業界の生涯賃金
  ② IT業界の市場規模
  ③ 自分の好きな季節
  ④ 自分の夢
  ⑤ 自分は自信があるかどうか 

```java:Ex1_05_11.java
class Ex1_05_11 {
	public static void main (String[] args) {
		int itIndustrlifetimeWage = 195000000; //IT業界の生涯賃金
		long itIndustryMarketSize = 6460800000000L; //IT業界の市場規模
		char myFavoriteSeason = '秋'; //自分の好きな季節
		String myDream = "世界一周"; //自分の夢
		boolean ispreviousGraduate = true; //自分は自信があるかどうか
	}
}
```

注意点
□見やすいようにコメントを付ける
□リテラルを表記するときの書式に注意
□boolean型を使用するときは、関数名にisを付けるのが一般的
□関数名を設定するときに誰が見てもわかりやすく
例）lifetimeWageだけだとマジックナンバーが何の数字を表しているかわからない
Python/目的ごとの変数を用意する

・修正前

```python

# ベース価格の計算
price = quantity * unitPrice

# 送料の判定
# ベース価格が3000以上であれば500円の送料を加算する。
if price < 3000:
   price += 500

# 送料判定後、税額の計算を実施。
price = price * taxRate()

```
priceという変数を使い回しているため、変数名の持つ本来の役割がわからなくなってしまっている。


・修正後

```python

# ベース価格の計算
basePrice = quantity * unitPrice
flightPrice = 0

# 送料の判定
# ベース価格が3000以上であれば500円の送料を加算する。
if basePrice < 3000:
   flightPrice = 500

# 送料判定後、税額の計算を実施。
totalPrice = (basePrice + flightPrice) * taxRate()


```

確かに上記の方がコードが読みやすい
もう少し複雑な例でやってみたい
週次報告にCopilotで作ったグラフをねじ込んでみた


今回、こちらのアドベントカレンダーに参加させていただいております

https://adventar.org/calendars/10228

# この話は、こちらの続きとなります
https://qiita.com/kanameShiga/items/c32c7698e75fa66e22bc

***

# 気づいたらデータがたまっていた

運用報告ツールで数か月
データはそこに溜めているものの折角だから可視化でもしてみようかと思ったけど
Excelで作るのは、自動連係させる際にデータの加工もあるので手間がかかりそう
かといって、手間をかけるならPower BIが使いたかったけど
ライセンスは割り当ててもらってないので使用できない

***

# 何とかデータを可視化できないものか考えてみた
メンバーへの個々のフィードバックは行えてたものの、顧客担当者へのフィードバックには
貢献できていなかったため、日々蓄積しているデータを使って
現場で、Copilotで出来そうなことを考えてた際に
以前、某朗読会でCopilotからグラフが出せるようになりましたと、某朗読会で紹介されていたので
使ってみようかを思いました

***

# まずは慌てずに考えて

最初に、考えていること
・生成AIに過度な期待は厳禁
・プロンプト次第では、今後の運用保守(報告)にかかる時間を減らせている
・事由によって分析用のプロンプトを用意する未来もあるかな？
・「分析」に関して 
　　Copilotを使うことで、単純に「分析」を行ってくれるわけではなく
  　何かを「分析」するには、「指示」が必要だということを念頭に置いています
　『データの分析をするのは「指示を行う側」で、
 　　Copilotをはじめツール類は分析をしてくれません、指示を実行するだけ』 
   
という事を踏まえて利用を検討していきたいと思います。 

また、分析を行うにも、結果に紐づくデータがなければ
AIは回答を導き出すことはないため、日々のデータ収集は必要となり
Copilotでの分析は一時利用に限られ
恒久的に使用する場合は専用のBIツールを使ったほうが良いとも理解しています

***

## データ分析 (メンバーの勤務時間)

実績工数を格納している情報から通常勤務時間を超過している(残業) 
閾値を指定してその推移を可視化して 
かつ、超過しているメンバーのピックアップを行う 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3701343/710eccd7-0bf9-3e8c-f68e-db7dda869ec3.png)


```言語:プロンプト
あなたは、優秀なチームリーダーです 
下記のCsvファイルの情報は以下の通りです 
  
# 添付のCsvファイル 
「アイテック個別実績工数.csv」 
  
# 項目の説明 
タイトル：実績を示すレコード 
memberNo：メンバーの番号 
taskName：タスク名 
taskType：タスクの種類 
actualDate：勤務日 
actualTime：実績時間 
  
上記のデータから各メンバーの勤務状態を把握したいと思っています 
メンバーごとに指定した期間の予定と実績時間を集計して分析してください 
  
# 結果は、markdown形式で予定の期間で 
１）「メンバー」毎に「日付」、「実績時間」折れ線グラフで表示してください 
　グラフの要素は、 
　　【すべて一枚のグラフ上】にメンバー全員を掲載して日付毎に実績時間のグラフ 
　　これを重ねあわせて、グラフ上で乖離を表示してください 
  
ただし 
・凡例はグラフに重ねないようにすべて見えるように表示してください 
・同じ日付に同じタスク名が複数ある場合は合算してください 
・勤務時間は通常、8時間を既定としています 
・直近、2週間で残業が多いメンバーがいる場合は、注意マークとして「＊」を凡例のメンバー番号前に記載してください 
・直近、２週間の「残業時間が合計」が10時間を超えている場合、注意マークを記載してください 
・残業が発生している日には、その日の点に残業時間を数値で表示してください 例：3時間あった場合は,3H 
  
指定する 
期間：2024/08/19～2024/09/04 
```

***

## データ分析 (予定と実績の乖離状況)

メンバーごとのタスクから予定と実績の乖離状況を把握
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3701343/bd5a45fe-632d-6475-624f-c272fd326158.png)


```言語:プロンプト
メンバーごとのタスクから予定と実績の乖離状況を把握 

あなたは、優秀なチームリーダーです 
下記のCsvファイルの情報は以下の通りです 
  
# 添付のCsvファイル 
「実績タスク.csv」 
  
# 項目の説明 
　reportDate：勤務日 
　memberNo：メンバーの番号 
　taskName：タスク名 
　taskType：タスクの種類 
　workRate：タスクの割合 
　タイトル：「朝の報告」は予定、「退勤報告」は実績を示している 
  
上記のデータから各メンバーの作業状態を把握したいと思っています 
メンバーごとに指定した期間の予定と実績を分析し、割合から 
予定外のタスクが発生した日をどれだけあったかを分析してください 
  
# 結果は、markdown形式で予定の期間で 
１）「タスク名」毎に「日付」、「予定(割合)」と「実績(割合)」折れ線グラフで表示してください 
　グラフの要素は、 
　　【すべて一枚のグラフ上】にタスクを掲載して 
　　日付毎に予定で一つのグラフで点線で 
　　日付毎に実績で一つのグラフで実戦で 
　　これを重ねあわせて、グラフ上で乖離を表示してください 
　　各日で予定がない実績のみタスクは割り込みタスクなので、★などの記号で表現してください 

# ただし 
・凡例はグラフに重ねないようにすべて見えるように表示してください 
・雑務は結果から除外してください 
・同じ日付に同じタスク名が複数ある場合は合算してください 
```

***

## 最後に
グラフを出力してもらえたものの、生成されたグラフに日本語使われていると
表示できませんでした
ここら辺は、プロンプトの指示が悪いのかうまくいきませんでしたが
伝えたいことは生成できていたのかなと思っています

ただ、Copilotの使用を足踏みしている、メンバーや顧客担当に
インパクトはあったので、今後の自身の紹介の仕方次第かと考えています

周りには、検証してみた結果
まだ使わない/使えない　という方が一定数いましたが
私はそう思ってなく、今はそうでもこれから進化していく要素はあり
その過程を見守りつつ使っていかないと
いざ、使えるようになった際、出遅れてしまうのでは？使っていけなくなるのではと
思っています、ですので今は、こんなことができるんだ将来が楽しみだなぁと
生暖かい目で見守っていきたいと思います
御神籤

## 1.はじめに
今回はもうすぐ年が明けるということなのでjavaScriptを使って御神籤を引けるプログラムを書いていこうと思います。時間がなくて簡単なものしか作れませんでしたがぜひ参考にしてください。:relaxed:
## 2.コード
![abcd.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943856/045e7100-fa9f-aa5a-e907-b8b739bf045a.png)

コードはこんな感じに書きました。
まず七つの運勢の配列を組み、次にランダムで運勢が出るように[乱数]を使いました。
    最後にswitch文を用いて、出た運勢をコメント付きで表示させるようにしました。

## 3.実行結果
![a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943856/c68904c9-acdf-b329-6e44-d487217e8712.png)
![b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943856/d27e4aec-1b81-019a-16b8-ac926b5eb485.png)
ボタンを押すとランダムに御神籤の結果が表示されます。
## 4.まとめ
javaScriptの乱数のコードの書き方が分からず、時間がかかってしまったが無事完成することができた。誰でも作れる簡単なプログラムなので初心者の方は真似して作ってみて下さい！
(クライアントとサーバ、リクエストとレスポンス、GETとPOST、WEBアプリケーション)

↓動画で解説
[![Web開発者に必要な知識](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3680113/6c09dea7-341e-0e8f-a1d9-4ee28ecab624.png)](https://youtu.be/NzTbsE33H-4)

WEBアプリケーションを開発する方は必須の知識になるので学んでおきましょう！

## WEBアプリケーションとは
インターネット上で共有して使えるアプリケーションのこと

WEBアプリケーションがない時代は、それぞれのPCにアプリケーションがあった

例）WordアプリケーションがそれぞれのPCにインストールされているイメージ
![](https://storage.googleapis.com/zenn-user-upload/7fbe5faa73e1-20240104.png)
<br><br>
インターネット上にあるWordアプリケーションを皆で使えるようになった(下図はイメージ)
![](https://storage.googleapis.com/zenn-user-upload/b7f2db29208a-20240104.png)
<br><br>
![](https://storage.googleapis.com/zenn-user-upload/39adb0afae06-20240104.png)

1.クライアントがこの商品見せて～とリンクをクリックするなどしてリクエストを送る

2.WEBサーバが、これはJavaなどの言語が必要だと判断したら、アプリケーションサーバに依頼する

3.アプリケーションサーバがこれはデータベースのデータが必要だと判断したらデータベースサーバに依頼する

4.データベースサーバはデータベースからデータを取得してアプリケーションサーバに返す

5.アプリケーションサーバはもらったデータとともに画面を生成してWEBサーバに返す

6.WEBサーバはクライアントに商品詳細などのページを画面に表示する

## クライアント
この商品見せて～など要求する側のこと

## WEBサーバ
Webサイトを公開しているコンピュータ

## アプリケーションサーバ
Javaなどの言語が動いているコンピュータ
データベースからデータ(例：商品名や価格)が欲しい時は、データベースサーバに依頼する

## データベースサーバ
データベースが格納されているコンピュータ


## リクエスト
この商品見せて～とお願いする行為のこと

## レスポンス
この商品見せて～に対して、はい、いいですよ～とWEBページを作って画面に表示してくれる行為のこと
<br><br><br>


## GET
![](https://storage.googleapis.com/zenn-user-upload/409985bf17ed-20240726.png)

以下の場合は**GET**という手段でデータが飛ばされる
- リンクをクリックした時
- ブラウザのアドレスバーにURLを入力してEnterを押した時


※ブックマーク(ブラウザのお気に入りに登録)が出来る
※主に検索やデータ(今回の場合は商品の詳細情報)を取得する時に使われる事が多い



## POST
![](https://storage.googleapis.com/zenn-user-upload/dc645965d3f6-20240104.png)

以下の場合は**POST**という手段でデータが飛ばされる
- HTMLのformタグのmethod属性がpostになっていた時
```
<form method="post">
```
- URLに入力したデータは表示されない(GETの場合は表示される)

※主にデータの書き込みなど更新がある場合に利用される


---
X(旧Twitter)
https://twitter.com/kunchan2_

Zenn
記事→https://zenn.dev/codek2
本→https://zenn.dev/codek2?tab=books

新入社員研修向け！JDBC・Servlet/JSP・ソフトウェアテスト・Webアプリケーション開発講座
https://www.udemy.com/course/jdbcservletjsp/?referralCode=88203EF7B00BDA28198C

note
https://note.com/codek2
Survey on the trend of Post Quantum Cryptography (PQC) in Japan (2024)

# Topic

Both Japanese and English will be provided.

[in English]

The Financial Services Agency has published a PQC-related report entitled "Report of the Study Group on Responses to Post Quantum Cryptography by Deposit-Taking Financial Institutions."

https://www.fsa.go.jp/singi/pqc/houkokusyo.pdf

Based on domestic and international trends, it describes what deposit-taking financial institutions should do.
It describes how to build a cryptographic inventory, how to collaborate with relevant parties and IT vendors, etc.

[in Japanese]

「預金取扱金融機関の耐量子計算機暗号への対応に関する検討会報告書」という題目で、PQC関係のレポートが金融庁から公開されました。

https://www.fsa.go.jp/singi/pqc/houkokusyo.pdf

国内外の動向をベースに、預金取扱金融機関として対応すべきことを書かれています。
暗号インベントリをどうやって構築していくか、関係各所やITベンダとどのように連携していくべきか等々のことが書かれている。

# Comment

We believe it is advisable to continue to monitor trends in PQC compliance going forward.
継承と委譲について語る

:::note info
この記事のコードは全てC#で記載しています。
:::

# 継承と委譲
まずは継承と委譲の違いを明確にしておきます。

趣味全開のコード例とともにですがお許しください😏

### 継承
- 「is-a」が成り立つ関係性
- 静的な関係を作り出すため、動的な変更が難しい
- 親クラスのコードを再利用可能
- 親クラスの責務もすべて引き継ぐ
```csharp
// 親クラス
class TwiceMember
{
    public void IntroduceMyself(string name)
    {
        Console.WriteLine($"Hello! This is {name}.");
    }

}

// 子クラス
class Momo : TwiceMember
{
    private readonly string NAME = "MOMO";

    // コンストラクタ
    public Momo()
    {
        // 親クラスのメソッドを使用可能
        this.IntroduceMyself(this.NAME);
    }
}
```

### 委譲
- 「has-a」が成り立つ関係性や特定の機能のみを使用したい場合
- 実行時に動的に機能を変更可能
- 他クラスの機能を必要に応じて利用
- クラスごとに責務を分離できる

```csharp
class Momo
{
    private readonly string NAME = "MOMO";

    private string HairColor {get; set;} = "black";

    public void ImageChange()
    {
        // HairSalonクラスの一機能のみを使用する
        var hairSalon = new HairSalon();
        this.HairColor = hairSalon.DyeHairBlond();
        Console.WriteLine($"HairColor changed to {this.HairColor}");
    }
}

class HairSalon
{
    public string DyeHairBlond() => "Gold";
}
```

# 「has-a」の場合は継承を使うべからず
オブジェクト指向やプログラミングを学び始めた当初、私はこう思いました。
**「全部継承でよくない？🤔」**

わざわざ使いたいクラスを`new`して使うぐらいだったら最初に継承しておけば機能を使用できるしコード量も削減できる。なぜ役割が分かれているのか？

それは、「has-a」の関係性を持つクラス同士や一部の機能のみを使用したいケースで継承をしてしまうといくつかのデメリットがあるからなんですね

先の委譲の実装例を継承に書き換えてデメリットのついて考察していきます。
```csharp
// 継承に置き換えた実装
class Momo : HairSalon
{
    private readonly string NAME = "MOMO";

    private string HairColor { get; set; } = "black";

    public void ImageChange()
    {
        // HairSalonクラスの機能をそのまま使用
        this.HairColor = this.DyeHairBlond();
        Console.WriteLine($"HairColor changed to {this.HairColor}");
    }
}

class HairSalon
{
    public string DyeHairBlond() => "Gold";
}
```

### デメリット1: 責務の混乱
継承を利用すると、子クラスが親クラスのすべての機能と責務を引き継ぎます。したがって、本来子クラスには必要のない責務まで引き継いでしまうことになります。

人であるモモちゃんが人ではないヘアサロンの責務を全て引き継ぐのは違和感がありますよね。別の実装者がクラス間の関係性を誤解して不具合を生む実装をしてしまう可能性があります。

クラスの設計は**単一責任原則**に則るべきですが、それに反する構造となります。

### デメリット2: 保守性の低下
継承を使用すると親クラスの変更が子クラスにも影響するため、常に親クラスの変更を気に掛ける必要があります。

「is-a」の関係性のように親クラスと同じ振る舞いをすることが確実でない場合、親クラスの修正が子クラスで予期しない不具合を生む可能性があります。

例えば、人以外を表すオブジェクトに対して一斉になにか実行する処理を追加実装したいとき。

`HairSalon`クラスに`IsHuman = false;`のようなプロパティを追加して対応する場合、`Momo`クラスで`IsHuman = true;`の実装が漏れると不具合に繋がる可能性が高いです。

継承の階層が深くなっている場合はこの不具合の原因を特定するにも一苦労することでしょう。

# まとめ
継承は上手く利用すれば便利ですが、使用の際はクラス間の関係性を吟味する必要があります。

必ず **「is-a」** の関係性が成り立つことを確認しましょう！

この話題には「インターフェース」も深く関わってきますが長くなりそうなので今回は言及を控えました。

「インターフェース」についてはまた別の機会に...

# 参考
https://ikenox.info/blog/inheritance-delegation-interface/
2024年のFlutterまとめ！

**本記事はFlutter アドベントカレンダー1日目の記事です**

2024年も終わりが近づきました！
本記事では2024年にあったFlutterの出来事をまとめていこうと思います！

## Flutter リリース関連

### 2月 Flutter 3.19 / Dart 3.3 リリース！

2月にはFlutter 3.19とDart 3.3がリリースされました。

google_gemini_aiのbeta版パッケージがリリースされたり、
スクロールの改良がなされました。

また、Dart3.3にてExtensionTypes の実装がなされました。

### 5月 Flutter 3.22 / Dart 3.4 リリース at Google I/O!

5月にはFlutter 3.22とDart 3.4がリリースされ、Google I/Oにて発表されました。

Flutter Web アプリのWeb Assembly (WASM)へのコンパイルがstable としてリリースされた他、
Dart の Macros についての最新情報が発表されました。

### 8月 Flutter 3.24 / Dart 3.5 リリース！

8月にはFlutter 3.24/Dart 3.5のリリースがありました。

Impeller や Shader の向上と、Flutter GPUのアーリープレビュー、Sliverの追加等が行われました。


## 日本のFlutter イベント

ここからは、自分が参加、運営した日本のFlutterイベントをいくつか紹介します。



### Flutter Ninjas

Flutterの日本のカンファレンスとしては珍しく、海外の方を呼んで、主要言語を英語としたカンファレンスが6月に開催されました。

Riverpod の作者のRemiさんなど、有名な方が多く参加し、非常に盛り上がったカンファレンスとなりました。

### 東京Flutterハッカソン 2024

昨年度も行われた2日間でFlutterを使ったアプリを作るイベント、東京Flutterハッカソンが、11月に開催されました。

自分も運営として参加しましたが、80名を超えるFlutter好きの方々が集まる、非常に貴重な会となりました。

### Flutter Kaigi 2024

つい先日ですが、11月に日本の大規模Flutterカンファレンス、Flutter Kaigiが開催されました。

自分は登壇者として参加し、非常に貴重な経験をさせていただきました。


### 他にも...

1月 ~ 11月までで、大小様々な勉強会、イベントが200件以上開かれました。(connpass調べ)

引き続き日本でFlutterは盛り上がっています。


## まとめ

今年はOSの追加などの大きな変更等はありませんでしたが、
Macrosの更新など、とても楽しみな発表が様々ありました。

来年のFlutterの動向も楽しみです！

本記事があなたの一助となれば幸いです。
CORSエラーでReactとFastAPI間で通信がうまくいかなかった

## 前提

フロントエンドにReact、バックエンドにFastAPIを使用してアプリを作成しており
バックエンドではJWTトークン生成しユーザー認証を行なっていた。

ReactからPOSTリクエストを送る際にCORSエラーになってしまう現象が起きてしまいました。

CORSの設定の記述は以下

```python
# main.py

app.add_middleware(
    CORSMiddleware,
    # BACKEND_CORS_ORIGINSは.envにて記述
    allow_origins=settings.BACKEND_CORS_ORIGINS,
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"]
```

.envは以下の通り

```python
# CORS関連の設定
BACKEND_CORS_ORIGINS=["http://localhost:5173", "https://cloudfront.アプリ名.net"]
```

フロントエンドのオリジンは許可しているのにCORSエラーが出て通信ができず詰まってしまいました。

結論から言うと問題の箇所は以下の部分でした。

```python
   	allow_methods=["*"],
    allow_headers=["*"]
```

ここでワイルドカード（ * ）を使用してメソッド、ヘッダーともに全てを許可しているので大丈夫かと思っていたが、認証でJWTなどのBeareトークンを使用している時は明示的に指定する必要があるらしい。

[FastAPI公式](https://fastapi.tiangolo.com/ja/tutorial/cors/)

以下の様に明示的に指定することでエラーを解決できた。

```python
app.add_middleware(
    CORSMiddleware,
    allow_origins=settings.BACKEND_CORS_ORIGINS,
    allow_credentials=True,
    allow_methods=["GET", "POST", "PUT", "DELETE", "PATCH", "OPTIONS"],
    allow_headers=["Content-Type", "Authorization", "X-CSRF-Token", "Access-Control-Allow-Origin"]
```

ReactではAxiosを使用しており、ブラウザからプリフライトリクエストというものが自動で発行され、リクエストのメソッドを許可するかどうかを確認しているらしい。その時 `OPTIONS` メソッドを使用して確認を行なっている。

そのため、`allow_methods` で `OPTIONS` も許可する必要がある。

[参考資料](https://developer.mozilla.org/en-US/docs/Glossary/Preflight_request#:%7E:text=It%20is%20an%20OPTIONS%20request,to%20craft%20such%20requests%20themselves.)

少しでもこの記事が参考になれば幸いです。
クラス設計における、コンストラクタの重要性

# はじめに

クラス設計における、コンストラクタの重要性をしっかりと理解すると幸せになります。
DI (Depnecy Injection) などでも重要な要素ではあるので、これを理解していると、安心・安全な設計が可能です。

## コンストラクタとは？

コンストラクタとは、クラスがインスタンス化される際に呼び出されるメソッドです。
インスタンスのコンストラクタが正常終了しているということは、そのクラスのインスタンスを安全に利用できるということです。
すなわち、メンバー変数などが安全に利用できるため、呼び出し元が注意さえすれば、そのインスタンスは好きに利用できます。（呼び出し元が注意すればというのは、敢えて、少し含みがある言い回しにしています。）

以下のようなコードを考えてみてください。

```C#
class A
{
}

class B
{
    public void Func1(A a)
    {
        Assert(a != null);
        ...
    }

    public void Func2(A a)
    {
        Assert(a != null);
        ...
    }
}

var a = new A();
var b = new B();

b.Func1(a);
b.Func2(a);
```

上記の例では、`B.Func1` や `B.Func2` には `A` を要求します。
ただ、`B` は `A` を要求しますが、`Func1` や `Func2` の呼び出し毎に、新しい `A` を必要としません。
`A` は不変的なものでよいのです。
この場合に、コンストラクタを利用することが可能です。

```C#
class A
{
}

class B
{
    readonly A a;

    public B(A a)
    {
        Assert(a != null);
        this.a = a;
    }

    public void Func1()
    {
    }

    public void Func2()
    {
    }
}

var a = new A();
var b = new B(a);

b.Func1();
b.Func2();
```

このようにすれば、`B` には `A` がコンストラクタの呼び出し時点で設定されますので、`Func1` や `Func2` の呼び出しのたびに `A` を指定する必要がなくなります。
 
また、`Func1` や `Func2` の呼び出し毎に `Assert` チェックも必要なくなっています。
これだけでも、メリットは感じてもらえると思います。
 
よくあるゲームのプログラムに置き換えれば、

```C#
public class GemeManager
{
    static GameManager gameManager = new GameManager();

    public static GetGamaMnager GetInstance()
        => gameManager;
}

public class GameScene
{
    public void Update()
    {
        if (GameManager.GetInstance() != null) {
            return;
        }

        // GameManager を使用するコード
        ...
    }
}

GameScene gameScene = new GameScene();

gameScene.Update();
```

上記のコードは、よく見かけるコードですが、これ自体も

```C#
public class GameScene
{
    GameManager gameManager;

    public GameScene(GameManager gameManager)
    {
        Assert(gameManager != null);
        this.gameManager = gameManager;
    }

    public void Update()
    {
        // GameManager を使用するコード
        ...
    }
}

GameScene gameScene = new GameScene(GameManager.GetInstance());
```

上記のようにするだけで、かなり使い勝手が良くなりますし、可読性もグッと上がります。
というか、`Update` の呼び出し毎に判定も必要なくなります。
 
コンストラクタの時点で、そのクラスが必要とするパラメーターを渡すことで、

- 必要とするパラメーターを一覧化することができる
- クラス内のメソッド呼び出し時の安全性が上がる
- 不要なコードを削除できる

などのメリットが、かなりあります。
これらを理解すること、必然的に DI のメリットも理解できます。

## 余談（上級者向け）

ちなみに冒頭に記載した「呼び出し元が注意すれば」というのは、初期化に関わる部分です。
コンストラクタで指定可能なのは、「インスタンスに対してのみ」であって、「インスタンスの状態」には関与しません。
一例で言えば、「初期化が非同期に行われる」場合には、それを考慮した呼び出し方をしないといけないというものです。
インスタンス化はされているが、初期化が非同期のため、初期化が完了していない可能性もある、ということです。
RAGを簡単に構築してみる

※RAGの説明は[RAGとは](#rag%E3%81%A8%E3%81%AF)をご参照ください。


# 簡単な構築方法

[生成 AI 体験ワークショップ](https://catalog.workshops.aws/generative-ai-use-cases-jp/ja-JP)を実施すればRAGを簡単に構築できます。

このワークショップでは、[Generative AI Use Cases JP (略称:GenU)](https://github.com/aws-samples/generative-ai-use-cases-jp)を使います。

なお、このリポジトリには、RAG以外にも色々なユースケースに対する実装（チャット、RAG チャット、Agent チャット、Prompt Flow チャット、文章生成、要約、校正、翻訳、Web コンテンツ抽出、画像生成、映像分析）が、 MIT-0 Licenseで公開されています。

## ざっくり手順

詳細な手順は前述のワークショップをご覧頂くとして、ざっくり手順は下記です。

1. AWSアカウントを用意
2. AWSマネジメントコンソール上で、Bedrockの生成AIモデルを有効にする
3. リポジトリからgit clone
4. cdk.jsonで、有効にする機能のフラグを適宜変更
5. 検索対象のPDFファイルを用意
6. AWS CLI、AWS CDKをインストール
7. CDKでデプロイ
8. URLにアクセスすれば使用可能

## コスト

AWSアカウントを新規で申し込んだ方であれば、ほとんど無料利用枠で実行できます。ただし、OpenSearch Serverlessの料金はそれなりに発生しますので、Billingのアラーム設定は忘れずに設定しておきましょう。

具体的には、Knowledge Baseを利用した場合、検索対象のPDFファイル1つで何回か質問したら400円くらいかかりました。ほぼOpenSearch Serverlessの料金でしたので、検索対象のPDFファイルが大量にあるとコストが上がりそうです。


# RAGとは

Retrieval-Augmented Generation（検索で強化された生成AI）の略です。「検索拡張生成」「取得拡張生成」と呼ばれています。

生成AIの嘘つき（ハルシネーション）をなるべく防ぐ方法として、検索対象のデータを渡し、それを元に応答を生成させます。

## RAGでは何をしているか

生成AIに、質問文と、検索対象データから質問文に関係ある所だけピックアップしたデータを一緒にプロンプトとして渡して、嘘つきを防いでいます。

以下の3つの処理を組み合わせています。

- Retrieval（検索）：有用な情報をデータベースやドキュメントから検索するプロセス。回答はこの中から探す。これにより、生成された応答の信頼性と正確性を向上させる
- Augmentation（強化）：検索した情報を用いて、生成されるテキストの質を向上させるプロセス。ユーザの質問を適切な質問文に修正したり、検索結果の関連情報をプロンプト向けの参考情報にする
- Generation（生成）：強化された情報を基に新しいテキストを生成するプロセス。このステップでは、ユーザーの質問や要求に対して適切な応答を作成する。いわゆる普通の生成AIの部分

また、Retrieval（検索）のために事前処理として、Store（データ整形）も実施します。

- Store（データ整形）：データを整形し、効率的に検索できるようにするプロセス。テキストデータを正規化し、トークン化。データをインデックス化し、検索が迅速に行えるようにする


# 参考

- コンテスト、コンペ
    - [AI Challenge Day 2024 in Kobe by 角川アスキー総合研究所, 日本マイクロソフト](https://ascii.jp/elem/000/004/199/4199213/)
    - [RAG-1グランプリ by SIGNATE](https://signate.jp/competitions/1407)
- 記事
    - [Qiitaで「RAG」を検索](https://qiita.com/search?q=RAG&sort=created)
    - [noteで「RAG」を検索](https://note.com/search?q=RAG&context=note&mode=search)
    - [Zennで「RAG」を検索](https://zenn.dev/search?q=RAG&order=latest)
ECS上のNode.jsアプリケーションで発生した「JavaScript heap out of memory」エラーの原因と解決方法

ECS上で稼働するNode.jsアプリケーションが、突然「**JavaScript heap out of memory**」というエラーで停止したので、原因と対応をまとめました。

## エラーの内容
エラー時に出力されたログは以下の通りです。

```bash
FATAL ERROR: Reached heap limit Allocation failed - JavaScript heap out of memory
```

このエラーは、Node.jsがJavaScriptの実行に使用するヒープ領域の上限を超えて、メモリを割り当てられなくなった際に発生します。
Node.jsのデフォルトヒープサイズは、64-bit環境の場合で約1.4 GBで、これを超える負荷がかかると、アプリケーションがクラッシュすることがあります。

## エラーの原因
### 1. Node.jsのヒープサイズ
Node.jsのデフォルトヒープサイズは約1.4 GBで、これを超えるメモリを使用するアプリケーションでは、メモリ不足によるクラッシュが発生します。今回は大量のデータ処理が原因でこの制限を超えてしまったようです。

### 2. ECSタスク定義のリソース設定
ECSの`memory`(ハードリミット) と `memoryReservation`(ソフトリミット)の設定によって、タスクのメモリ使用量に制限がかかります。

今回のタスクは以下の設定でした。

```json
"memory": 2048,
"memoryReservation": 2048
```

Node.jsプロセスが使用するヒープ領域(1.4 GB)に加えて、その他のメモリ(バッファ、ネイティブコードなど)を収めるには足りませんでした。その結果、メモリ不足によるクラッシュが発生しました。

## 解決方法
### 1. ヒープサイズの拡張
Node.jsでは `--max-old-space-size` オプションでヒープサイズを拡張できます。以下は、ヒープサイズを2 GBに拡張する例です。

```bash
node --max-old-space-size=2048 dist/main.js
```

ECS環境では、`Dockerfile`を変更するか、タスク定義に`command`を追加してこのオプションを適用できます。

#### タスク定義での設定例
タスク定義の`command`セクションで、起動コマンドにオプションを追加します。
```json
"command": [
  "node",
  "--max-old-space-size=2048",
  "dist/main"
]
```

### 2. ECSタスクのメモリ設定を増やす
Node.jsプロセス全体では、ヒープサイズ以外にも以下の用途でメモリを消費します。
- ネイティブモジュールやコードキャッシュ
- バッファ領域(ファイルI/O、ネットワーク通信)

そのため、`memory`と`memoryReservation`をヒープサイズよりも十分大きく設定する必要があります。

```json
"memoryReservation": 3072,
"memory": 4096
```

## 実装例

### Dockerfile
`Dockerfile`自体を変更する場合は以下のように記述します。

```dockerfile
CMD ["node", "--max-old-space-size=2048", "dist/main"]
```

### タスク定義
タスク定義でヒープサイズを設定し、ECSのメモリ制限も調整します。
`Dockerfile`で設定を追加すると全環境で共通になってしまい、環境ごとの調整が難しくなるため、今回はタスク定義を修正しています。

```json
{
  "containerDefinitions": [
    {
      "name": "app",
      "memory": 3072,
      "memoryReservation": 3072,
      "command": [
        "node",
        "--max-old-space-size=2048",
        "dist/main"
      ],
      "logConfiguration": {
        "logDriver": "awslogs",
        "options": {
          "awslogs-group": "/ecs/app",
          "awslogs-region": "ap-northeast-1",
          "awslogs-stream-prefix": "ecs"
        }
      }
    }
  ],
  "cpu": "1024",
  "memory": "3072"
}
```
ChatGPTがエンターキーで送信されるの辛い

## 対象読者
* ChromeブラウザでChatGPTを使っている
* 改行しようと思って（頭では分かってるんだけど）エンターキー押して送信されちゃう
* 無課金なので利用制限(10回送信/3h)がイヤ

## これをインストール

https://chromewebstore.google.com/detail/chatgpt-ctrl+enter-sender/gbncgdhklmnckojlibfhdadpfbcdbnch?hl=ja&pli=1

## 使い方
1. ChromeでChatGPTを開く
1. 右上の拡張機能をクリックして有効化（画像参照）

![スクリーンショット 2024-12-01 16.18.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821993/5491d414-ee7a-fc67-6625-e79bb91af120.png)

ChatGPTのタブを閉じて、再度開くと以下のようになってます。
* エンターで改行される
* Ctrl(⌘) + エンターで送信される

イライラすることが無くなりました。
[Advent of Code 2024] Day 1: Historian Hysteria

この記事は、[mae616 Advent of Code Advent Calendar 2024](https://qiita.com/advent-calendar/2024/mae616) の1日目の記事です。

https://qiita.com/advent-calendar/2024/mae616

ちなみにこのアドベントカレンダーは皆勤賞のQiitaくんのぬいぐるみに惹かれて挑戦している大変ゆるい挑戦のものです。そんな感じで読んでいただければ幸いです。
ちなみにアドベントカレンダー、アドベントコード共に初挑戦です٩( ᐛ )و

---
次の日: [[Advent of Code 2024] Day 2: Red-Nosed Reports](https://qiita.com/mae616/items/d9171df55b29864e958d)

# 本日のお題

https://adventofcode.com/

https://adventofcode.com/2024/day/1

# 物語はなんだ？
(最初はアドベントコードの概要かな？)
※ アドベントカレンダーは25日まで

> 毎年、クリスマスのサンタクロースのソリの発進を欠かさず見ている主任歴史学者を最近見ない。
> 他の歴史学者たちが主任歴史学者の現れそうな北極の地点を確かめて25日のサンタクロースが出発する前に主任歴史学者を探し出そう。「現れそうな北極の地点」は50個あって、1日に2個のパズルを解いてね。

て、ことらしいです。ファンタジーですね。世界観があって素晴らしいです。
2個解くのか。ありゃ、結構大変そう ꉂꉂ( ᐛ )

# 1問目のお題と物語
※ すごく適当に訳したり付け加えてます
> 歴史学者たちは、とりあえず、「現れそうな北極の地点」のリストを作ろうと主任歴史学者のオフィスにきた。すると何かのリストやらメモやらを発見した。もしやこれは、主任歴史学者がどっかにいく前に行こうとした場所をメモしたものかも。

おお、素晴らしい٩( ᐛ )و

> 主任歴史学者のオフィスに散らばってるメモを集めようと、歴史学者たちは、2つのグループに分かれてリストやらメモやらをそれぞれ全部見て「完全なリスト」を作ろうとした。（ちなみに主任歴史学者は場所を「場所ID」というのでメモしてた）
> 2つのグループがどちらも「完全のリスト」を作ったら、どうもその2つの「完全なリスト」が似てないっぽい。
> 1つ目のお題はその2つの「完全なリスト」の照合を手伝いましょう。

て、ことらしいです。

## 実際のお題

例: 
```
3   4
4   3
2   5
1   3
3   9
3   3
```

要は1チームは左の「3, 4, 2, 1, 3, 3」て「完全なリスト」を出して、
もう1チームは右の「4, 3, 5, 3, 9, 3」て「完全なリスト」を出したらしいです。

これを左の一番小さい値「1」と右の一番小さい値「3」の差をとって、
次に左の二番目に小さい値「2」と右の二番目に小さい値「3」の差をとって
....
てひたすらやっていって差の合計を求めれば良いようです。

## 解いたコード
```javascript: day1_1/main.js
function main(input) {
  const args = input.split("\n");

  const a = [];
  const b = [];
  for (const arg of args) {
    if (arg === "") continue;
    const [tempA, tempB] = arg.split("   ");
    a.push(Number(tempA));
    b.push(Number(tempB));
  }

  a.sort((a, b) => a - b);
  b.sort((a, b) => a - b);

  let sum = 0;
  for (let i = 0; i < a.length; i++) {
    sum += Math.abs(b[i] - a[i]);
  }

  console.log(sum);
}

main(require("fs").readFileSync("./input/puzzle.txt", "utf8"));
```
下記で実行できます。
```zsh
cd day1_1
node main.js
```

https://github.com/mae616/adventOfCode2024/tree/main/day1_1

# 2問目のお題
> 2つの「完全なリスト」は違った。なんか場所IDが重複してないか？

てことで...

## 実際のお題

例: 
```
3   4
4   3
2   5
1   3
3   9
3   3
```

これを左の一番上の「3」と右のリストで「3」が出てくる回数をかけて(3 * 右で3が出てくる回数)
次に左の二番目の「4」と右のリストで「4」が出てくる回数をかけて(4 * 右で4が出てくる回数)
....
てひたすらやっていってその掛け算して求めた値の合計を出せば良いようです。


## 解いたコード
```javascript: day1_1/main.js
function main(input) {
  const args = input.split("\n");

  const a = [];
  const b = {};
  for (const arg of args) {
    if (arg === "") continue;
    const [tempA, tempB] = arg.split("   ");
    a.push(Number(tempA));

    if (tempB in b) {
      b[tempB]++;
    } else {
      b[tempB] = 1;
    }
  }

  let sum = 0;
  for (let i = 0; i < a.length; i++) {
    if (a[i] in b) {
      sum += a[i] * b[a[i]];
    }
  }

  console.log(sum);
}

main(require("fs").readFileSync("./input/puzzle.txt", "utf8"));
```

https://github.com/mae616/adventOfCode2024/tree/main/day1_2

1日目は終わり٩( ᐛ )و
最初から暗礁に乗り上げてますが主任歴史学者さんは見つかるのでしょうか。がんばれ٩( ᐛ )و

お疲れさまです٩( ᐛ )و

---
海外の人と一緒にヒャッハー！
https://www.reddit.com/r/adventofcode/

(何故、Googleスプレットシートで解いてる人がいるのでしょう。驚異です...)
Radix UIのdropdown menuを開くとscrollbarが消えてスタイルが変わるときの対処法

Radix UIのdropdown menuを開くときに，スクロールバーが消えてスタイルが変わってしまうことがあった．見栄えが悪いので修正しようとしたが記事がなく，修正に手間取ったのでここに修正方法を記す．

該当のコードは以下の通り．

```tsx
"use client";
import { Moon, Sun } from "lucide-react"
import { useTheme } from "next-themes"
 
import { Button } from "@/components/ui/button"
import {
  DropdownMenu,
  DropdownMenuContent,
  DropdownMenuItem,
  DropdownMenuTrigger,
} from "@/components/ui/dropdown-menu"

export const ThemeToggle = ({ children }: { children: React.ReactNode }) => {
  const { setTheme } = useTheme();

  return (
    <>
      {children}

      <DropdownMenu>
        <DropdownMenuTrigger asChild>
          <Button
            variant="outline"
            size="icon"
            className="
              fixed bottom-8 right-8 
              dark:text-gray-800 text-gray-200
              hover:dark:text-gray-700 hover:text-gray-200
              dark:bg-white bg-black
              hover:dark:bg-gray-100 hover:bg-gray-950
              dark:border-white border-black
            "
            >
            <Sun className="h-[1.2rem] w-[1.2rem] rotate-0 scale-100 transition-all dark:-rotate-90 dark:scale-0" />
            <Moon className="absolute h-[1.2rem] w-[1.2rem] rotate-90 scale-0 transition-all dark:rotate-0 dark:scale-100" />
            <span className="sr-only">Toggle theme</span>
          </Button>
        </DropdownMenuTrigger>
        <DropdownMenuContent
          align="end"
          className="
            dark:text-gray-800 text-gray-200
            hover:dark:text-gray-700 hover:text-gray-200
            dark:bg-white bg-black
            hover:dark:bg-gray-100 hover:bg-gray-950
            border-none
          "
        >
          <DropdownMenuItem className="dark:hover:bg-gray-300 dark:hover:text-black" onClick={() => setTheme("light")}>
            Light
          </DropdownMenuItem>
          <DropdownMenuItem className="dark:hover:bg-gray-300 dark:hover:text-black" onClick={() => setTheme("dark")}>
            Dark
          </DropdownMenuItem>
          <DropdownMenuItem className="dark:hover:bg-gray-300 dark:hover:text-black" onClick={() => setTheme("system")}>
            System
          </DropdownMenuItem>
        </DropdownMenuContent>
      </DropdownMenu>
    </>
  );
};
```
ボタン要素が`fixed`だからおかしくなったのかなとは思うが`fixed`は使わざるを得ない．ちなみにレスポンシブでは同様のバグは発生しなかった．もちろんスクロールバーが出ない状態でも発生はしない．

修正方法は以下の通り．`grobals.css`にこれを追加するだけ．

```css
body[data-scroll-locked][data-scroll-locked] {
  overflow: auto !important;
  margin-right: 0 !important;
}
```

`data-scroll-locked`属性が2回付与された`body`要素に対して適用している．おそらくJSによってdata-scroll-lockedをbodyに付与することでスクロールを無効化しており，dropdown menuにその機能があったのではないかと推測している．

`[data-scroll-locked][data-scroll-locked]`のように2回付与された場合しか適用できなかった．

そしてこの時に`overflow: auto !important;`と`margin-right: 0 !important;`を指定している．

前者は要素がオーバーフローをしたときにスクロールバーを表示させるようにしているが，`!important`によってそれを優先的に適用させている．

このときになぜかbodyに`margin-right: 16px !important`が付与されるため，後者のように指定することでそれを無効化している．


参考
[shadcn/radix ui scrollbar removal bug](https://www.reddit.com/r/reactjs/comments/1fjcwkh/shadcnradix_ui_scrollbar_removal_bug/?rdt=60694)
【勉強記録】11月の成果

# はじめに
こんにちは、独学でソフトウェアエンジニアになるために勉強しているものです。
本日は、11月の成果について勉強記録をつけているので振り返っていきたいと思います。

# 11月の勉強成果
11月は大学の勉強をやりながらなので勉強時間は先月に比べて減っていると思いますが、遊びの予定があって勉強はほぼ毎日続けました。
記事投稿する際も内容を調べたりまとめたりするのでかなりいい勉強になりました。

### 勉強時間
11月の勉強時間は90時間でした。
先月と比べて10時間減ですが、11/27~12/1までサンクスギビングというアメリカの休日で旅行に行っているので、その時間を通常通り勉強に当てたら先月より多いかもしれません。
今月は先月より土日の勉強時間を延ばすことに成功しました！

### 新たにやったこと
* 持ち歩くPCにもQiita-CLIとGitを入れて旅行中でも記事を投稿できるようにした
* innternational studentのイベントに行き、友好関係を広げるように取り組んだ
* 日本に興味のあるアメリカ人と追加で2人連絡先を好感した
* 学校の先生と中学生ぶりに現地の卓球クラブに行った
*  Web技術の基本を読み始めた
* 毎日ではないが、英語のpodcastを聞いて、便利そうな表現をまとめて定期的に見返すようにしている

### 12月から挑戦したいこと
* 大学が中旬に終わるので、それまでに交友関係を広げて英語力向上を図る
* アウトプットをしたいので、オンライン英会話を始める
* international イベントに参加して引き続き交友を広げる
* たのしいRubyがかなり曲者なので12月中には終わらせて、Railsを始める
* 語学学校が終わると午前中も時間ができるので、Ruby以外のスキル(webやインターネット周りの知識)の勉強も併せてやる

# まとめ
11月もあっという間に過ぎてアメリカに来てからそろそろ5カ月がたとうとしています。
もちろん前よりもスピーキングとリスニングが上がっている気がします。
プログラミングの勉強についても、今まで触れてこなかった深い勉強をしている気がします。
これが必要であるか否かは今の段階では判断できませんが、ただ学ぶだけでなく用途を意識しながら積み上げていきたいと思います。
Next.js App routerで，Custom 404 pageにレイアウトを適用させない方法

`Layout.tsx`は配置されているディレクトリの中身に適用される 

→ `not-found.tsx`と`page.tsx`とで違うディレクトリにすれば良い．

→ 普通のディレクトリにいれるとルーティングされるので，論理グループを使う

```txt
app/
    (default_site)/
        /page.tsx
        about/page.tsx
        contact/page.tsx
        layout.tsx
    (error_layout)/
        layout.tsx
        not-found.tsx
components/
utils/
```

このように配置すればいい

参考
[How to remove the Layout on 404 page](https://github.com/vercel/next.js/discussions/37311)
shadcn/uiでdarkmodeに切り替えるときのHydration errorを解決する方法

`theme-provider.tsx`を

```tsx
'use client';

import { ThemeProvider as NextThemeProvider } from 'next-themes';
import { type ThemeProviderProps } from 'next-themes/dist/types';
import { useEffect, useState } from 'react';

export const ThemeProvider = ({ children, ...props }: ThemeProviderProps) => {
  const [mounted, setMounted] = useState<boolean>(false);
  useEffect(() => {
    setMounted(true);
    return () => setMounted(false);
  }, []);
  return (
    mounted && <NextThemeProvider {...props}>{children}</NextThemeProvider>
  );
};
```
のようにすればよいらしい．このようにしたら治った．

参考
[DarkMode切替時でのHydration errorの対応策](https://zenn.dev/dk_/articles/dd9b0426e58f7d)
どのようにアドバタイズするか

# BGPが経路を決める基準
### BGPのルーティングポリシーに従ってルートを選ぶ
>距離ベクトル・ルーティングではあるが、RIPのようなイントラドメイン・距離ベクトル・ルーティングとは全く異なる。

>BGPで経路選択を行う際には、最短距離の経路を選ぶのではなく、ルーティング・ボリシーが用いられる。

### ベクトル・プロトコルで記録する
>各宛先へのルートのコストを維持するする代わりに、利用したルートをそれぞれのBGPルーターが記録しておくことである。このような方法は、経路ベクトル・プロトコル(path vector protocol)と呼ばれている。

# BGPの経路の名前
>`次ホップのルーターとルートが経由した一連のASを逆順に並べたAS経路（AS path)`からなる。

### 経路の内容は次ホップのルーターと経由したASを逆順したもの
>BGPにおけるルート・アドバタイズの例を図5−69に示す。三つのASがあり、中央のASは左右のISPにトランジット・サービスを提供している。プレフィックスCへのルート・アドバタイズはAS３から出発する。図の上部であるR2Cへのリンクを通過している地点では、`AS経路はAS3のみであるり、次ホップのルーターはR3a`となる。図の下図のルート・アドバタイズも同一のAS経路を持つが、異なるリンクをたどっているため、次ホップのルーターは異なる。このアドバタイズはその後も伝搬を続け、AS１との境界を超える。図の上部にあるルーターR1αに到達した時点では、`AS経路はAS2、 AS３であり、次ホップおルーターはR2a`となっている。

#### 経由してきたルートは完全な経路情報になる
>ルートとともに、完全な経路情報を伝搬していくことで、それを受け取ったルーターは、ルーティング・ループを容易に発見、解消できるようになる。

# 経路のアドバタイズの流れ
### 自分のAS番号を追加して次に送る
>経路情報を伝搬するため、ASの外へ経路情報を送るルーターは、経路情報の先頭に自身のAS番号を追加する（AS番号のリストが経路の逆順となっているのはこのためである）。

### 受け取ったアドバタイズ(AS経路)がループを起こしそうなら破棄する
>経路を情報を受け取ったルーターは、自身を含むAS番号がAS経路にすでに登録されているかどうかをチェックする。すでに登録されている場合には、ループがあることがわかり、そのアドバタイズは破棄される。

https://bookplus.nikkei.com/atcl/catalog/23/03/16/00728/

# ルーティングループ
>　RIPのようなディスタンスベクタ型ルーティングプロトコルで最大の問題点と言っても過言ではないものがルーティングループです。ルーティングループはアップデートのタイミングなどにより発生し，`ルーティングテーブルが誤った情報を載せてしまい，その結果正しいルーティングが行われなくなります`。
>
>　ルーティングループは再配布などを除けばディスタンスベクタ型以外のルーティングプロトコルでは発生しないか，もしくは発生しにくくなっています。一方のリンクステート型やハイブリッド型のルーティングプロトコルでは，元々ルーティングループの防止を組み込んで作られています。

https://xtech.nikkei.com/it/article/COLUMN/20080715/310885/#:~:text=%E5%AD%A6%E3%81%B3%E3%81%BE%E3%81%97%E3%82%87%E3%81%86%E3%80%82-,%E3%83%AB%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E3%83%AB%E3%83%BC%E3%83%97,%E3%81%AE%E9%98%B2%E6%AD%A2%E3%82%92%E7%B5%84%E3%81%BF%E8%BE%BC%E3%82%93%E3%81%A7%E4%BD%9C%E3%82%89%E3%82%8C%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82,-%E3%81%A7%E3%81%AF%EF%BC%8CRIP%E3%81%A7

# 感想
経路を進みながら逆順の経路をアドバタイズする
JSビット演算子

```js
let a = 5;  // 0101（二進数）
let b = 3;  // 0011（二進数）

let result = a & b; // 0101 & 0011 = 0001（二進数）
console.log(result); // 1
```

これは5と3を二進数にしたとき、１桁目がどちらも１だったから0001（二進数）を返し、それは1だから1を返すということで
```js
let a = 7;  // 0111（二進数）
let b = 5;  // 0101（二進数）

let result = a & b; // 0111 & 0101 = 0101（二進数）
console.log(result); // 5
```

は一致してるのが３桁目と１桁目なので、 0101（二進数）を返し、それは５なので結果が5になるということ
なにもしていないのに、buildに失敗した話

Pythonで開発中.

requirements.txtを触ってないのにビルドが失敗...
エラーメッセージは「client-init got an unexpected keyword argument proxies」

おいおいおい。どうして急に？
原因を調べたら、openaiパッケージのバージョン1.55.3にアップデートする必要があるとのこと.

うそやん。そんなことある？
そこでバージョンを指定して再ビルドしたら、無事Buildに成功

急なアップデートは問題ないけど、今まで使用できたものが使用できなくなるのは、あまりよろしくないですぞ...
OpenAIさん、もう少し安定した更新をお願いします(´ω｀)

#調べたページ
https://community.openai.com/t/client-openai-returns-error-client-init-got-an-unexpected-keyword-argument-proxies/1035249/14
mac+node+vue.js環境構築(2024/12)

## mac + node(nodebrew)でVue.jsプロジェクトを作成
 本記事ではmac環境にnodebrewによるnode.jsをインストールし、vue.jsプロジェクトを作成します。

## 前提
本記事では下記の前提のもと記載します。
* OSは以下
```zsh
%sw_vers
ProductName:		macOS
ProductVersion:		15.1
BuildVersion:		24B2083
```

* homebrewのインストール済み
```zsh
%brew -v
Homebrew 4.4.8
```
　

環境構築

### nodebrewのインストール
以下のコマンドを実行する。
```zsh
%brew install nodebrew
```

### インストール後の確認
```zsh
%nodebrew -v
nodebrew 1.2.0
```

### nodeのインストール
必要に応じて下記コマンドのどちらかを実行する。
* 最新版をインストール
```zsh
%nodebrew install latest
```
* 安定版をインストール
```zsh
%nodebrew install stable
```
### インストールされたnodeのバージョン確認
```zsh
%nodebrew ls
v22.11.0
current: none
```
### インストールしたnodeの有効化
``` zsh
nodebrew use v22.11.0
```

### 有効化されたか確認
```zsh
%nodebrew ls
v22.11.0

current: v22.11.0
```

### シェル(zsh)でnodeコマンドを実行できるよう、環境パスを通す。
・下記コマンドを実行する。

```zsh
%echo 'export PATH=$HOME/.nodebrew/current/bin:$PATH' >> ~/.zprofile
```

### nodeコマンドを実行して最終確認
```zsh
%node -v
v22.11.0
```

## vue.jsプロジェクトを作成
下記コマンドを任意のディレクトで実行する。
```zsh
%npm create vue@latest
```

### 参考
* 下記ページのReadme
https://github.com/hokaccha/nodebrew
* 下記ページの「クイックスタート」章
https://ja.vuejs.org/guide/quick-start
kotlin アルファベットの小文字を大文字に変換方法

アルファベットの小文字を大文字に変換方法です。

```Utils.kt
    fun toUpper(text: String): String {
        return text.uppercase()
    }
```

あまり使う時は少ないかもしれませんが、アルファベット小文字を大文字にこれで変換できます。
next.js npm run devでEACCES: permission denied, mkdir '/Users/xxx/my-app/.next'になる場合

# はじめに
next.jsで新規プロジェクトを作って、`npm run dev`で開発環境を立ち上げようとしたらこんなエラーになりました。

```console
$npm run dev

> indofullness-app@0.1.0 dev
> next dev

   ▲ Next.js 15.0.3
   - Local:        http://localhost:3000

 ✓ Starting...
Attention: Next.js now collects completely anonymous telemetry regarding usage.
This information is used to shape Next.js' roadmap and prioritize features.
You can learn more, including how to opt-out if you'd not like to participate in this anonymous program, by visiting the following URL:
https://nextjs.org/telemetry

[Error: EACCES: permission denied, mkdir '/Users/name/my-app/.next'] {
  errno: -13,
  code: 'EACCES',
  syscall: 'mkdir',
  path: '/Users/name/my-app/.next'
}
node:internal/process/promises:289
            triggerUncaughtException(err, true /* fromPromise */);
            ^

[Error: EACCES: permission denied, mkdir '/Users/name/my-app/.next'] {
  errno: -13,
  code: 'EACCES',
  syscall: 'mkdir',
  path: '/Users/name/my-app/.next'
}

Node.js v20.12.0
```


※ `name/my-app `の部分は編集して省略してます。

Next.js がプロジェクトフォルダ内に .next ディレクトリを作成しようとした際にアクセス許可がないのでエラーになるよ、ということらしいです。。。

# 権限を確認する
まずは権限を確認してみましょう。

```console
$ ls -ld /Users/name/my-app
drwxr-xr-x  16 root  staff  512 11 30 22:20 /Users/name/my-app
```

現在のユーザー (上記パスの`name`) ではなく、`root` が所有者となっています。このため、`npm run dev` コマンドでフォルダ内に書き込みを行う権限がないためエラーになってます。

# 権限を変更する

```console
$ sudo chown -R $(whoami) /Users/name/my-app

$ chmod -R 755 /Users/name/my-app
```

まずは指定したディレクトリとその中のすべてのファイルの所有者を現在のユーザーに変更します。
以下はGPTさんによる解説

>sudo
管理者権限でコマンドを実行します。所有権の変更には通常、管理者権限が必要です。

>chown
"change ownership" の略で、ファイルやディレクトリの所有者を変更します。

>-R
再帰的 (recursive) に実行します。このオプションにより、指定されたフォルダとその中に含まれるすべてのサブフォルダやファイルの所有権が変更されます。

>$(whoami)
現在ログインしているユーザーの名前を取得します。この値が新しい所有者になります。例えば、現在ログインしているユーザーが gento であれば、この部分は gento に展開されます。

次に指定したディレクトリとその中のすべてのファイルのアクセス権を 755 に設定

>chmod
"change mode" の略で、ファイルやディレクトリのアクセス権（パーミッション）を変更します。

>755
設定するパーミッション（アクセス権）です。以下に分解して説明します：
7 (所有者): 読み取り (r), 書き込み (w), 実行 (x) のすべてが許可される。
5 (グループ): 読み取り (r) と実行 (x) が許可される。
5 (その他): 読み取り (r) と実行 (x) が許可される。

これで`npm run dev`が成功です！！！
【書評】データ指向アプリケーションデザイン

# 読んだ本

https://www.oreilly.co.jp/books/9784873118703/

# 感想

エンジニア必読の書として有名だが、なかなかの分厚さに長い間躊躇していたがなんとか読み切った。毎日少しづつ読んで二ヶ月はなかなかハード。
特にWEBアプリケーションのバックエンドではデータをどう扱うかが一番の関心事項と言っても過言ではないが、本書ではこのデータを取り巻く技術を広く取り扱う。引用も多く、そこも辿って読むなら相当な力がつきそうだ。

大枠では三章建てになっていて、１章ではデータベース絡みの基礎的な知識を、２章では分散システム時代のパーティショニングやシャーディングなどの問題、３章ではデータウェアハウスなど大量のデータを扱う際の課題について書かれていた。

最近だとAmazon Auroraなど既存の技術の延長として、気付いていなくても分散システムの恩恵を受けていることが多い。本書を読むことで、こういった分散システムの裏にどんな困難な課題があるのか、少し理解が深まった。ここまで高度なものでなくても、アプリサーバーのスケールアウトなども分散システムのひとつなので身近な内容でもある。読後に、実務でも本書で扱われていた問題が起きる可能性がある場面に遭遇し、かなり低頻度なので運用でカバーするという判断をした。その際、その問題について詳細に説明しないと伝わらず、なかなか辛かった。この本を読んで欲しい。

# おすすめの人

- アプリケーション開発に携わる人全般

# 次に読むなら

- 「システム設計の面接試験」は後半に分散システムについての内容が含まれていた。本書より優しいので先に読むのもおすすめ
2年ほど前の自分の転職活動を振り返る

# 背景
- 2年半ほどアプリケーションエンジニア、データエンジニアとして活動していた
- クラウドネイティブな環境で、モダンな手法の開発がしたかった
- それまでの職場では、クラウドのサービス新規使用申請が下りるまで平均一月、最大半年ほど待つケースもあるといった話を耳にしており、自分の望む仕事ができそうにないと判断した
- 2022年4月頃〜7月頃まで実施、10月1日から新職場に着任

# 当初のビジョン
- 手を動かすエンジニア職種で、アプリケーションエンジニア or データエンジニアに絞る
- 大きすぎない規模のシステム開発あるいはデータの可視化・データ基盤構築案件に絞る
- 業務ドメインは絞らず、事業会社〜コンサルまで幅広に見る

# どのように活動が進んだか

## 選考フローと期間
- 基本的には書類選考→webテストあるいはコーディングテスト→複数回面接→オファー　の形で進む
- 1つの企業の選考応募〜内定までは1〜2ヶ月ほどかかる

## 各選考段階で気をつけるべきこと

### 書類選考
- openworksやlinkedinなどのポータルサイトにweb履歴書を登録し、他の企業の出すオリジナルレイアウトにはコピペベースで対応できるようにする
- ChatGPTなどの生成AIサービスを用いてレイアウト修正するのもあり
- エージェントの提供するエクセルやワードのフォーマットだとレイアウトが崩れる時は、許可をもらってMarkdownで記述し、PDFにエクスポートして提出するのもあり

### webテスト、コーディングテスト
- 面倒がらずに速やかに受ける
- コーディングテストは対策必須
　- tracktestなど、どのサービスを使用するか分かっている場合は無料登録して温度感、必ず使用するコードなどを確かめておく
　- ソート系、FizzBuzz系などの有名なアルゴリズムは実装できるようにしておく

### 各種面接
- 聞かれる内容は、志望理由、今までの実績、仕事の進め方、着任後の仕事やキャリアについてに大別できる
- 面接時間中は回答内容の掘り下げが続くので、聞かれたことに簡潔に答え続けることを意識する

#### 質問例： 志望理由について
- 転職を考えた理由
- 何故うちなのか、他社でない理由は何か

#### 質問例：今までの実績
- 参画案件概要と従事したロール
- 最も主体的に取り組んだ職務内容とそれによって生み出した価値を可能な限り定量的に話してほしい
- 技術力を問うような質問（以下は一例）
　- アプリケーションをホストする際に、可用性やセキュリティ的の側面から気をつけること
　- tcpとudpの違い
　- dbのacid特性とは
　- dbの正規化とは何か、第一〜第三まで

#### 質問例：仕事の進め方
- どのようなステークホルダーと進めてきたか
- チームメンバー、上司、ステークホルダーと仕事をする際のコミュニケーション
　- 思い通りにタスクが上がってこないメンバーとの接し方
　- 要件整理のためにどのようなコミュニケーションを取るか
　- 意見が食い違った時の擦り合わせ方

#### 質問例：着任後の仕事やキャリアについて
- 新規職場での3-5年のキャリア
- 技術を極めたいのか、事業ドメインやIT企画系に向けた方向へ進みたいのか


### オファー
- 場合によっては給与の交渉が効く。内資企業の場合は向こうの給与テーブルに沿って指定されがちだが、提示額に対して最低50万ほどは上げられる気がする
- オファー受諾意志の提示猶予はだいたい1週間

# 気づいたこと
- 自分は事業ドメインよりは新しくて実用的な技術に興味がある
- 求人内容にどれだけ興味を持てるか、その案件の先にどのようなキャリアを築けるかを重要視したほうが良い
- 技術的な質問は、基本的には基本情報レベルの中で実用的な内容に限定されたものが多い
　- 普段意識して業務に取り組んでいなくても、ここを疎かにした結果足切りを食らうケースもそこそこあるので対策しておく
　- この辺の質問はChatGPT などで壁打ちして整理しておくと楽
- よほど応募したい企業を絞れるまでは、カジュアル面談程度にとどめておき、5社までに絞れてきたら一気に面接を進める、みたいな方法だと短めに活動を終わることができそう