OmniAICreator/Qiita-1.07M huggingface dataset:
Amazon Q Developer CLIを使ってゲームを作る（そしてTシャツを手にいれる）

# はじめに
何やらAWSで面白そうなキャンペーンが開催されていました。

> Build a game using Amazon Q CLI
Write a blog about what & how you built it, or a record a video about your experiences, then post in social media
Redeem a Amazon Q branded T shirt

①Amazon Q CLIを使ってゲームをビルドする（作る）
②何を作りどのように作ったかをブログを書くか動画に記録してSNSに投稿する
③Tシャツと引き換え
手順はたったこれだけです！

https://community.aws/content/2xIoduO0xhkhUApQpVUIqBFGmAc/build-games-with-amazon-q-cli-and-score-a-t-shirt

↓日本語翻訳版も公開されてました

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

# 手順
## AWS Builder IDにサインアップ
必要であればDiscordサーバにも参加しましょう。

https://community.aws/builderid?trk=b085178b-f0cb-447b-b32d-bd0641720467&sc_channel=el

## Amazon Q CLIのインストール
以下のページの手順に沿ってインストールを行いましょう。macOSでHomebrewを使っていれば`brew`コマンドで簡単にインストールできます。

https://docs.aws.amazon.com/ja_jp/amazonq/latest/qdeveloper-ug/command-line-installing.html

## ゲームを作成
私が作ったゲームは後述します。

## ブログなどを作成してSNSに投稿
作成したゲームについてブログを書くか動画を作成し、SNSに投稿します。投稿時にはハッシュタグ`#AmazonQCLI` を忘れずに付けましょう。

また、Tシャツ獲得フォームではGitHubリポジトリのリンクが必須となっているため、コードは必ずGitHubで公開しておく必要があります。記事は日本語でも問題ありません。

## Tシャツ獲得フォームへ入力
個人情報のほか、以下の内容が必要です。

* Link to the public blog / video you’ve published about your game
* Link to your social media post
* Link to your game code in GitHub

当然ですが、Publicで閲覧可能であることに注意が必要です。

https://pulse.aws/survey/ZO9G4AEL?p=0

# 作ったゲーム
私はサッカーが好きなので、今回はPK戦を行うゲームを作ってみました。
特に指定があるわけではないですが、記事で紹介されているPyGameを利用したゲームを作成してもらいました。

最初のプロンプトがこちら。
```shell
ローカル環境にPyGameを使って、サッカーのPK戦を行うゲームを作ってください
```
できたものがこちら。
![1回目.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448259/56d4904d-4cf0-400b-a92f-a9b7692564cc.gif)

操作はクリックするだけのシンプルなものですが、文字化けしていたり、そして何よりプレイヤーのキックが完了後、すぐにCPUのキックが始まってしまうので、プレイヤーはゴールキーパーの操作をほぼできない問題があります。というわけで指示を出しつつ改良。

途中のプロンプトは割愛しますが、下記の機能実装をお願いしました。
* 文字化けの解消
* プレイヤーのキック後に、ゴールキーパーの操作を受け付ける時間を用意
* ゴールキーパーが上下左右に動けるように
* CPUのキーパーの色を青に
* 試合経過がわかるように表を表示
* 早期決着パターンで、勝敗を確定できるように
* サドンデスが実施できるように
* 難易度選択

途中出てきたエラーは適宜修正をお願いしました。

# 完成したもの
最終的に完成したものはこちら。
![完成.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448259/a6b64942-07b2-40f9-b4f8-24c6c0d9f1cb.gif)

# 苦労した点
PK戦は通常5回ずつキックを行うのですが、展開によっては勝敗が確定するタイミングがあります。例えば、先攻が3回連続成功し、後攻が3回連続で失敗すると、規定の5回以内で後攻が勝利することは不可能なため、この時点で勝敗が決定します。
このような早期決着パターンがいくつかあるのですが、「全て網羅して」とお願いしても、プレイ時に早期決着とならないことが多々ありました。そのため、以下のようなプロンプトを適宜入力して都度修正をしました。

```shell
ラウンド5の先攻が終了して、2-3の状況で後攻のキックが発生してしまいます。0-1、1-2、2-3、3-4のケースで同様の事象が発生しないか確認してください。
```
上記の場合は後攻のキックが不要にも関わらず、キックが発生する問題ですが、「ラウンド5の先攻が終了して、2-3の状況」だけの修正をお願いしても2-3の修正しかされないので、同じようなパターンで起こり得るスコアも修正する様にしています。

# GitHub
今回作成されたコードはこちらになります。

https://github.com/alchemy-1115/penalty-shoot-out

# 裏技
ちなみにこのゲーム裏技がありまして、キック時にクリックを連打すると無限に得点をし続けることが可能です。そのため6点以上を最初のキックで記録することで、**CPUにボールを蹴らせず勝利することができます。**

![スクリーンショット 2025-06-01 14.01.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448259/17add256-4320-44a6-ab67-7fee2aed5d09.png)

~~バグじゃなくて仕様だよ。~~
Ansibleを使用して、EC2へのApacheインストール自動化作業

# はじめに
Ansibleというすごい便利な自動化ツールがあると知りましたので、実際に試してみました。

# 構成
[ローカルPC（WSLまたはDocker）※今回はDocker使用]
        ↓ SSH + Ansible実行
[AWS EC2インスタンス（Amazon Linuxなど）]

# 構築手順
 ステップ➀：EC2作成※AmazonLinux2使用
・EC2を起動（パブリックIP付き）

・キーファイルをローカルに保存

・一応、httpがインストールされていないことを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3898218/088fb4c4-b22c-49d8-8031-f37eb1a749ed.png)



ステップ➁：ローカルにAnsible実行環境を用意
・Dockerコンテナを作成するディレクトリ配下に下記ファイルを準備
➀Dockerfile
```
FROM ubuntu:22.04
RUN apt update && apt install -y python3-pip ssh ansible
```
➁hosts.ini（Ansible用インベントリファイル）
 ```
 [web]
[EC2のDNS名] ansible_user=ec2-user ansible_ssh_private_key_file=./[EC2のキーファイル名]
```
➂EC2用のキーファイル

➃playbook.yaml（Ansible用playbook）
```
# install_apache.yml
- name: Install Apache
  hosts: web
  become: true
  tasks:
    - name: Install httpd
      yum:
        name: httpd
        state: present

    - name: Start service
      service:
        name: httpd
        state: started
        enabled: true
```

・Dockerを使ってAnsibleコンテナで実行

　実行コマンド
```
docker build -t ansible .
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3898218/2c17a408-7ddc-425e-97f3-5cca99b9d395.png)

```
docker run -it --name [作成するコンテナ名] `  -v "ローカルPC上に配置したEC2キーファイルの絶対パス:/[キーファイル名]" ` -v "[ローカルPC上に配置したplaybook.yamlの絶対パス]:/playbook.yaml"` -v "[ローカルPC上に配置したhosts.iniの絶対パス]:hosts.ini"`  ansible /bin/bash
```
ステップ➂： 起動後のチェック
・コンテナ内で以下を確認
```
ls /
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3898218/8a4f93f4-1b79-4e5c-bf44-7e226ba08349.png)



EC2との疎通確認
```
ansible -i /hosts.ini web -m ping
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3898218/0d112722-9966-4dcb-9580-3572f5c0a13b.png)

EC2へのApacheインストール
```
ansible-playbook -i /hosts.ini playbook.yaml
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3898218/788656f3-2bd8-4744-8c28-4c7386451750.png)

一応、httpがインストールされていることを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3898218/d10db02f-8fab-4b66-bbd6-fbc2ab30980c.png)


EC2へApacheインストールされているかブラウザで確認

