OmniAICreator/Qiita-1.07M huggingface dataset:
今さら聞けない！Linuxの基本コマンド4選【mkdir / rmdir / touch / cat】

# Linuxの基本コマンド【mkdir / rmdir / touch / cat】

こんにちは！今回は **Linuxの基本コマンド** について解説します。

Linuxを使い始めたばかりの方にとって、最初のハードルとなるのが「コマンド操作」。  
特に **ファイルやディレクトリの作成・削除・確認** といった基本操作は、日常的に使う場面が多く、しっかりと理解しておきたいところです。

本記事では、そんな方のために、Linuxの中でも特に使用頻度の高い **基本コマンド4つ** をピックアップして、わかりやすく解説していきます！

---

## **mkdir：ディレクトリを作成する**

### **基本的な使い方**
```bash
mkdir ディレクトリ名
```
### **よく使うパターン**
| コマンド | 説明 |
|---------------|----------------------|
| `mkdir test`  | `test`ディレクトリの作成 |
| `mkdir -p parent/child`  | 階層構造になっている複数のディレクトリを一度に作成 |

### **ワンポイント** ###
`-p`オプションを使えば、**親ディレクトリが存在しない場合でも自動で作成**してくれます。


## **rmdir：空のディレクトリを削除する**

### **基本的な使い方**
```bash
rmdir ディレクトリ名
```
### **よく使うパターン**
| コマンド | 説明 |
|---------------|----------------------|
| `rmdir test`  | 空の`test`ディレクトリの削除 |

### **注意点** ###
・`rmdir`は空のディレクトリしか削除できません。
・中にファイルがある場合は、`rm -r`を使いましょう。


## **touch：空のディレクトリを削除する**

### **基本的な使い方**
```bash
touch ディレクトリ名
```
### **よく使うパターン**
| コマンド | 説明 |
|---------------|----------------------|
| `touch index.html`  | 空の`index.html`ファイルの作成 |
| `touch a.txt b.txt`  | 複数ファイルを一括作成 |

### **ワンポイント** ###
・`既存ファイルがある場合は、更新日時だけが変更`されます。


## **cat：ファイルの中身を表示する**

### **基本的な使い方**
```bash
cat ディレクトリ名
```
### **よく使うパターン**
| コマンド | 説明 |
|---------------|----------------------|
| `cat memo.txt`  | `memo.txt`の中身を表示 |
| `cat file1 file2 > merged.txt`  | 複数ファイルを結合して新しいファイル`merged.txt`に出力 |

### **ワンポイント** ###
・長いファイルは`less`や`more`と組み合わせると見やすくなります。


## **まとめ** ##
| コマンド | 説明 |
|---------------|----------------------|
| `mkdir`  | ディレクトの作成 |
| `rmdir`  | 空ディレクトリの削除 |
| `touch`  | 空ファイルの作成・更新 |
| `cat`  | ファイル内容の表示・結合 |

まずはターミナルで `実際に使ってみる` ことが大切です！
次は `これらのコマンドを使った練習問題` にもチャレンジして、習得していきましょう！

👉練習問題へすすむ
Linux基本コマンド 練習問題【mkdir / rmdir / touch / cat】

# はじめに

こんにちは！  
今回は **前回の記事** で解説した Linux の基本コマンド **mkdir / rmdir / touch / cat** の **練習問題** です。

Linuxを使う上で欠かせない **ファイル・ディレクトリの操作** を習得するために、実際にコマンドを試してみましょう！

---

## **事前準備**
まずは **練習用の環境** を整えましょう。  
以下のコマンドを順番に実行してください。

```bash
cd ~
mkdir -p Practice/Notes
cd Practice
touch memo.txt
echo "Hello Linux!" > memo.txt
```

## **練習問題一覧**
- 1.ディレクトリを作成しよう（mkdir）
- 2.空のディレクトリを削除しよう（rmdir）
- 3.ファイルを作成しよう（touch）
- 4.ファイルの中身を表示しよう（cat）
- 5.応用問題：ファイルを作って中身を確認しよう

## **Linux基本コマンド 練習問題**
### **問題1：ディレクトリを作成しよう（mkdir）**
**指示**: 現在 `/home/user` にいます。`Projects` フォルダを作成してください。

<details>
  <summary>答えを見る</summary>
mkdir Projectus
</details>

### **問題2：空のディレクトリを削除しよう（rmdir）**
**指示**: 先ほど作成した `Projects` ディレクトリを削除してください。
※ 中に何も入っていない状態であることを確認 してください。

<details>
  <summary>答えを見る</summary>
rmdir Projects
</details>

### **問題3：ファイルを作成しよう（touch）**
指示 : `Notes` ディレクトリ内に `todo.txt` という空のファイルを作成してください。

<details>
  <summary>答えを見る</summary>
touch Notes/todo.txt
</details>

### **問題4：ファイルの中身を表示しよう（cat）**
**指示**:  `memo.txt` の中身を表示してください。

<details>
  <summary>答えを見る</summary>
cat memo.txt
</details>

### **問題5（応用）：ファイルを作って中身を確認しよう**
**指示**:  
1. `Practice` ディレクトリ内に `greeting.txt` を作成
2. **「Hello, world!」** という文字列をそのファイルに書き込む
3. `cat` コマンドで内容を確認する

<details>
  <summary>答えを見る</summary>
touch Practice/greeting.txt <br>
echo "Hello, world!" > Practice/greeting.txt <br>
cat Practice/greeting.txt

</details>


# お疲れ様でした！

ここまでお読みいただき、ありがとうございました！
**mkdir、rmdir、touch、cat** は **Linux**操作の基本 となる大切なスキルです。
今回の練習問題は通して、**コマンドの使い方を実践的に学べた** と思います。
次は **よりオプション等を使用して**挑戦してみましょう！


---
【Day8】フロントに表示する画像のサイズを小さくする

## はじめに

勉強とアウトプットを兼ねて、Webアプリ開発の記録を記事にしてみます。

個人のメモ的な側面が強いです。
Web開発初心者すぎて至らぬところだらけだと思いますが、暖かい目で見ていただければ幸いです。

