OmniAICreator/Qiita-1.07M huggingface dataset:
PHP備忘録：Docker環境のLaravelでMySQLが空白…原因はSQLite接続だった

## はじめに

LaravelをDocker上に構築し、マイグレーション処理を試みた際、MySQLにテーブルが作成されない問題に遭遇しました。

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

本記事はその原因と解決までの過程をまとめた、PHP学習初心者の備忘録です。

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

個人的にPHPのキャッチアップをしたくてDocker + Laravel環境を構築中、`artisan migrate` は成功しているのに MySQL の中にテーブルが見えないという現象に悩まされました。

**実際の事象**

![Screenshot 2025-05-05 at 14.35.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/9c39bbd9-9c35-4a5a-8a05-2e0781ec0ebb.png)

調べてわかったことを整理して残しておきたいと思い、この記事を書きました。

## 内容

### 問題の現象

* `php artisan migrate` は成功した（`messages` テーブルも Ran 表示）。
* しかし `mysql` にログインして `SHOW TABLES;` を実行すると空。

### 原因の特定

1. `.env` の中身を確認したところ、以下のように `DB_CONNECTION=sqlite` になっていた：

```env
DB_CONNECTION=sqlite
```

2. Laravel はこの設定をもとに **SQLite にマイグレーションしていた**。

### 正しい設定への修正

`.env` を以下のように修正：

```env
DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=laravel
DB_PASSWORD=secret
```

さらに、設定変更を反映させるために以下を実行：

```bash
make cache-clear
make migrate:fresh
```

**実際のMakefile**

```Makefile
# Laravelのキャッシュをすべてクリアする
cache-clear:
	docker exec -it php-app php artisan config:clear
	docker exec -it php-app php artisan route:clear
	docker exec -it php-app php artisan view:clear

# マイグレーションを実行する
migrate:
	docker compose exec php-app php artisan migrate

# 指定テーブルが存在するかを確認する（true が返ればOK）
check-table:
	docker compose exec php-app php artisan tinker --execute="\Schema::hasTable('messages');"
```


その後、MySQLに入り直して `SHOW TABLES;` を実行すると `messages` テーブルを含む一覧が正しく表示されました。

**実際の画面**

![Screenshot 2025-05-05 at 14.37.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/ff2e45c9-59f5-42e6-ba60-32da92fbd94d.png)

## まとめ

Laravelが使用するデータベースは `.env` ファイルで決まるため、Dockerなどの仮想環境下で構築する際は `.env` の `DB_HOST` や `DB_CONNECTION` の設定に特に注意が必要です。

:::note warn
**今回は `sqlite` になっていたために、MySQLにテーブルが現れないという状態でした。**
:::

今後は環境構築直後に `.env` を確認し、Laravelと接続するDBが意図したものになっているかをチェックするようにします...！
【R】作成した図にフォントを埋め込む

# はじめに

先日にRで作成した図（PDF）を提出したところ、提出先の方から「DTPソフトに図を取り込むと、フォントが使用できないという警告が出る」と言われました。
この件に関して提出先の方に話を聞いてみると、「作成したPDFファイルにフォントを埋め込めば、DTPソフトの警告が出なくなる」とのことでした。
そこで今回は、作図する際にフォントを埋め込む方法を記事としてまとめてみました。

# 使用した環境

* OS：Windows11（24H2）
* R：GNU R 4.0.2

# PDFにフォントが埋め込まれているかの確認

* 以下の手順で問題となったPDFにフォントが埋め込まれているかを確認したところ、やはりフォントは埋め込まれていませんでした。
  1. PDFファイルを開き、［メニュー］>［文書のプロパティ］に進みます。
  1. ［フォント］タブを開いて、フォント名の横に「**（埋め込みサブセット）**」と書かれていればフォントが埋め込まれています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312166/3addf925-1212-4de0-b159-48228cbcd3c0.png)

# 図にフォントを埋め込む方法

* [こちらのURL](https://okumuralab.org/~okumura/stat/font.html)を見ると、Rで作った図にフォントを埋め込む方法はいくつかあるそうですが、今回は最も基本的と思われるGhostScript＋embedFonts関数を使うことにしました。

## GhostScriptのインストール

* GhostScriptは、PDFファイルを操作するために使われるツールだそうです。
* 以下のURLから、GhostScriptをダウンロードしてインストールします。
  * [www.ghostscript.com](https://www.ghostscript.com/)
  * 今回は「Ghostscript 10.05.0 for Windows (64 bit)」を利用しました。
* GhostScriptのインストールが完了したら、OSを再起動します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312166/5af9b959-32f3-439e-a677-ecb2713f5ecc.png)

## 作図するコマンドの修正

* 以下のようにPDFを作図するコマンドは従来通りで、作図が終わった後（＝dev.off()の後）に`embedFonts`を呼び出すことでフォントを埋め込むことが出来ました。
  * 以下の例では、fig2.pdfを開いてフォントを埋め込んだものをfig2_embed.pdfとして保存しています。

```r:作図するコマンド

pdf("fig2.pdf", width=5, height=3) // ここからfig2.pdfの作図開始
...
...
...
dev.off() // ここで作図終了

embedFonts("fig2.pdf", outfile="fig2_embed.pdf") // フォントの埋め込み
```

## PDFにフォントが埋め込まれているかの確認（再）

* 以下のようにフォントが埋め込まれていることが確認出来ました🎉

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312166/faf18d74-612b-4d17-ba4b-69935873532c.png)


# 参考URL