```
http://[EC2のパブリックIP]
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3898218/f8f53786-3651-4b07-b6ff-9f8c540497c4.png)


# おわりに
正直すごく効率的なツールだと感じました。個人的には、IaCでCloudFormationやTerraformを使って、インフラの作成を実施→その他のMW製品のインストールや各種設定ファイルの設定にAnsibleを活用するといった分け方が良いのかなと感じました。

明日から、クラウドの業務が始まりますので、積極的にこういった自動化ツールを活用していけるように知識のキャッチアップをしていきます！
AWS EC2 のパブリックIPを Elastic IP で固定してみた

## はじめに
AWS EC2 を使っていると、インスタンスを停止・再起動するたびにパブリックIPが変わってしまうのが地味に面倒ですよね。
SSH接続やWebサービスの確認をするたびに、毎回IPを確認して接続し直すのはストレスです。

そこで今回は、Elastic IPを使って EC2のパブリックIPアドレスを固定する方法を試してみました。
思ったよりも簡単に設定できたので、その手順をまとめておきます。

> ※本記事は、前回投稿した以下の記事の続きです。
> 内容の一部（環境構築や Flask アプリのセットアップなど）は前回記事を前提としているため、本記事では詳細な説明を省略しています。

https://qiita.com/ymtdir/items/aa172f718793e414b26f

## 概要
本記事では、EC2インスタンスにElastic IPを割り当ててIPアドレスを固定する方法を解説します。

具体的な手順は以下の通りです
- AWS マネジメントコンソールで Elastic IP を割り当てる
- EC2 インスタンスに関連付ける
- IPアドレスが固定されているか確認する
- SSH の Config ファイルを設定して、接続を簡略化する

Elastic IP を設定すれば、インスタンスを再起動しても IP アドレスは変わらなくなります。
開発環境・検証環境などで安定したアクセスが必要な方には特におすすめです。

## Elastic IP の割り当て
### 1. AWSマネジメントコンソールで EC2 > Elastic IP に移動
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4050675/ea9d4873-d41f-42e1-8647-6ebaa5246bd2.png)

### 2.「Elastic IP の割り当て」をクリック
![image (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4050675/bd96cd92-5659-4f34-872b-73b7e2830abe.png)

### 3.「割り振る」をクリック
![image (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4050675/7c5c13c9-6fe8-4d29-aa86-732d9c3d4193.png)

### 4. Elastic IPアドレスが割り振られたことを確認

## Elastic IP をインスタンスに関連付ける
### 1. Elastic IP の左のチェックボックスを選択![image (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4050675/e79fe4ed-003a-404e-8e68-37dc1de1de48.png)

### 2. 画面上部の「アクション」→「Elastic IPアドレスを関連付ける」を選択

### 3. 対象のインスタンスを選択し、「関連付け」をクリック
![image (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4050675/0f9ebd21-ae5d-47cf-b8ee-680456fb3e39.png)
- プライベートIPアドレスは自動で選択されます

## IPアドレスが固定されているか確認する
### 1. インスタンスを起動
![image (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4050675/8b693cfc-dd0e-48b7-aef3-396a71e001fa.png)
- 起動後、Elastic IPアドレスとパブリックIPアドレスが一致していることを確認します

### 2. VS Code からSSH接続する
![image (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4050675/0f2b7d6c-c956-4f4a-9088-357df50a91e1.png)
![image (7).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4050675/7d482216-4eb6-48d5-a20f-64fb45564afc.png)

### 3. Flaskアプリを起動して動作確認
```bash
sudo ~/flask_app/venv/bin/python ~/flask_app/main.py
```

### 4. ブラウザから Elastic IP にアクセスし、表示を確認する
![image (8).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4050675/9ebc751b-9da1-400e-8942-d6cb24c2e02d.png)

### 5. インスタンスを再起動して動作を確認
- インスタンスを一度停止して再起動
- Elastic IP（パブリックIP）が 変わらないことを確認

## 任意: SSH Config ファイルで接続を簡略化
`~/.ssh/config` に以下のように設定

```bash
Host aws-ec2
  HostName ec2-18-178-201-136.ap-northeast-1.compute.amazonaws.com
  IdentityFile .ssh/aws-ec2-ymtdir.pem
  User ubuntu
```

- `Host`は任意の名前(例: `aws-ec2`)でOK
- 過去のインスタンス情報は全て削除してOK

これで、以後は以下のコマンドで簡単に接続可能：

```bash
ssh aws-ec2
```

---

続きの記事はこちら

https://qiita.com/ymtdir/items/9a1b5e5ebd547913d89f
Java Gold合格体験記

# はじめに

本記事はJava Gold11に合格するために行った勉強法を記載したものです。
これから受験を考えている方の役に立てればと思い、
備忘録的な意味合いも兼ねて書き残すことにしました。

# 本記事の想定読者
・Java Silverに合格済で、Goldの受験を検討している方
※Goldの受験には**Silverに合格していることが必須条件**のため、
　Silver合格済の方を対象としています。

# 使用した書籍&合格までの勉強日数
書籍
→Bronze,Silverと同様、黒本の内容を完璧に理解していく形で勉強しました。

勉強日数
→応用情報受験後から開始して、1か月ちょいくらいでした。
 応用情報の結果が合格であれば、そちらの体験記も書こうと思います。

# 勉強開始直後の感想
黒本を購入して、第1章を見た瞬間Silverとの難易度の差に愕然としました...

Silverの勉強を始めた際は、第1章を見た時「Bronzeの延長っぽいな」といった感想を抱き、ラムダ式辺りに差し掛かるまでずっとその感覚で解き進めていました。
ですが、Goldは第一章からずっと初見の分野しか問われず、
Silverの延長線にあるといった感覚は一切抱けませんでした。

本当にこんな問題が理解できるようになるのか...?とずっと不安なまま解き進めていました。
こんな状態からでも無事合格できたので、今同じ壁に当たっている方も安心してください！

# 勉強法
私は以下のような流れで勉強していました。
~~~
1.黒本を1章分等キリのいいところまで解き、採点する
2.黒本記載の解説を見たり、ChatGPTに解説してもらう
3.再度解き直す
4.不正解だった問題、正解ではあるものの根拠を説明できない問題については、2からやり直し。
~~~

黒本記載の解説だと、レベルが高すぎて理解できない...といった事も多かったので
**ChatGPTには非常に助けられました。**

Geminiも試してみましたが、解説が教科書チックであまり頭に入ってこなかったので、
口語調で解説してくれるChatGPTが一番使いやすかったです。
(プロンプトの問題かもしれないですが。。)

ChatGPTを利用する際には黒本の問題を写真で撮って、
「これの答えはA。解説して」みたいな投げ方をしていました。
>補足：※ハルシネーションを起こすことも度々ありましたので、その点にはご注意ください。

その選択肢が正解とされている理由について理解することが出来たら、
下記2点まで深堀して理解するようにしていました。
~~~
・他の選択肢はなぜ誤りとされているのか
・他の選択肢が正解になるには、どういった修正が必要か
~~~

各章を上記勉強法で解き進め、大体黒本4周くらいしていました。
1周目は初見で解いてズタボロの状態、2周目は解説読んだ後解いてある程度マシな状態。
3,4周目はほぼ満点に近い状態。といったところでした。

# 各章の重要度
第1章:クラスとインタフェース
→まぁまぁ出る。Enumは特に抑えておくべき。

第2章:関数型インタフェースとラムダ式
→**かなり出る。徹底的にやるべき。**

第3章:並列処理
→まぁまぁ出る。しっかりやっておくべき。

第4章:ストリームAPI
→**かなり出る。徹底的にやるべき。**

第5章:入出力
→まぁまぁ出る。しっかりやっておくべき。

第6章:JDBCによるデータベース連携
→これはあんまり出てなかったと思う。

第7章:汎用とコレクション
→まぁまぁ出る。しっかりやっておきべきだけど、覚えることはそんなに多くない。

第8章:アノテーション
→出た記憶がないくらい、出てなかったと思う。

第9章:例外とアサーション
→まぁまぁ出る。しっかりやっておくべき。

第10章:ローカライズ
→そんなに出ない。けどある程度はやっておくべき。

第11章:モジュール・システム
→そんなに出ない。けどある程度はやっておくべき。
requiresとかexportsとかその辺の用途はしっかり抑えておくべき。

第12章:セキュアコーディング
→よく出る。しっかりやっておくべき。

2章4章はとにかくやっておくべきだと思います。
**Goldは当たり前のようにラムダ式が使用されているので、特にラムダ式は絶対に抑えておくべき。**

# 試験本番&締め
黒本の章末問題から8割近く出る...なんて噂も聞いていましたが、私が受験した際には6,7割くらいだったかと思います。選択肢の順番はシャッフルされてました。
黒本外の問題でも、問われている内容自体は黒本の問題と大差なく、理解不能な初見問題等は特になかったです。
黒本を完璧に仕上げておけば合格できると思いますので、受験を検討されている方は頑張ってください！
「手探りでCUI OS作成に挑む」問題解決篇　文字列表示がうまく行かない　

## 「手探りでCUI OS作成に挑む」連載

この記事は「手探りでCUI OS作成に挑む」連載の一部です。
全体の目次は[「手探りでCUI OS作成に挑む」連載目次](https://qiita.com/earthen94/items/b5d77f98f0cf85a13346)を御覧下さい。

## 現象
以下のように表示される
```
TEST
. DAMMY
≡　雪印
```
又は
```
- HALT
HALT
カーソル
```

本来は以下の筈
```
TEST
HALT
```

## プログラム
ブートローダーから以下のプログラムを読み込む。
読み込み自体は問題ないように思う。

```
[org 0x7E00]
[bits 16]

;********************************************************************************
; システム初期化ブロック
;********************************************************************************
start:

; === セグメントレジスタ初期化 スタック設定===
    cli
    xor ax, ax
    mov ds, ax     ; データセグメントは 0 にしておく（test_string などの参照に対応）
    mov es, ax
    
    mov si, 0x7E00

    mov ax, 0x9000     ; 安全な場所にスタックを置く（0x9000:FFFF = 0x9FFFF）
    mov ss, ax
    mov sp, 0xFFFE     ; FFFEが望ましい（偶数）
    sti
    
    mov si, test_string
    call print_str
        
    mov si, hlt_msg
    call print_str
    
    cli
.loop:
    hlt
    jmp .loop

print_str:
    push ax
    push si
    mov ah, 0x0E    ; BIOSテレタイプ機能
.loop:
    lodsb           ; 次の文字をALにロード
    test al, al     ; ヌル文字チェック
    jz .done
    int 0x10        ; BIOS文字表示
    jmp .loop
.done:
    pop si
    pop ax
    ret

halt:
    cli
.loop:
    hlt
    jmp .loop
    

test_string      db 'TEST',0x0D,0x0A,0
hlt_msg          db 'HALT',0x0D,0x0A,0

DAMMY            db 'DAMMY',0x0D,0x0A,0


; パディング（512バイト×3のコードサイズを保証）
times 512 * 3-($-$$) db 0

```

## ラベルの指定は正しいことを確認

### 文字列のオフセットを確認
```
hexdump -C load.bin > loadhexdump.txt
```
```
00000030  5e 58 c3 fa f4 eb fd 54  45 53 54 0d 0a 00 48 41  |^X.....TEST...HA|
00000040  4c 54 0d 0a 00 44 41 4d  4d 59 0d 0a 00 00 00 00  |LT...DAMMY......|