↓ これまでの内容 ↓
[【Day0】アプリが完成するまで毎日投稿](https://qiita.com/midorigame/items/f9b9a445c945b4a837b1)
[【Day1】開発環境を考える](https://qiita.com/midorigame/items/e26344599e2ffaa22033)
[【Day2】開発環境を構築する、、、はずでした](https://qiita.com/midorigame/items/3f57f2691a8e1074adb8)
[【Day3】まずはフロントだけ開発環境を構築する](https://qiita.com/midorigame/items/9de27ba72aaef504a833)
[【Day4】バックエンドの開発環境を整えつつ、マルチコンテナ対応のDevcontainerにする](https://qiita.com/midorigame/items/5b95374cd85f715a6498)
[【Day5】お試し実装！ファイルをアップロードしてバックエンドで処理する](https://qiita.com/midorigame/items/9663f0063b95b501c08a)
[【Day6】Docker Desktopが起動しなくなり泣きながら原因調査する](https://qiita.com/midorigame/items/d07df1caf05267d0609d)
[【Day7】画像にフレームとExif情報を付けてみる](https://qiita.com/midorigame/items/e2d85ce8dd7a5bcb5daf)

## 前回のあらすじ

バックエンドで受け取った画像の加工処理を実装しました。


## 今回やったこと

画像を処理中の時にステータスメッセージを表示させるようにしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307348/ad9a8da1-67a2-4d1f-91e2-3c64cb3b3c3f.png)


また、ブラウザ上に表示する画像のサイズも小さくしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307348/43562107-db0a-45d8-982e-9903d72a90b5.png)

今日は力尽きてしまい、これでおしまい、、、

## 気づいたこと

backendコンテナからfrontendコンテナに切り替えたらDevcontainerで接続時に以下のエラーが出ました。


```text
[8142 ms] Start: Run in container: /bin/sh -c chown -R devuser:devuser /home/devuser/workspace
chown: '/home/devuser/workspace/frontend/package.json' の所有者を変更中: 許可されていない操作です

(中略)

chown: '/home/devuser/workspace' の所有者を変更中: 許可されていない操作です
[8578 ms] postStartCommand from devcontainer.json failed with exit code 1. Skipping any further user-provided commands.
```

書いてある通り、DevcontainerでpostStartCommandとして実行している`chown -R devuser:devuser /home/devuser/workspace`というコマンドがうまくいってないみたいですね。

確かにworkspace以下を参照してみると、フォルダの所有者がdevuserになっていないですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307348/4b24b529-6b29-4a5e-83f4-9e88f7d09f02.png)

frontendでもDockerfile内でdevuserにsudoを付与してるんですけどね、、、

ためしにコンソールで`sudo chown -R devuser:devuser /home/devuser/workspace`と手動で実行してみたら権限が変わりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307348/99e34991-567f-4fb1-8afe-4eadbd10e14f.png)

ただ、おかしいことにfrontendのコンテナにリモートアクセスしているはずなのに、frontendのサーバーが自動で起動してて、backendのサーバーが立ってない。
でもコンテナ自体はNodeのもので、Python用の環境設定はない。

どういうこと？？？

改めてfrontendのコンテナをRebuild without cecheしたら元通りになりました。。。Docker難しい。。。。


## おわりに

今日はフロントの実装にしました。

Docker周りでまた躓きました。初心者が一番詰まるのは開発環境構築ですね。泣
【長田総一郎】ノーコードだけじゃ足りない？Zapier×GASで業務自動化



スタートアップやフリーランスの方にとって、スピード感と柔軟性は命。
でもノーコードツールだけでは対応しきれない業務も多いのではないでしょうか？
そんなときにおすすめしたいのが「Zapier × Google Apps Script（GAS）」の組み合わせです。


なぜZapierだけでは足りないのか
Zapierはドラッグ＆ドロップで簡単接続できるが、細かい条件分岐やAPIの高度な処理には不向き

無料枠だと実行回数やAPIリクエスト数に制限があり、スクリプトの最適化が必要なケースが多い

データの後処理・バルク更新・独自メソッド呼び出しなどはZapierでは実現しにくい

つまり、「簡単だけど柔軟性が足りない」という壁に直面するケースが散見されます。



なぜGASと組み合わせると楽になるのか
GASで細かい処理を書くことで、Zapier単独では難しい条件分岐や業務ロジックを実現可

Zapier → GAS のフローにして、データ加工や集計、APIエンドポイントの処理をGASに任せられる

GASはGoogle Workspaceとの連携が強力（スプレッドシート、ドキュメント、ドライブ連携など）

💡 実例：問い合わせフォーム→Slack通知→スプレッドシート集計の流れ
1. Zapierで“Webhook → Slack通知”を構築
問い合わせフォーム（例：Typeform）でWebhook URLをZapierに登録

トリガーは「New Entry」 → アクションで「Send Slack Message」

ここまでは標準的なZapierで完結しますが、
「内容をスプレッドシートに記録したい」「タグ分類したい」などのロジックはZapierだけでは辛い。



✅ メリットまとめ
特徴	Zapier単体	Zapier×GAS
条件分岐	◯（限定的）	◎（GASで自由）
集計・加工	△（有限）	◎（任意処理OK）
スプレッド管理	✕	◎（Spreadsheet API自由）
コスト	API超過で課金	GASは無料枠内で抑えやすい

ノーコードとスクリプトの良いとこ取りが可能となり、
「手軽さ」と「柔軟性」を両立した、自動化の最適解になります。

🚀 もう一歩踏み出すヒント
スキーマに応じてデータ検証や再送機構を作り込める

GASのライブラリ（OAuth2, JDBC, ChatAPIなど）を使えば、社内DB連携やLINE通知も可

定期実行（トリガー）でバッチ処理＆レポート出力も簡単

🔚 まとめ
Zapierは素晴らしい自動化ツールですが、
限界を感じたら GASと併用することで次のレベルに進めます。

・API柔軟性

・データ加工自由度

・Google Workspace連携力

特にマーケ系業務では、スクリプトとノーコードの融合が効率を最大化します。
ぜひZapierとGASのコンボで、自動化の世界を広げてみてください。
ubuntuにms系フォントをインストール

# 環境
- ubuntu22.04

## インストーラーのインストール

ターミナルを開き
```
sudo apt install ttf-mscorefonts-installer
```
を実行。
途中でライセンスの同意などを求められるのでTabキーとEnterキーで対応。
インストールが完了したらPCを再起動する。

## 確認
インストールされたフォントは`/usr/share/fonts/truetype/msttcorefonts
`に保存されるので
```
ls /usr/share/fonts/truetype/msttcorefonts
```
で見るのもいいし、
```
fc-list | grep "Times New Roman"
```
のように探してもいい。
欲しいフォントが見つかっていたらおしまい、
Amazon Q CLIで簡易的なゲームを作った

# Amazon Q CLIでゲーム開発に挑戦してみた - JAWS-UG横浜レポート

JAWS-UG横浜の「Build Games with Amazon Q CLI」イベントに参加してきました。Amazon Q CLIを使ったゲーム開発の体験レポートをお届けします。

## 作業内容

使い方を分かっていないので、とりあえずブログを真似してみることにしました。

参考にしたブログ：

https://community.aws/content/2v7MlfGov3QNOrh7wqmV5KtuY3v/lets-build-a-game-scratch-that-lets-build-two?trk=e025b97e-05b5-418d-bab8-034103b7ffbb&sc_channel=el_


### 環境セットアップ

Q CLIは以下をもとにインストールしています。(Win11でWSL2を使用)

https://community.aws/content/2v5PptEEYT2y0lRmZbFQtECA66M/the-essential-guide-to-installing-amazon-q-developer-cli-on-windows

pygameのインストール

```bash
python -m venv venv
source venv/bin/activate
pip install pygame
```

### Amazon Q CLIでゲーム生成

ブログの内容をコピペして、Amazon Q CLIに以下のプロンプトを投げてみました：

```
q /chat "write a pygame game which combines the ideas of pacman and nibbles"
```

すると、コードを提案してくれました！`t` (trust) をタイプするとファイルとして保存してくれます。

### 最初の実行とエラー対応

とりあえず保存したものを実行してみました：

```bash
python pacman_nibbles.py
```

しかし、エラーが発生：

```
$ python pacman_nibbles.py 
pygame 2.6.1 (SDL 2.28.4, Python 3.9.6)
Hello from the pygame community. https://www.pygame.org/contribute.html
Traceback (most recent call last):
  File "/home/taco/study/amznQ/20250609-jawsy/pacman_nibbles.py", line 364, in <module>
    game = PacNibbles()
  File "/home/taco/study/amznQ/20250609-jawsy/pacman_nibbles.py", line 36, in __init__
    self.reset_game()
  File "/home/taco/study/amznQ/20250609-jawsy/pacman_nibbles.py", line 51, in reset_game
    self.generate_dots(30)  # Start with 30 dots
  File "/home/taco/study/amznQ/20250609-jawsy/pacman_nibbles.py", line 94, in generate_dots
    self.add_dot()
  File "/home/taco/study/amznQ/20250609-jawsy/pacman_nibbles.py", line 103, in add_dot
    (x, y) not in self.power_pellets):
AttributeError: 'PacNibbles' object has no attribute 'power_pellets'
```

### デバッグとトラブルシューティング

エラーをQ CLIに貼り付けてみると、長いこと自問自答しながらデバッグしてくれました。デバッグ情報を追加したり、キー入力の検出部分を改善したりと、まるで人間のデベロッパーと一緒に作業しているような感覚でした。

最終的に、パックマンみたいなやつが動くイモムシゲームが完成！スコアも勝手に計算してくれています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89531/ff47e259-2975-41bc-b5b3-1ced0dfc6f84.png)


### AWS風カスタマイズ

「もっとAWSっぽい感じにできる？」と聞いてみると、面白い提案をしてくれました：

#### AWS風の変更案：

1. **キャラクター変更**：
   - Snake → EC2インスタンス
   - Dots → データパケット
   - Power Pellets → AWS Credits
   - Ghosts → セキュリティ脅威やコスト超過アラート

2. **色とテーマ**：
   - AWSオレンジ (#FF9900) とダークブルー (#232F3E) を使用
   - 背景を AWS コンソール風に

3. **UI要素**：
   - スコア → "Cost Optimization Score"
   - ゲームオーバー → "Service Disruption"

実際にコードを修正してくれて、以下のような変更が加えられました：

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89531/a889e5b1-2a7e-47a9-87bd-320ccad1f755.png)

出てくる言葉がAWSを意識したものになりました。

さらに改良を重ねて：

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89531/59d0b4b1-fa0a-4152-b37f-f6077263cab5.png)

見づらいと伝えると、さらに調整してくれて：
最終的にはこんな感じに：

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89531/126927af-5023-45fc-8c7e-05dd2407225e.png)

AWSっぽい？？？

## まとめ

Amazon Q CLIを使ったゲーム開発は楽しかったです。エラーが出ても一緒にデバッグしてくれるし、要望を伝えるとどんどん改良してくれる。まるでペアプログラミングをしているような体験でした。

JAWS-UGのイベントも非常に有意義で、実際に手を動かしながら学べる貴重な機会でした。Amazon Q CLIの可能性を実感できた一日でした。
Amazon Q CLI でゲームを作ろう！

みなさん知ってますか？
今、期間限定(2025 年5月20日から6月20日まで)でこんなキャンペーンが開催されています。

https://aws.amazon.com/jp/blogs/news/build-games-with-amazon-q-cli-and-score-a-t-shirt/

早速横浜支部でキャッチアップしてイベントを開催してみました。

https://jawsug-yokohama.connpass.com/event/355243/

結構な参加希望があり、Q CLI にみなさん興味津々・・・
今回も新高島の三菱電機さんの超素敵なオフィスで開催させていただきました！
いつもありがとうございます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117386/0ea9c92c-33db-442f-a0f5-809876ddc62c.png)

AWSJからも、konippiさん、稲田さん、金森さん、Katzさんと4名も参加いただきサポートしてくださいました。ありがとうございます！稲田さんは、日本語ブログの執筆者とのことで、本当に豪華な会となりました！


### では早速チャレンジ

先ほどの日本語ブログをみながらチャレンジです。

1. Builder ID が必要なので登録します
1. Q CLIをマシンにインストールします。今回は mac で挑戦です。
1. Q CLIでプロンプトを投入します。必要に応じて改善のプロンプトを投入していきます。

### できあがり
これだけです。簡単ですよね？コードは一切触る必要がありません。

作ったものはこちらです。4人パーティのドラクエ風ロールプレイングゲームです。
EC2、Lambda、S3、IAMの4人(?)が敵と戦ってくれます。オート戦闘モードもつけました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117386/b33ed85d-7591-4e5b-be40-0b6793d596a1.png)

プロンプトはこちら
```
ドラクエ風の4人パーティのゲームを作ってください　
パーティはEC2 Lambda S3 IAM とし、それ以外のAWSサービスを敵として登場させてください。
アイコンはAWSアイコンをモチーフにして HTML CSSで作成
攻撃や攻撃をうけた際にはエフェクトを表示し、攻撃や魔法攻撃、アイテムの利用ができるようにしてください　
オート戦闘モードを搭載してください　
うけこたえは日本語で、ファイルの出力先は ~/Downloads としてください
```