* [Acrobatでフォントの埋め込み状態を確認する](https://dtp.screen-cre.co.jp/dtp0015/)
* [Rでのフォントの扱い](https://okumuralab.org/~okumura/stat/font.html)
MOG2を用いた異常画像検出と保存処理


MOG2を用いた異常画像検出と保存処理
概要
本プロジェクトは、背景差分法 (MOG2) を利用してフォルダ内の全画像を1番目の基準画像と比較し、差分を検出するものです。 さらに、異常判定として白抜き領域が一定割合以上ある画像を抽出し、別フォルダに再書き出し する処理を含みます。

処理の流れ
対象フォルダの画像を取得

画像フォルダから .jpg ファイルを収集。

背景差分処理 (compareFirstTwoImages)

フォルダ内の最初の画像を基準に、MOG2 を使って他の画像との差分を計算。

差分画像を 異常画像フォルダ (abnormal_images) に保存。

異常判定 (testFGDetected)

差分画像内の白ピクセル割合を計算し、1.0%以上の場合は異常と判定。

異常画像の再保存

異常判定された画像を 結果フォルダ (result_images) に再保存。

異常画像の一括削除 (deleteAbnormalImages)

abnormal_images フォルダに残った不要な画像を削除。

主要関数と役割
compareFirstTwoImages(imagePath1, imagePath2)
画像を MOG2 で比較し、前景マスクを生成。異常画像フォルダに保存し、Base64 に変換して配列へ格納。

testFGDetected(fgMask, thresholdPercentage = 3.0)
画像データを解析し、白ピクセルの割合を計算して異常判定 する。

getMat(fgMask)
Base64 エンコードされた画像データを cv.Mat 型に復元。

deleteAbnormalImages()
異常画像フォルダ (abnormal_images) 内の全 .jpg ファイルを一括削除 する。

実行方法
sh
node image_processing.js
新人エンジニアのためのインフラ入門（第7回）を読んで学んだこと

## はじめに

今回は「構築」をテーマに、理解を整理してみます。  
特に、「Manager-Agent構成」について詳しく整理します。

---

## 構築とは？

構築とは、サーバを使える状態にするための作業。

- OSのインストールと設定
- ミドルウェア（WebサーバやDBなど）のインストールと設定

アプリケーション開発以外の領域が「構築」。

コマンドラインでの作業は、サーバの数が増えるほど大変で、ミスも起こりやすい。

そこで、AnsibleやTerraformなどの構築自動化ツールが使われる。

構築手順をコード化することで、誰が実行しても同じ環境を正確に再現できるようになる。

---

## Manager-Agent構成とは？

ミドルウェアには、次の2種類の動作形態がある。

- サーバ単体で動くもの：1台のサーバ内で完結（例：Apache, MySQLなど）
- Manager-Agent構成のもの：複数サーバで連携して動く（例：Zabbix, Datadogなど）

### Manager-Agent構成のイメージ

```
[AgentサーバA] →   
                → [Managerサーバ]
[AgentサーバB] →
```

- 各サーバには「Agent」をインストール  
- 中央には「Manager」をインストール

Agentはそれぞれのサーバの状態（CPU、メモリ、ディスクなど）を定期的に収集し、Managerに送信する。  
Managerはそれを受け取って、監視画面で可視化したり、異常時にアラートを出したりする。

サーバ同士の通信が前提になるため、構築時にネットワーク周りの設定に注意が必要。

---

## おわりに

アプリケーション開発では、ネットワーク通信やOSの理解がなくても、ある程度開発はできるが、インフラ周りを学び始めると、そういった抽象化された下の層、いわゆるCSの基礎知識の重要性を感じた。
Linucレベル１勉強メモ　＃１８

＃ 第二章　ファイル・ディレクトリの操作と管理

練習問題2.3
カレントディレクトリdataと、そのディレクトリ内にあるすべてのファイルの所有者をpenguinに変更するコマンドを記述してください。

＃＿＿＿＿＿＿＿＿＿＿＿＿＿

（解答）chown -R penguin data


（解説）
ファイルやディレクトリの所有者を変更するにはchownコマンドを使います。ディレクトリ内のすべてのファイルやサブディレクトリの所有者も同時に変更するには、-Rオプションを付ける必要があります。

chownコマンドの書式
chown [オプション] ユーザー[:グループ] ファイル名やディレクトリ名

chownコマンドのオプション
-R,  --recursive<br>指定したディレクトリとその中にある全ファイルの所有者を変更する。
画面が閉じられたか検知したい

### 知らなかったのでメモ：ブラウザやタブが閉じられたかを検知する方法について
こちらは調査した結果、検知できる方法がない。

https://stackoverflow.com/questions/3888902/detect-browser-or-tab-closing

上記リンクに書かれている通り、「ブラウザが閉じられたか」のみ検知する方法はない。


#### onunload と onbeforeunload イベント

上記リンクにも書かれている通り、onunload（タイミング：後）およびonbeforeunload（タイミング：前）イベントは、ユーザーが現在見ているウェブページから離れる状況を検知するために使用される。このイベントは以下の3つのケースで発生する：

①閲覧中のページを閉じる（後か前）
②閲覧中のページをリロードする（後か前）
③閲覧中のページを移動する（リンククリックなど）（後か前）

#### 重要なポイント
この3つのケースすべてを検知することができるが、「閲覧中のページを閉じる」イベントのみを検知することはできない。つまり、タブやブラウザを閉じたかどうかを区別する方法はなく、すべて同じイベントとして扱われる。

### なんで？
ブラウザやタブが閉じられたかを正確に検知できない理由は、主にセキュリティとプライバシー保護の観点で、ユーザーの行動を監視したり、追跡することを防ぐためだ。

昔のウェブではそれを無理やり検知・阻止しようとするサイトも存在した。
例えば
```
window.onunload = function () {
  while (true) {
    alert("閉じないで！");
  }
};
```
→ 本当にこういうことをやる迷惑サイトがあったんで…
（今はalertの使用が禁止されており、主要ブラウザでは通用しない）

また、ユーザーがいつ画面を閉じたかなどの情報を収集して悪用するリスクもある。


### 結論
現在ではブラウザが画面が閉じられたか検知する方法のほとんどをブロックしており、
ユーザーの体験とセキュリティを守る方向へと進化している。
Linucレベル１勉強メモ　＃１７

＃ 第二章　ファイル・ディレクトリの操作と管理

練習問題2.2
カレントディレクトリにあるファイルtestのアクセス権を、所有者は読み取り、書き込み、実行ができ、グループは読み取りと実行ができ、その他ユーザーは読み取りのみができるように設定しようとしています。実行すべきコマンドを選択してください。

A. chmod 754 test

B. chmod test 754

C. chmod 731 test

D. chmod test 731

（解答）　A

（解説）
chmodコマンドは、アクセス権、対象ファイルの順に指定するため、選択肢BとDは不正解です。

chmodコマンドの書式
chmod[オプション]　アクセス権　ファイル名

アクセス権を数値で表すと、
r=4, w=2, x=1　になるので
「rwxr-xr--」＝754になります。
新しい時代の HDL "Veryl" を試した

# はじめに

Veryl は SystemVerilog にトランスパイルされる HDL です．[公式](https://doc.veryl-lang.org/book/ja/)が「学習の容易さ、設計プロセスの信頼性と効率の向上、およびコードの記述の容易さが実現されます。」と謳っているように，覚えやすく書きやすい言語です．

私は以前 [FPGA 向けの UART モジュールを SystemVerilog で実装](https://github.com/Kenta11/simple_uart)しました．このモジュールを先日 [Veryl で移植](https://github.com/Kenta11/simple_uart_veryl)しました．

本稿では，移植の際に Veryl の機能について個人的に良いなと感じた点を，SystemVerilog と比較して紹介します．

# 良かった機能

## 打鍵数が減る

SystemVerilog ではコードブロックは `module` `endmodule` や `begin` `end` などで囲った範囲でした．対して Veryl では `{}` で囲った範囲です．タイプする量が減るので単純に楽です．ミスタイプする機会も減ります．

## 宣言が楽

SystemVerilog では2ビット以上のレジスタ等のサイズを`:`で指定します．この表現は初学者にとって非常に分かりづらく，熟練者でもミスの温床になります．

```verilog:SystemVerilog での宣言
logic [31:0] clock_counts;
```

対して Veryl ではサイズそのものを指定します．

```:Veryl での宣言
var clock_counts : logic<32>;
```
多くのプログラミング言語ではむしろこの方法が一般的だと思うので，分かりやすいのではないでしょうか．

## 列挙型が現代的

SystemVerilog では列挙子がグローバルな名前空間に定義されます．これは名前の衝突リスクがあります．

```verilog:SystemVerilog での列挙型定義
typedef enum logic [1:0] {
    STATE_WAIT         = 2'h0,
    STATE_RECEIVE_BITS = 2'h1,
    STATE_WRITE_WORD   = 2'h2
} state_t;
// state <= STATE_WAIT; // 列挙子の参照方法
```

対して Veryl では列挙子が列挙型を通して参照されます．名前の衝突リスクが減るので，名前が簡素になります．

```:Veryl での列挙型定義
enum state_t: logic<2> {
    WAIT,
    RECEIVE_BITS,
    WRITE_WORD,
}
// state = state_t::WAIT; // 列挙子の参照方法
```

SystemVerilog では C 言語風の，Veryl では Rust 風の列挙型が定義できると考えれば理解がしやすいでしょう．

## リセット周りが便利

SystemVerilog ではリセットも他の信号と同様に register または wire として扱います．この表現ではリセットの性質（極性と同期・非同期）によって，記述を修正する必要がありました．


```Verilog:SystemVerilog でのリセット定義
module receiver_axis (
    input rst,
    // 省略
);
```

Veryl では[リセット専用の型](https://doc.veryl-lang.org/book/ja/05_language_reference/03_data_type/04_clock_reset.html?highlight=reset#%E3%82%AF%E3%83%AD%E3%83%83%E3%82%AF%E3%81%A8%E3%83%AA%E3%82%BB%E3%83%83%E3%83%88)でこの問題を解決します．これはリセットの性質を抽象化しています．

```:Veryl でのリセット定義
module receiver_axis (
    rst : input reset,
    // 省略
)
```

リセット型を導入すると，リセット専用の文法 `if_reset` を使うことができます．

```:Veryl でのリセット参照
always_ff (clk) {
    if_reset {
        // リセット時の記述
    } else {
        // 省略
    }
}
```

veryl 0.15.0 時点では，上記の記述は負極性で非同期のリセットにトランスパイルされます．

```verilog:トランスパイル後のリセット参照
always_ff @ (posedge clk, negedge rst) begin
    if (!rst) begin
        // リセット時の記述
    end else begin
        // 省略
    end
end
```

ここで Veryl.toml に次の記述を追加しましょう．

```toml:Veryl.toml に追記する内容
[build]
reset_type = "sync_high"
```

もう一度トランスパイルし直すと，次の SystemVerilog 記述が得られます．正極性で同期のリセットになりました．

```verilog:再トランスパイル後のリセット参照
always_ff @ (posedge clk) begin // <- negedge rst が削除された
    if (rst) begin // <- リセットの論理が逆になった
        // リセット時の記述
    end else begin
        // 省略
    end
end
```

開発ターゲットに応じてリセットの性質は異なることがあるはずなので，このリセットの抽象化はとても便利なのではないでしょうか．

# おわりに

本稿では Veryl 移植で感じた良かった点を紹介しました．Veryl は SystemVerilog が抱えていた問題や難しさを解決するよい言語だと思います．JavaScript に TypeScript がいるように，SystemVerilog にも Veryl がいると，開発体験が良いものになるのではないでしょうか．


Veryl には他にも[様々な特徴](https://doc.veryl-lang.org/book/ja/02_features.html)がありますので，気になる方は公式サイトを見てください．また，[Veryl は現在も開発中](https://github.com/veryl-lang/veryl)のため，紹介した機能は今後変わってゆく可能性があります．ご利用の際は最新情報をご参照ください．
HTTP ステータスコードをなるべく暗記しないで理解する

## HTTP/1.0の設計時のステータスコードのざっくりした内容　
### 1xx: 今は使わないが将来用にとっておくよ
### 2xx: あなたの送った情報は受信できて理解できたよ
### 3xx: 追加の行動が必要だよ（リダイレクション）
### 4xx: あんたの送った要求はなんかおかしいよ（クライアントエラー）
### 5xx: 私のミスであなたの要求には答えられないよ（クライアントエラー）

## 現在のステータスコード（1.0と比較すると1xx以外は同じ）
### 1xx: 情報処理中（例えば画像の種類の情報を先に送ってくれたりする）
### 2xx: 成功
200 OK 
例　Webページが正常に表示されたよ

201 Created 
新しい投稿がうまくいったよ

204 No Content　
削除できたよ！　いいねボタンの処理成功！（サーバーから返すものはないがこのステータスコードを受けてクライアント側でいいねボタンのデザインを変更する）

### 3xx: リダイレクション
### 4xx: クライアントエラー
400 Bad Request　
文章が理解できません

401 Unauthorized　
ちゃんとログインしてないでしょ

404 Not Found　
住所間違えてない？ページがないよ

### 5xx: サーバーエラー

>Informational responses (100 – 199)
Successful responses (200 – 299)
Redirection messages (300 – 399)
Client error responses (400 – 499)
Server error responses (500 – 599)

## 参考文献
https://www.rfc-editor.org/rfc/rfc1945#section-6.1.1
https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status
【ChatGPT】「ひとり反省会」やめたい日の思考整理リストをもとにしたやめるためのPromptを作成しました。


　どうも、カーブミラーです。

　今回は、【ChatGPT】「ひとり反省会」やめたい日の思考整理リストをもとにしたやめるためのPromptを作成しました

:::note info
本記事は、ChatGPT（Plus版）
で行なっております。
画像はありません。あしからず。
:::
　ChatGPT等の動作状況を知らせる
　　OpenAIのステータスページ。
　　　[OpenAIステータス](https://status.openai.com/)
***
　こちらも載せますね。
　　[ChatGPTが使えない？ログインできない・反応しない原因やエラー時の対処法を解説](https://aismiley.co.jp/ai_news/chatgpt-error-resolution-explanation/)
***
　著作権法については
　　こちらを参照するのが
　　　良いのではないかと。

　文化庁レポートをもとにした
　　著作権法についての動画（約20分）
　　　[かいちのAI大学　【警告】ChatGPTの画像生成は危険です...【4o Image Generation】](https://youtu.be/8VLUnG-iyo0?si=rAfjMboqmNqppDGq)
***
　まずは、【ニュース】です。

　芸能人が
　　ChatGPTを使って、
　　　何をしているのか？

　[長澤まさみさん『最近は、年齢関係なく敬語で話すようにしています』｜CLASSY.](https://news.yahoo.co.jp/articles/1f872a6e809a1f390375e1c14d1d83e86517b9f0)

　長澤まさみさんは
　　語学学習で使っているそうです。
　　　愛称は、“チャッピー”だとか。

　この記事の中では
　　ひと言ふた言しか
　　　触れていません。

　それでも
　　芸能人も生成AIに
　　　注目しているのは
　　　　うれしいですね😸
***
　次に

　Skypeが
　　今日で、サービス終了します。

　[Microsoft、「Skype」を2025年5月に終了 22年の歴史に終止符](https://news.livedoor.com/article/detail/28251013/)

　今後数日以内に、
　　Skypeアカウントを使用して
　　　Teamsにログイン
　　　　できるようにする、とのこと。
***
　では、【本題】です。

　今回は、
　　「ひとり反省会」やめたい日の
　　　思考整理リストをもとにした
　　　　やめるためのPromptを
　　　　　作成しました。

　こちらを読みました。
　　[まやさんポスト](https://x.com/maya_fitness413/status/1918780102638281000?t=QCOvomMsPQ0rmnIAgSn5nQ&s=19)

　「ひとり反省会」とは
　　なんでしょうか？

　まやさんは
　　次のことを
　　　挙げています。

　1. 「あれ言わなきゃよかった」
　　　って繰り返してる

　2. 完璧な返しを
　　　あとから思いついて落ち込む

　3. 相手の反応を深読みしすぎる

　4. 「なんか空気悪くしたかも…」
　　　って不安になる

　5. その場では
　　　言えなかった自分を責める

　6. 自分ばっかり
　　　反省してることに気づく

　7. 考えても答えが出ないのに
　　　グルグルしてる

　8. 「嫌われたかも」で
　　　夜が終わるの、もうやめたい

　誰でもあるかと思いますが、
　　そこから抜け出すのに
　　　時間が必要な人は、
　　　　意外に多いものです。

　“なんとか抜け出したい”と、
　　そう思っても
　　　具体的な対応策が
　　　　ありません。
***
　そこで
　　そうしたことを相談できる
　　　Promptを作成しました。

　頭の中のグルグルを
　　言葉にするだけでも
　　　気分的にいいものです。

　相談を続けていけば、
　　最後に助言をしてくれます。

　その助言に
　　応える形で
　　　続ければ、
　　　　次の段階へと
　　　　　進められるはずです。

　こちらがそのPromptです。

```Text:「ひとり反省会」やめるためのPrompt
あなたは、臨床心理学・脳科学・マインドフルネスに精通した親身なカウンセラーです。
相談者は「ひとり反省会（＝人とのやりとりを思い出して自己批判的に悩む）」について困っており、心の整理と落ち着きを求めています。
以下のような進行で、相談者の話を丁寧に引き出し、必要なときに質問を投げかけ、最終的に科学的根拠に基づく的確なアドバイスを提示してください：

1. まず最初に「今日はどうしましたか？」と問いかけ、ユーザーの悩みを受け止めてください。


2. 相談内容に応じて、「それはいつ起きた出来事か」「どうして気になっているのか」「相手はどんな様子だったか」など、思考整理のための具体的な質問を1つずつ丁寧に投げかけてください。


3. 相談者が思考を整理していけるよう、共感的にフィードバックしながら進めてください。


4. 一通り話を聞き終えたら、心理学・脳科学的根拠に基づいて、「なぜそのような状態になるのか」を簡潔に説明してください。


5. 最後に、相談者のタイプに合った具体的な行動アドバイスを1つ〜3つ程度提示してください（例：マインドフルネス、セルフ・コンパッション、書き出す、運動など）。


※アドバイスの内容はあくまで非医療的なもので、相談者が安心して試せる日常的な行動や考え方の範囲に留めてください。
※常に穏やかで安心感を与える文体で対応してください。
```

　みなさんの
　　作品制作の糧に
　　　なれば、幸いです。

　今回は、ここまで。
【サーバレス】ローカル環境でDynamoDB動かせるのか！ ~ テーブルを作成するためのスクリプト付き ~

# DynamoDBをローカル環境で動かす理由

サーバレスアプリケーションを構築するためのAWSサービスで、**AWS SAM**というサービスがあります。これを使用すると、Lambda関数やDynamoDB, API Gatewayなどのサービスを一括でビルド・デプロイができるのですが、これをデプロイする前にローカル環境でテストをしたい場合があります。

AWSマネジメントコンソール上でLambda関数の作成する時に、`json`形式でパラメータを渡してテストを実行できる機能があります。これをローカル環境でやってしまうこともできます。

Lambda関数だけで処理が完結する場合は、以降の記事は必要ないです。

ローカル環境でLambda関数からDynamoDBへデータの閲覧・登録・更新・削除などを行う場合に、DynamoDBをローカル環境で動かしたくなります。

# Docker使います！

あらかじめDocker Desktopをインストールしておいてください。

## コマンドを叩くだけ！

以下のコマンドを実行するだけで、DynamoDB Local用のコンテナが起動してくれます。

```sh
$ docker run -d -p 8000:8000 --name dynamodb-local amazon/dynamodb-local
```

以下のコマンドが実行できれば、コンテナが起動しています。

```sh
$ aws dynamodb list-tables --endpoint-url http://localhost:8000 --output json
```

# おまけ1: DynamoDB Localにテーブルを作成するスクリプト

## 1. 任意のディレクトリにスクリプトファイルを作成

今回は、ルートディレクトリに `create-table-to-dynamodb.sh`として作成します。

```sh:create-table-to-dynamodb.sh
#!/bin/bash

# DynamoDBのエンドポイントを指定
ENDPOINT_URL="http://localhost:8000"

# 同名のテーブルの存在チェック
create_table_if_not_exists() {
  local table_name=$1
  local create_command=$2

  echo "🚧 Creating $table_name..."

  # 既にテーブルが存在するか確認
  if aws dynamodb describe-table --table-name "$table_name" --endpoint-url "$ENDPOINT_URL" &>/dev/null; then
    echo "✅ $table_name already exists. Skipping."
  else
    eval "$create_command"
    echo "✅ Created $table_name."
  fi
}

# 各テーブルの作成コマンドを定義
create_table_if_not_exists "user-groups-dev" "
aws dynamodb create-table \
  --table-name user-groups-dev \
  --attribute-definitions AttributeName=group_id,AttributeType=S \
  --key-schema AttributeName=group_id,KeyType=HASH \
  --billing-mode PAY_PER_REQUEST \
  --endpoint-url $ENDPOINT_URL
"

create_table_if_not_exists "users-dev" "
aws dynamodb create-table \
  --table-name users-dev \
  --attribute-definitions AttributeName=group_id,AttributeType=S AttributeName=user_id,AttributeType=S \
  --key-schema AttributeName=group_id,KeyType=HASH AttributeName=user_id,KeyType=RANGE \
  --billing-mode PAY_PER_REQUEST \
  --endpoint-url $ENDPOINT_URL
"

create_table_if_not_exists "tasks-dev" "
aws dynamodb create-table \
  --table-name tasks-dev \
  --attribute-definitions AttributeName=user_id,AttributeType=S AttributeName=task_id,AttributeType=S \
  --key-schema AttributeName=user_id,KeyType=HASH AttributeName=task_id,KeyType=RANGE \
  --billing-mode PAY_PER_REQUEST \
  --endpoint-url $ENDPOINT_URL
"
```

## 2. スクリプトを実行

以下のコマンドを叩きます。

```sh
./create-table-to-dynamodb.sh
```

# おまけ2: Dockerコンテナの止め方

```sh
$ docker stop dynamodb-local
$ docker rm -f dynamodb-local
```
Automating GIS Processes 2024 写経　Lesson 1（３）



[前回](https://qiita.com/t_t_japan/items/d5c9d30099ccc87509bc)の続き


https://autogis-site.readthedocs.io/en/latest/lessons/lesson-1/geometry-objects.html#Polygon

## Polygon

内周もあるポリゴンを作ってみましょう。`Polygon()`の第二引数で内周のリストを指定します。

```
from shapely.geometry import LinearRing, Polygon

# define the exterior
outer = LinearRing([(-180, 90), (-180, -90), (180, -90), (180, 90)])

# define a hole:
hole = LinearRing([(-170, 80), (-100, -80), (100, -80), (170, 80)])

polygon_with_hole = Polygon(outer, [hole])
polygon_with_hole
```

`hole`のところだけ、白抜きになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4076503/13bc1662-bbd3-4bc2-8f34-b3ff95f10ede.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4076503/31362cf7-b3cc-4f6c-974c-3beeaf23df5e.png)

printすると、内周の座標も表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4076503/850c79dd-6668-4273-8e3d-d98e8ee86ca8.png)

### Polygon properties and methods

https://autogis-site.readthedocs.io/en/latest/lessons/lesson-1/geometry-objects.html#Polygon-properties-and-methods


`Polygon`はいろいろな属性を持っています。print文の内容は教材からすこし変更しています。
```
print(f"重心: {polygon_with_hole.centroid}")
print(f"面積: {polygon_with_hole.area}")
print(f"minx, miny, maxx, maxy: {polygon_with_hole.bounds}")
print(f"exterior: {polygon_with_hole.exterior}")
print(f"exteriorr.coords: {list(polygon_with_hole.exterior.coords)}")
print(f"周囲（長さ）: {polygon_with_hole.exterior.length}")
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4076503/baf259ed-e388-44ef-a14c-7a17a5ece516.png)

## Check your understanding

多角形のお絵かきができます。
なお、円（真円）を描きたいときは、`Polygon`ではなく、`Point`を使います。
```
# Circle (using a buffer around a point)
point = Point((0,0))
point.buffer(1)
```

ちょっとだけ変形。結果は同じです。さて、`distance`の1はどういう意味なのでしょうか。後ほど出てくるとかもですが。
```
# Circle (using a buffer around a point)
point = Point((0,0))
point.buffer(distance=1)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4076503/5272da0b-7050-42e3-939d-c05197f4db5c.png)

## Geometry collections (optional)

optionalなので省略します。
まあ、`Point`とか`Linestring`とか`Polygon`を複数まとめて管理できる、ということです。

## Convex hull and envelope

>Convex hull：凸包(convex hull)とは， 与えられた点をすべて包含する最小の凸多角形（凸多面体）のこと
>凸多角形：単純な多角形であって、その内部または境界にある任意の二点間を結ぶ線分が、その多角形の外に出ることがないもの

とのことです。私もあまりよくわかっていませんが。


まずは、`MultiPoint`を用意します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4076503/f7668323-8178-4f68-ad13-6a7a6d2c8f85.png)

`convex_hull`属性を取得しています。確かに、与えられた点をすべて包含する最小の凸多角形ですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4076503/8673f19f-277d-4c5f-946d-a6365abf3d59.png)


次に`envelope`属性を取得します。convex_hullとは異なった値です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4076503/97cb40d3-0c07-4454-b6a2-3e990ccf0f00.png)

envelopeについては、よくわかりませんでした。。。


# Validity of geometries

`Point` `Linestring` `Polygon`などは、それを定義しうる要件があります。その要件を満たすことをチェックする関数`is_valid`が用意されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4076503/e4174cc0-ac50-4c6b-9650-a04c5f6f36df.png)

いったんここまでとします。次回はExercise 1です。
TsukuCTF 2025参加体験記 ~Writeup~

## はじめに
こんにちは，kmです．
TsukuCTF 2025(5/3-4)にチーム suiryo のメンバー [ハンドルネーム] として参加しました！
最終結果は204th(800pt)でした👍️✨️．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729645/5cfc75ae-4ba8-460d-abd9-ffedab06bf73.png)
初めてのCTF参加だったのですが，OSINT問題を楽しく解くことができました！

参加したきっかけは，優秀な後輩が「先輩もこれ参加しましょう」と誘ってくれたことです．
チームの後輩と同輩に感謝🙌．

このWriteupではTsukuCTF2025の課題のうち筆者が回答に関わったOSINTの2問のみ解説します🧐．
以下解説．

## [OSINT] Casca
![casca.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729645/1e2dda51-8ef9-4898-ac37-456a2be172a7.jpeg)

>海が綺麗なこの日本の街は、かつてポルトガルのリゾート地との交流がありました。
>この写真のすぐ右側にはその記念碑が置かれています。記念碑に書かれている「式典の開催日」を答えてください。
>Format: TsukuCTF25{YYYY/MM/DD}

『この課題を一瞬で解いてチームの士気上げてくぜー！』と息巻いて解き始めました．
結論から言うと途中で諦めかけ，チームの援助を借りて回答してもらいました(泣)．
初心者すぎて課題タイトルの**Casca**がヒントになっていることも見逃していたことが回答に難航した要因でしょう😢．

**回答:** TsukuCTF25{2014/06/06}
**解説:** 
Googleで画像検索を行うと，画像内にあるアートが熱海市に設置されているものだと分かる．
そこから熱海市の記念碑についてまとめたサイトを調べ上げ，課題の画像と似たアートが写っている記念碑を見つける．
記念碑に【2014年6月吉日】と書いてあるので，日にちについては愚直にポチポチ試していけばCorrectが得られる．

(友達がAIに式典の日を調べてもらっていたらしく，2014年6月6日という回答を得ていた．式典の日をもう少し詳しく調べていたら愚直に日にちを打たなくても答えが確定していたかも...💡)

## [OSINT] destroyed
>[このTelegramの投稿](https://t.me/etozp/19319)の写真に写っている学校を特定してください。
>フラグフォーマットはその場所の座標の小数点第4位を四捨五入して、小数第3位までをTsukuCTF25{緯度_経度}の形式で記載してください。
>例: TsukuCTF25{12.345_123.456}
>注意: この問題を解く過程で、戦争に関わる直接的な画像が表示される場合があります。
>23:14 GMT+9 追記: フラグを追加しました

この問題はそんなに難しくない(はず)でしたが，回答にとても時間がかかりました．
どうやら運営側が正答として受理するFlagの設定に不備があったそうで，途中で正解していたはずの箇所が不正解となっていたようです．
Flagの設定が修正されてからはちゃんとCorrectできました．

**回答:** TsukuCTF25{47.798_35.305}
**解説:** 
Telegramの投稿を翻訳するとウクライナのステフネという地域の体育館を写した画像だと分かります．
しかし，GoogleMapでウクライナのステフネ(Stepne)を調べると複数箇所が候補に挙がり断定できず...
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729645/e7604c95-7979-4af5-831b-0ac9b6d8e2a2.png)

そこで，投稿された画像を画像検索で調べると[同件について述べた別の記事](https://armyinform.com.ua/2022/12/24/okupanty-prodovzhuyut-nyshhyty-shkoly-ta-infrastrukturu-na-zaporizhzhi/)が見つかりました．
そこには画像の建物がザポリージャ地方にあるという情報が書かれています．
これによって，ザポリージャ地方のステフネという地域を調べればいいと分かります．
あとは投稿された画像から[長めで屋根のある建物]と[赤い屋根の建物]が近くにあることを条件に，GoogleMapで衛星写真をグリグリと見渡せば該当する建物を見つけることができます🌏️．

## おわりに
初めてのCTFで，最初はどんな問題を解くことになるのかも知りませんでしたが，OSINTという取り掛かりやすい問題が用意されていて安心しました．
ちゃんとしたセキュリティ系の問題に取り組むだけの知識が自分に無かったことを悔やみますが，それでも仲間と楽しい一時を過ごせたので良かったと思います．
ありがとうございました😀！
【読書感想】図解即戦力 要件定義のセオリーと実践方法がこれ1冊でしっかりわかる教科書

# 書籍タイトル：図解即戦力 要件定義のセオリーと実践方法がこれ1冊でしっかりわかる教科書

読む時間：03:14

## はじめに
四月から新しい案件に配属され、初めて上流工程から関わることになりました。これまでは、他の方が作成した設計に従ってコーディングを行うことがほとんどで、上流に携わる機会は新卒時の研修程度しかありませんでした。

今回のお客様は、プロダクト企画の段階から専門業者を起用しており、カスタマージャーニーの設計など、UI/UXの専門的な視点からシステム全体をデザインしています。そのため、非常に良い学びの機会となっています。

私はバックエンド担当として、要件の洗い出しといった要件定義フェーズから関わっており、今後はデータベース設計や実装も担当していく予定です。せっかくの機会なので、「要件定義」では何をすべきかを系統的かつ俯瞰的に学びたいと思い、このテキストを購入しました。

## 📚 **本書の詳細情報**
https://gihyo.jp/book/2020/978-4-297-11367-4


## 印象に残ったポイント

### 1. 業務要求・機能要求・非機能要求の分けて整理すること
業務要求・機能要求・非機能要求を分けて整理することは、一見すると簡単に思えますが、実際の現場では話が混ざってしまったり、要件定義の初期段階ではうまく分類できなかったりすることが多いと感じました。

業務要求は、ビジネス上の視点から「こういった課題を解決したい」「こんなことを実現できるシステムがほしい」といった目的を示すものです。

機能要求は、その業務要求を実現するために「このような画面が必要」「テーブル構成はこうした方が良い」といった、具体的な機能に踏み込んだ内容になります。（詳細は今後の「設計」フェーズでやりますが）

一方で非機能要求は、システムを安定的に運用・維持していくために必要な条件を定義するものであり、「最低限必要なパフォーマンスはどれくらいか」「セキュリティ上どのような対策が必要か」などが該当します。

実際にお客様と一緒に要件の洗い出しを行っていると、業務要求・機能要求・非機能要求といった分類を明確に意識して会話することはほとんどなく、話題があちこちに飛び交う中で要件をすり合わせていく場面が多いと感じました。

しかし、本書を読んだことで、自分の中では「これは業務的な話だな」「これは非機能要件だな」といった具合に、頭の中で自然と分類しながら会話を整理できるようになり、とてもスッキリしました。



### 2. 要件定義のための下調べが大事であること
初めて特定の業界のシステムに配属されると、新人はおそらく業界特有の知識がないため、最初の会話についていくことすら難しいと感じると思います。

今回のお客様は、事前に専門業者とプロダクト企画をしっかり進めたうえで、私たちが要件定義フェーズに入る際には、前提や背景、事業目標、ステークホルダー、競合他社の状況などを非常に丁寧に共有してくださいました。まさに「天使のようなお客様」だと感じました。

ただし、毎回このように親切なお客様に出会えるわけではありません。今後、要件定義やITコンサルの専門家としてスキルを磨いていくならば、本書に書かれている「要件定義のための事前調査の進め方」をしっかり意識して、自ら動いて準備する姿勢が必要だと思いました。

実際今回も、お客様から多くの情報を共有していただいたとはいえ、会話の中で「この言葉の意味は何だろう？」と戸惑わないように、事前にUdemyで該当業界の知識を学び直しました。業界知識があるだけで安心感が生まれ、初対面の緊張も少し和らげることができました。

### 3. 合意・承認のタイミング
要件定義の段階では、お客様とさまざまなテーマについて意見交換を行いますが、最終的な意思決定はあくまでお客様側にあります。どんなに優れた提案をしていたとしても、「あれ、そんな話あったっけ？」となってしまっては困ってしまいます。

本書に書かれていた「定期的に合意を取る（最後まで放置しない）」や「テーマごとに合意を得る（話を混在させない）」という考え方は、非常に重要だと感じました。ですが、実際の現場ではこれがうまくできずに、話が混ざってしまったり、後で食い違いが生じたりするケースはありがちだと思います。

昭和的な「上司のスケジュールに合わせて、まとめて一括で報告・決定する」ようなウォーターフォール的進め方ではなく、なるべくアジャイル的な考え方で、小さなサイクルを回しながら要件のライフサイクルを柔軟に進めていきたいと思っています。

今回のお客様もアジャイルの考え方を大切にされており、私自身も以前スクラム開発のメンバーだった経験があるため、ガチガチのウォーターフォールにならないよう、意識して柔軟に進めていくつもりです。


## まとめ・感想
今回は、エンジニア歴5年目にして初めて要件定義フェーズから関わることになり、本書はそんな私にとって非常に心強い“武器”となりました。

これまではコーディング中心の業務がほとんどで、物事をどうしてもプログラム視点でしか捉えられていませんでした。しかし、上流工程から関わることで、「なぜ当時あのような設計になっていたのか」が少しずつ理解できるようになり、単に面白さを感じるだけでなく、設計者としての責任の重さも実感しました。

今までは、さまざまな案件を経験する中で、幅広い知識に触れる機会はありましたが、それを系統的・俯瞰的に整理する機会はあまりありませんでした。本書を通じて、そうした知識を頭の中でしっかり整理するきっかけになり、大変勉強になりました。

これからも、他の分野についても積極的にテキストを手に取り、初心者レベル（ただ触れたことがある状態）から、上級者レベル（自分の言葉で体系的に語れ、人にも教えられるレベル）へと進化していきたいと思います。
Pythonプログラミングでよくある初学者のつまずきとその解決法

## Pythonプログラミング、最初の壁をどう越えるか？
Pythonは文法がシンプルで習得しやすいと評されますが、実際に手を動かすと意外とつまずくポイントが多くあります。Qiita上でも「初心者向け」とされる投稿にエラー解決や構文理解の記事が集中していることからも、Python初学者が最初に直面する「小さな技術的課題」の壁が見て取れます。
この記事では、 **Python学習でよくある課題** をベースに、実務でも役立つTipsを交えて対処法を解説します。

### なぜPythonは人気なのか？その背景と概要

Pythonは2020年代以降、**AI・データサイエンス・自動化** といった分野でのニーズ拡大と共に爆発的な人気を得ました。公式ドキュメントでも初心者への配慮が感じられる設計となっており、PEP8（Python Enhancement Proposal）による **可読性重視の設計** もその理由の一つです。ただし、公式ドキュメントは情報量が多く、初学者にとってはどこから読めば良いか分かりにくいという声もあります。

### 初心者がハマりやすい課題・エラー

- インデントエラー（`IndentationError`）
- 変数のスコープ（ローカルとグローバルの混同）
- 型の違いによるエラー（例：文字列と数値の加算）
- importエラーと環境構築の問題

<span style="color:red;">エラー文を読まずにGoogle検索でコピーエラーを貼り付けて解決を試みる</span>のは非効率です。まずはエラーメッセージの意味を理解することが重要です。

### よくある課題とその対処コード

#### 1. インデントエラー対策

```py
def greet():
    print("Hello, World!")  # ← タブではなくスペースを使用（PEP8準拠）

greet()
```

#### 2. 型の違いでのエラー例と修正

```py
# NG例
age = 30
message = "Your age is " + age  # TypeError

# OK例
message = "Your age is " + str(age)
print(message)
```

#### 3. importエラー時の対処

```sh
# モジュール未インストール時
# エラー: ModuleNotFoundError: No module named 'requests'

# 対処方法（仮想環境内で）
# ターミナルで実行:
pip install requests
```

### Python学習におけるベストプラクティス

-  **仮想環境** （venv）を使って依存管理を行う
- Jupyter NotebookやVSCodeで実行結果を逐一確認する
- エラー文の前後関係を読む訓練をする
- 公式ドキュメントは「Tutorial」「Library Reference」から段階的に読む
-  **学習と実務を分けない：小さなスクリプトでも実務に応用** 

### まとめ：Pythonは書いて・壊して・直して覚える
Pythonは非常に強力な言語ですが、その力を最大限に活かすには、 **エラーを避けるのではなく、エラーと付き合う** 姿勢が重要です。この記事で紹介した内容は、実際にQiitaでもよく読まれている課題やトラブルに基づいており、実務でも活用できる内容です。今後はより複雑な構文やライブラリ（例：Pandas、Flask、FastAPIなど）に進んでいく中で、基礎の理解が確実な土台となるでしょう。
高校二年生、AIを勉強し始めて2週間で日本人工知能オリンピックに参加した話【第1回JOAI体験記】


#  はじめまして


こんにちは、初めてQiitaに投稿します。
2025年の第一回日本人工知能オリンピックに参加しました！
**選抜枠26位・最終スコア96.256%**
決して高いスコアではないと思いますが、この記事では、AIを勉強し始めて2週間の状態で「第1回 日本人工知能オリンピック（以下JOAI）」に出場した体験を、結果や解法の概要とともにまとめます。

また、JOAIの出場を考えている人に私が実際に出場してみて思った、私なりのアドバイスを書いていくので良ければ見て言ってください（あまり技術的なアドバイスはありません）


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4078843/d4ea90d0-1e1f-4080-9f23-52cdfe560878.png)


JOAI公式X
https://x.com/JOAICommittee


# 自己紹介と背景
高校2年生です。2024年の冬、X上でJOAI、IOAI(国際人工知能オリンピック)の存在を知り、興味を持ったのが参加の理由です。Pythonやプログラミングはさわれるものの、それまで人工知能は一切触ったことがなく、完全に0からのスタートでした。
Kaggle等は登録したものはいいもののなかなかモチベが出ず、本格的に勉強し始めたのは2025年の4月初め、JOAI開催
の二週間程度前でした。

 ↓kaggleのactivity
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4078843/be36634b-ec93-484b-81b7-daebdfef7c2f.png)

# JOAIとは
JOAI の概要はホームページで以下のように紹介されています。主な目的としては、IOAI（国際人工知能オリンピック）の代表選手の選抜になります。

>日本人工知能オリンピック（JOAI）は、国際科学オリンピックの一つである「国際人工知能オリンピック (International Olympiad in Artificial Intelligence; IOAI)」の日本代表選手選考を兼ねています。
第1回大会では、2025 年 8 月に中国・北京で開催される第2回国際人工知能オリンピック (International Olympiad in Artificial Intelligence 2025; IOAI2025) の代表選手を選抜します。
[JOAI公式HPより](https://ioai-japan.org/joai2025/)


# コンペ概要
画像・表・テキストの情報が与えられるのでガスの分類を行うモデルをコンテスト期間の一週間で作成するという課題でした。
>このコンペティションでは、表・画像・テキストのマルチモーダル情報から、ガスに関する分類タスクに取り組んでいただきます。各データは、ガスセンサによる2つの測定値と、同時に赤外線カメラで撮影された画像、および画像を説明したテキストから成ります。ガスは「Perfume」「Smoke」の2種類存在し、それぞれの有無を考慮した4つのラベルが存在します。（Perfume, Smoke, Mixed, NoGas)

# 結果・解法・できなかったこと・したかったこと
私は、全体で62位と参考にならないと思うのであまり詳しくは話しません。

金賞を受賞したkanda9685　さんが記事を上げていて非常に参考になるのでぜひそちらをどうぞ。
https://zenn.dev/kanda9685/articles/a6e9dc0cc89493

一般的な前処理、特徴量エンジニアリングをおこなってモデルを作成。エラー分析やパラメーターの調整をoptunaでしようとしたもののうまく行かず、、コンペ中はテキストをどう処理するかを考えていましたが、実はテキストデータはノイジーだったとコンペ終了後に知る。大体こんな感じです。

# 今後出場予定の方へのアドバイス
さて、本記事のメインディッシュです。割と当たり前のこともありますが、実際に参加してみて思ったことを書きます。

**1. 焦らない**
次年度以降の形式がどうなるかはわかりませんが(今大会はコンペ開催期間が1週間でした。)、コンペの比較的早い段階から、高いスコアを出したりする方も現れます。ただ、ここで焦らないことが大切です。焦って解法に先入観に囚われたりするのもよくありません。はじめは、リーダーボードを見ないほうがいいんじゃないか？くらいに思っておいたほうがいいかもしれま
せん（個人の感想です。）
<br>

**2. GPUの使い方について**
たとえば、kaggle notebookではGPUの使用時間が30h/weekと決まっています。コレをうまく使いましょう！たとえば、JOAIが金曜日から始まるのに金曜までにGPUの使用時間をたくさんつかってしまっては、JOAIで少し不利になります。また、**使わないときはセッションをきちんと切りましょう。（わたしはついやらかして、一週間の初めの2日でGPUを30時間つかいきってしまいました)**制限が来たら、Google Colabをつかうのも視野に入れましょう、ただ、トレーニングファイル、フォルダのサイズが大きいことを視野に入れて、コンペが始まって比較的早い段階でGoogle Driveにアップするのがいいかもしれません。
こちらの記事なんかも参考にするといいと思います。　
[Colabで別のアカウントのドライブを参照](https://qiita.com/dabjhs2012/items/a3f01f5d722890b2f21f)



<br>

**3. 結果は最後までわからない！**
1と類似するところはありますが、コンペの結果は最後までわかりません！諦めないでください！（私は体力の限界とバグの修正でつかれて諦めました。）実際、Xや出場者の知り合いと話していたり、リーダーボードを見てみても、コンペ終了1時間前にスコア、順位ともに大幅に上がっていた方もいました。

# おわりに
最後に、これから出場する人へのアドバイスです。
・初心者でも怖がらずに出てみるべき！
・大事なのは「できるかどうか」より「やってみたいと思うかどうか」
・早めに始めて、少しずつ勉強すれば絶対楽しくなる
・わからないことはChatGPTやQiita、Kaggleでググればなんとかなります

私自身、本当に初心者ながら今回のコンペですごく楽しむことができました。
また、JOAI運営様から、チュートリアル等も設置されていて初めて人工知能を学びたい方にもすごくいい勉強の機会だと思っています。

<br>
来年、受験生でどうなるかわかりませんが、もっと精進してぜひ出場したいと考えています。
この記事を読んでくれたすべての皆様、ありがとうございます

---
わたしのXアカウントです。基本的にフォロバもしています。
DMも気軽にしていただいて構いません。
すべて返信させていただいています。
https://x.com/ItsLinilys
Redashで閲覧権限のユーザーでクエリパラメータを使用する


Redashで閲覧権限のユーザーでクエリパラメータを使用する方法（覚書き）です。

# クエリパラメータの使い方について

まず、クエリパラメータの使い方について。
`{{  }}` で囲うことで、クエリパラメータ化できます。


## 具体例

具体例は、以下の通り。

### クエリ
```
select * from shops
where
 created_at between '{{ 調査期間初日 }}' and '{{ 調査期間最終日 }}';
```

### 表示
![query_parameter1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/9bb49985-c571-415d-b160-e1282fe838bb.png)

→ これで、`{{ 調査期間初日 }}` と　`{{ 調査期間最終日 }}`の部分に任意の値を入力して検索を実行できます。

# 閲覧権限（View Only）権限で使えるクエリパラメータの種類

閲覧権限（View Only）権限、正確には、フルアクセス（Full Access）権限以外で使えるクエリパラメータには限りがあります。
具体的には、Text-typeは使えず、それ以外は使えます。


表にまとめると以下の通り。

|  |フルアクセス（Full Access）権限  |それ以外（閲覧権限（View Only）権限）など  |
|---|---|---|
|Text-type  |◯  |×  |
|それ以外  |◯  |◯  |

フルアクセス（Full Access）権限以外でText-typeが使えないのは、セキュリティ上の理由らしいので、それ以外の権限でText-typeをクエリパラメータとして使いたい場合は諦めるか、権限をフルアクセス（Full Access）に昇格させるしかなさそうです。

## 閲覧権限（View Only）権限でクエリパラメータを使用するには

閲覧権限（View Only）権限でクエリパラメータを使用するには、設定が必要です。
手順は、以下の通り。

(1) 入力欄の右上の歯車マークをクリック

![query_parameter1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/dab063cb-189d-4453-86db-06397fec64d8.png)

(2) Text-type以外の、適切なタイプを選択

![query_parameter2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/eeb32dbd-b410-49e4-9068-f268d820292a.png)

これで、閲覧権限（View Only）権限（正確には、フルアクセス（Full Access）権限以外）でもクエリパラメータが使えるようになりました。

# 終わりに

自分の使用環境では、デフォルトがTextになっていて、閲覧権限（View Only）権限の人にアクセスエラーが出てしまい、ちょっと焦りました。
解決できて、ひと安心！


# 参考

- [Query Parameters | redash.io](https://redash.io/help/user-guide/querying/query-parameters/)
LISP en Español

LISP, el "lenguaje de DIOS"
https://www.youtube.com/watch?v=-QHTPXOHvIo&t=171s

Tuve la oportunidad de trabajar como pasante durante tres meses junto a la persona que lidera el proyecto Mule.
3ヶ月、Muleプロジェクトを主導されている方の隣で研修生をしていたことがあります。

Mule es un proyecto multilingüe para Emacs, un editor escrito en LISP.
Muleは、LISPで書かれたエディタであるEmacsの多言語対応プロジェクトです。

Un programador Lisp me dijo que LISP es como un ensamblador.
Lispプログラマの方には、LISPはアセンブラみたいなものだと教えていただきました。

En ese momento, los procesadores Lisp estaban disponibles y tenían base física.
当時、Lispプロセッサが、発売されており、物理的にも根拠がありました。

Los procesadores Lisp siguieron siendo caros y de bajas ventas, y nunca llegaron a ser prácticos.
Lispプロセッサは、販売台数が少なく、高価なままで実用的にはなりませんでした。

Las personas que publicaron el Sistema Léxico Japonés también eran programadores LISP.
日本語語彙体系を発行した方々も、LISPプログラマでした。

# Ref
LISPはアセンブラだ
https://qiita.com/kaizen_nagoya/items/f527798ab85b55b995b7

docker(173) でLISP
https://qiita.com/kaizen_nagoya/items/c6280f1b7af18e3d29cf

「LISP入門」入門
https://qiita.com/kaizen_nagoya/items/a15fb08db24bad85a841

日本語(23) 語彙大系　追悼：白井諭。Lisperへの敬意を込めて。
https://qiita.com/kaizen_nagoya/items/e41ed513c8686841399b

日本語（６）日本語情報処理で次に取り組む課題
https://qiita.com/kaizen_nagoya/items/d3aeb25838f3b4becf6f

賢人の跡を追って 仮説(249)
https://qiita.com/kaizen_nagoya/items/536c2cabae2586afbc86

OBJ の試用経験 図(55)
https://qiita.com/kaizen_nagoya/items/acb2f1740740d5e57892

プログラミング言語教育のXYZ。 仮説（52）
https://qiita.com/kaizen_nagoya/items/1950c5810fb5c0b07be4

人生で影響を受けた本100冊
https://qiita.com/kaizen_nagoya/items/16af53acbb147a94172e

50歳からのプログラミング言語入門。docker(152)
https://qiita.com/kaizen_nagoya/items/5c7cec79cb3b15237076

６５歳からのプログラミング入門 転職(16)
https://qiita.com/kaizen_nagoya/items/1561f910c275b22d7c9f

プログラムは詩のように描こう。仮説(110)
https://qiita.com/kaizen_nagoya/items/dd2a912f23b18e0f8893

programming like making a poem.
https://qiita.com/kaizen_nagoya/items/07ed8747f0811d070070

「何を」よりも「誰を」１０年後のために今見習いたい人たち
https://qiita.com/kaizen_nagoya/items/8045978b16eb49d572b2

日本のプログラマが世界で戦える16分野・事例。仮説（53）統計と確率(25)
https://qiita.com/kaizen_nagoya/items/a7e634a996cdd02bc53b

新人(学生)を指導するよりも新人(学生)に指導してもらった方が効率的
https://qiita.com/kaizen_nagoya/items/db993b1536055029f7c8

凡人は天才、秀才と違うことをして生きていく
https://qiita.com/kaizen_nagoya/items/0502aebb7610fef584f5

人間が計算機に勝てる３つのこと。忘れる、あきらめる、やめる
https://qiita.com/kaizen_nagoya/items/49dc709d289d22846044

「知っている」ことと「実現する」こと
https://qiita.com/kaizen_nagoya/items/fc65bb332561add5b249

# Ref.
LinuxChad
https://qiita.com/kaizen_nagoya/items/cdae082ffdfffee10605
NotebookLMとMCPで実現！音声チャットボットで最新技術を耳から学ぶ

## はじめに

近年、AI技術の進化により、テキストだけでなく音声で学習する方法も身近になりました。この記事では、Googleが提供するNotebookLMを使って、Model Context Protocol（MCP）に関する最新知識を音声チャットボット（Podcast形式）で学ぶ方法をご紹介します。

## NotebookLMとは？

NotebookLM（旧称：Project Tailwind）は、Google Labsが開発したAIベースのリサーチ・ノートツールです。Google Geminiを基盤とし、ドキュメントから要約、Q\&A生成、音声要約などを行うことができます。2024年にはAudio OverviewというPodcast形式の音声生成機能が追加され、複雑な内容を音声で手軽に学ぶことが可能になりました。

## MCP（Model Context Protocol）とは？

MCPは、大規模言語モデル（LLM）間の文脈共有を効率化し、AIエージェントが協調して動作するためのプロトコルです。Anthropic、GitHub、a16zなど主要なAIコミュニティで注目されており、分散型AIシステム構築において重要な役割を果たしています。

## NotebookLMでPodcastを生成する手順

### 1. 情報収集

Google検索やChatGPTを利用して以下のような記事を収集します。

* [What is MCP and why you should pay attention](https://waleedk.medium.com/what-is-mcp-and-why-you-should-pay-attention-31524da7733f)
* [ModelContextProtocol.io](https://modelcontextprotocol.io/introduction)
* [Anthropic's article](https://www.anthropic.com/news/model-context-protocol)
* [Descope's article](https://www.descope.com/learn/post/mcp)
* [Github blog](https://github.blog/ai-and-ml/llms/what-the-heck-is-mcp-and-why-is-everyone-talking-about-it/)
* [a16z's blog](https://a16z.com/a-deep-dive-into-mcp-and-the-future-of-ai-tooling/)
* [Wikipedia](https://en.wikipedia.org/wiki/Model_Context_Protocol?utm_source=chatgpt.com)
* [Hugging Face](https://huggingface.co/blog/Kseniase/mcp?utm_source=chatgpt.com)
* [Patrick McGuinness](https://patmcguinness.substack.com/p/building-next-gen-ai-agents-with?utm_source=chatgpt.com)
* [The Top 7 MCP-Supported AI Frameworks](https://medium.com/%40amosgyamfi/the-top-7-mcp-supported-ai-frameworks-a8e5030c87ab)

### 2. NotebookLMへのデータ取り込み

NotebookLMにログインし、新規ノートブックを作成します。収集した記事URLやドキュメントを取り込みます。NotebookLMはこれらの情報を要約・分類して、学習用のナレッジベースを作成します。

NotebookLMの最初のページ
![NotebookLM.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457682/c5e53760-e609-48f7-95ad-08546bab6c30.jpeg)

ノートを作るとソースの取り込みができる
![02_input.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457682/dfa56295-486e-4ca8-b357-fd8ddfee2c55.jpeg)

### 3. ポッドキャストの生成

NotebookLMの画面右上にある「音声概要」機能をクリックすることで、ポッドキャスト形式の音声要約が自動で作成されます。音声は会話調で構成され、理解しやすくナレーションされます。今回はカスタマイズをしました。

生成されたPodcastは10分ほどで、隙間時間に聞いて効率よく知識をインプットすることが可能です。
![03_CreatePodcast.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457682/8f30d36a-300d-4b80-92db-5a55238a1b27.jpeg)

## NotebookLM × RAGの活用

今回の方法はRetrieval-Augmented Generation（RAG）に似たアプローチを採用しています。外部情報（記事）を事前に収集し、NotebookLMがその情報をもとに要約とPodcast生成を行います。これにより、リアルタイムに最新の専門的知識を音声で簡単に取り入れられます。

## 活用例と今後の可能性

NotebookLMの活用はMCPに限らず様々な分野に応用可能です。

* 新規技術やトレンドのキャッチアップ
* 社内教育用コンテンツ作成
* 英語論文の日本語音声解説
* ビジネス資料の事前学習

将来的には音声データの外部エクスポートや、企業内での専用環境構築といった展開も考えられます。

## 注意点とセキュリティ

NotebookLM利用時は以下の点に注意が必要です。

* 個人利用と法人利用で規約が異なる
* 機密情報や著作権に敏感な内容は避ける
* 医療、法律、金融など専門領域での直接的判断には利用不可

GoogleはNotebookLMで収集された個人データをAIモデルの学習には利用しないことを明記しています。安全に活用するためにはこれらの規約を十分に理解しておく必要があります。

## まとめ

NotebookLMを利用すれば、最新技術を「耳で学ぶ」新しい学習スタイルが可能になります。MCPを始めとした最新の専門知識をPodcast形式で手軽に学習できるこの方法は、忙しい現代人の効率的なインプット方法として非常に有効です。これは通勤時間が長い人には嬉しい機能です。

ぜひNotebookLMを活用し、新しい学習方法を取り入れてみてください。
Linucレベル１勉強メモ　＃１６

＃ 第二章　ファイル・ディレクトリの操作と管理

練習問題2.1
アクセス権「rwxrw-r--」で表すとどうなりますか。３桁の数値で記述してください。

____________

（解答）　764

（解説）
r=4、w=2、x=1、のように数値化し、所有者、所有グループ、その他ユーザーごとに加算すると簡単に求めらられます。アクセス権の表記はどちらの方法でも記述できるように、いずれかからもう一方へ変換できるようにしておく。

アクセス権
ファイルやディレクトリには、アクセス権が設定されます。アクセス権（パーミッション）とは、どのユーザーに対してどういった操作を許可するのかという情報のことです。使用者の分類は「所有者」「所有グループに属するユーザー」「その他のユーザー」の３つに分かれる。アクセス権については「読み取り可能」「書きこみ可能」「実行可能」の３つに分かれます。
「-rwxr-xr--」の部分のアクセス権はひだりから３文字ずつ「ユーザー（所有者）のアクセス権」「グループのアクセス権」「その他ユーザーのアクセス権」を表しています。
今日の学習ログ（2025/4/22）HTML

# 🗓 今日の学習ログ（2025/4/22）
📌 現在、プログラミングスクールにてWeb開発を学習中です。
🎯 未経験からIT業界へのキャリアチェンジを目指しています。

学習がスタートして2週間。学習の記録としてqiitaを始めます:grinning:
まずは、この2週間分の振り返りながら、少しずつ始めてみたいと思います。
よろしくお願いします。

## 📚 学習内容

- 使用教材／学習環境：スクールカリキュラム
- 学んだこと：HTMLとCSS

## 🧠 キーワード・要点・気づき

### Webページの見た目を作るための前提知識

- **HTML（HyperText Markup Language）**
    - Webサイトに表示する情報を記載する言語
    - HTMLファイルは〇〇.htmlという拡張子をつける
- **CSS（Cascading Style Sheets）**
    - CSSはHTMLを装飾するための言語
    - CSSファイルは〇〇.cssという拡張子をつける
- **拡張子**

<aside>
💡

HTMLはブラウザ上に情報を表示するためのもの。したがってHTMLだけでも情報を表示することができる。

しかしHTMLだけでは、質素なウェブサイトに仕上がる。

CSSを用いることで、ユーザーが見やすい形にウェブサイトを装飾することができる。

</aside>

### 必要なフォルダとファイルの作成方法

テックキャンプをWindowsで受講している場合は、Ubuntu（Lesson2で導入したシステム）で決めたユーザー名の専用フォルダのことを指す

エクスプローラーを開き、検索欄に \\wsl$ と入力するとUbuntuのファイルシステムを表示できる

 **`Ubuntu`** → **`home`** → **`ユーザー名のフォルダ`** 

### HTMLの構成

- HTMLは要素の積み重ねで構成されている
- HTMLは、head要素とbody要素に大きく2分される
- head要素にはWebページのタイトルなど、Webページの情報を記述する
- head要素の記述は、ブラウザ上には表示されない
- body要素には、ブラウザ上に表示される情報を記述する
- コメントアウトを用いることで、コードの中にメモを残すことができる

|  |  |
| --- | --- |
| headヘッド要素 | ウェブサイトの情報や、装飾用のCSSファイルの情報を記載する部分。ここに記述した情報は画面上に表示されない。 |
| bodyボディ要素 | 画面上に表示したい情報を記載する部分。ブラウザ上に表示されている情報は、body要素の中に記述されたもの。 |
| DOCTYPEドックタイプ | 「ドキュメントタイプ」の略で、この文章がHTML文章であることを宣言する要素。終了タグはなし。
実際に記述する場合は、**`<!DOCTYPE HTML>`**のように。
この要素を記述しないと、レイアウトが崩れ、正しく表示がされない場合がある。 |
| htmlエイチティーエムエル要素 | HTML文章の始まりと終わりを示す要素。 |

| head要素 |  |
| --- | --- |
| metaメタ要素 |  |
| 属性 |  |
| 属性値 |  |
| charsetキャラセット属性 |  |
| titleタイトル要素 |  |

| body要素 |  |
| --- | --- |
| h1〜h6エイチワン〜エイチシックス要素（見出し要素） |  |
| pピー要素 |  |
| brビーアール要素 |  |
| bビー要素 |  |
| aエー要素 |  |
| hrefエイチレフ属性 |  |

### コードの差分✅

コードの差分を比較するには、VSCodeの標準機能を使う✨
（ | 左がコピーしたコード |  | 右が開いている自分のコード | ）

1. 見本のコードをコピーする
2. 自分のコードがあるファイルを開く
3. **`command + shift + P`**でコマンドパレットを開く
4. **`>`**に続けて**`compare`**と入力し、**`Compare Active File With Clipboard`**を選択
5. 赤字でハイライトされている見本と異なる部分を確認する
6. 編集したいファイルを選択して、誤字や抜けているコードを修正する

## 🌀 つまずいたこと・調べたこと

- 

## 💭 所感・次にやること

- まずはこのペース（時間割学習）に慣れることを優先に取り組んだ
- 「ホスト」という役回りをチーム内で一番手として担うことになり緊張したがなんとか務められてホッとした
- 本日は役割を全うすることと取りこぼしがないようにすることで必死だったが、明日からはカリキュラムの進度をもう少し早めたい
- 細かな時間割や役割もわかったので、家族とのスケジュール調整やカレンダー登録など個人的な環境設定も大方進められた

---

📝 補足やリンク（参考にした記事や動画など）

-
【Unity】OnPointerUpが実機で勝手に発行される！？シミュレータとAndroidで違ったタッチイベントの罠

Unity開発において、**Editorではうまく動作するのに、Android実機でだけ挙動が崩れる**という現象はよくあります。

本記事では、**`OnPointerDown` / `OnPointerUp` の発行タイミングがUnity EditorとAndroid実機で異なる**ことで発生したバグと、その解決方法を紹介します。

---

## 発生した問題

ジョイスティックUIを実装していた際、`OnPointerUp` イベント内でスティックの位置を初期化していました。

```csharp
public void OnPointerUp(PointerEventData eventData)
{
    inputVector = Vector2.zero;
    handle.anchoredPosition = Vector2.zero;

    RectTransformUtility.ScreenPointToLocalPointInRectangle(
        stickRoot.transform.parent as RectTransform,
        RectTransformUtility.WorldToScreenPoint(eventData.pressEventCamera, activeAreas[0].position),
        eventData.pressEventCamera,
        out Vector2 localPoint
    );
    (stickRoot.transform as RectTransform).anchoredPosition = localPoint;
}
```
Unity シミュレータ上では問題なく動作していましたが、Android実機では操作中にもかかわらず OnPointerUp が発行され、スティックが勝手に戻ってしまうという不具合が発生しました。

## 環境別の挙動
環境	挙動
Unity Editor	指を離したときだけ OnPointerUp が発行される（想定通り）
Android 実機	指を離していないのに OnPointerUp が発行されることがある（想定外）

## 原因
Android実機では、一時的なフォーカスロストや通知のポップアップなどの影響で、ユーザーが指を離していなくても OnPointerUp が発行されることがあります。

そのため、OnPointerUp に位置リセット処理を直接書いてしまうと、**「触っているのに勝手に戻る」**という状態になります。

## 修正方法（OKパターン）
OnPointerUp では入力ベクトルのみクリアし、位置リセットは Update() 内で 「一定時間以上入力がない場合」 に限定して実行するようにしました：

```csharp
void Update()
{
    if (inputVector == Vector2.zero)
    {
        if (inputZeroStartTime < 0f)
        {
            inputZeroStartTime = Time.time;
        }
        else if (Time.time - inputZeroStartTime > resetDelay)
        {
            stickRoot.transform.position = activeAreas[0].position;
            inputZeroStartTime = -1f;
        }
    }
    else
    {
        inputZeroStartTime = -1f;
    }
}
```
## 教訓
OnPointerUp のようなイベントに即座に副作用のある処理を書くのは避けるべき

入力状態を別で管理し、安定したフレーム単位のロジックで制御する方が安心

実機テストは必須。Unity Editorだけではわからない挙動差が存在する

### 補足：なぜUnity シミュレータ上では問題なかったのか？
Editorではマウスイベントに基づくため、明示的にマウスボタンを離さない限り OnPointerUp は発行されません。一方、実機では予期せぬトリガーでイベントが飛ぶケースがあります。


## ブログでもUnityや個人開発ネタを発信中です！
開発ノウハウやアプリ制作過程、Unity連携系のハマりポイントなど
より深掘りした内容をブログにまとめています。
▶ https://syunpp.com

## 公開中のアプリ一覧はこちら！
実際にUnityで開発してリリース済みのアプリ一覧をまとめています。
▶ https://syunpp.com/公開中のアプリ一覧/
【マインクラフト（統合版）】Websocketサーバーと連携できる「フックショットガン」を作ってみました

# はじめに

「はやぶさの剣」実装時にご紹介した「瞬間移動の杖」を発展させたものですが、以下のように木の上を渡ったり崖の上に登ったりできます。

▼一人称視点
![一人称視点](https://socket-manager.github.io/document/minecraft-contents/img/hook-shot/first.gif "一人称視点")

▼三人称視点
![三人称視点](https://socket-manager.github.io/document/minecraft-contents/img/hook-shot/third.gif "三人称視点")


# 動作環境

<dl>
    <dt>プラットフォーム</dt>
    <dd>Windows10</dd>
    <dt>マインクラフト（統合版）</dt>
    <dd>Bedrock Edition v1.21.73</dd>
    <dt>socket-manager</dt>
    <dd>v1.14.2</dd>
    <dt>言語</dt>
    <dd>PHP v8.2.4（v8.1.0以降）</dd>
</dl>


# ユースケース

▼丘越え
![丘越え](https://socket-manager.github.io/document/minecraft-contents/img/hook-shot/hill.gif "丘越え")
丘をまたぐように発射すれば丘越えも可能です。

▼川越え
![川越え](https://socket-manager.github.io/document/minecraft-contents/img/hook-shot/river.gif "川越え")
対岸まで５０ブロック程度ですが、これくらいの距離であれば届きます。


# 「フックショットガン」取得

socket-manager環境のビヘイビアパック／リソースパックなどのアドオンパックを適用しておけば、以下の方法で「フックショットガン」が手に入ります。

### ・ショップで購入する場合

以下のショップで購入できます。

https://qiita.com/glasses_seven/items/e77bfb43baf55e35680b/

### ・コマンドで取得する場合

以下はワールドオーナーやシステム組み込み用としてコマンドで取得する方法です。
<img src="https://socket-manager.github.io/document/minecraft-contents/img/hook-shot/get-command.png" height="335px" width="500px" />
<img src="https://socket-manager.github.io/document/minecraft-contents/img/hook-shot/get-hook-shot.png" height="335px" width="500px" />

---

あとはsocket-managerでWebsocketサーバーを起動後、マインクラフトからの接続が完了すれば「フックショットガン」を含めた各種コンテンツが使えるようになります。

:::note info
socket-managerの導入方法やアドオンパックの所在については以下のページでご紹介していますのでご興味のある方はご覧ください。
:::

https://qiita.com/glasses_seven/items/433ac9d9fcbdb72c6d18/

:::note info
アドオンパックの適用方法については以下のページでご紹介しています。
:::

https://qiita.com/glasses_seven/items/7a174722c9030e669eac


# おわりに

今回は「発射アイテム」としてのフックショットガンを実装後、「ダミーエンティティ」を作成して「発射体エンティティ」として発射する事でイベント検知を行っています。

https://qiita.com/glasses_seven/items/ed7e18730c9c5de3295c/

https://qiita.com/glasses_seven/items/abf1aecba67284e88e27/

https://qiita.com/glasses_seven/items/6bcd386abd74db01e450/

また、「召雷の魔石」実装時と同じようにWebsocketサーバーを介したネットショップとの接続中は発動できないようにしています。

https://qiita.com/glasses_seven/items/e58ec2ceaf2850461965/
Railsプロジェクトをdocker化してみた。

## はじめに
今回は、Railsプロジェクトをdocker化してみました。
Dockerを学びたてということもあり、設定や構築の過程でさまざまな試行錯誤がありました。この記録が、同じように環境構築に挑戦する方の参考になれば幸いです。

## 🎯 目的
- Docker と Docker Compose を使って Rails アプリをコンテナ化
- PostgreSQL（バージョン12）を DB に使う
- localhost:3000 で Rails にアクセスできるようにする

### 対象アプリはこちら：こちらのアプリをdocker化したいと思います。
🔗 https://github.com/ihatov08/rails7_docker_template

## 📌 公式ドキュメントを元に試してみた
まずは公式ドキュメントを参考に以下のような Dockerfile と docker-compose.yml を作成。

Dockerfile
```
FROM ruby:2.3.3
RUN apt-get update -qq && apt-get install -y \
  build-essential \
  libpq-dev \
  nodejs
RUN mkdir /myapp
WORKDIR /myapp
COPY Gemfile Gemfile.lock ./
RUN bundle install
COPY . .

```
docker-compose.yml

```
version: "3"
services:
  db:
    image: postgres
  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"
    depends_on:
      - db

```
## 🐛 最初のつまづき：apt-getエラー
docker-compose up で次のようなエラーが発生：

:::note alert

E: Some index files failed to download. They have been ignored, or old ones used instead.
:::
→ 原因はベースイメージが古く、パッケージのインデックスが取得できなかったこと。
→ Gemfileを見たところruby "3.2.2"という表記があったのでRuby3.2.2に変更。さらにbundler を明示インストール
### Dockerfile

```
FROM ruby:3.2.2 `ここを変更`
RUN apt-get update -qq && apt-get install -y \
  build-essential \
  libpq-dev \
  nodejs
RUN mkdir /myapp
WORKDIR /myapp
COPY Gemfile Gemfile.lock ./
RUN gem install bundler:2.4.10`ここを変更`
RUN bundle install
COPY . .
```



## 🐛 localhost:3000 へのアクセスは成功、、、しかし！
ブラウザで http://localhost:3000 にアクセスはできたが、データベース接続に失敗。

![スクリーンショット 2025-05-05 11.19.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949461/76a06dcd-a519-4674-b0ae-7dbb6b0aa7a3.png)

DBの設定を何も記述していなかったことが原因！なのでDB周りの設定を記述

## ✅ 解決策：環境変数と設定を調整
### config/database.yml を修正：
```
default: &default
  adapter: postgresql
  encoding: unicode
  host: db
  username: postgres
  password: <%= ENV.fetch("DATABASE_PASSWORD") %>
  port: 5432
  pool: 5

development:
  <<: *default
  database: myapp_development

```
### docker-compose.yml も修正：
```
version: "3"

volumes: //ここを追記
  db-data:

services:
  db: //以下を追記
    image: postgres:12
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: password
    volumes:
      - "db-data:/var/lib/postgresql/data"

  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"
    depends_on:
      - db
    environment:　　　　　　//ここを追記
      DATABASE_PASSWORD: password
```
## ✅ 最終結果：正常に起動！

docker-compose build
docker-compose up
http://localhost:3000 にアクセス⇩⇩
![スクリーンショット 2025-05-05 12.17.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949461/85229f63-2a89-4b6f-a734-c1f08cf01c9a.png)


Rails の初期画面を確認 ✅
PostgreSQL にも正常に接続 ✅
【ネットワーク】SSH


# はじめに

こんにちは。アメリカに住みながら、独学でエンジニアを目指している Taira です。
現在インターネットクイズを定期的に自分に課しているのですが、その中で出てきた `ssh` についてまとめようと思います
GitHub でも ssh 接続があり、わたしも 1 つのローカルレポジトリで SSH を使用していますが仕組みまではあまり理解できていなかったので、今回を気に理解を深めようと思いました

## 1. SSH 接続とは

SSH（Secure Shell）接続とは、リモートのコンピュータ（例：サーバー）に対して、安全にログインし操作できるプロトコルです。通信内容はすべて暗号化されており、パスワードやコマンドが第三者に見られる心配がありません。

```bash
ssh username@hostname
```

上記のようなコマンドで、インターネット越しに遠隔サーバーを操作できます。

## 2. 公開鍵認証方式の仕組み

SSH 接続では「公開鍵認証方式」と呼ばれる安全な認証方法が使われます。

- **秘密鍵**：自分の PC に保存。誰にも見せない。
- **公開鍵**：サーバーに登録。誰に見られても OK。

### 認証の流れ

1. 自分の PC で鍵ペア（公開鍵・秘密鍵）を生成。
2. 公開鍵をサーバーに登録。
3. 接続時、サーバーが「この公開鍵に対応する秘密鍵を持っているか？」を確認。
4. 一致すればパスワードなしでログイン可能。

## 3. 鍵の作成方法

近年は RSA よりも Ed25519 が推奨されているようです

```bash
ssh-keygen -t ed25519 -C "your_email@example.com"
```

生成された鍵は以下に保存されます：

- 公開鍵：`~/.ssh/id_ed25519.pub`
- 秘密鍵：`~/.ssh/id_ed25519`

Windows では、以下のようにして公開鍵をコピーできます：

```powershell
clip < C:\Users\ユーザー名\.ssh\id_ed25519.pub
```

## 4. パスフレーズとは？

秘密鍵にかける追加のロック（暗号化）です。万が一秘密鍵が漏れても、パスフレーズがなければ悪用できません。
このパスフレーズは GitHub のリモートレポジトリに push をする際に入力する必要があります

## 5. SSH 接続の用途

- サーバー管理（VPS, EC2 など）
- GitHub との接続（公開鍵を登録すれば、push/pull がパスワードなしに）
- CI/CD パイプラインからのサーバー操作
- ファイル転送（`scp` や `rsync`）

## 6. HTTPS との違い（GitHub 接続）

| 接続方法 | 認証方法             | 認証の頻度               | CI/CD との相性       |
| -------- | -------------------- | ------------------------ | -------------------- |
| SSH      | 鍵（公開鍵+秘密鍵）  | 一度設定すれば不要       | △（サーバーへは OK） |
| HTTPS    | トークン（PAT など） | Credential Helper が保存 | ◎（主流）            |

GitHub Actions などでは、SSH ではなく HTTPS ＋トークンで認証するのが一般的です。
実際にこの記事投稿も、GitHub Actions の schedule の cron を用いており、レポジトリにアクセスするためには PAT(Personal Access Tokens)が必要になります。

## 7. HTTPS から SSH へ切り替える方法

既存のリポジトリでも、以下のコマンドで切り替え可能です：

```bash
git remote set-url origin git@github.com:username/repo.git
```

## まとめ

- SSH はリモート操作を安全に行うためのプロトコル。
- 公開鍵認証により、パスワードレスでのログインが可能。
- ローカル操作は HTTPS でも十分安全。
- CI/CD 用途では PAT や`GITHUB_TOKEN`の利用が主流。