```
`T`は0x37
`H`は0x3E
から始まる。

### 逆アセンブル
```
ndisasm -b16 load.bin > loaddisasm.txt
```
mov si, test_string → mov si,0x7e37
mov si, hlt_msg → mov si,0x7e3e

ラベルのアドレス指定に問題は無い


## 変な現象
popa/pushaに変更しても正常に動かない
ax,siのみをpop/pushしても正常に動かないが、
ax,bx,siをpop/pushするか、ax,cx,siをpop/pushもしくはまともに動く。
CXでもBXでもよいことからレジスタそのものの問題ではなく、スタックに起因するものと思われる。

以下は正常に動作する例
```
print_str:
    push ax
    push bx
    push si
    mov ah, 0x0E
.loop:
    lodsb
    test al, al
    jz .done
    int 0x10
    jmp .loop
.done:
    pop si
    pop bx
    pop ax
    ret

halt:
    cli
.loop:
    hlt
    jmp .loop
```

割り込みが入りスタックがずれた可能性を考え、以下のように割り込みを禁止するも表示は不正なまま。
```
print_str:
    cli
    push ax
    push si
    sti
    
    mov ah, 0x0E
.loop:
    lodsb
    test al, al
    jz .done
    int 0x10
    jmp .loop
.done:
    cli
    pop si
    pop ax
    sti
    ret
```

原因はさっぱり分からない
一旦AX、BX、SIをPUSH/POPしたら動くのでこのまま開発を進める。
何日かして頭が整理されたら改めて調べる。
自分のペースでゆったり学ぶTCP/IP　アウトプット

自身の知識定着も含めてアウトプットをしていきます。

📖 読んだ本
書名：自分のペースでゆったり学ぶTCP/IP

著者：網野衛二

出版社・発行年：技術評論社・2009年11月25日

読んだ目的：基礎知識を身に着けるため

📝 概要
この本は、ネットワークの基本となるTCP/IP階層モデルについて、初心者向けに会話形式でわかりやすく解説した一冊です。わかりやすい例を会話形式で取り上げているため、ネットワーク初心者にも理解しやすい構成になっています。

💡 学んだこと・印象に残ったこと
ポイント1
MACアドレス・IPアドレスの違い
　MACアドレス：次にデータを渡す機器を指定（＝近くの「町」）
　IPアドレス：最終的な目的地（＝「住所」）
　ルーティング：目的地までの経路を決める処理
ポイント2
UDPとTCPの違いについて
　UDPは高速＆信頼性少＝不特定多数に送信することが可能
 　例）動画ストリーミング
　TCPは遅い＆信頼性高＝不特定多数に送信することができない
 　例）メールなど

ポイント3
DNS(Domain Name System)のイメージはあだ名
　コンピュータがどこにあるかを知るためにはIPアドレスが必要になるが、32ビットではわかりにくい。そのためドメイン名をつけて視覚的にわかりやすくしている。

💬 感想・ひとこと
TCP/IPをはじめ、ネットワーク全般に苦手意識があるため、定期的に本書を読み返して知識を定着させていきたいです。
Wan2.1 VACE 1.3B で画像からの動画生成をコントロールする実例集

# コンパクトなモデルで、数分で生成できる
A100 GPUで数分で生成。A10でも生成できる。しかもそこそこ綺麗。
動画生成AIの中ではトップレベルでコスパいい。

いろんな制御方法があるので、例は随時追記していきます。

## Image2Video

**元画像 / 出力動画**
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/27fe7a8f-76b5-428a-b4b4-b8d955bf1c79.jpeg width=200> <img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/a685f6f8-4dc1-419c-b366-ad3379732a07.gif width=200>

```shell
python vace/vace_preproccess.py --task image_reference \
    --mode salient \
    --image "girl.jpg"

python vace/vace_wan_inference.py \
  --src_ref_images "processed/image_reference/{DATE}/src_ref_image-image_reference.png" \
  --prompt "A girl is smiling and walking slowly towards the camera. Highly detailed facial drawing."
```

## Face2Video

**元画像 / 前処理結果 / 出力動画**
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/27fe7a8f-76b5-428a-b4b4-b8d955bf1c79.jpeg width=200><img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/10cf25df-9bda-4fae-b7b8-9cb804fbc81e.png width=100><img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/049a94b1-f5c1-46a6-ac03-815273c72aed.gif width=200>

```shell
python vace/vace_preproccess.py --task image_face --image processed/image_reference/2025-06-01-01-13-38/src_ref_image-image_reference.png

python vace/vace_wan_inference.py \
  --ckpt_dir models/Wan2.1-VACE-1.3B/ \
  --src_ref_images processed/image_face/{DATE}/src_ref_image-image_face.png \
  --prompt "Girl in robot suit shooting lasers from her hands. Highly detailed facial features."
```

## Video2Depth2Video

**元動画 / 前処理結果 / 出力動画**
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/c92f8b79-387d-4a6a-8183-d53ee672c3e3.gif width=200><img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/5989182d-b5d0-4046-b055-cac51770e6f3.gif width=200><img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/381c270f-5c2e-4fe6-ad56-e3c1ed5f0abc.gif width=200>

```shell
python vace/vace_preproccess.py --task image_face --image processed/image_reference/2025-06-01-01-13-38/src_ref_image-image_reference.png

python vace/vace_wan_inference.py \
  --ckpt_dir models/Wan2.1-VACE-1.3B/ \
  --src_ref_images processed/image_face/{DATE}/src_ref_image-image_face.png \
  --prompt "Girl in robot suit shooting lasers from her hands. Highly detailed facial features."
```

# VideoInpaint2Video
**元動画 / 前処理結果 / 出力動画**

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/7d54a85c-d746-474a-96a6-b664bb217c06.gif width=600>

```shell
python vace/vace_preproccess.py --task inpainting --mode salientmasktrack \
   --video 12744585_1080_1920_100fps.mp4 --label person --maskaug_mode original_expand --maskaug_ratio 0.3

python vace/vace_wan_inference.py \
    --src_video processed/inpainting/{DATE}/src_video-inpainting.mp4\
    --src_mask processed/inpainting/{DATE}/src_mask-inpainting.mp4 \
    --prompt "老虎望着大海，站起身走开。场景逼真。"
```

#
ReactiveCollectionの参照差し替えに要注意

# ある日の業務中のこと…
WPFアプリの開発中の出来事でした

他のクラスから受けとった値でReactiveCollection型のプロパティを更新
↓
Subscribeしているクラスで変更後の処理を実行

という流れを実装しようとしていましたのですが、
なんとサブスクライブした後の処理が実行されないのです🤔

以下のような実装になっていました（必要なusingの記載は省略しています）
```c#
// 値の管理を行うクラス
public class IntsService
{
    // 整数値のコレクション(管理したい値)
    public ReactiveCollection<int> Ints { get; set; } = [];
}
```
```c#
// 変更をサブスクライブする側のクラス
public class IntsSubscriber
{
    private readonly IntsService intsService;

    public IntsSubscriber()
    {
        this.intsService = new IntsService();

        // 値の追加をサブスクライブ
        // 本来はコンソール出力ではなく値変更後に実行したいメソッドを渡してました
        this.intsService.Ints
            .ObserveAddChanged()
            .Subscribe(x => Console.WriteLine("値が追加されました"));
    }

    public void ChangeProperty()
    {
        // ReactiveCollectionの値を変更
        this.intsService.Ints = new ReactiveCollection<int>()
            .AddRange(new List<int> { 1, 2, 3 });
    }
}
```
```c#
public static class ReactiveCollectionExtensions
{
    // ReactiveCollectionではListのAddRangeが使えないため自前の拡張メソッドで実現
    // 本題とは関係ないです
    public static ReactiveCollection<T> AddRange<T>(this ReactiveCollection<T> collection, IEnumerable<T> items)
    {
        foreach (var item in items)
        {
            collection.Add(item);
        }
        return collection;
    }
}
```

# なぜ変更通知が飛ばなかったのか
皆さんはお分かりでしょうか？

原因は`IntsSubscriber`の`ChangeProperty`メソッドにありました
```c#
public void ChangeProperty()
{
    // ReactiveCollectionの値を変更
    this.intsService.Ints = new ReactiveCollection<int>()
        .AddRange(new List<int> { 1, 2, 3 });
}
```
ここで値を変更するためにReactiveCollectionをnewしているんですね
つまり、参照を書き換えてしまっているわけです

ReactiveCollectionは.NET標準のObservableCollectionを継承しており、
変更通知の仕様はCollectionChangedメソッドと同様になります

CollectionChangedの仕様を確認してみると以下の記載があります
> 項目が追加、削除、または移動されたとき、またはリスト全体が更新されたときに発生します。

https://learn.microsoft.com/ja-jp/dotnet/api/system.collections.objectmodel.observablecollection-1.collectionchanged?view=net-8.0#system-collections-objectmodel-observablecollection-1-collectionchanged

同じ参照のコレクションに対する変更は通知されますが、
参照を書き換えてしまうとイベントが発火されないのです

じゃあなんで単純に値をAddする実装にしていなかったのかという話ですが、
直近で触っていたFlutterのプロパティ変更通知がそういう仕様になっていたからですね

ReactiveCollectionも同じ仕様だろうと勘違いをして、
こんなお粗末な実装をしていたわけです😩

# 解決方法
参照を変えずに値を変更すれば解決です
```c#
public void ChangeProperty()
{
    // ReactiveCollectionの値を変更
    this.intsService.Ints.AddRange(new List<int> { 1, 2, 3 });
}
```
**参照差し替えには要注意です！**
Amazon Q Developerでパズルゲームを作ってみた

普段の業務においてコーディングをする機会がないことを言い訳に、これまでコード生成ツールに触れてこなかったのですが、「Amazon Q CLI でゲームを作ろう Tシャツキャンペーン」なるものが開催されることを知り、Amazon Q Developerに入門してみました。

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

# 事前準備
キャンペーンのブログに掲載されている手順に従い、準備を進めます。
クラスメソッドの方が詳細な手順をまとめておりましたので、こちらを参考に設定しました。

https://dev.classmethod.jp/articles/q-developer-cli-game-cbs/

なおOSがWindowsのため今回はWSL2を利用しております。

# ゲーム構築
`q chat`よりセッションを開始し、今回作成するゲームの概要を伝えます。

```
以下ルールのパズルゲームを作ってください。
#ゲームのルール
・4×4のマスの上で、数字のタイルを動かす
・一つのタイルを上下左右にスライドすると、すべてのタイルがその方向に動く
・同じ数字のタイル同士がぶつかると合体して、数字が2倍になる
　例：2 + 2 → 4、4 + 4 → 8
・合体後のスコアは、合体した数字の分だけ加算される
・合体は1ターンにつき1回のみ行われ、連鎖はしない
・毎ターン、2または4のタイルが新たに出現します。