で、作成されたゲームの特徴はこちらです。
ドラクエ風なのに、エーテル、エリクサー！？
```
## ゲームの特徴
• **パーティメンバー**: EC2、Lambda、S3、IAMの4人で構成
• **敵キャラクター**: DynamoDB、CloudWatch、SNS、SQS、RDSと最終ボスのCloudFormation
• **バトルシステム**:
  • 通常攻撃と特殊攻撃
  • 魔法攻撃（ヒール、ファイア、サンダー、アルティメット）
  • アイテム使用（ポーション、エーテル、エリクサー）
  • オート戦闘モード搭載

## 遊び方

1. ブラウザで ~Downloads/aws-rpg.html を開きます
2. 各キャラクターが順番に行動します（アクティブなキャラクターは枠が光ります）
3. 「攻撃」「魔法」「アイテム」タブから行動を選択します
4. 「オート」タブでオート戦闘を開始できます
5. 敵を倒したら「次の敵」ボタンで次の敵に進みます
6. 「ゲームリセット」ボタンでゲームをリセットできます

## 技術的な実装

• AWSサービスのアイコンはSVGで簡易的に表現
• 攻撃や回復時にはエフェクトアニメーションを表示
• レスポンシブデザインで様々な画面サイズに対応
• JavaScriptでゲームロジックを実装
```
動く、それなりにちゃんとできてる！
プロンプトを投入してできあがるまでけっこう時間がかかりますが、時間がかかりすぎると、こんな気配りもしてくれます。エライ！
```
すみません、応答に時間がかかっていました。小さなステップに分けて作業を進めましょう。
```

### まとめ
CLIを体感するという意味ではすごく良い機会になったと思います。
今、このイベント対象国の中で日本は No.2 だそうです(2025/6/9現在)、是非みなさんもQ CLIでゲームを作ってエントリしてみましょう！
JIRAとLLMを連携して自動化できる作業

韓国のバイブ・コーディング・コンサルティング会社である[Roboco](https://roboco.io/)は、[L4バイブコーディング](https://qiita.com/DohyunJung/items/601d01b477a00d88176b)の実現を目標に、ソリューション開発とコンサルティングサービスを提供しています。

JIRAとLLMを連携して自動化できる作業の例を紹介します。

### 1. タスクのアサイン（担当割り当ての自動化）

* チケットの内容や作業負荷、スキルを考慮して最適な担当者をLLMが推薦し、自動的に割り当てる。

### 2. コンテキスト追加リクエスト（情報不足時の質問自動化）

* チケットの内容に情報が不足している場合、LLMが不足情報を特定して、チケット作成者や関係者に追加情報を求めるコメントを自動で投稿。

### 3. 優先順位の設定（プライオリティの自動判定）

* チケットの重要度や緊急度をLLMが分析し、自動的に優先順位を設定する。また、状況の変化に応じて優先順位を動的に調整。

### 4. チケット間の依存関係設定（タスク依存性の管理）

* 複数のチケットの関連性や順序を分析し、依存関係を自動で設定し、適切な順番でタスクを進行できるようにする。

### 5. チケット要約および自動分類（自動ラベリング）

* チケットの内容を分析して概要を簡潔にまとめ、適切なカテゴリー、ラベル、エピックを自動的に割り当てる。

### 6. 重複チケットの検知とマージ提案

* 似ている内容のチケットを自動で発見し、チケット統合の提案を関係者に通知。

### 7. 定例会議の議事録要約とアクションアイテム生成

* スプリントレビューやレトロスペクティブなど、定例会議の議事録を分析し、具体的なタスクとしてチケット化する。

### 8. リリースノートの自動生成

* 特定のリリースでクローズされたチケットを元に、ユーザー向けのリリースノートを自動作成する。

### 9. 進捗状況の要約・レポート作成

* 現在のプロジェクトやチームの進行状況をJIRA上のデータから分析し、進捗状況をSlackやメールで共有するレポートを作成。

### 10. 完了タスクの振り返り（レトロスペクティブ）

* クローズしたチケットを分析して、作業遅延の原因や改善すべき点を特定し、振り返りのためのインサイトを提示。

### 11. リスク検知・アラート生成

* チケットの内容、進行状況、依存関係を元に、プロジェクトのリスクや問題点を自動で検知してアラートを発信。

### 12. 質問対応自動化・FAQ作成支援

* 類似質問を繰り返すユーザーや関係者に対し、チケットへの自動回答を提供し、よくある質問（FAQ）を自動更新・整備する。

### 13. タスクの所要時間・リソース予測

* 過去のタスク情報を元に、新規タスクに必要な所要時間や適切な人材配置を自動で予測・推薦。

### 14. ナレッジベース管理・ドキュメント連携

* JIRAのチケットから得られたノウハウや議論の結果をConfluenceなどのナレッジベースへ自動的に反映し、情報共有を円滑化。

JIRAとLLMの連携により、これらの管理作業を効率化・自動化することで、チームの生産性と品質向上につなげられます。

現在、[Roboco](https://roboco.io/)は[L4バイブコーディング](https://qiita.com/DohyunJung/items/601d01b477a00d88176b)を目標としており、そのためにはソフトウェア開発に関連するすべての活動においてAIを全面的に活用する方向へ思考の転換が必要だと考えています。
AWSエンジニアに向けての所信表明

# なんでこの記事を書こうと思ったか
この度、中小SES企業からAWS構築専業の企業へ転職しました。(入社は10月1日)
この記事は今の経験の棚卸しとAWSエンジニアへ進むための所信表明としてとして投稿しておきます。
また、同じような立場からAWSエンジニアに進みたい人にとって励みになれたら嬉しいです。

# 経歴
## IT入門前
某私立大学を中退後、バイトとして働いていた飲食店でそのまま店舗責任者という形で働いていました。
バイトの時と違って、シフトに穴が空けば店舗責任者が埋めるようなブラック環境だったため、月300時間以上は労働していた記憶です。
毎日、帰宅しては寝るだけの生活で、スキルも身につかないと思っていたため「このままでは歳をとっても続けられるものではないな...」と思っていました。
いま考えれば店舗責任者としてシフト管理や売り上げ管理などを担っていたため業界は違えどマネジメントいう分野の一端を担っていたのは良い経験でした。

## IT業界への転職を決意する
責任者として働き始めて2年弱経ったころ、ついに転職に向けて動き出すことにしました。
とはいえ、もともとPCやプログラムが好きだったわけではなく単純に「スキル一本で働く」イメージのあったIT業界がかっこいいなと思っただけの浅い理由でした。
そんなこんなで特に資格も勉強せず、手当たり次第に「未経験可」と書いてある求人へ応募して今の会社に入社することにしました。入社動機は特になく、単純に1番最初に内定をもらったからです。
いま、この文章を書いていて本当に何も考えてなく生きていたんだなと苦笑いしています。

## 初めてのIT業界
入社後、初めての現場は客先常駐のコールセンター(24H365D)でした。
業務内容はエンドユーザーからの問い合わせに応じてエスカレーションを実施するだけのイメージしていた仕事とは無縁のものです。「あれ？」とは思ったものの、営業の「何年か実績を詰めればステップアップできるよ」の常套句にだまされてしぶしぶ働くこと選んでしまったのはいまだに正解だったのかわからないです。


## コールセンターからヘルプデスクデスクへ
コールセンターを1年実施した後に、隣の現場のリーダーに気に入られヘルプデスク業務へ移動できました。
内容としてはパッケージ業務システムでの障害対応、アプリケーション取り扱い、追加運用に対する1次ヒアリングなど多岐にわたる業務内容でした。ここで初めてシステムがどう動いているのか、DBとは何なのかなどの知識が習得できました。
この時にITパスポート、基本情報技術者試験を取得しました。

 ~~当時の現場リーダがパワハラ気質(過去に何人も辞めさせている実績あり)で何回も病みそうになったのはいい思い出です。~~

## クラウドを知る
ヘルプデスクへ異動して業務も一通り自分でできるようになった頃、クラウドという言葉を知りました。
今後はクラウドの知識が必要になるなと思い、営業に現場移動の打診をしましたが、いまのヘルプデスクへの交代要員がいない状態で異動は出来ないと言われました。本来であればそこで戦うべきだったのですが聞き分けのいい自分は納得してしまいそのままヘルプデスクにいることを選びました。ただ、それでも今後のためと思い、SAA(C02)を取得しました。

## 初めて展示会で参加する
そんなこんなでヘルプデスクで5年たったころ、初めてAIエキスポという展示会へ一般観覧として参加することになりました。
はめての聞く技術を知ることで自分のキャッチアップ能力の低さを痛感するとともに自分がいかに狭い環境で過ごしていたんだろうと。それと同時にこのままじゃ何もスキルが付かずに一生を終えてしまうという恐怖を感じ、再度営業に異動の打診をしました。返答は「考えておくよ」でした。
流石に2回目は騙されないぞとおもい、営業が何もしてくれなくても自分で転職できるように2024年12月からAWSを学習し始めてSAA(C03)、DVA、SOAを取得しました。
学習方法としては基本的にUdemyでのハンズオン、Cloudlicenseでの問題集を活用しました。細かい勉強方法を知りたい場合は、Qiitaで調べてみてください。より細かく投稿されている方がたくさんいます。

## 転職活動開始
資格も取得し、営業へ2025年4月に再度打診(3回目)しました。
弊社は毎月帰社日が設けられているため、営業へ乾杯の挨拶をして話そうとしましたが、乾杯も早々に自分から逃げるように立ち去りました。自分は頭にきて、直属の上長へクレームを入れ営業部へ異動の話をしてくれましたが特に反応もないため4月末より転職活動を開始することになります。
転職活動では、構築経験のない点が弱みなると考えたため資格取得だけでなくハンズオンでも学習していることを武器に戦いました。
それでも約100社程度エントリーし、10社が1次面接とほとんどが書類選考落ちでした。
約2か月の転職活動を経て、ついにAWS専業の企業様から内定を頂くことができました。

## 入社までにすること
今回の転職はゴールではなく、あくまで再スタートだと思っています。
入社までには
* AWSでのハンズオンを徹底する
* Dockerなどのコンテナ知識の習得
* Iacの知識習得
* 余力があれば英語学習
* 学習記録をQiitaへアプトプットすること

を実施しようかと考えています。
あとは退職の交渉が中々難航しそうですが、毅然とした態度で行きたいとおもいます。
通貨（Currency）項目の設定不可事項


Salesforceの項目型（通貨）では設定できないことがいくつかあります



## 設定不可事項1 共有ルールで項目設定不可

Salesforceの共有ルールでは通貨型の条件設定ができません

例として商談の標準項目「金額」(Amount)はもちろん、カスタム通貨項目も共有ルールでは使えません

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/35d191ec-f07d-4aef-9c56-f830805d6848.png)

※参考URL
https://salesforce.stackexchange.com/questions/419770/opportunity-sharing-rules-criteria-based-field-amount-not-available

## 設定不可事項1 一致ルールで項目設定不可

一致ルールでは金額項目の設定はできません

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/ca7344b7-447d-4065-b790-2c5ae6880c92.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/9ff67b0c-5b9d-4362-8f54-12d4bf9417b5.png)