#終了条件
・100回操作を実行した際の、タイルの数字の合計値でスコアを付ける
・タイルを動かすことができないア場合（＝全マスが埋まり、合体もできない）はゲームオーバー

なお作成したファイルは全てローカルに保存してください
```
この後作成されたプロトタイプを見ながら、主にデザインに対し指示を与えました。
最終的にタイルの数字に応じて、動物が変化するようにしています。
  • 2: うさぎ
  • 4: ねこ
  • 8: いぬ
  • 16: きつね
  • 32: おおかみ
  • 64: ライオン
  • 128: ぞう
  • 256: きりん
  • 512: さい
  • 1024: ドラゴン
  • 2048: ユニコーン
  • 4096: フェニックス

そして完成したのがこちらです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3665293/915595db-cb60-495c-9061-9280af6c3e65.png)

特に指定はしなかったですが、こちらの意図を組んで、矢印キーで操作できるようになっていました。
数字を組み合わせると確かに動物も進化しますね。

![無題の動画.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3665293/717be2dc-471e-4183-8cdb-3fb549dfde00.gif)

何回か試してみましたが、上限100回だと128のゾウが限界でした。

## 注意点
今回はAmazon Q Developerの無料版を利用しているため、5/31現在チャットインストラクション(会話の回数)の上限は50回/月となっています。複雑性の高いゲームを作成する、複数のゲームを作成するといった場合は、ご注意ください。

https://aws.amazon.com/jp/q/developer/pricing/

なおPro版は1ユーザーあたり$19/月かかりますが、チャットインストラクションの上限は設けられていないため、こちらを利用するという選択肢もあります。

https://dev.classmethod.jp/articles/amazon-q-developer-pro-member-account/

## 感想
ゲームの作成自体は30分程度で完了し、非常に驚愕しています。むしろ事前準備の作業時間の方が長かったです。

これまで自分の考えをホワイトボードに書いて他者に伝えるといったことが当たり前でしたが、抽象的なものについてはどう表現すればいいのか迷うことがしばしばありました。
アマQのような生成AIの力を借りることで、言語化が難しい表現も補ってもらいつつ、素早くよりイメージしやすい形で伝えることができる可能性を感じました。
ClineからPlaywright MCPを利用して、Chromeを操作する

# ✅ 準備
MCPサーバ設定から、`cline_mcp_settings.json`を開く。

![スクリーンショット_2025-06-01_0_56_41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141934/65272c9f-f1f5-424b-86ef-f6af3f52eb83.png)

`cline_mcp_settings.json`にPlaywrightのMCPサーバを設定する。

```json:cline_mcp_settings.json
{
  "mcpServers": {
    "playwright": {
      "command": "npx",
      "args": [
        "@playwright/mcp@latest"
      ]
    }
  }
}
```

# ✅ 動作確認
Clineにplaywrihtを利用してgoogleを開くように指示する。

![スクリーンショット 2025-06-01 14.05.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141934/30934a0d-a925-495e-93a4-17fe75a4e767.png)

Chromeが起動してgoogleのページが表示される。

![スクリーンショット 2025-06-01 14.02.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141934/8b346792-a7bc-4a2f-b0ad-0b01eab73797.png)

---

# 📝 参考
https://github.com/microsoft/playwright-mcp
【受験体験記】生成AIパスポートを受験しました！勉強法や難易度を振り返る

こんにちは、river_mouth(りばーまうす)です。
本記事では、2025年6月1日に受験した「生成AIパスポート」について、学習方法や試験の感想をまとめておきます。  
**なお、試験結果はまだ届いておりませんので、結果が判明次第、記事を更新いたします。**!

---

## ◆ 生成AIパスポートとは？

生成AIパスポートは、生成AI（ChatGPTや画像生成AIなど）に関する基礎知識を問う資格試験です。  
AI技術の概要、活用シーン、リスク、法律・倫理的観点など、幅広いトピックが扱われています。

### 試験概要（2025年6月時点）

| 項目        | 内容                                          |
|-------------|-----------------------------------------------|
| 試験形式    | オンライン（IBT方式）                        |
| 問題数      | 60問（四肢択一式）                           |
| 試験時間    | 60分                                          |
| 出題範囲    | 公開シラバスより出題                          |
| 受験料      | 一般：11,000円（税込）／学生：5,500円（税込）|
| 合格基準    | 非公開（正答率の目安は7〜8割と推定）         |
| 実施回数    | 年3回（2月・6月・10月）                      |

※最新情報は[公式サイト](https://www.guga.or.jp/)をご確認ください。

---

## ◆ 勉強期間と使用教材

### ▶ 勉強開始時期  
5月中旬から開始し、約2週間ほど集中的に学習しました。

### ▶ 使用教材

1. **guga公認 生成AIパスポート テキスト＆問題集**  
   - 試験範囲を広く網羅しており、基礎を固めるのに最適です。  
   - テキストを**2周**読み、巻末の模擬問題を何度も解きました。

2. **Udemy講座（実践問題対策）**  
   - [Udemy講座リンクはこちら](https://www.udemy.com/share/10cTtz3@RQb-q60cYmFawm4oTUxqmpngvJ3zzuA2AELF2kb1CpZQ5Z0-L92lqbel_GpaZZGT/)  
   - 模擬問題が充実しており、アウトプット重視の学習に最適でした。  
   - テキストとの併用で、理解の定着を実感できました。

---

## ◆ 試験当日の流れと所感

- 試験はIBT方式で、自宅からオンライン受験可能。
- 私は**20分程度で全問解答完了**。見直し時間も含めても30分弱。
- 出題傾向は、教材の模擬問題と非常に近い印象を受けました。
- 内容をしっかり学んでいれば、**難易度はそこまで高くない**と感じました。

---

## ◆ 合格のコツと勉強法

- **テキストを繰り返し読み込む（最低2周）**  
- **模擬問題を繰り返し解く**ことで出題傾向を把握  
- **アウトプット学習**（特にUdemyの問題）がスピード感にも直結  
- スキマ時間の活用と、間違えた問題の反復が重要です。

---

## ◆ 最後に

生成AIの基礎知識を体系的に学べるこの資格は、エンジニア・非エンジニア問わず、今後のビジネス環境において大いに役立つと感じました。

**試験結果が判明しましたら、合格証やスコア、勉強時間の具体的な目安などを追記いたします。**  
ご質問やコメントなどあれば、お気軽にお寄せください！

---
inline関数の考え方

# はじめに
今回はあまり使われてないがすごい便利なインライン関数での考え方を紹介していきます
そもそも、Inline関数は特定の処理を関数内で展開できるようにするものでほとんど同じ処理をしている関数を無駄に増やさないためによく使われます
### コード
今回は例としてEpoch秒数を更新する処理で考えてみます
```kotlin
private inline fun updateEpochSecond(
    isStart: Boolean,
    // LocalDate,LocalTimeはこの関数を呼び出す側で利用できるもの、尚且つLongが返却物にないとダメ
    crossinline updateFunc: (LocalDate, LocalTime) -> Long
) {
    val zone = ZoneId.systemDefault()
    val currentEpoch = if (isStart) _uiState.value.startEpochSecond else _uiState.value.endEpochSecond
    val zonedDateTime = Instant.ofEpochSecond(currentEpoch).atZone(zone)
    val currentDate = zonedDateTime.toLocalDate()
    val currentTime = zonedDateTime.toLocalTime()

// ここまでの処理で用意した値をcrosslineに渡すことで呼び出し元で別の加工ができる
    val newEpoch = updateFunc(currentDate, currentTime)

// 帰ってきた値を使って更新
    _uiState.value = if (isStart) {
        _uiState.value.copy(startEpochSecond = newEpoch)
    } else {
        _uiState.value.copy(endEpochSecond = newEpoch)
    }
}

fun updateDate(date: LocalDate, isStart: Boolean) {
    updateEpochSecond(isStart) { _, time ->
        date.atTime(time).atZone(ZoneId.systemDefault()).toEpochSecond()
    }
}

fun updateTime(time: HourMinute, isStart: Boolean) {
    updateEpochSecond(isStart) { date, _ ->
        time.toDateTime(date).atZone(ZoneId.systemDefault()).toEpochSecond()
    }
}
```
### さいごに
高次関数と似てはいますがInline関数はパフォーマンスにも影響するので使えるところは使っていきたいですね
テスト設計・実施の課題と対策

## はじめに
通常のチーム開発ではあまり見られないかもしれませんが、
私が携わっているプロジェクトでは、**人手不足**により、**テスト仕様書のレビューが行われないままテストが実施される**という状況が発生しました。

当然のことながら、リリース直前になって
「**なぜ今さらこんなバグが見つかるのか？**」という状況に陥ってしまいました。

レビューは、品質・効率・信頼の観点から**欠かせない作業**であると理解していましたが、
一方で、**「レビューを依頼すれば安心だろう」という、作成者側の思い込みや油断**があったのも事実です。

そこで、今後は「本当にレビュー者に任せきりでよいのか？」という観点を持ち、
**依頼前に作成者自身が確認すべきポイントを明確にすることが重要**だと感じました。

本記事ではその気づきをもとに、レビュー前に気をつけるべきチェックポイントを整理し、
再発防止や品質向上のヒントになればと思います。

## 現状の課題をおさらい
現場で実際に起こっている、テストフローとその問題点の振り返り。

テストフロー：
```
結合テスト仕様書作成
　↓
結合テスト実施
　↓
テストで発見したバグを改修
　↓
同じテスト仕様書を用いて、本番環境でのテストを実施  
```
問題点：

* この一連の工程を、**すべて同一の担当者が実施**しています。
* 結合テストで発見されたバグが本番環境で改善されているかの確認はできますが、
テスト仕様書が**一度も第三者に確認されない**ため、
**もともと網羅されていなかった観点や、新たなバグの見逃しが発生**してしまいます。


## 作成側が気をつけるべきポイント
### 1. 仕様の理解不足・誤解による誤ったテスト設計
* 仕様を思い込みで解釈し、誤ったテスト設計や実施をしてしまうリスクがあります。
* 特に、共有フォルダ上で仕様変更が行われたのに設計書が更新されていない場合、古い情報のままテストを進めてしまう危険があります。
* 少しでも疑問点があれば、最新の仕様に基づいているか、関係者と認識が一致しているかを確認しましょう。

### 2. 慣れによる「見落とし」
* 自分が作成した仕様書を自分でレビューする場合、どうしても“慣れ”が生じます。
* 書いた内容を「わかっているつもり」で読み飛ばし、ミスや抜けを見落としやすくなるため注意が必要です。

### 3. テストケースの網羅漏れ
* 特定の観点に偏ったテスト設計をしてしまい、必要なパターンや境界値が抜けてしまうことがあります。
* 組み合わせパターンや例外系など、多角的な視点から網羅性を意識することが大切です。


## 対策
### 1. セルフレビューシートの導入
* 第三者のレビューが難しい場合でも、自分自身で客観的に確認できる仕組みを持つことが重要です。
* チェックリスト形式のセルフレビューシートを用意し、テスト設計時の見落としを防ぎましょう。
* 最初は個人用として作成し、後にチーム共有していくと組織的な強化にもつながります。

<例：チェック項目>
* 境界値は網羅できているか？
* 異常系のテストケースは含まれているか？
* 修正による影響範囲のテストは含まれているか？

### 2. 時間差レビュー
* 作成直後にレビューすると、頭の中の情報と一致してしまい、見落としや思い込みに気づきにくくなります。
* 設計から1日程度時間を置いて見直すことで、自分の思い込みを排除し、より客観的に確認できます。
* 「他人が書いた資料を読むつもり」で再確認するのがポイントです。

### 3. 組合せ表・マトリクスの活用
* 複数の条件を組み合わせるテストでは、設計者の主観だけではパターンの網羅に偏りが出やすくなります。
* 組合せ表やマトリクスを使って、条件を形式的に整理・可視化することで、テストケースの抜けや偏りを防止できます。

### 4. チェック観点のテンプレート化
* テスト観点に漏れが出やすい場面では、あらかじめ確認すべき項目をテンプレート化しておくと効果的です。
* たとえば、以下のような観点を毎回チェックリストに含めておくと、品質のブレを防げます。

<例：共通チェック観点>
* UI表示（レイアウト崩れ、誤字脱字など）
* エラーハンドリング（エラー時の処理やメッセージ表示）
* APIのリクエスト／レスポンス内容の確認

### 5. 過去のバグリストを参考にする
* 過去に発生したバグは、同様のミスが再発しやすいポイントでもあります。
* チームや自身が経験したバグを一覧にし、テスト設計時の参考資料として活用することで、同じ過ちを防げます。

## 最後に
今回の振り返りを通じて、テスト設計に限らず、日々の業務全体において「事前の確認」や「意識的なチェック」がいかに大切かを改めて実感しました。

また、自分自身がレビューする立場だったら、どのような成果物が望ましいかという視点を持ちながら作業を進めることの重要性にも気づかされました。
単に「レビューに出す」ではなく、「相手が確認しやすいようにまとめる」意識が、結果として品質の向上につながると感じています。

手動によるテストだけに頼ると、確認漏れや、他の不具合の修正によって意図せず動作が変わってしまうといったリスクもあります。
そうした状況に備えるためにも、自動テストやテストコードの導入も視野に入れつつ、チーム全体で最適なテスト手法を議論・選定する場を持つことが重要だと感じました。

## 参考資料
https://www.qt.io/ja-jp/blog/tdd-vs-bdd-comparison-testing-approaches
【SQL】INNER/LEFT/RIGHT/FULL/CROSS JOINの違いと具体例

# はじめに
SQLの `INNER JOIN`、`LEFT JOIN`、`RIGHT JOIN`……
「何がどう違うの？」と聞かれるとちょっと不安。
この記事では、自分の頭の中を整理するために、JOINの基本的な種類と違いを簡単な例と一緒にまとめてみました。

# JOINの「書き方の違い」について
SQLのJOINは、同じ意味でも書き方にバリエーションがあります。
省略形が使われることもあるので、違いを整理しておくと理解しやすくなります。

|JOINの種類 | 省略形 |
| ---- | ---- |
|INNER JOIN | JOIN |
|LEFT OUTER JOIN | LEFT JOIN |
|RIGHT OUTER JOIN | RIGHT JOIN |
|FULL OUTER JOIN | FULL JOIN |
|CROSS JOIN | なし |

`INNER JOIN` の場合は `INNER` を、`OUTER JOIN` の場合は `OUTER` を省略して記述することが可能です。
例えば、`INNER JOIN` は `JOIN` と、`LEFT OUTER JOIN` は `LEFT JOIN` と書くことができます。

# 使用するテーブルの例
- users テーブル

|id | name |
| ---- | ---- |
|1 | 佐藤 |
|2 | 朴 |
|3 | スミス |

- orders テーブル

|id | user_id | item |
| ---- | ---- | ---- |
|1 | 1 | 寿司 |
|2 | 1 | 納豆 |
|3 | 2 | キムチ |
|4 | 4 | トムヤムクン |

# INNER JOIN（内部結合）
`INNER JOIN` は「両方のテーブルにマッチするデータ」だけを取得します。

```sql
SELECT users.name, orders.item
FROM users
INNER JOIN orders
ON users.id = orders.user_id;
```

|name | item |
| ---- | ---- |
|佐藤 | 寿司 |
|佐藤 | 納豆 |
|朴 | キムチ |

スミス は注文がないので除外され、user_id=4 の トムヤムクン も users に存在しないため除外されます。

# LEFT OUTER JOIN（左外部結合）
`LEFT OUTER JOIN` は「左側のテーブル（ここでは users）をすべて表示し、右側に対応するデータがなければ NULL にする」結合です。

```sql
SELECT users.name, orders.item
FROM users
LEFT OUTER JOIN orders
ON users.id = orders.user_id;
```

|name | item |
| ---- | ---- |
|佐藤 | 寿司 |
|佐藤 | 納豆 |
|朴 | キムチ |
|スミス | NULL |

スミス は注文していないけれど、users に存在するので表示されます。

# RIGHT OUTER JOIN（右外部結合）
`RIGHT OUTER JOIN` は「右側のテーブル（ここでは orders）をすべて表示し、左側に対応するデータがなければ NULL にする」結合です。

```sql
SELECT users.name, orders.item
FROM users
RIGHT OUTER JOIN orders
ON users.id = orders.user_id;
```

|name | item |
| ---- | ---- |
|佐藤 | 寿司 |
|佐藤 | 納豆 |
|朴 | キムチ |
|NULL | トムヤムクン |

user_id=4 の トムヤムクン は users に該当しないため、name が NULL になります。

# FULL OUTER JOIN（完全外部結合）
`FULL OUTER JOIN` は「両方のテーブルの全データを対象とし、一致しない部分は NULL で補完する」結合です。
```sql
SELECT users.name, orders.item
FROM users
FULL OUTER JOIN orders
ON users.id = orders.user_id;
```
※MySQL では直接使えないため、LEFT JOIN＋RIGHT JOIN＋UNION で代用します。
```sql
SELECT users.name, orders.item
FROM users
LEFT OUTER JOIN orders ON users.id = orders.user_id
UNION
SELECT users.name, orders.item
FROM users
RIGHT OUTER JOIN orders ON users.id = orders.user_id;
```

|name | item |
| ---- | ---- |
|佐藤 | 寿司 |
|佐藤 | 納豆 |
|朴 | キムチ |
|スミス | NULL |
|NULL | トムヤムクン |

# CROSS JOIN（クロス結合）
`CROSS JOIN` は「すべての行の組み合わせを返す」結合です。
users に3件、orders に4件ある場合、3 × 4 = 12件 が返されます。

```sql
SELECT users.name, orders.item
FROM users
CROSS JOIN orders;
```

|name | item |
| ---- | ---- |
|佐藤 | 寿司 |
|佐藤 | 納豆 |
|佐藤 | キムチ |
|佐藤 | トムヤムクン |
|朴 | 寿司 |
|朴 | 納豆 |
|朴 | キムチ |
|朴 | トムヤムクン |
|スミス | 寿司 |
|スミス | 納豆 |
|スミス | キムチ |
|スミス | トムヤムクン |

# おわりに
JOIN の違いや書き方のバリエーションは、よく使うからこそ曖昧にしたくないところ。
この記事が、自分と同じようにモヤモヤしていた方の助けになればうれしいです。
PlayWright MCPでローカルwordpress環境にアクセスさせていたら、robots.txtで制限された

# はじめに
2025年に入ってから、MCPの魅力にすっかり虜になってしまい、
色々プロトコルを追加しては遊んでいる日々を過ごしています。

さて、そんな中で、WordPressをローカル環境に移してClaude4さんに開発を~丸投げ~協力してもらいながら、進めていました。

ふと、ローカル環境で立ち上げたURLに`PlayWright MCP`を潜り込ませれば、
UIデザインもClaudeさんに任せられるのでは？と思ったので、さっそく仕込んでみました。

するとさっそく、デザイン分析まで進めてくれてそれをもとにfilesystemの編集とe2eテストも完全自動で行ってくれて大変ありがたかったのですが、**あるタイミングで完全にアクセスできなくなりました。**

そのとき、Claudeからこのように言われました。
```text
.localにアクセスしようとしましたが、robots.txtによってアクセスが制限されているようです。
ローカルドメイン（.local）なので、おそらくあなたのローカルネットワーク内のサーバーだと思います。MCPツールは外部のWebサイトへのアクセス用に設計されているため、
ローカルネットワーク内のリソースへのアクセスには制限があるかもしれません。
```

`robots.txt`・・・？
良くわからなかったので、分からないことは記事としてまとめる精神に則り、調査してみることにしました:writing_hand_tone1:。

# robots.txtとは

`robots.txt`とは、**公開WEBサイトが検索エンジンのクローリングを制御するために使用する、アクセスを制御をするテキストファイルです。**
通常はウェブサイトのルートディレクトリに置かれていて、検索エンジンのクローラー（Webサイトを巡回して情報を収集するプログラム）に対して、「どのページにアクセスしてOKかダメか」を伝えるためのものです。

## ポイント１ あくまでも「お願い」である

`robots.txt`は、アクセスを制限するいった「命令」的拘束ではなく、「従ってください」というお願いベースの拘束です。
ですので、セキュリティレベルはそこまで高くなく、**悪意あるボットからは普通に無視されます。**

また、`robots.txt`は公開ファイルなので、検索すれば普通に見ることができます。

WordPressではURLに`/robots.txt`をつけるとみることができます。
こんな感じです。
```
User-agent: *
Disallow: /wp-admin/
Allow: /wp-admin/admin-ajax.php
```

## ポイント２ 検索エンジン別の対応
Google（chrome）はrobots.txtを厳格に守っているようです。
これは、ブラウザごとに異なっているそうですが、主要ブラウザは基本的に同じスタンスのようです。

## ポイント３ 結局なんのためにあるのか
これはWebの歴史にも関わる箇所です。
web黎明期の頃検索エンジンのボットが大量発生し、アクセス数が激増したためサーバー負荷が異常なくらいかかりました。
そこで当時の開発者たちが紳士協定的意味合いで、`robots.txt`を提案したそうです。

これにより、
・不要なページのクロールを避ける
・アクセス頻度をコントロール
・個人情報を含むページを保護

という意図で使われるようになったそうです。

# MCPではアクセスできないのか
今回は`PlayWright MCP`でアクセスブロックが発生しました。
このMCPの中身はわかりませんが、少なくともいえることは、MCP（そのweb_fetchは）はアクセス時にクローラーのような形ではなく、**きちんとrobots.txtを尊重してアクセスしていることが制限によりわかりました。**

この制限を乗り越えるには、外部連携元のPlayWrightのアクセス方法を覗かないと分からないです。
また、robots.txtを一時的にリネームして解除することもできるそうです。

しかし、現時点で一番有力な方法として、**`Filesystem MCP`　＋　手動確認が最も効率的で、時間的な負荷もかからないと考えてます。**

# 終わりに
PlayWright MCPを活用して新たにこんな知見まで得られるとは、思わぬ発見でした。
MCPのソースコードも覗いてみて、どんな風にアクセスされているのか検証するのもいいかもしれませんね。（というより、いつかやりたい）。
uvicornのreloadが監視するファイルに.envを含める

`reload_includes`を使う

```python
uvicorn.run(
    'server.app:app',
    host='0.0.0.0',
    port=8000,
    reload=True,
    reload_includes='.env',
)
```


参考

https://github.com/encode/uvicorn/blob/ce129ff120c31f433edea63e697de60ab690ace6/uvicorn/supervisors/watchfilesreload.py#L13

https://www.uvicorn.org/#usage
未経験転職4か月目がJavaSilverを受けるまで

とりあえずいきなりの決意です。
Javaの基本は一応学習もした。簡単な掲示板もSpringで作ってみた。
のでそろそろ資格試験に本腰を入れようと思います。
基本情報からとるべきかもしれませんが、いま現場でJava以外の言語をやっていてこの知識がJava試験の邪魔をするかもしれないと思い先に受けることにしました。

が、JavaSilverほんとに受験料高すぎ。税金入れると4万超えるから…
なので失敗は許されない。

予定では7/5（土）に受けようと思います。

ので勉強の状況を逐一ここでメモしていこうと思いました。
同じ未経験の方の参考になれば、と。

ちなにみ黒本（Java SE11 Silver問題集）は総仕上げ問題以外は1回すべて解きました。がほとんど間違えてばかりです。
おそらく総合問題もほとんど正解できない状態。

さてここから1か月どこまで伸ばせるか。

頑張ります:thumbsup:
frpの設定はiniで書かないほうがいい

## frpとX-Forwarded-Protoヘッダー
[frp](https://github.com/fatedier/frp)とはローカルネットワーク内のサービスをNATやファイアウォールを越えて外部に公開するための、高速なリバースプロキシツールである。

私は、
`nginx[443] (SSL終端) -> proxy_pass[http] -> frps[http] -> ...tunnel... -> frpc[http] -> local service[http]`のようなhttp proxy構成を試みた。その時、frpは`X-Forwarded-Proto`ヘッダーを除去する挙動があり、これは仕様である。そのため、frpc側で、
```
requestHeaders.set.x-forwarded-proto = "https"
```
のように、あとからhttpsだよというヘッダーを付与せねばならない。このことは [x-forwarded-proto gets stripped away in http proxies fatedier/frp #4168](https://github.com/fatedier/frp/issues/4168) からわかる。

## iniでは設定が効かない

しかし、私の環境ではこの設定を追記しても直らなかった(frps,frpc共にバージョンは0.62.1)。適当なヘッダーを付与して`tcpdump`で確認したところ、一切ヘッダーが追加されないことが判明した。

frpcのログを見ていたところ、
```
WARNING: ini format is deprecated and the support will be removed in the future, please use yaml/json/toml format instead!
```
の一文が目に入ったため、iniで書いていた設定ファイルをtomlに書き直したところ、正常に動作した。

## iniはやめよう
> https://github.com/fatedier/frp?tab=readme-ov-file#configuration-files
> Since v0.52.0, we support TOML, YAML, and JSON for configuration. Please note that INI is deprecated and will be removed in future releases. New features will only be available in TOML, YAML, or JSON. Users wanting these new features should switch their configuration format accordingly.

release noteを見る限り、この`X-Forwarded-Proto`を付与する機能はv0.58.0で追加されたものであるため、iniでは設定できず、toml, yaml, jsonじゃないと効かないパラメータである。
AlmaLinuxでwebサーバの作成方法

# Apacheをインストールする。
- スーパーユーザに昇格
```
su -
```
- ソフトウェアインストール

```
dnf install -y httpd
```
- httpdの再起動
```
systemctl restart httpd
```
- httpdの有効化
```
systemctl enable httpd
```

- httpdの状態を確認
```
systemctl status httpd
```
<details>
<summary>結果</summary>
<pre>
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
   Active: active (running) since Thu 2020-11-05 08:32:56 UTC; 9s ago
     Docs: man:httpd(8)
           man:apachectl(8)
</pre>
</details>

# firewalldの設定
- httpとhttpsを開放し、再起動
```
firewall-cmd --add-service=http --zone-public --permanent
firewall-cmd --add-service=https --zone-public --permanent
firewall-cmd --reload
```
【rails】helperを使おう


## はじめに

こんにちは。アメリカ在住で独学エンジニアを目指している Taira です。
現在、Rails チュートリアルのアウトプットとしてアプリを制作しています。
教材を使って学習していた際、`helper` を使うタイミングが難しいと感じていたのですが、今回のアプリ制作中に実際に使用する場面に遭遇したので、忘れないうちに記事にまとめておこうと思いました。

## helper 導入例

`application.html.erb` に flash メッセージを表示するため、以下のようなパーシャルを作成しました。
なお、CSS には Tailwind CSS を使用しています。

```erb
<% flash.each do |type, message| %>
  <% next if message.blank? %>
  <!-- 空ならスキップ -->
  <div class="border px-4 py-3 rounded <%= flash_color_class(type) %>">
    <%= message %>
  </div>