※参考リンク

https://ideas.salesforce.com/s/idea/a0B8W00000GdhdJUAR/allow-currency-fields-in-duplicate-matching-rules
Db2 for i のカラム名をかんたんにコピペする方法

ようやくDb2 for i でもながーいカラム名が普及し始めたようです。

これまではDDS（や5250ベース）の制約で、***カラム名（フィールド名）は最大10桁***でしたので目で見てタイプして問題ありませんでした:smile:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/de235ddf-571b-4c45-9a28-283e516c8c6f.png)

が、SQLベースで書く事が増えた昨今、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/b4ee3814-2dc2-41a4-a5bb-c440626ff3c1.png)

この長さのカラム名は自分だとタイポの嵐で無理です:sweat_smile:

## Db2 for i カラム名をかんたんにコピペする方法①　SQLスクリプト実行画面から

1. SELECT * で全カラムを検索
2. 結果の任意のカラム名を右クリック -> 詳細　を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/686e2528-1946-44c5-b945-6f08f8a13707.png)
3.列を右クリック -> コピー -> カラム名　を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/fdffe391-2ad0-47eb-bb9a-7003a7b87ead.png)
4.必要な個所にペースト
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/1285ea11-9b4a-4597-af41-a825f4d127da.png)

以上です。

これ以外の手順もあると思うので探してみてください（気が付いたら追記します）
【Codex使用】GCP Cloud RunにPython Flask Hello WorldをGithub Actionsでデプロイするまで

やりたいこと：
Python Flask Hello WorldをGithub ActionsでCICDパイプライン経由でCloud Runにデプロイする。

:::note info
この記事ではCloud Runのプロジェクト作成とGithub actionsに渡すキーの作成まで行います。
:::

事前準備
CLIのインストール
https://cloud.google.com/sdk/docs/install?hl=ja

Pythonのインストール
Win storeからインストール

CLIのインストール

インストーラが最後まで行けば、CMDが起動してログインを求められる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4109347/f8a4c60d-5296-49e7-8419-50c3b17a13e0.png)

CLIから新規プロジェクトを作成

まずはプロジェクト作成
```ruby:プロジェクト作成
# プロジェクトIDは世界でユニークなIDをつけてね
export PROJECT_ID="my-cloud-run-python-$(date +%s)"

# 新規プロジェクトを作成
gcloud projects create $PROJECT_ID --name="My Cloud Run Python Project"

# 作成したプロジェクトをアクティブに設定
gcloud config set project $PROJECT_ID
```


```ruby:作成したプロジェクトを選択
gcloud config set project %PROJECT_ID%
```


```ruby: 必要なAPIを有効化
gcloud services enable run.googleapis.com cloudbuild.googleapis.com artifactregistry.googleapis.com
```

:::note warn
エラー「type: googleapis.com/billing-enabled」が発生した場合、プロジェクトに請求先を紐付ける必要があります。

プロジェクトに課金アカウントをリンク
1️⃣ 左メニュー：課金 → アカウント管理
2️⃣ 対象の課金アカウントを選択
3️⃣ 「アカウント管理」→ 「プロジェクトを管理」へ移動
4️⃣ さっき作成した%PROJECT_ID%を選択し、課金アカウントを関連付ける
:::



```ruby:gitfub Actionsがデプロイに使用するアカウントの作成と権限の付与
:: サービスアカウント作成
gcloud iam service-accounts create github-actions-deployer --display-name="GitHub Actions Deployer"
:: 権限を付与
gcloud projects add-iam-policy-binding %PROJECT_ID% --member="serviceAccount:github-actions-deployer@%PROJECT_ID%.iam.gserviceaccount.com" --role="roles/run.admin"
gcloud projects add-iam-policy-binding %PROJECT_ID% --member="serviceAccount:github-actions-deployer@%PROJECT_ID%.iam.gserviceaccount.com" --role="roles/iam.serviceAccountUser"
gcloud projects add-iam-policy-binding %PROJECT_ID% --member="serviceAccount:github-actions-deployer@%PROJECT_ID%.iam.gserviceaccount.com" --role="roles/storage.admin"
```

サービスアカウントキーを作成

:::note info
このキーをgithub actionsで使用できます
キーはカレントディレクトリにjson形式で出力されています。
:::

```ruby:キー出力
gcloud iam service-accounts keys create key.json --iam-account=github-actions-deployer@%PROJECT_ID%.iam.gserviceaccount.com
```

いったんここまで
次回は、github actionsにシークレットキーを追加します（key.json）
Next.jsでの認証設計パターン整理【NextAuth.js / OAuth / JWT 実務ガイド】

## はじめに

受託開発やSaaS開発で**認証設計**は避けて通れません。むしろ「認証をどう作るか」で保守性・安全性・運用負荷が大きく左右されます。

この記事では、**Next.js案件で実務によく使われる認証設計パターン**を、NextAuth.js・OAuth・JWTそれぞれの視点から整理します。

---

## 想定読者

* Next.js案件の認証設計に悩んでいる方
* SaaS開発で安全に認証設計したい方
* OAuth連携やセッション管理の実務Tipsが欲しい方

---

## 認証設計パターンの分類

| パターン         | 主な用途        | 概要                        |
| ------------ | ----------- | ------------------------- |
| セッションCookie型 | SaaS・管理画面系  | 安定性重視・サーバーセッション管理         |
| JWTトークン型     | SPA・モバイルAPI | 完全API駆動型・ステートレス運用         |
| OAuth2型      | 外部サービス連携    | Google / GitHub等の外部ログイン   |
| NextAuth.js  | 上記の統合管理     | Next.js案件に最適化された認証フレームワーク |

---

## 1. NextAuth.jsの設計ポイント

Next.jsの認証実装で最も採用事例が増えているライブラリが**NextAuth.js**です。

### ✅ 主な強み

* サーバーセッション管理が標準
* OAuthプロバイダ統合（Google, GitHub, LINE等）
* JWT運用もサポート
* Database連携も柔軟
* App Router構成にも正式対応（`next-auth@beta`）

### ✅ 最小構成コード例

```typescript
import NextAuth from 'next-auth';
import GoogleProvider from 'next-auth/providers/google';

export const authOptions = {
  providers: [
    GoogleProvider({
      clientId: process.env.GOOGLE_CLIENT_ID!,
      clientSecret: process.env.GOOGLE_CLIENT_SECRET!,
    }),
  ],
  session: { strategy: 'jwt' },
};

export default NextAuth(authOptions);
```

👉 SaaS案件でも中〜長期保守性が高い構成。

### ✅ App Router対応（最新版）

```typescript
import NextAuth from 'next-auth';
import authConfig from './auth.config';

export const { handlers, auth } = NextAuth(authConfig);
```

---

## 2. OAuth2設計の実務ポイント

### ✅ 採用例

* Googleログイン
* LINEログイン（国内SaaSでも人気）
* GitHub/Slack連携

### ✅ 注意点

* **Callback URLの管理** → 本番・開発環境で分ける
* **スコープ最小化** → 最小限の権限だけ要求する
* **外部API変更の追従** → Provider依存管理が必要

### ✅ カスタムOAuth実装時の流れ

```typescript
providers: [
  OAuth2Provider({
    clientId: 'xxx',
    clientSecret: 'yyy',
    authorization: 'https://provider.com/oauth2/authorize',
    token: 'https://provider.com/oauth2/token',
    userinfo: 'https://provider.com/oauth2/userinfo'
  })
]
```

---

## 3. JWT型認証（API駆動型）

### ✅ 採用例

* モバイルAPI
* BFF構成
* GraphQLバックエンド

### ✅ 実務の注意点

* トークン署名は**HS256/RSA256**等を正しく選定
* RefreshToken運用必須（アクセストークン短命化）
* Storageは**HttpOnly Cookie推奨**（XSS耐性）

### ✅ JWT生成例

```typescript
import jwt from 'jsonwebtoken';

const token = jwt.sign({ userId: 1 }, process.env.JWT_SECRET!, { expiresIn: '15m' });
```

### ✅ セキュリティポイント