<% end %>
```

上記のように、flash の種類（\:notice や \:success、\:alert など）によって表示を切り替えたいと考えました。
そこで、`app/helpers/application_helper.rb` に以下のようなメソッドを定義しました。

```ruby
module ApplicationHelper
  # flash メッセージの色分けロジック
  def flash_color_class(type)
    case type.to_sym
    when :notice
      'bg-blue-100 text-blue-700 border-blue-300'
    when :success
      'bg-green-100 text-green-700 border-green-300'
    when :alert, :error
      'bg-red-100 text-red-700 border-red-300'
    else
      'bg-gray-100 text-gray-700 border-gray-300'
    end
  end
end
```

このように、ロジック的な要素は helper に切り出し、表示の部分は view に任せるという構成にすることで、コードの可読性や保守性が高まることを実感しました。

実際には既に実装しているけれど、気づかないまま view にロジックを書いてしまっている箇所もあるかもしれません。
アプリが一通り完成したら、改めて整理して helper に切り出せる部分を見直してみようと思います。
【SQL】第5回勉強日記 問題解答 難易度★★☆☆☆ 内容：サブクエリ

## お久しぶりです
ようやく研修が終わりました...
前回の記事を見たらなんと1カ月以上前ということで
時の流れの速さにとても驚いています笑

ということで今日からまたSQLを再開していきます！
と同時に、数学やデータ分析系の勉強記録、
あとはCBASやG検定といった資格試験の記録なども
これからはつけていきたいと思ってます！

それではやっていきます！

### SQL練習問題 - 問6
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4053502/f165cd54-5f03-4d22-b5a4-b9fc203a9327.png)

・すべての選手を対象
・選手「ごと」の得点ランキング
・SELECT句で副問合せを使用

というところが要点ですかね
サブクエリ使用という条件があるので使っていきましょう
得点ランキングを出したいのでそちらを主のSELECTに置いていきます
そこからサブクエリで追加の情報を入れていき...
という感じで書いてみようと思います

【私のメモ】
久しぶりにテーブルを見たので
どこになんの情報が書いてあるのか忘れてしまったので
一旦メモさせていただきます！
今回使うのはたぶんこれ↓
[goalsテーブル]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4053502/dffa14af-e8ba-4327-baa7-88c139bb27b9.png)
[playersテーブル]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4053502/00888242-af3d-45bd-ba6f-6c2aa1b3bf41.png)

【私の解答】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4053502/4e5d24fe-1a1d-412e-b362-66f98baae4ce.png)
【実行結果】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4053502/ccc4e8d8-a108-486a-b365-68454f954037.png)
おおむねよさそうですが、解答と少し違うんですよね...
解説にもロドリゲスが6得点で得点王なら正解と書いてあります。
うーん、何が違うんだろう...
条件通りにできているはずなんですけどねぇ...
これは精査して原因が分かったら共有させていただきます！
もしご覧になった方で原因が分かる方は教えてください！

それではSQLはここまでです！
積分と運動のシミュレーション

## 加速度と積分

今回の記事では積分を用いた物体のシミュレーションを行います。積分と聞くと高校数学で微分積分を勉強して数学が嫌いになった人も多いと思いますがコンピュータを使うとこれらの数学をチカラワザで解くことができます。後々人工衛星の軌道シミュレーションなども行いますが、まず単純なボールの投げ上げの問題をシミュレーションしてみます。　ボールの投げ上げの問題は高校物理で出てきたと思いますがそれはほぼ公式の丸暗記なので使いません。

### 加速度・速度・位置
　ボールを投げ上げた時、ボールにかかる加速度は重力のもののみになります。加速度とは「速度が変化する値」であり、現在の速度と加速度により少し先の速度を知ることができます。同じく速度は「位置が変化する値」であり、現在の位置と速度により少し先の位置を知ることができます。

```math
\displaylines{
v（t+Δ）＝v（t）＋a×Δ\\
x（t+Δ）＝x（t）＋v×Δ\\
x:位置　v：速度　a：加速度
}
```

　この「少し先」を計算することを連続的に行うと、10秒先などの未来の情報を知ることができます。　この「少し先を計算することを連続的に行う」ことが積分に相当します。

　加速度・速度・位置の関係を微分・積分で表現すると下記のようになります。

　（加速度・速度・位置の関係）
　・加速度の積分⇒速度　速度の積分⇒位置
　・位置の微分⇒速度　　速度の微分⇒加速度

 ### ボールの投げ上げシミュレーション
 　ここからボールの投げ上げについてシミュレーションしてみます。斜め上に投げ上げたボールの速度はx（水平方向）とy（垂直方向）の2つに分解できます。このうちy方向のみ重力により下向きの加速度がかかります。この加速度を1回積分すると速度になり、2回積分すると位置になります。実際にコードに書いてみると下記のようになります。
```python
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation

# 定数関連
StepCount = 120
delta = 0.01

if __name__ == '__main__':
    position = np.zeros((StepCount, 2)).astype(np.float32)  # (x, y)の組み合わせのペア

    #初期(位置・速度)
    x = 0.0
    y = 0.0
    Vx = 5.0
    Vy = 5.0

    # 位置のシミュレーション（積分）
    for i in range(StepCount):
        # 現在位置の設定
        position[i, 0] = x
        position[i, 1] = y

        # 加速度の計算（ボールの投げ上げの問題のためAy=-9.8で固定）
        Ax = 0.0
        Ay = -9.8

        # 位置の更新
        x = x + Vx * delta
        y = y + Vy * delta

        # 速度の更新
        Vx = Vx + Ax * delta
        Vy = Vy + Ay * delta

        print('(x,y)=' + str(x) + ',' + str(y))


    fig = plt.figure()
    ims = []
    for i in range(StepCount):
        # (i * delta)秒までの位置を描写
        # 軌跡の描写
        im1 = plt.plot(position[0:i, 0], position[0:i, 1], linestyle='None', marker='.', color='blue')
        plt.xlim([0, 6.0])
        plt.ylim([-0.1, 2.0])
        # ボールの現在位置
        x = position[i, 0]
        y = position[i, 1]

        im2 = plt.plot(x, y, color='red', marker='o')
        ims.append(im1 + im2)

    ani = animation.ArtistAnimation(fig, ims, interval=100)
    # GIFとして保存する場合
    #ani.save('anim.gif', writer='pillow')
    plt.show()
```
![anim.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4101406/c7952205-19c8-4c93-ac4e-d60141e9e1cb.gif)

このコードを実行すると斜め上に投げられたボールの動きをシミュレーションできます。もし投げる角度、ここではxy方向のぞれぞれの速度の大きさ（Vx,Vy）を変えると軌跡が変化します。
```python
    Vx = 5.0
    Vy = 5.0
```

### さいごに
次回はこのシミュレーションコードを応用して人工衛星の軌道をシミュレーションしてみます。
TermiusをWSL2のUbuntuにつなぐ

## はじめに

先日、旅行中に自分のプライベートのブログがトラブルで閲覧できなくなり、スマホにSSHクライアントを入れる必要が生じました。その際に使ったのが[Termius](https://termius.com/)というアプリ。使ってみたところなかなか良い感じで、マルチプラットフォーム対応ということだったので帰宅後にはWindowsにも入れてみました。

リモートにつなぐ分にはなかなか良い感じ。たｄWSL2のUbuntuにつなぐ方法がちょっとわかりにくかったのでまとめておきます。

ちなみに上記のトラブルの顛末はこちらに書いてあります (Qiitaではなくプライベートのブログです)。

[2025年4月30日から5月1日にかけてのサイトダウンとその対処の顛末](https://www.yoshimura-s.jp/2025/05/troubleshooting-of-my-site-down-during-short-trip/)

## Termiusって？

手抜きしてGeminiに聞いてみます。[「Termiusとは」でGoogle検索](https://www.google.com/search?q=termius%E3%81%A8%E3%81%AF)した際に表示された「AIによる概要」は以下の通り。

>Termiusとは、SSH、Mosh、Telnet、SFTP、SCPなどのプロトコルをサポートする、クロスプラットフォームのSSHクライアントアプリです。iOS、Android、macOS、Windows、Linuxなどのさまざまなデバイスで利用できます。特に、ワンクリックでリモートデバイスに接続できる機能が特徴です。﻿

Qiitaのtermiusタグにはまだ記事は少ないですが、多分これから増えるんじゃないかな、と思ってます。

https://qiita.com/tags/termius

インストール方法などはこちらの記事でも紹介されています。

https://qiita.com/Sakathon/items/123ec29b996e1caf32b1

## 環境

以下

* Windows 11 Pro 23H2
* Termius 9.19.4

で確認しました。

## ローカルターミナルの立ち上げ方とWSL2のUbuntuへのつなぎ方

アプリを立ち上げたときに表示されている「TERMINAL」のボタンをクリックするとローカルターミナルが開きます。

![スクリーンショット 2025-06-01 112808.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3838423/a242c99b-ab6b-43a6-90e2-50bd016d639e.png)

デフォルトではPowerShellが開くようになっていると思います。今回やりたいことは、これで開くターミナルの接続先をWSL2のUbuntuのbashに変えてやろうということです。

左上のハンバーガーメニューからSettingsを開きます。

![スクリーンショット 2025-05-11 064956.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3838423/19f4ecfb-c565-451c-8525-ccdef65b2975.png)

左のメニューで「Terminal」を選んでずーっと下の方にスクロールしていくとLocal Terminal Pathという項目が現れます。

![スクリーンショット 2025-05-11 065105.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3838423/ed2378d4-4bac-44e2-b87b-ae48a1f3f52a.png)

これを開きたいターミナルのパスに変えればOKです。でもUbuntuのbashのパスってどこでしたっけ？コマンドプロンプトで`where`を使えば探せます。

    Microsoft Windows [Version 10.0.22631.5335]
    (c) Microsoft Corporation. All rights reserved.
    
    C:\Users\yoshi>where bash.exe
    C:\Users\yoshi\AppData\Local\Microsoft\WindowsApps\bash.exe

このパスをさっきのLocal Terminal Pathに設定。

![スクリーンショット 2025-05-11 071623.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3838423/6aa8c766-025b-4ad0-a059-450c0effd879.png)

これでTERMINALをクリックすればbashが開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3838423/35068f55-2877-40b0-b30b-03e0f8da5e44.png)

ちなみに`bash.exe`以外に`ubuntu.exe`、`wsl.exe`でもOK。`ubuntu.exe`に設定したときのみUbuntuのホームディレクトリで立ち上がります。

参考：

https://qiita.com/mizutoki79/items/f6ba08b7f73133102c91

## まとめ

Termiusをローカルターミナルとして使用する際に接続先をWSL2のbashにするには、Settings → TerminalのLocal Terminal Pathを`bash.exe` (もしくは`wsl.exe`、`ubuntu.exe`) のパスに変更すればOKです。

ほんとは複数の接続先 (コマンドプロンプト、PowerShell、bash) をわざわざ設定をいじらずに切り替えられるともっと嬉しい気もしますが、まあ実際のところbash以外でそんなに込み入ったことはやらない気もするので、当面これで使ってみようと思っています。
備忘録：ハッカソン中に直面した「Lambda から Fargate の Run Task」実装記録を整理してみた

## はじめに

AWS Lambda から ECS Fargate タスクを起動する方法について、自分の備忘録としてまとめました。

マイグレーションコンテナは、以下の記事で詳しく説明しているので気になる方は、参考にしてみてください。

https://qiita.com/free-honda/items/dcd9861ffbbb29ca6db9

**個人の備忘録程度の走り書きとなっておりますが、温かい目で見守っていただければ幸いです。**

## 書こうと思ったきっかけ

受講している IT スクールのハッカソンでチーム開発を進める中、Lambda から ECS タスクを起動する仕組みを実装しました。その際に IAM ポリシーや Lambda のエラーで詰まったため、今後の自分や他の人が同じことでつまづかないように記事にしておきます。

## つまづいた内容

### 必要な IAM ロール

以下の IAM ポリシーを Lambda の実行ロールに付与する必要があります。

```json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents"
      ],
      "Resource": "arn:aws:logs:*:*:*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "ecs:RunTask",
        "ecs:DescribeTasks",
        "ecs:DescribeTaskDefinition"
      ],
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": "iam:PassRole",
      "Resource": [
        "arn:aws:iam::xxx:role/prod-ecs-task-role",
        "arn:aws:iam::xxx:role/prod-ecs-task-execution-role"
      ]
    }
  ]
}
```

**作成後の画面**

![Screenshot 2025-06-01 at 11.49.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/f8593431-95b4-4b65-9a71-ef1740137ad9.png)

### 実装済み Lambda 関数

`boto3` の `run_task` メソッドは `datetime` オブジェクトを含むため、`json.dumps(..., default=str)` を使用してレスポンスを文字列化しています。

```python
import os
import boto3
import json