* XSS対策：HttpOnly Cookie運用
* CSRF対策：SameSite設定＋CSRF Token併用
* Token失効制御：ブラックリスト運用or短命設計

---

## 4. 実務での選定ガイドライン

| 案件タイプ     | 推奨パターン                             |
| --------- | ---------------------------------- |
| SaaS管理画面  | NextAuth.js + サーバーセッション            |
| 外部OAuth連携 | NextAuth.js + OAuth Providers      |
| モバイルAPI   | JWT型ステートレス認証                       |
| BFF構成     | JWT + RefreshToken + API Gateway前段 |

👉 **「何を作るか」に応じて使い分けるのがコツ**

---

## 5. 認証設計で詰まりやすい落とし穴

### ❌ 認証情報をLocalStorageに保存

* XSS耐性が弱い
* HttpOnly Cookie利用が推奨

### ❌ RefreshToken運用を軽視

* 長期セッション維持に失敗しがち
* 正しいトークン更新フロー必須

### ❌ Provider別設定ミス

* OAuth Provider側の設定値間違いが頻出
* Redirect URIと一致させること

---

## おわりに

認証設計は実務経験がものを言う重要分野です。
Next.js + NextAuth.js を中心に、正しいパターン整理ができると案件提案力・保守性・安全性が一気に上がります。

Qiitaでは今後もこういった**実務提案に刺さるフロントエンド設計Tips**を発信していきますので、ぜひLGTM・フォローお願いします！
HTML＆CSSの勉強①

# 備忘録

## HTML
Webページの内容を記述する言語

#### ヘッダーに書く内容
##### ①文字コード
```\<meta charaset=文字コード>```
##### ②ページタイトル
```\<title>タイトル\</title>```
##### ③CSSの読み込み
```\<link rel="stylesheet" href="スタイルシートの名前.css>```

## CSS
Webページの見た目を記述する言語
背景や文字の色を変更したり，余白の設定を行う

ex)
backuground-color
color
padding
margin  ...etc

####
Python subprocess.run「構文が間違っています」エラーの対処法

# 発生した問題

WSL上のPythonスクリプトから、Windows側のPython（例：`C:\Program Files\Python39\python.exe`）を`subprocess.run()`で呼び出そうとしたところ、次のようなエラーに直面しました。

使用したコード：

```python
subprocess.run([
    "cmd.exe", "/c",
    "\"C:\\Program Files\\Python39\\python.exe\" C:\\path\\to\\main_win.py"
], check=True)
```

出力されたエラー：

```
ファイル名、ディレクトリ名、またはボリューム ラベルの構文が間違っています。
```

不思議なことに、このコマンドをコピーして `cmd.exe` で直接実行すると正常に動作します。

# 原因：クォートの扱いに問題があった

`subprocess.run()`に渡したコマンドは、`cmd.exe`側では以下のように解釈されます。

```
cmd.exe /c "\"C:\Program Files\Python39\python.exe\" C:\path\to\main_win.py"
```

`cmd.exe` は `/c` の後の引数を1つの文字列として解釈します。その際、クォートの混在によって構文解析が正しく行われず、エラーが発生します。

# 解決策：引数をリスト形式で分けて渡す

以下のように、コマンドと引数を明示的に分けて渡すことで問題は解消されました。

```python
subprocess.run([
    "cmd.exe", "/c",
    "C:\\Program Files\\Python39\\python.exe",
    "C:\\path\\to\\main_win.py"
], check=True)
```

このように記述することで、Python側が適切にクォートを処理し、`cmd.exe`でも正しく引数として解釈されます。

# 補足：なぜこれで動くのか

* `subprocess.run()` にリスト形式でコマンドを渡すと、Pythonが安全にクォートを処理します。
* 一方、クォートを含む1つの文字列として渡すと、Windowsの`cmd.exe`が意図しない解釈をしてしまいます。
* `"cmd.exe", "/c", "\"C:\...\""` のようにクォートで囲むと、かえって構文エラーを誘発することになります。

# 教訓

> **`subprocess`を使う際は、コマンドと引数は分けて渡すのが基本です。**

特に `cmd.exe /c` を用いる場合は、クォートの扱いに注意が必要です。

# 参考：WSLからWindowsのPythonを実行するサンプル

```python
import subprocess

def run_windows_python():
    python_path = r"C:\Program Files\Python39\python.exe"
    script_path = r"C:\Users\you\main_win.py"

    subprocess.run([
        "cmd.exe", "/c",
        python_path, script_path
    ], check=True)

run_windows_python()
```

# おわりに

一見些細に思えるこのようなクォートの問題も、実際に遭遇すると時間を費やしがちです。この記事が、同様のエラーでお困りの方の助けになれば幸いです。
Azure WAFはクリックジャッキング攻撃に対応できますか

Azure Web Application Firewall（WAF）は、クリックジャッキング攻撃に対する直接的な保護機能は標準では提供していません。クリックジャッキングは、ユーザーをだまして意図しないアクションを実行させる攻撃手法で、通常は`X-Frame-Options`ヘッダーや`Content-Security-Policy`（CSP）ヘッダーを使用して防ぐことができます。しかし、Azure WAF自体は主にSQLインジェクションやクロスサイトスクリプティング（XSS）などの一般的なウェブ攻撃を防ぐためのルールセット（OWASP Top 10など）に焦点を当てており、クリックジャッキング専用のルールは含まれていません。

ただし、Azure WAFをAzure Application GatewayやAzure Front Doorと組み合わせて使用する場合、以下の方法でクリックジャッキング対策を実装できます：