def lambda_handler(event, context):
    ecs = boto3.client('ecs')

    response = ecs.run_task(
        cluster=os.environ['ECS_CLUSTER_NAME'],
        taskDefinition=os.environ['ECS_TASK_DEFINITION'],
        launchType='FARGATE',
        networkConfiguration={
            'awsvpcConfiguration': {
                'subnets': os.environ['SUBNETS'].split(','),
                'securityGroups': os.environ['SECURITY_GROUPS'].split(','),
                'assignPublicIp': 'ENABLED' if os.environ.get('ASSIGN_PUBLIC_IP', 'false').lower() == 'true' else 'DISABLED'
            }
        }
    )

    print("Task started successfully:", response)

    return {
        "statusCode": 200,
        "headers": {
            "Content-Type": "application/json"
        },
        "body": json.dumps({
            "status": "invoked",
            "detail": response
        }, default=str)
    }
```

### 環境変数の確認（必要なもの）

この Lambda 関数を正常に動作させるために、以下の環境変数を設定しておく必要があります：

* `ECS_CLUSTER_NAME`
* `ECS_TASK_DEFINITION`
* `SUBNETS`（カンマ区切り）
* `SECURITY_GROUPS`（カンマ区切り）
* `ASSIGN_PUBLIC_IP`（オプション、true/false）

**実際の実行後結果**

![Screenshot 2025-06-01 at 11.53.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/0b935120-fbb9-4ffa-9041-5a54bcf58436.png)

問題なく起動して、マイグレーションされていることが確認できました！

## まとめ

Lambda から ECS タスクを起動する際には、IAM の `iam:PassRole` の対象リソースが正しく設定されているか、また `boto3` のレスポンスを JSON に変換できるかに注意する必要があります。

小さなミスで大きなハマりポイントになるので、この記事が誰かの助けになればうれしいです...！
山本和佳Tips：日本でバズりそうなアプリ10個をAIに聞いてみた

山本和佳です！
https://www.yashima.ac.jp/univ/search.php?cx=001898054821632748893%3Apyvzqky4qqu&cof=FORID%3A10&ie=UTF-8&q=%E5%B1%B1%E6%9C%AC%E5%92%8C%E4%BD%B3&sa.x=18&sa.y=6#gsc.tab=0&gsc.q=%E5%B1%B1%E6%9C%AC%E5%92%8C%E4%BD%B3&gsc.page=1

AIに「日本でバズりそうなアプリのアイディアを10個出してください」と指示してみました。

こんにちは。今日はちょっとワクワクするテーマ、「日本でバズりそうなアプリのアイディア」を10個ご紹介します。
ただの妄想ではなく、**なぜバズる可能性があるのか**という理由も含めてお届けします。

SNSやスマホに慣れ親しんだ日本人ならではの感性や文化を前提にしたアイディアばかりです。
今後アプリ開発を考えている方や、起業ネタを探している方にも、何かヒントになるかもしれません。

---

## 1. 匿名ツッコミアプリ「ひとことボケて」

自分の写真や投稿に「ひとことツッコミ」をつけてもらうアプリ。
友達同士のいじり文化が根付く日本では、「ゆるく笑えるネタ投稿」がバズりやすい。

**バズる理由：** SNSでシェアしたくなる“ネタ要素”と、匿名性による手軽さの融合。

---

## 2. おばあちゃんの知恵袋集「ばあちゃんの知恵」

昭和の生活知識・暮らしの知恵を、動画や投稿で学べるコミュニティ型アプリ。

**バズる理由：** レトロブームと癒しニーズ、さらに実用性まで兼ね備えている。

---

## 3. 睡眠ボイスマッチングアプリ「おやすみの声」

「おやすみ」を言ってくれる優しい声を選んで眠れる。声優・一般ユーザー参加型。

**バズる理由：** ASMR人気と癒しコンテンツ需要にマッチ。推し声文化とも相性◎

---

## 4. 遅刻言い訳ジェネレーター「ごめんねメーカー」

遅刻や欠席など、気まずい場面の“ちょうどいい言い訳”を自動生成。

**バズる理由：** ネタとしてSNSで共有されやすく、共感される「あるある系」。

---

## 5. 即興料理マッチング「冷蔵庫レシピAI」

冷蔵庫の中身を入力すると、AIがレシピと調理動画を生成。

**バズる理由：** 節約志向×時短ニーズ×生成AI＝実用性＆話題性どちらも強い。

---

## 6. 推し活SNS「OSHIing（オッシング）」

推しへの愛を日記や写真、音声で綴る“推し専用SNS”。

**バズる理由：** 推し活市場の成長＋「共感とつながり」を求める若年層の欲求に刺さる。

---

## 7. 気まずい沈黙を壊す「話題くじ」

友人や恋人との会話で使える“くじ引き話題”アプリ。お題は日替わり。

**バズる理由：** 合コンや初対面で使いやすく、TikTokなどの動画企画にも展開できる。

---

## 8. ニセSNS風日記アプリ「架空のワタシ」

架空の人物になりきって日常を投稿できる、創作系SNS。

**バズる理由：** 誰でも“なりきり”で創作を楽しめる時代背景と、バーチャル文化の融合。

---

## 9. スマホ封印バトル「ガマン王」

どれだけスマホを触らずにいられるかを競う、全国対戦型の集中力向上アプリ。

**バズる理由：** 勉強・仕事の生産性向上＋ゲーミフィケーションで若年層に刺さる。

---

## 10. 愚痴バクダン「誰にもバレずに叫べ」

日頃のイライラを吹き出し風にして匿名で放出、数秒後に“爆発”して消える。

**バズる理由：** ストレス社会×共感消費の時代にぴったり。共感・笑い・解放感が三位一体。

---

## まとめ：バズは“実用×感情”が鍵

今回ご紹介したアプリの共通点は、「日常のちょっとした悩み」や「感情」をテーマにしている点です。
人は共感したとき、笑ったとき、驚いたときに“シェア”したくなるもの。

バズるアプリには、ただ便利なだけでなく、「気持ちを動かす要素」が必ず入っています。
そうした小さな感情のツボを押せるプロダクトが、これからの時代に求められるのではないでしょうか。

次は、これらの中から実際に開発してみようかな…なんて、少し本気で考えている今日この頃です。

---

ご希望があれば、これらのアイディアをもとにしたピッチ資料やLP文案も作成可能です！お気軽にお声がけください。
GCPのe2-microのDISKサイズを10GBから30GBに拡張する (Always Free枠)

bookworm で作成される。

https://cloud.google.com/free/docs/free-cloud-features#compute

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/4c529a73-f9ed-46df-9b42-66fe1d982812.png)

30 GB までむ

## 10GBから30GBに拡張する

e2-microを作成した時、ディスクサイズは 10GB で作成される。
Always Free枠は30GBまでのため、30GBに拡張したい。

ディスク -> 編集 をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/dd1b18e4-ab43-4a67-b853-87e1ee403058.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/5553c573-513f-4cde-a088-da1a32615625.png)

gcloudコマンドでもできる様子。

```
gcloud compute disks resize ディスク名 --size=30GB --zone=ゾーン名
```

## 反映

* OSの再起動を行うことで自動でリサイズされている。

----

## その他セットアップメモ

```
mkdir docker
cd docker

apt install -y docker.io
```

```sh:nginxを動かしてみる
docker run -it -d -p 80:80 --restart=always nginx
```