1. **X-Frame-Optionsヘッダーの追加**：
   - Azure Application GatewayやAzure Front Doorでは、HTTPレスポンスヘッダーをカスタマイズできます。`X-Frame-Options`ヘッダー（例：`DENY`や`SAMEORIGIN`）を追加することで、ウェブページがiframe内でレンダリングされるのを制限し、クリックジャッキングを防ぐことができます。
   - 設定方法：
     - Azure Front Doorでは、**Rules Engine**を使用してレスポンスヘッダーに`X-Frame-Options`を追加できます。[](https://learn.microsoft.com/en-us/azure/frontdoor/front-door-security-headers)
     - Application Gatewayでは、**HTTPヘッダー書き換え**機能を使って同様の設定が可能です。[](https://learn.microsoft.com/en-us/azure/application-gateway/overview-v2)

2. **Content-Security-Policy（CSP）の設定**：
   - CSPヘッダーを使用して、iframeの使用を制御できます。たとえば、`frame-ancestors`ディレクティブを設定して、信頼できるドメインのみがページをiframeで読み込むことを許可できます。
   - Azure Front DoorのRules EngineでCSPヘッダーを追加する例がドキュメントに記載されています。[](https://learn.microsoft.com/en-us/azure/frontdoor/front-door-security-headers)

3. **カスタムルールの活用**：
   - Azure WAFではカスタムルールを作成して特定の条件に基づくリクエストをブロックできますが、クリックジャッキングは主にクライアント側のブラウザ挙動に関連するため、ヘッダー設定が主な対策となります。カスタムルールで不審なiframeリクエストを検出するような高度な設定は限定的です。

**注意点**：
- バックエンドサーバーがすでに`X-Frame-Options`やCSPヘッダーを設定している場合、WAF側での追加設定は不要な場合があります。[](https://campus.barracuda.com/product/webapplicationfirewall/doc/20251309/enabling-clickjacking-protection-for-a-service/)
- ウェブサイトが意図的にiframe内で表示される必要がある場合（例：埋め込みウィジェット）、`X-Frame-Options`を`SAMEORIGIN`に設定するか、CSPの`frame-ancestors`で許可するドメインを指定する必要があります。

**結論**：
Azure WAF自体はクリックジャッキング専用の保護機能を持っていませんが、Azure Application GatewayやAzure Front Doorのヘッダー書き換えやRules Engineを活用することで、クリックジャッキング対策として`X-Frame-Options`やCSPヘッダーを効果的に設定できます。これにより、クリックジャッキング攻撃を防ぐことが可能です。設定の詳細は、アプリケーションの要件に応じてAzureポータルまたはAzure PowerShellを使用して構成してください。[](https://learn.microsoft.com/en-us/azure/frontdoor/front-door-security-headers)[](https://learn.microsoft.com/en-us/azure/application-gateway/features)
バチャキャスフィルターを改造して公式VCIに無理やりねじ込む方法

公式の提供しているコメント窓はアイコン情報がないと表示されません。
現状アイコンの取得に対応しているのはニコニコとYouTubeのみです。

それだと非公式なプラグインでは使えないので、無理やりアイコン情報をねじ込み利用できるようにする方法をご紹介します♥

https://yurivr.booth.pm/items/6729952

# 改造
まずバチャキャスフィルターのplugin.jsをメモ帳かなんかで開きます。
下の方に<b>const formatComment = {</b>というのがあり
その中に<b>displayName:~~~</b>があるので<b>,</b>をつけて改行し
<b>profileImageUrl:</b>というのを追加します

こんな感じですね

```plugin.js
    const formatComment = {
        id:String(id),
        liveId:String(liveId),
        userId:String(userId),
        name:String(name),
        isOwner:Boolean(isOwner),
        isModerator:Boolean(isModerator),
        isMember:Boolean(isMember),
        autoModerated:Boolean(autoModerated),
        timestamp:String(timestamp),
        hasGift:false,
        comment:String(comment),
        displayName:String(displayName),
        profileImageUrl:"ここにURL"
    };
```
ここに画像のURLを追加するのですが、前述の通りニコニコかYouTubeのURLしか通してくれません。
そこで私が思いついたのは<b>自分のニコニコのアイコンを設定してしまう</b>という手法です♥

ではまず自分のアイコンのURLを確認しましょう。
自分のユーザーページを開き（マイページでも可）
デベロッパーツールを開きます
そして<b>iconUrl</b>で検索をかけて出てきた部分エレメントのコピーで一度メモ帳に貼り付けして、下の方にある<b>img src</b>のURLの部分だけをコピーしましょう。

私の場合は
```icon
https://secure-dcdn.cdn.nimg.jp/nicoaccount/usericon/8639/86391026.jpg?1749253700
```
このとき~~.jpgから後ろの部分?~~~~は消してしまいましょう。
```icon
https://secure-dcdn.cdn.nimg.jp/nicoaccount/usericon/8639/86391026.jpg
```
こうですね

それを先程の<b>profileImageUrl:</b>に貼り付けて上書き保存しましょう。
ここで注意なのはURLは<b>""</b>で囲うこと！
これで完了です♥

必要に応じて<b>"const formatComment2 = {"</b>の方にも追加してもいいかもです。
その場合は
``` plugin.js
    const formatComment2 = {
        type: "youtube",
        author:String(name),
        comment:String(comment),
        iconUrl:"ここにURL",
        timestamp:String(timestamp)
    };
```
のようにしてみてください。

プラグインの再読み込みをして完了♥![2025061008005584_松尾テスト_松尾悠里.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4043122/c32eed8c-cc68-4d3c-a331-279c14fa0c60.png)
学習6日目

# 今日やったこと
オリジナルアプリの1つのモデルについて、下記機能の実装
①一覧表示
②詳細表示
③新規作成・保存
④編集・更新

# 内容
## ①一覧表示
モデルとコントローラを作成。
```
rails g model hoge
rails g controller hoges
```

基本的なCRUD処理が必要になるので、ルーティングを記述。
(routes.rbの記述例)
```
resources :hoges
```

その後、下記コマンドを実行し、それぞれのアクションに対応するパス名を確認。
```
$ rails routes
```

モデルと同時に作成されるマイグレーションファイルに必要なカラム情報を追記し、マイグレート実行。
```
rails db:migrate
```

必要に応じて、モデルにバリデーションを記述。
(hoge.rbの記述例)
```
validates :column_name, presence: true
```

コントローラに下記を記述。
併せて、views/hoges/index.html.erbも作成。
(hoges_controller.rbの記述例)
```
def index
    @hoges = Hoge.all
end
```

ビューでは一旦全データについて特定のカラム情報を一覧表示させたいので、下記を記述。
ついでに詳細画面へのリンクも付けておく。
(views/hoges/index.html.erbの記述例)
```
<% @hoges.each do |hoge| %>
    <%= link_to "#{hoge.column_name}", hoge_path(hoge) %>
<% end %>
```

## ②詳細表示
コントローラに下記を記述。
併せて、views/hoges/show.html.erbを作成。
(hoges_controller.rbの記述例)
```
def show
    @hoge = Hoge.find(params[:id])
end
```

ビューでは一旦全カラムの情報を表示させたいので、下記を記述。
ついでに編集画面へのリンクも出しておく。
(views/hoges/show.html.erbの記述例)
```
<%= @hoge.column_name1 %>
<%= @hoge.column_name2 %>
<%= @hoge.column_name3 %>
<%= link_to "edit hoge", edit_hoge_path(@hoge) %>
```
## ③新規作成・保存
コントローラにnewとcreateアクションを定義。
ストロングパラメータも記述。
保存できなかった場合の処理は一旦無視して、正常に保存できる処理のみ記述。保存後はルートパスに遷移させるようにする。

(hoges_controller.rbの記述例)
```
def new
  @hoge = Hoge.new
end

def create
  Hoge.create(hoge_params)
  redirect_to root_path
end

private
def hoge_params
  params.require(:hoge).permit(:column_name1,:column_name2,...)
end
```

併せて、views/hoges/new.html.erbを作成し、下記を記述。
(views/hoges/new.html.erbの記述例)
```
<%= form_with model: @home do |form| %>
  <%= f.text_field :column_name1 %>
  <%= f.text_field :column_name2 %>
  <%= f.text_field :column_name3 %>
  <%= f.submit "submit" %>
<% end %>
```

## ④編集・更新
コントローラにedit・updateアクションを定義し、下記を記述。
基本的にはnew・createと同じ流れだが、空のインスタンスではない点と、メソッドがcreateではなくupdateとなる。
views/hoges/edit.html.erbの記述はnew.html.erbと同じ。
(hoges_controller.rbの記述例)
```
def edit
  @hoge = Hoge.find(params[:id])
end

def update
  Hoge.update(hoge_params)
  redirect_to root_path
end
```

# 感想
Railsの命名規則を守らないと予想外のエラーに遭遇するので、注意したい。
内容をそのままQiita記事に書いていくと時間がかかるので、要点のみ記述するようにしたい。
新卒風エンジニアがJAWSで初LTに挑戦してみた!~JAWS-UG 神戸 #6 AWS大喜利大会~

# はじめに
今回は初LTに挑戦してきたので、初LTを通じての感想を書きたいと思います。これまで、現地では3回ほどJAWSに参加してきたのですが、LTは初めてだったので、まだLTをやったことがない方や、新人の方で参考になるものがあればと思います。私の経歴については後に出てくる、発表資料の初めの方に書いてあるので、気になる方はお読みいただければ幸いです。

https://jawsug-kobe.connpass.com/event/354076/

# 発表のきっかけ
きっかけは前回参加したJAWS-tochigiの会場で、今回の宣伝をしていたことです。まだ、LT枠もあるとのことだったので、せっかく関西に変えるタイミングだったので、いい機会だと思い応募しました。数日前から緊張もしていましたが、今までのお世話になった支部の方々にも応援をいただき気合を入れて当日を迎えました。

# LT当日の様子と発表内容の振り返り

### AWS大喜利大会
当日は大喜利大会から始まりました。大喜利大会ではAIに回答を採点してもらうのですが、秀逸な回答もあれば、逆に低い点数を狙いに行く流れ、AIの回答に対する評価なども面白かったです!IT×お笑いは可能性を感じますね!

### 初LT登壇　発表と反省点
私のLTの順番は2番目だったのですが、初LTということで、直前の方にLTでうまく繋いでいただき、発表を迎えることができました（本当にありがたかったです）。発表資料は以下に載せておきます。話そうと思っていたところを数か所飛ばしてしまいましたが、大事なところは話せたと思います。評価して頂いたところもあるので、初めてにしてはうまくいったのではないかと思います。反省点としては、カンペを書きすぎないことや、一枚に詰め込みすぎずもう少し枚数を区切りたいですね。

https://speakerdeck.com/tarekatsu/xin-zu-enzinia-gaawsren-ding-zi-ge-noqu-de-de-de-raretamonotoxian-zai-nozi-fen

# おわりに
今回初めてLTに挑戦しましたが、モチベーションにもつながりますし、何より自分の考えや経験を誰かに伝えるというのはとても良い経験になると思います。またどこかでLTに挑戦したいですね。そして何より今回LTをさせていただいた、神戸支部の方々も暖かく受け入れくださり、ほかの支部の方々も支えてくださり、初心者の方でも挑戦できるような環境だと思います。もし迷われている初心者の方がいるなら、まずは挑戦してみてください!
W55RP20-EVB-Picoとは？

W55RP20-EVB-Picoを入手したのでレビューします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/3d4aeb15-4fab-48f0-950b-7d882020995b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/b0fb8bea-7fd9-4077-b361-a3b7d79da75d.png)

以前の記事　WIZnet W5500-EVB-PicoをArduinoで使ってみよう

https://qiita.com/usashirou/items/13c0247ae43b23605e29
# W55RP20-EVB-Pico
W55RP20-EVB-Picoは __SoC__ に __W55RP20__ を搭載したイーサネット対応ボードになります。
USB端子が __USB-C__ になっているほか、__POEモジュール__ を追加することで __PoEデバイス__ として使用可能です。
以前のW5500-EVB-Picoの後継製品といえます。
なお、__GPIO16,17,18,19,20,21,22,23,24,25,29__ が使用出来ません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/9e4b3a4f-7d6f-4abc-94ff-08f202434682.png)

https://docs.wiznet.io/Product/ioNIC/W55RP20/w55rp20-evb-pico
# W55RP20
W55RP20は __RP2040__ に __W5500__ と __2MVB__ のフラッシュメモリを統合したチップになります。
W5500の __ToE（TCP/IP Offload Engine）__ 機能によりイーサネット対応デバイスがワンチップで構築可能です。
なお、__GPIO17,20,21,22,23,24,25__ が __W5500__ につながっており __使用できません__ 。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/9cfc7622-b640-4fb3-a982-7d0af967c418.png)

https://docs.wiznet.io/Product/ioNIC/W55RP20/documents_md#data-sheet

# PoE
__WIZPoE-P1__ を使用する事で __PoE対応__ とすることができます。
PoEはDC48Vの電圧が使用されますがJ6端子に適当な電圧を印加することでも使用可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/cde557d3-266f-4e7b-88fc-390847e8b5f3.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/9fa9e312-aac5-4ab1-a215-487af4370a62.png)

# 開発環境
__C環境__ の他 __MicroPython__ や __Arduino__ にも対応しています。
- C/C++
- MicroPython
- CircuitPython
- Arduino
スクロールバーを非表示にしてスクロールしたいぺこ！

まず素朴にスクロールできる環境を作る

おそらく
- w-fullで横幅を指定
- 子要素が親要素以上の長さを持つ
- overflow-x-scrollを指定している
で実現できています

```
.bg-white.rounded-md.w-full.p-3.overflow-x-scroll
  p 111111223212312312312312312312312312312312jdfgnskjdfngosjdnfgojksndfogkjnsdofkgnmsodkfgmoskdfmgoskdfmgoskdmfgoksdmfgoksmdfogkmsdofkgmsodkfmgoksdfmgoksmdfgokmsdfogkmsdokfg
```

最初に立てた方針としてスクロールバーを非表示にしたいと考えていました。
しかし、スクロールバーは非表示(透明にも)ができないと判断しました。
なので方針を変えてDOMに残るがユーザーからは見えない要素を作るという方針にしました

白いスクロールバーにしてみた結果
スクロールバーがユーザーから見えなくなりました。
しかし、パディングとしては残るのでこれをどうにかしたいですね。
```
.bg-white.rounded-md.w-full.p-3.white-scrollbar
  p 111111223212312312312312312312312312312312jdfgnskjdfngosjdnfgojksndfogkjnsdofkgnmsodkfgmoskdfmgoskdfmgoskdmfgoksdmfgoksmdfogkmsdofkgmsodkfmgoksdfmgoksmdfgokmsdfogkmsdokfg
```

```
.white-scrollbar {
  overflow-x: scroll;
  scrollbar-color: white white;
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3804334/6e92fdc3-d88b-4f93-b409-de2625e0b298.png)


灰色でも試してみましたが、こうすれば完全に同化して見えなくなりますね！
(さっきの白でも自然なpadding-bottomとして見えるようにすれば解決しますが…)

```
.rounded-md.w-full.px-3.pb-0.gray-scrollbar
  p 111111223212312312312312312312312312312312jdfgnskjdfngosjdnfgojksndfogkjnsdofkgnmsodkfgmoskdfmgoskdfmgoskdmfgoksdmfgoksmdfogkmsdofkgmsodkfmgoksdfmgoksmdfgokmsdfogkmsdokfg
```

```
.gray-scrollbar {
  overflow-x: scroll;
  scrollbar-color: #F2F2F2 #F2F2F2;
}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3804334/499a6789-6ad0-43c4-8fb6-2f2f7cb273e2.png)
【OSS版Dify Tips】Difyのループブロックで最大ループ時間を変更する方法

# はじめに

Difyのループブロックで最大ループ時間を変更するための環境構築方法を紹介する。長時間のポーリング処理などをしたい場合に有用。


# 動作環境
* [OSS版Dify v1.4.0](https://github.com/langgenius/dify/releases/tag/1.4.0)
* Ubuntu 22.04 x86_64
* Docker 28.1.1
  * Docker Compose v2.35.1

# 方法

```./docker/.env.example```を```./docker/.env```にコピーして、以下の環境変数を修正する。

|環境変数|説明|デフォルト値|変更例|
|:-|:-|:-|:-|
|APP_MAX_EXECUTION_TIME|最大実行時間（秒）|1200|36000|
|LOOP_NODE_MAX_COUNT|最大ループ数（回）|100|100000|
|WORKFLOW_MAX_EXECUTION_STEPS|ワークフロー最大ステップ数（回）|500|100000|
|WORKFLOW_MAX_EXECUTION_TIME|ワークフロー最大実行時間（秒）|1200|36000|


:::note
ポイント
最大ループ回数だけでなく、ワークフロー実行時間のタイムアウトに関する環境変数も併せて修正する。
::: 

以下に、.envファイルのセクションごとに修正内容を記載する。

## 「OTLP Collector Configuration」セクションの修正

以下の環境変数を修正する。

* ``APP_MAX_EXECUTION_TIME``

```bash:変更前
# ------------------------------
# OTLP Collector Configuration
# ------------------------------

...

# The maximum number of active requests for the application, where 0 means unlimited, should be a non-negative integer.
APP_MAX_ACTIVE_REQUESTS=0
APP_MAX_EXECUTION_TIME=1200
```

```bash:変更後
# ------------------------------
# OTLP Collector Configuration
# ------------------------------

...

# The maximum number of active requests for the application, where 0 means unlimited, should be a non-negative integer.
APP_MAX_ACTIVE_REQUESTS=0
APP_MAX_EXECUTION_TIME=36000
```

## 「Others Configuration」セクションの修正

以下の環境変数を修正する。

* ``LOOP_NODE_MAX_COUNT``
* ``WORKFLOW_MAX_EXECUTION_STEPS``
* ``WORKFLOW_MAX_EXECUTION_TIME``

```bash:変更前
# ------------------------------
# Others Configuration
# ------------------------------

...

# Workflow runtime configuration
WORKFLOW_MAX_EXECUTION_STEPS=500
WORKFLOW_MAX_EXECUTION_TIME=1200

...

# Maximum loop count in the workflow
LOOP_NODE_MAX_COUNT=100
```

```bash:変更後
# ------------------------------
# Others Configuration
# ------------------------------

...

# Workflow runtime configuration
WORKFLOW_MAX_EXECUTION_STEPS=100000
WORKFLOW_MAX_EXECUTION_TIME=36000

...

# Maximum loop count in the workflow
LOOP_NODE_MAX_COUNT=100000
```


# 結果

ループ回数が増やせて、実行時間のタイムアウトが変更されていることが確認できた。

現状のUIの制約で、ループブロックのUI表示が3ケタまでしか画面に入り切れていないが、設定変更は正しくされており編集も可能。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638977/bc437785-1f6e-44a7-a6a4-bb455e5a977c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638977/e7c749d5-1084-49d7-a3c0-b2f47fbbb157.png)


## 既知の問題

### error: timeout error: signal: killed

ワークフローのプレビューから実行すると、ワークフローが下記のエラーで止まることがある。再現性が今のところないため原因不明（調査中）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638977/398ad811-8d06-4672-8d49-9f4cc40036c2.png)


# まとめ

Difyのループブロックで最大ループ時間を変更するための環境構築方法を紹介した。長時間のポーリング処理などをしたい場合に有用なので試してみてほしい。


# 参考

https://docs.dify.ai/ja-jp/guides/workflow/node/loop?utm_source=chatgpt.com

https://github.com/langgenius/dify/issues/18585

https://github.com/langgenius/dify/issues/8874
 
https://github.com/langgenius/dify/issues/13556

https://github.com/langgenius/dify/discussions/13028

https://github.com/langgenius/dify/issues/8643

https://qiita.com/Kazuhisa-Wada/items/35e4ea17a52eb501cfda
Amazon Q CLIでゲームを作ってみた！

Amazon Q CLIでゲームを作った記事です。以下のキャンペーンもあり、これまでQ CLIでコード生成をやったことがなかったのでチャレンジしました。

https://aws.amazon.com/jp/blogs/news/build-games-with-amazon-q-cli-and-score-a-t-shirt/

## 事前準備
MAC BookにQ CLIをPygameをインストールして実施しました。
それぞれのインストール手順は以下を

* Amazon Q CLIのインストール
    * https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/command-line-installing.html
* Pygameのインストール
```
python3 -m pip install -U pygame
```

## Q CLIとのやり取り
まずはターミナルからQ CLIを起動します。
```
q /chat
```
Q CLIへの初めの依頼は以下のようにしました。見ての通り、結構雑な依頼です。
```
ゲームを作りたいです。イメージとしてバトルシティのようなタンクゲームで。ファミコンライクのドットで。
```

ここからはQが頑張って、Pythonコードを生成してくれます。Auto Approveを設定したので、基本的には放置してテスト動作してくれるまでは別作業をしていました。

しばらくすると...
```
以下のコマンドでゲームを起動できます：

python /Users/masaki/Documents/tank_game.py


このゲームはまだ基本的な機能だけですが、以下のような機能を追加することで、より本格的なバトルシティ風のゲームに発展させる
ことができます：

1. 弾の発射機能
2. 敵タンクのAI
3. レンガや鉄の壁など、異なる種類の障害物
4. スコアシステム
5. ステージの切り替え
6. ドット絵風のグラフィック（現在は単純な図形で表現）
```
実際に起動させましたが、うまく動作しました！
追加機能の提案もしてくれるのがチャット形式でするメリットと思います。

Q CLIの提案に対するフィードバックと”ここだけは直して"といったチャットを繰り返すと、アニメーションなども含めてどんどん機能追加してくれました。
途中エラーで動作しなくなることもありましたが、
* スクリプト実行
* エラーメッセージ解析
* 必要な修正
も自動でやってくれるので、基本的にたまにターミナルをチェックするだけでどんどん進みます。

> 時折、ゲームとしてルールを逸脱した実装をすることもありましたが、指摘することで修正してくれました...


## できたもの
画像のような戦車ゲームです。緑が自機で相手と撃ち合って3つある体力ケージを0にすると破壊できます。
ステージクリア型となっていて、敵をすべて破壊すると次のステージに進めます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367655/02dcb207-774f-4bd1-a2c7-77d022e9cece.png)

完成コードはGitHubにあります。せっかくなのでREADME.mdもQ CLIに書かせています。

https://github.com/licux/q-cli-tankgame

## 感想
自然言語、チャット形式で作ることができて、なかなか楽しかったです！
待ち時間が長いこともありますが、画面を見張っている必要はないので別作業の間にちょっと確認、で十分でした。

思った通りに改修してくれないこともありますが、そこは使う側が具体的な指示を出すことで改善できると思います！
Cursor MCPの設定方法(Python)

# はじめに
Cursor MCPの設定方法を簡単に記します。

# 設定方法
## [quickstart-resources](https://github.com/modelcontextprotocol/quickstart-resources/tree/main#)のPythonを題材にします。

１. 上記リポジトリをクローン
```bash:ターミナル
git clone https://github.com/modelcontextprotocol/quickstart-resources.git
```

２. weather-server-pythonへ移動
```bash:ターミナル
cd weather-server-python
```
   
３. [For Server Developers](https://modelcontextprotocol.io/quickstart/server)のコマンドを参考に初期設定

```bash:ターミナル
# install uv
curl -LsSf https://astral.sh/uv/install.sh | sh

# Create virtual environment and activate it
uv venv
source .venv/bin/activate

# Install dependencies
uv add "mcp[cli]" httpx
```
```json:JSON
{
  "mcpServers": {
    "weather": {
      "command": "uv",
      "args": [
        "--directory",
        "/ABSOLUTE/PATH/TO/PARENT/FOLDER/weather",
        "run",
        "weather.py"
      ]
    }
  }
}
```

４. Cursorの`Cursor/Preferences/Cursor Settings/MCP Tools`のJSONを編集

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3088985/7fb97334-50bd-40c0-ac80-14f6d5b08632.png)

`command`と`args`を絶対パスで指定するのがポイント
```json:mcp.json
{
  "mcpServers": {
    "weather": {
      "command": "/<ABSPATH>/.local/bin/uv",
      "args": [
        "--directory",
        "/<ABSPATH>/quickstart-resources/weather-server-python",
        "run",
        "weather.py"
      ]
    }
  }
}
```

絶対パスの取得
```bash:ターミナル
# args
pwd

# command
which uv
```

５. Cursorで質問しMCPツールの起動を確認


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3088985/be62508b-857c-4a8b-9445-ad51b18b1091.png)

もし、回答不明又はWeb検索の処理に進む場合はMCPツールが使われていないので、再度設定の確認と**Cursorの再起動**を試してみてください。

# 参考文献

https://github.com/modelcontextprotocol/quickstart-resources?tab=readme-ov-file

https://modelcontextprotocol.io/quickstart/server#python

https://docs.cursor.com/context/model-context-protocol
Amazon Q  CLI に任せて作る初めてのEbitengineゲーム

この記事は「Amazon Q CLI でゲームを作ろう Tシャツキャンペーン」に参加しています。

https://aws.amazon.com/jp/blogs/news/build-games-with-amazon-q-cli-and-score-a-t-shirt/

## はじめに
Amazon Q CLI (以下、Q) を使った Vibe Coding に関する記事を見かけることがありましたが、なかなか触ってみる機会がありませんでした。そんな折、冒頭にリンクを掲載したキャンペーンの存在を知り、「よしやってみるか！」とPCを広げてから約1日後の今、この記事を書いています。

Amazon Q CLI の実力や如何に…！楽しみですね！

## Executive Summary
- Qにアルゴリズムを適切に説明しづらい場合、ゲームのバグ修正が困難な時があった。
- 簡潔なアルゴリズムのゲームを選べば、数回のやり取りで所望のゲームを作ることができた。
- CLIツールとしての使いこなし方法は先に習得しておいた方が良い。参考：https://docs.aws.amazon.com/ja_jp/amazonq/latest/qdeveloper-ug/command-line-context-profiles.html

## ゲーム作りの記録
### 前提条件
- Amazon Q CLIの使用準備が整っている
- Go言語のプログラムをビルドできる

### 環境構築：ゲーム作成ライブラリの導入
せっかくの機会なので、**気になっていたけどなかなか使えていなかったGo製 2DゲームエンジンのEbitengine**を使ってみることにします。

1. プロジェクト用のディレクトリを作成&移動して`q`コマンドを実行。
1. 立ち上がったQのチャットスペースで「Go言語のプロジェクトを初期化して、モジュール名は`github.com/foo/bar`」と依頼。`go mod init`してくれましたが、不要な`main.go`もサジェストされました、こちらはお断りしましょう。
1. 「最新の`github.com/hajimehoshi/ebiten`を追加」と指示すれば`go get`してくれます。指定しわすれていましたが適切に`github.com/hajimehoshi/ebiten/v2`を追加してくれました。えらい。

ここまでは順調ですね。

### 失敗：ビジュアルやアルゴリズムを適切に伝えきれなかった、やや複雑なゲーム

:::note warn
試行錯誤するも、結局バグが解消しなかったため、スクリーンショット等も取らずに消してしまいました。
:::

どんなゲームを作ろうかなと思案したものの、あまり良い題材が思い浮かびません。パッと考えついた「レールが書かれたパネルを並べてスタートからゴールまでレールを繋ぐ」ゲームを試しに作ってみることにしました。

思いつく限りの情報をプロンプトに詰め込んでゲーム作成を依頼すると、**一発目でそれらしい見た目の画面ができました**。これはなかなかテンションが上がります。

しかしそこから、「細かいビジュアルの指定に追従しない」「レールがつながったことの判定アルゴリズムが完成しない」状態になり、何度問答を続けても硬直した状態となりました。

この失敗を振り返ると、次のような反省がありました。
- 細かいビジュアル指定をプロンプトで繰り返したが、画像を入力として使う機能もあるため、それを試してみるべきだった。https://docs.aws.amazon.com/ja_jp/amazonq/latest/qdeveloper-ug/command-line-chat-images.html
- やや複雑なアルゴリズムを、特に下書きもせずプロンプトに一発記載していたため、もう少し詳細なドキュメントを作成してから入力すべきだった。


しかしながら、なかなか準備時間も取れません。そこでもう少し簡単なゲームを作ることに方針転換しました。

### 成功：画面構成もアルゴリズムも単純なゲーム
これまたネタが思い浮かびませんでしたが、子どもの勉強にでも使えたら良いなという思いで「寿司ネタの漢字を表示して、複数選択肢の中から漢字に対応する正しい英語を選ぶ」ゲームを作ることに決めました。

先に完成した画面をご覧ください。
![スクリーンショット 2025-06-08 19.56.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1553191/4406e3b7-643c-4941-8312-1dd5f3beb42c.png)

以下、作成の簡易ログです。

- 最初の指示でおおよその画面構成は作成完了した。
- 点数計算のロジックにバグがあったが数回のやり取りで修正が完了した。
- フォントの問題かと思いますが、表示されない漢字がありました。数回のやり取りで修正が完了しました。

とても簡単なゲームではありますが、ほぼイメージ通りのものを簡単に作り上げることができました。また、今まで書いたことのないEbitengineのプログラムでしたが、まず動くものができあがっているので、コードを読んだ時にとても理解が捗ります。初めて触るプログラミング言語やライブラリの習得に便利だな、と実感しました。

振り返ってみると改善できそうなことは以下の通りです。
- 単体テストも何もない状態なので点数計算ロジックの修正に数回のやり取りを要したが、最初から「重要なゲームのロジックには単体テストを作成し、単体テストがパスすることを確認しながら実装を進めよ」などの指示をしていればもっと簡単になったかもしれない。

ところで、「お、便利」という気づきもありました。作業中、何度かQを終了・再実行することがありましたが、会話のコンテキストが引き継がれている感じがしました。ディレクトリベースで自動的に会話がresumeされるのですね。https://docs.aws.amazon.com/ja_jp/amazonq/latest/qdeveloper-ug/command-line-chat-persistence.html

最初の失敗バージョンの作成から会話をずっと継続していたので、もしかすると`compact`などで会話を圧縮しておく必要もあったかもしれません。https://docs.aws.amazon.com/ja_jp/amazonq/latest/qdeveloper-ug/command-line-chat-commands.html

いかんせん、使用する前にQについて調べなさすぎだったことは反省です。予想以上に多様な機能を備えていてパワフルです…！

作成したゲームはこちらのリポジトリにあります。Goがインストールされていればすぐに実行できます。

https://github.com/tenkoh/q-ebiten-simple-game

## おわりに
簡単なゲームであれば非常に短時間で作成できてしまいました。Amazon Q CLI、なかなか強力です。「作ってみたいけど時間がなかなか取れないんだよなぁ」という個人開発ネタ、隙間時間で作れる時代が来ていますね、ワクワクです！
(調査中)amazonses。レスポンス調査

Amazon SES（Simple Email Service）は、**REST API**または**SMTP**のいずれかを使って利用されます。
このうち、「**REST API経由で送信したときのレスポンスのbodyがgzip圧縮されるか？**」という質問について、以下のように説明できます。

---

### ■ 結論

Amazon SES の REST API（v2含む）のレスポンスは、**クライアントが gzip 圧縮をサポートしている場合に限り、gzip 圧縮される可能性があります**。
つまり、**HTTP ヘッダーで `Accept-Encoding: gzip` を付けてリクエストした場合に限り**、レスポンスが gzip 圧縮されます。

---

### ■ 詳細

#### 1. gzip圧縮される条件

* クライアントがリクエストヘッダーに以下のように指定すると：

  ```
  Accept-Encoding: gzip
  ```
* Amazon SES は、HTTP クライアントの要求に応じて gzip 圧縮されたレスポンスを返すことがあります。
* これは Amazon SES 特有ではなく、**Amazon API Gateway や他の AWS サービスの REST API に共通する挙動**です。

#### 2. 圧縮される内容

* 通常の成功レスポンス（たとえばメール送信成功時の MessageId など）や、エラーメッセージなどが対象です。
* gzip されるのは **HTTP body（Content-Encoding: gzip）** であり、HTTP ヘッダー自体は圧縮されません。

#### 3. gzipかどうかを確認する方法

レスポンスヘッダーの `Content-Encoding` を確認してください：

```
Content-Encoding: gzip
```

このヘッダーがあれば、body は gzip 圧縮されています。

---

### ■ 実用的な注意点

* Java などで HTTP クライアントを使う場合（例：Apache HttpClient、OkHttp など）、多くのライブラリが自動的に gzip をサポートしており、解凍も自動で行います。
* 自前で解凍が必要な場合は `GZIPInputStream` などで対応可能です。