OmniAICreator/Qiita-1.07M huggingface dataset:
EPSSスコアに基づくリスク区分をどうするか

# EPSSスコアに基づくリスク区分と対応基準

EPSSは公式のカテゴリ区分（例: Critical, Highなど）を提供していません。  
そのため、**各組織が保有するリソースやリスク許容度に応じて独自の閾値（cutoff）を設定する**ことが推奨されています。

> Arbitrary cutoffs force two scores, which may be separated by the tiniest of a value,  
> to be labeled and then handled differently, despite there being no practical difference between them.

これは、**スコア間の微細な差異を恣意的に区分すると判断ミスを引き起こす可能性がある**ためです。

---

## カテゴリ化（Heuristics）の実用性

EPSS側も以下のように述べており、実務上の迅速な判断のためにカテゴリ化は有用とされています。

> Heuristics are important and useful mental shortcuts that we employ every day when making decisions,  
> and can also be useful here.

---

## 基準設定の背景

EPSSの公式統計によると、以下のような傾向があります：

- **全CVEの約90%以上がEPSS Score 0.1未満に分布**
- **0.01未満に多くの脆弱性が集中し、実際に悪用される可能性は非常に低い**
- **EPSS Score 0.1以上は上位約10%の高リスク脆弱性**
- **0.05付近でスコア分布が曲がる傾向があり、注目領域となる**

---
![4b060348-997c-4607-9466-4996d87b4d54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465875/14788558-f256-4f73-b5e2-2bad9d120a6c.png)


## 提案基準（基準: EPSS Score）

| 区間           | 意味                                                                 | 推奨対応                 |
|----------------|----------------------------------------------------------------------|--------------------------|
| 0.1以上         | 上位約10%のリスクが高い脆弱性。実際に悪用される可能性が高い          | 早めに対応               |
| 0.05 ~ 0.1未満 | 中程度のリスク区域。悪用可能性は低いが注意が必要                    | 1ヶ月以内に対応         |
| 0.01 ~ 0.05未満| 低リスク区域。攻撃者が関心を持つ可能性は低い                        | 定期点検時に対応を検討   |
| 0.01未満       | 大多数の脆弱性が含まれる。悪用可能性は非常に低い                    | 無視またはモニタリングのみ|

---

## 基盤となる統計および参考資料

- [EPSS公式Percentile統計](https://www.first.org/epss/)
【ChatGPT＋4o Image Generation】で、クリーチャーを生成します。


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

　今回は、4o Image Generationで、クリーチャーを生成します。

:::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)
***
　まずは、【ニュース】です。

　えー、AIとは関係ありませんが、
　　ちょいと芸能ニュース😅

　ウルトラセブンのアンヌ隊員と
　　仮面ライダーアマゾンが
　　　結婚します。

　なんだそりゃ、なんですが
　　ひし美ゆり子さんと
　　　岡崎徹さんが
　　　　本当に、結婚です。

　ひし美ゆり子さんが
　　X-Twitterでポストされました。
　　　[ひし美ゆり子さんポスト](https://x.com/ANNEinfinity/status/1915636222485303561?t=5iSmcBUUMudQJpmezi2WwQ&s=19)

　おめでとうございます🎉🎉🎉
***
　次に

　ChatGPTに
　　軽量版DeepResearch登場。
　　　[OpenAI公式ポスト](https://x.com/OpenAI/status/1915505959931437178?t=ZDoqyREeLa9i9thJn6FJwg&s=19)

　こちらは、
　　Web版ChatGPTに出る
　　　お知らせです。
![Screenshot_20250425-090955.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/c305dc7d-23cd-43c6-9288-7adcf9426437.png)


　この軽量版は、
　　o4-miniをベースに開発されました。

　そのため、
　　回答は、通常版に比べて
　　　短くなるとか。

　なお、
　　通常版と軽量版の切り替えは
　　　通常版の制限が来次第、
　　　　軽量版に切り替わるそうです。

　通常版の制限も
　　ほぼ倍の回数になり、
　　　以下のようになります。
　　　　[サム・アルトマンポスト（04/24）](https://x.com/sama/status/1915098418504241469?t=P5oVtVxl3rh79BGoMiWsnQ&s=19)

　Free：
　　軽量版で月5回

　Plus & Team：
　　通常版で月10回
　　　 + 軽量版で追加15回

　Pro：
　　通常版で月125回
　　　 + 軽量版で追加125回

　Enterprise & Edu：
　　標準版で月10回

　なお、
　　Enterprise & Eduは
　　　来週中に開放されるそうです。
***
　次に

　4o Image Generationで
　　“ジブリ風”が流行っていますね。

　ですが、
　　**どうやらペナルティが
　　　科せられる**、との報告が
　　　　上がっています。

　２時間以上、
　　4o Image Generationが
　　　使えない状態になったそうです。
　　　　[#SOZO美術館さんポスト](https://x.com/sozo_museum/status/1915594765586059686?t=trtCZAmowYD1YE6kPBOBfQ&s=19)

　ご注意を。
***
　次に

　サムからポストが
　　ありました。
　　　[サム・アルトマンポスト](https://x.com/sama/status/1915902652703248679?t=kVt__LkfJ4RaNGBQFb-EGA&s=19)

***（ChatGPT）***
本日、GPT-4oをアップデートしました！　知能と個性の両方が向上しています。
***

　なんですと！

　実際、やってみると
　　応答速度が早く感じます。

　しかし、
　　早くなった分、
　　　余計なことを
　　　　しゃべるようになった印象が😅

　様子見します。
***
　では、【本題】です。

　今回は、
　　4o Image Generationで
　　　クリーチャーを生成します。

　クリーチャーとは何か？

　創造されたもの、被造物。

　まぁ、
　　ファンタジー世界や
　　　SF世界では、
　　　　よく出てくる存在です。

　エイリアンやプレデターが
　　その例でしょうか。

　ペガサスやユニコーンなども
　　その例ですね。
***
　前置きは、このくらいにして
　　まずは、サンプルをどうぞ。
![Screenshot_20250426-135454.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/851dd800-1bc2-4663-a18c-65394f7103b8.png)


　それぞれを生成した際の入力。

　左上：
　　水中を走る馬

　右上：
　　馬
　　険しい崖
　　腕がある
　　ベージュ
　　警戒心が強い
　　崖を登っている

　左下：
　　ライオン
　　空
　　コウモリの翼
　　色はライオン
　　獰猛
　　青空

　右下：
　　ヒヨコ
　　羽と足に水かき
　　水上
　　走るのが速い

　どうです？
　　悪くないかと思います。
***
　では、
　　大元のPromptです。

```Text:クリーチャー生成Prompt
以下の条件に基づいて、想像上のクリーチャーをリアルでファンタジックなスタイルで描写してください。

ベースとなる動物: 【ここに動物名を入れる】

移動する環境: 【陸・海・空】

特徴的なパーツ: 【翼／尾／目など】

色・模様のイメージ: 【ここに色や模様の指定】

性格・雰囲気: 【威厳がある／優雅／狂暴など】

背景の設定: 【霧の森／火山地帯／幻想的な空など】


アートスタイルは「リアルで精密なファンタジーアート」。
光の演出やディテールにもこだわって描写してください。
Promptを作成したら、描画すること
```

　クリーチャーの入力は、
　　これに縛られなくても
　　　構いません。

　ただ、
　　自身のイメージを
　　　ひとつひとつ言葉にして
　　　　ChatGPTさんに伝えてください｡

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

　今回は、ここまで。
Dockerコンテナ上のPHPで静的解析エラーをVSCode上に表示する

# はじめに

普段 WSL2 上に PHP と Composer、 PHPStan、 PHP CodeSniffer をインストールし、 VSCode の settings.json でそれらの実行ファイルを指定して静的解析エラーを表示していました。  
・・・が、 PC 入れ替えのタイミングで、 WSL2 をキレイに保ちたい ( = PHP 等ほかソフトをインストールしたくない) と思い、 Docker コンテナ上の PHP で静的解析エラーを VSCode 上に表示できないかと調査を始めました。

# 結論

以下の設定で可能。

## 1. VSCode 張機能をインストール

- PHPStan

https://marketplace.visualstudio.com/items/?itemName=SanderRonde.phpstan-vscode

- PHP Sniffer & Beautifier Docker

https://marketplace.visualstudio.com/items/?itemName=mtbdata.vscode-phpsab-docker

## 2. VSCode settings.json 設定追加

```json-doc
{
    // PHPStan の設定
    "phpstan.singleFileMode": true,
    "phpstan.binPath": "backend/vendor/bin/phpstan", // VSCode のワークスペースルートから見た実行ファイルのパス
    "phpstan.binCommand": [],
    "phpstan.configFile": "backend/phpstan.neon",
    "phpstan.paths": {
        "backend": "/src" // VSCode のワークスペースルートから見た、 Docker コンテナとマウントしているパス
    },
    "phpstan.dockerContainerName": "backend-php", // Docker コンテナ名
    "phpstan.rootDir": "",
    "phpstan.options": [],
    "phpstan.enableStatusBar": true,
    "phpstan.memoryLimit": "1G",
    "phpstan.enabled": true,
    "phpstan.projectTimeout": 300000,
    "phpstan.timeout": 300000,
    "phpstan.suppressTimeoutMessage": false,
    "phpstan.showProgress": false,
    "phpstan.showTypeOnHover": false,
    "phpstan.enableLanguageServer": false,
    "phpstan.ignoreErrors": [
        "Xdebug: .*"
    ],
    "phpstan.suppressWorkspaceMessage": false,
    "phpstan.pro": false,
    "phpstan.tmpDir": "",
    "phpstan.checkValidity": false,
    // PHP CodeSniffer の設定
    "phpsab.docker.dockerEnabled": true,
    "phpsab.docker.dockerContainer": "backend-php", // Docker コンテナ名
    "phpsab.docker.dockerWorkspaceRoot": "/src", // Docker コンテナとマウントしているパス
    "phpsab.docker.dockerExecutablePathCBF": "/src/vendor/bin/phpcbf", // Docker コンテナ内から見た実行ファイルのパス
    "phpsab.docker.dockerExecutablePathCS": "/src/vendor/bin/phpcs",
    "phpsab.docker.autoRulesetSearch": false,
    "phpsab.docker.standard": "CakePHP" // WordPress のフォーマッターで見る時は WordPress に書き換える
}
```

# 前提

- Docker コンテナ内に PHP、 Composer、 PHPStan、 PHP CodeSniffer がインストールされている。
- VSCode ワークスペースルート配下の PHP ファイルすべてに Linux 読み取り・書き込み権限がある。  
  `sudo chmod -R ogu+rw ./`
- VSCode に PHPStan、 PHP CodeSniffer の実行権限がある。  
  `sudo chmod -R 777 backend/vendor`

# 確認したリポジトリ

https://github.com/q23isline/study_cakephp5

# ※ 注意点

Docker コンテナ上で VSCode が静的解析を実行する都合上、VSCode のターミナルにて `docker compose up -d` した後に `Ctrl + Shift + p` した後、「開発者: ウィンドウの再読み込み」を選択する必要がある。

# さいごに

これで WSL2 には PHP をインストールせずとも PHP の静的解析を実行できるようになりました！  
この記事が他のエンジニアの助けになれば幸いです。
Symbol-RestのOpenAPIをTypeScriptで使ってみる


## openapi3.yml の入手

まずは `openapi3.yml` を手に入れましょう。GitHub のリリースページからダウンロードする方法と、自分でビルドする方法があります。

### ダウンロード

一番簡単なのは、GitHub のリリースページからダウンロードする方法です。

[Symbol OpenAPI リリースページ](https://github.com/symbol/symbol-openapi/releases)

https://github.com/symbol/symbol-openapi/releases

ここから `openapi3.yml` をダウンロードしてください。

### 自分でビルド

自分でビルドしたい場合は、以下の手順を実行します。

1. GitHub リポジトリをクローンします。

```bash
git clone https://github.com/symbol/symbol-openapi.git
```

1. クローンしたリポジトリのディレクトリに移動し、依存パッケージをインストールします。

```bash
cd symbol-openapi
npm i
```

1. ビルドを実行します。成功すると、`_build` ディレクトリ内に `openapi3.yml` が生成されます。

```bash
npm run build
```

## プロジェクトで使う

openapi ディレクトリを作成して、ダウンロードまたはビルドした openapi3.yml を中に格納します。

```plaintext
my-project/
├── openapi/
│   └── openapi3.yml       ← ここに置く
├── src/
│   └── ...
```

次に `openapi-typescript-codegen` をインストールします。また、HTTP クライアントに `axios` を使用したいので、併せてインストールします。

```bash
npm i -D openapi-typescript-codegen
npm i axios
```

以下のコマンドで OpenAPI コードを生成します。

```bash
npx openapi-typescript-codegen -i ./openapi/openapi3.yml -o ./src/generated-api --useOptions -c axios
```

これにより、`src/generated-api` ディレクトリ内に API クライアントコードが生成されます。
あとは、これを自分のコードから呼び出して使うだけです。

**使用例**
生成したコードを使って、実際に API を呼び出してみます。
以下は `/node/info` エンドポイントを取得する例です。

```typescript
import { NodeRoutesService, OpenAPI } from "./generated-api";

OpenAPI.BASE = "https://t.sakia.harvestasya.com:3001";

NodeRoutesService.getNodeInfo()
  .then((nodeInfo) => {
    console.log("Node Info:", nodeInfo);
  })
  .catch((error) => {
    console.error("Error fetching node info:", error);
  });
```
Windows×DockerでROS2を使う

## はじめに

本記事では、**Windows11 環境**で **Docker** を使って ROS2 の最新バージョン「**Jazzy**」を動かす手順を解説します。GUIを使った turtlesim のチュートリアルも動作確認済みです。

## 記事の対象者

* ROS2ってLinuxでしか動かないんじゃないの？っていう人
* WindowsにDockerを入れたけどGUI表示の仕方がわからない人


## 1. 前提条件

以下の環境が準備されている必要があります：

- Windows 10/11
- Docker Desktop インストール済
- WSL2 有効化済


## 2. X Server の準備（VcXsrv）

Windows 上で GUI アプリケーションを表示するために、X Server を起動します。

### VcXsrvのダウンロード  
以下のリンクからVcXsrvをダウンロードできます。

https://sourceforge.net/projects/vcxsrv/

### VcXsrv の設定手順

1. スタートメニューから「**XLaunch**」を起動
2. `Display settings` → **Multiple windows** を選択し「Next」
3. `Client startup` → **Start no client** を選択し「Next」
4. `Extra settings` → **Disable access control** にチェックを入れて「Next」
5. 最後に「Finish」で起動

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3633766/6220d8fe-3e7c-4e93-8834-1fd584529bb5.png)

X Server はバックグラウンドで動作します。エラーが出なければ準備完了です。

## 3. Docker コンテナの起動

### 【操作する場所】  
**PowerShell または Windows ターミナル**

以下のコマンドで `ROS2 Jazzy` 環境を持つ Docker コンテナを起動します：

```bash
docker run -d --rm \
  --name ros_jazzy \
  -e DISPLAY=host.docker.internal:0.0 \
  osrf/ros:jazzy-desktop \
  sleep infinity
```

> sleep infinity を指定することで、コンテナが即終了せず常駐します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3633766/8952f4ed-e995-4aeb-9d20-5c27692866d3.png)


## 4. コンテナ内で turtlesim を実行する

**ここからは複数のターミナルを使用します。**

### GUI ノードを起動

まずはコンテナに入ります：

```bash
docker exec -it ros_jazzy bash
```

次にROS2環境を有効化：

```bash
source /opt/ros/jazzy/setup.bash
```

turtlesim の GUI ノードを起動：


```bash
ros2 run turtlesim turtlesim_node
```



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3633766/da09dbcb-bebb-4cb1-bb9d-42c15fe20c43.png)


亀が起動

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3633766/87647805-83ee-403c-811c-b8a533a425bc.png)


### キー入力の受付

GUIノードとは異なるターミナルを立ち上げ以下のコマンドで再度コンテナに入ります：

```bash
docker exec -it ros_jazzy bash
```

同様にセットアップして、キーボード操作用ノードを起動：

```bash
source /opt/ros/jazzy/setup.bash
ros2 run turtlesim turtle_teleop_key
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3633766/ffa0679f-12ac-446f-b44d-3429d6f8fbc2.png)


ターミナル上で矢印キーを押すと、turtlesim のウィンドウでカメが動きます！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3633766/b82aee89-f2cd-410a-8678-15052b27d863.png)


## 5. トラブルシューティング

### カメが表示されるが動かない

対象のターミナルをクリックしてから矢印キーを押さないと入力が反映されません。

### GUI が表示されない

* VcXsrv が起動しているか確認
* Windows ファイアウォールのアクセス許可を確認

## おまけ

カメの初期位置を変更したい

turtlesim_node 起動後に別ターミナルで以下を実行：

```bash
ros2 service call /kill turtlesim/srv/Kill "{name: 'turtle1'}"
ros2 service call /spawn turtlesim/srv/Spawn "{x: 2.0, y: 8.0, theta: 1.57, name: 'turtle1'}"
```

## まとめ

* Docker + Windows でも ROS2 Jazzy の GUI アプリが動作可能
* VcXsrv を使えば turtlesim もスムーズに操作可能
* docker exec を活用して複数ターミナルを使おう

ここまででWindows*Dockerでturtlesimを利用することでできました。

あとは公式ドキュメントを参考にチュートリアルを進めてください。

https://docs.ros.org/en/jazzy/Tutorials/Beginner-CLI-Tools/Introducing-Turtlesim/Introducing-Turtlesim.html
Raspberry Pi Picoを工場出荷時状態に戻す方法

Raspberry Pi Picoが何らかの原因で正しく動作しないといったような場合、工場出荷時状態に戻す必要があります。

以下は[PicoMiteのユーザマニュアル](https://geoffg.net/Downloads/picomite/PicoMite_User_Manual.pdf)と[How to Reset Raspberry Pi Pico – 4 Easy Ways](https://electrocredible.com/how-to-reset-raspberry-pi-pico-w/?utm_source=chatgpt.com)に記載されている方法をまとめたものです。

なお、Raspberry Piの[公式サイトの文書](https://www.raspberrypi.com/documentation/microcontrollers/pico-series.html#software-utilities)にも工場出荷時状態に戻す方法が記されている。

# 作業手順

その手順は次の通りです。

1. 工場出荷時に戻すためのファームウェアを以下のいずれかからダウンロードする。
	- Geoff’s Projectsが提供する[Raspberry Pi Pico (RP2040) 用のファイル](https://geoffg.net/Downloads/picomite/Clear_Flash.uf2)
	- Geoff’s Projectsが提供する[Raspberry Pi Pico 2 (RP2350)用のファイル](https://geoffg.net/Downloads/picomite/Clear_Flash_RP2350.uf2)
	- 公式サイトが提供している[UF2ファイル](https://datasheets.raspberrypi.com/soft/flash_nuke.uf2).
2. Raspberry Pi Picoの`BOOTSEL`ボタンを押したままでUSBケーブルをコンピュータに接続する。
3. ダウンロードした工場出荷時状態の戻すファームウェアをコンピュータにマウントされたRaspberry Pi Picoのドライブにドラッグ＆ドロップする。
4. Raspberry Pi Picoが自動的に再起動し、工場出荷時状態に戻る。
WSL コマンド一覧【備忘録】

# コマンド詳細
・学習ごとに内容を随時更新する。
・基本的なコマンドを記載。

## 既定のディストリビューションを確認
```bash:
$ wsl --status
```

## インストール可能なディストリビューションの一覧を表示
```bash:
$ wsl --list --online
```

## ディストリビューションを指定してインストール
```bash:
$ wsl --install -d {ディストリビューション名}
```

## インストール可能なディストリビューションの一覧を表示
```bash:
$ wsl --list --online
```

## インストール済みのディストリビューションの一覧を表示
```bash:
$ wsl --list --verbose
$ wsl -l -v
# ディストリビューション名とバージョン情報が表示される
```

## 既定のディストリビューションを設定
```bash:
$ wsl --set-default {ディストリビューション名}
$ wsl -s {ディストリビューション名}
# ディストリビューション名とバージョン情報が表示される
```

## wslのバージョンを表示
```bash:
$ wsl --version
```

## wslのアップデート
```bash:
$ wsl --update
```

## wslの起動
```bash:
$ wsl
# 既定のディストリビューションが起動
```

## 指定したディストリビューションを起動
```bash：
$ wsl -d {ディストリビューション名}

# 例
$ wsl -d Ubuntu
```

## WSL全体を終了する
```bash:
$ wsl --shutdown
```


[ ディストリビューション ]
IT関連の場合、ディストリビューションはLinuxディストリビューションの省略表現であり、
OSとしてのLinuxまたは、その配布形態のこと。

※ 厳密には、LinuxはOSの名前ではなく、カーネル（OSの中核部分のソフトウェア）のことである。

<参考サイト>
https://wa3.i-3-i.info/word12473.html
https://wa3.i-3-i.info/word12472.html
Linux関連 メモまとめ【備忘録】

# 概要
・参考になるものがあまりなく苦労したことをメモ書きでまとめる。

## LinuxとWindowsの共有フォルダをマウント
```:
# Linux側のコマンドプロンプトにて実行
$ mount -t cifs -o username={ユーザー名(windows側)},password={パスワード} //{IPアドレス(windows側)}/{ディレクトリ} {ディレクトリ(Linux側)}
```

上記のコマンドにて、マウントした。
実行にあたってSambaなどの導入などを行った。
その際にさせていただいたサイトは以下である。

<参考サイト>
https://qiita.com/hirohirox/items/7ac02c55b6a96611db64
https://qiita.com/Yoh_Yasushi/items/8e35473bf7adab480d83
https://users.miraclelinux.com/support/?q=node/397

---
## SELinuxの無効化
SELinuxが有効の場合、batファイル、シェルスクリプト、サービスなどが
うまく実行できないことが起きたため、無効化することで解決した。

### 状態確認方法
```:
$ getenforce
Enforcing
```
<状態一覧>
・enforcing  … SELinux = 有効、アクセス制限 = 有効
・permissive … SELinux = 有効、アクセス制限 = 無効、警告のみ出力
・disabled   … SELinux = 無効

### 一時的に無効化
```:
$ setenforce 0
# 【結果】Permissive となる。

$ setenforce 1
# 【結果】Enforcing となる。
```

### 永続的に無効化
```:
$ vi /etc/selinux/config
# 「SELINUX=enforcing」と、設定ファイルを書き換える
```

### サーバ再起動
変更後、再起動しなければ反映されない。
```:
$ reboot
```

---
## Linuxのファイアウォール設定
```:
# サービスの起動
$ systemctl start firewalld
# サービスの停止
$ systemctl stop firewalld
# 解放しているポートの確認
$ firewalld-cmd --list-all
```

---
## ポートフォワーディングの設定（コマンドプロンプト）
※（注意）Linux のコマンドではなく、Windowsのコマンドである。

```:
# ポートフォワーディングを設定
$ netsh interface portproxy add v4tov4 listenport={転送元(ホストOS)ポート} listenaddress={転送元のIPアドレス} connectport={転送先ポート} connectaddress={転送先のIPアドレス} 

# ポートフォワーディングしているものを表示
$ netsh interface portproxy show all

# ポートフォワーディングを設定
$ netsh interface portproxy delete v4tov4 listenport={転送元(ホストOS)ポート} listenaddress={転送元のIPアドレス}
```
---
# 備考
Linux コマンド一覧①
https://qiita.com/skull-eve/items/56661fa8ae5ac31185b2
Linux コマンド一覧②
https://qiita.com/skull-eve/items/7ea5773ca2fdddeafad9
エルボー法とシルエットスコア


# この記事は
本記事では、K-Meansクラスタリングにおける適切なクラスタ数 $K$ の決定手法として、
**エルボー法** と **シルエットスコア** を解説し、
Pythonによる実装例と具体的な解釈までをひととおり紹介します。

# 概要
- クラスタリングの結果は「何個に分けるか」に大きく依存する
- エルボー法：クラスタ内誤差（Inertia）の減少幅に注目して"肘"を探す
- シルエットスコア：クラスター内の一体感と外との分離度を定量化する
- 両者を組み合わせることで、より安定したクラスタ数の判断が可能
---
## エルボー法とは
1. **Inertia（慣性／クラスタ内誤差）** を各 $K$ で計算
$$
\text{Inertia} = \sum_{i=1}^{n} \min_{j=1..K} \|x_i - \mu_j\|^2
$$
2. $K$ を増やすほど必ず下がるが、減少幅は次第に小さくなる
3. グラフ上で「急激に減ったあと平坦になる箇所＝肘（Elbow）」を最適 $K$ の候補とする
4. メリット：直感的、計算も軽量　／　デメリット：明確に折れ曲がりが見えない場合もある
---
## シルエットスコアとは
1. 各サンプル $i$ に対して
    - $a(i)$：同じクラスタ内の他点との平均距離
    - $b(i)$：最も近い異クラスタとの平均距離
    - シルエット係数
    $$
    s(i) = \frac{b(i) - a(i)}{\max(a(i),\,b(i))}
    $$
2. **平均シルエットスコア**（全サンプルの $s(i)$ の平均）を算出
3. $-1$～$+1$ の範囲で、+1 に近いほど "よく分かれている"
4. メリット：クラスタの質を定量評価できる　／　デメリット：計算量がやや多い
---
## Pythonでの実装例
```python
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
import matplotlib.pyplot as plt
# --- データの前処理 ---
X_scaled = ...  # 標準化済み特徴量行列
# --- 評価指標の計算 ---
inertia = []
silhouette_scores = []
K_range = range(2, 11)
for k in K_range:
    km = KMeans(n_clusters=k, random_state=42, n_init=10)
    km.fit(X_scaled)
    inertia.append(km.inertia_)
    silhouette_scores.append(silhouette_score(X_scaled, km.labels_))
# --- 結果のプロット ---
plt.figure(figsize=(12,5))
plt.subplot(1,2,1)
plt.plot(K_range, inertia, marker='o')
plt.title('Elbow Method for Optimal K')
plt.xlabel('Number of Clusters (K)')
plt.ylabel('Inertia')
plt.grid(True)
plt.subplot(1,2,2)
plt.plot(K_range, silhouette_scores, marker='o')
plt.title('Silhouette Score for Optimal K')
plt.xlabel('Number of Clusters (K)')
plt.ylabel('Silhouette Score')
plt.grid(True)
plt.tight_layout()
plt.show()
```
### 具体例での解釈
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3937496/1f8054f1-0c87-4032-9a95-8f016a160dfe.png)
- **エルボー法**：
    - $K=2 \to 3 \to 4$ の減少が大きく、以降は緩やか
    - "肘" と見なせるのは **$K=4$**
- **シルエットスコア**：
    - 平均スコアのピークが **$K=4$（約0.43）**
    - $K>4$ ではスコアが下がり、クラスタ分離度が低下
- **結論**：
    
    両者とも **$K=4$** がもっともバランス良く、過剰分割のリスクも抑えられる最適解
    
---
# まとめ
- K-Means のクラスタ数選定には、**エルボー法** と **シルエットスコア** の併用が有効
- エルボー法でざっくり"肘"のあたりを絞り、シルエットスコアで最適値を確かめる流れ
- Python／scikit-learn なら数行のコードで実装可能
- 実務では結果の「解釈しやすさ」や「ドメイン知見」も組み合わせて最終判断しましょう
Linux コマンド一覧②【備忘録】

# コマンド詳細
・学習ごとに内容を随時更新する。
・オプションは一部のみ記載

## cat：ファイルの内容を表示
```:書式
$ cat [オプション] {ファイル名}
```
```zsh:/home/testUser1
$ cat testFile1.txt
a1
b2

c3
```
### オプション
```shell:/home/testUser1
# -n：行番号をつけて表示
$ cat -n testFile1.txt
	1 a1
	2 b2
	3
	4 c3

## -b：空白行を含まず行番号を表示
$ cat -b testFile1.txt
	1 a1
	2 b2
	
	3 c3
```

---
## vi：テキストエディタを起動
```:書式
$ vi [オプション] {ファイル名}
```
※存在しないファイルを指定した場合、ファイルが新規作成される。

```shell:/home/testUser1
$ vi testFile1.txt
```

### viエディタ コマンド一覧(一部のみ)
| コマンド				| 説明					|
|-----------------------|-----------------------|
| i 				| インサートモード(編集状態)に切替 |
| Esc 				| コマンドモードに切替 |
| q!				| 変更内容を保存せず強制終了 |
| :wq				| 上書き保存して終了 |
| a 				| カーソル位置から入力開始 |
| x 				| カーソル位置の文字を削除 |
| G 				| カーソル位置を最終行に移動 |

<参考>
https://qiita.com/pe-ta/items/0510bee10bcfd88afeee

### オプション
```shell:/home/testUser1
# -R：読み込み専用で起動
$ vi -R testFile1.txt
# [ $ view { ファイル名 } ] でも読み込み専用で起動可能。

```

---
## chmod：パーミッションの変更
```:書式
$ chmod [オプション] {権限設定(パーミッション)} {ファイル名orディレクトリ名}
```
```shell:/home/testUser1
$ chmod 777 testFile1.txt
# パーミッションが「-rwxrwxrwx」となる。
```

### [解説]パーミッション
```shell:/home/testUser1
$ ls -l
drwxr-xr-x 1 testUser1 testUser1 4096 Feb 20 12:00 testFolder1
lrwxr-xr-x 1 testUser1 testUser1 4096 Feb 20 12:10 testFolder1_link -> testFolder1
-rwxr-xr-x 1 testUser1 testUser1   11 Feb 20 12:20 testFile
```

#### パーミッションの見方
パーミッションは以下の10文字で構成される。

| ファイルの属性 | 所有者の権限 | 所有者と同グループの権限 | 第三者の権限 |
|--------------|--------------|--------------|--------------|
| 1文字 | 3文字 | 3文字 | 3文字 |

#### 権限の基本種類
| 読み込み権限 | 書き込み権限 | 実行権限 |
|:--:|:--:|:--:|
| r | w | x | 

※これらの他に特殊な権限も存在する。

#### **権限の対応表**
|数字|権限|説明|
|:--:|:--:|:--|
|0|	---|権限なし|
|1|	--x|実行のみ可|
|2|	-w-|書込のみ可|
|3|	-wx|書込・実行のみ可
|4|	r--|読込のみ可|
|5|	r-x|読込・実行のみ可|
|6|	rw-|読込・書込のみ可|
|7|	rwx|読込・書込・実行が可|

### オプション
```shell:/home/testUser1
# -v：コマンド実行時に詳細を表示
$ chmod -v 666 testFile1.txt
`testFile1.txt' のモードを 0777 (rwxrwxrwx) から 0666 (rw-rw-rw-) へ変更しました

# -c：コマンド実行時に変更があれば詳細を表示
$ chmod -c 666 testFile1.txt
`testFile1.txt' のモードを 0777 (rwxrwxrwx) から 0666 (rw-rw-rw-) へ変更しました
```

<参考>
https://www.miraiserver.ne.jp/column/about_permission/

---
## less：フォルダやファイルの中身を表示
```:書式
$ less [オプション] {フォルダ名orファイル名}
```
```zsh:/home/testUser1
$ less testFile1.txt
```
### オプション
```shell:/home/testUser1
# -N：行番号をつけて表示
$ less -N testFile1.txt

## --version：バージョンを表示
$ less --version testFile1.txt
```

---
## su：フォルダやファイルの中身を表示
```:書式
$ su [オプション] {ユーザー名}
```
```zsh:/home/testUser1
# スーパーユーザーに切り替える
$ su
# 指定したユーザーに切り替える
$ su testUser2
```
### オプション
```shell:/home/testUser1
# -：環境変数を引き継がずに他のユーザーに切り替える
$ su -
# 【結果】環境変数を引き継がずにスーパーユーザーに切り替える
```

---
## ps：OS内部で実行中のプロセスを一覧で表示
```:書式
$ su [オプション]
```
```zsh:/home/testUser1
# 実行中プロセスを一覧で表示
$ ps
```

### オプション
```shell:/home/testUser1
# a： 端末操作のプロセスを表示
$ ps a

# u：CPUやメモリの使用率なども表示
$ ps u

# x：端末操作以外のプロセスを表示
$ ps x

# 組み合わせ
$ ps aux
# 【結果】端末操作内外すべての、CPUやメモリの使用率を付与した、プロセスを表示する。
```

<参考サイト>
https://qiita.com/toshiokun/items/86e8e69ab410ebf40259




# 備考
Linux コマンド一覧①
https://qiita.com/skull-eve/items/56661fa8ae5ac31185b2
個人的備忘録：Next.js × TypeScript × Tailwindで始めるアクセシビリティ設計をまとめてみた

## はじめに

本記事では、Next.js、TypeScript、Tailwind CSSを組み合わせたフロントエンド開発において、アクセシビリティ（A11y）に配慮した設計方法についてまとめます。

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

誰もが使いやすいUI/UXを目指す上で、基本的な考え方と具体的な実装ポイントを整理しました。

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

現在、Next.jsとTypeScript、Tailwind CSSを技術スタックとして採用しているプロジェクトにおいて、画面のUI/UXをアクセシビリティを意識した設計にしたいと考えました。

基本に立ち返り、開発初期から正しい知識をもとに設計するため、自身の整理も兼ねて記事にまとめました。

## Next.js × TypeScript × Tailwindでやるべきアクセシビリティ設計

### 1. セマンティックなHTMLをしっかり使う
- `div`の乱用を適切に避ける
- 例えば、ボタンには正しく`<button>`タグを使う
- セクションごとに`<main>`, `<header>`, `<section>`, `<article>`, `<footer>`などを適切に利用する

---

### 2. Tailwindでフォーカススタイルをしっかりつける
- `focus:outline-none`だけだと、「どこにフォーカスしているか」分からないリスクがある
- 例:

```tsx
<button className="focus:outline-none focus:ring-2 focus:ring-blue-500">
  送信
</button>
```

---

### 3. 色だけに依存しない設計
- Tailwindにはテキストスタイルのクラスも豊富
- 例:エラーメッセージは赤色マーク（色）、アイコン（ビジュアル）、文字の組み合わせで伝える

```tsx
<div className="flex items-center text-red-600">
  <svg className="w-5 h-5 mr-2" aria-hidden="true">...</svg>
  <span>入力に誤りがあります</span>
</div>
```

---

### 4. スクリーンリーダー対応
- 隠したい情報にTailwindの`sr-only`クラスを使う

```tsx
<span className="sr-only">ログインボタン</span>
```
- これで「画面には見えないけどスクリーンリーダーには読まれる」状態を作れる

---

### 5. 自動モーション制御
- Tailwindでは`motion-safe:`や`motion-reduce:`を使って簡単にアニメーション制御が可能

```tsx
<div className="transition motion-reduce:transition-none">
  ここにアニメーション
</div>
```

---

## まとめ：この技術スタックで意識すべきこと

| 項目 | ポイント |
|:---|:---|
| HTML設計 | セマンティックなタグを使う |
| キーボード対応 | フォーカス可能＋フォーカススタイルを設ける |
| カラーコントラスト | 明確に見やすい色を選ぶ（Tailwindのカラー設定を調整してもOK） |
| スクリーンリーダー対応 | `aria`属性、`sr-only`クラスを適切に使う |
| モーション制御 | `motion-reduce`で優しい動きに |

---

これらの基本を押さえることで、より多くの人にとって使いやすいWebサイト・アプリケーションを作るとできます

今後もアクセシビリティの向上を意識しながら、開発を進めていきます...！
猿でもわかるAIの倫理・リスクシリーズ 🐵⚠️[第5回] 著作権問題！生成AIが作った作品は誰のもの？



### 1. はじめに：コードも画像も「誰のもの」？

Stable DiffusionやChatGPTのような生成AIが普及する中で、企業や開発者が本格的に向き合うべき問題が浮かび上がっています。それが、**生成物の著作権問題**です。

「AIが書いたコードを使ってもいいの？」「クライアントに納品する画像がAI生成だったら？」――そんな疑問は、今や現場で日常的に聞かれるようになりました。

本記事では、エンジニアとして知っておくべき法的・実務的なポイントを解説しつつ、トラブルを避けるための実装・運用Tipsも紹介します。

---

### 2. 技術者向け：生成AIと著作権の基礎

#### ✅ 著作権とは？（簡単な整理）
- **著作権**：人間が創作した表現物に与えられる権利
- **保護対象外**：データ、アイデア、事実のみでは不可

#### ❗ AIによる生成物の著作権は？
| ケース | 著作権の帰属 | 注意点 |
|--------|----------------|---------|
| AIが完全に自動生成 | 原則、著作権なし（日本法） | 米国など国ごとに違いあり |
| 人がプロンプトなどで創作性を持って生成 | 人に著作権が発生する可能性あり | 創作性の立証が必要 |
| 他人の著作物を学習したAIが生成 | 著作権侵害のリスクあり | 学習データの透明性が重要 |

#### 🔍 参考事例
- **GitHub Copilot事件**：オープンソースライセンス違反の疑いで集団訴訟（2023年）
- **Getty Images vs Stability AI**：トレーニングデータに無断使用があったとして訴訟中

---

### 3. 実務での対処法：プロンプト設計＋チェック＋ライセンス対応

ここからは、実際のプロダクトやPoCで活用する際のTipsをコードやワークフローと共に紹介します。

#### 🧪 例：生成画像を業務利用する場合
```python
from diffusers import StableDiffusionPipeline
import torch

pipe = StableDiffusionPipeline.from_pretrained(
    "runwayml/stable-diffusion-v1-5",
    safety_checker=None
).to("cuda")

prompt = "an illustration of a robot holding a copyright document, digital art"
image = pipe(prompt, guidance_scale=7.5).images[0]
image.save("copyright_ai_sample.png")
```

📌 **ポイント**：
- `safety_checker`やNSFWフィルターが必要な場合は明示的に有効化
- プロンプト履歴を記録（創作性の証拠）

#### 🛠️ 業務フロー導入イメージ
1. プロンプトと生成物をDBで管理（誰が、いつ、何を生成したか）
2. 検出ツールで既存画像・文章との類似性チェック（例：Hive, CopyLeaks）
3. ライセンス明示された生成AIの利用（例：Adobe Firefly）

---

### 4. よくある落とし穴と対策

| 誤解 | リスク | 対策 |
|------|--------|------|
| 「商用利用OK」モデルを使えば安心 | 実はトレーニングデータ由来で問題が残る | 利用規約と学習元データを確認 |
| プロンプトで改変すれば著作権は自分のもの | 二次創作として扱われる可能性あり | オリジナル性を持たせる工夫を |
| GitHub Copilotから出力されたコードをそのまま使う | OSSライセンス違反の可能性 | 自動ライセンスチェックの導入 |

---

### 5. 応用編：組織での生成AI活用ガイドライン作成

社内PoCや製品レベルで生成AIを扱う際、以下の観点で**ガイドライン**の整備が不可欠です。

#### 📋 チェック項目例：
- [ ] 使用する生成AIのモデル名とライセンス確認
- [ ] プロンプトと出力物を全て記録
- [ ] 商用利用前に社内レビューを必須化
- [ ] ツール類（CLIP, DetectGPTなど）での類似度検証
- [ ] 外部提供物には「AI生成を含む」旨の明記

📎 参考リンク：
- [OpenAI使用ポリシー](https://openai.com/policies/usage-policies)
- [日本著作権情報センター（CRIC）](https://www.cric.or.jp/)

---

### 6. まとめ：生成AIは「グレー」だからこそ管理が命

#### ✅ メリット
- 爆速での制作・開発
- アイデア生成やドラフトに最適

#### ⚠️ リスク
- 著作権侵害による訴訟・信頼喪失
- ガバナンス不在による内部トラブル

#### 🔮 展望
- 世界各国で著作権法の再整備が進行中（例：EU AI Act）
- モデル設計段階での法令対応（"lawful by design"）が重要に

---

生成AIは私たちエンジニアにとって革新の源であると同時に、**法的リスクという新たな責任**も背負っています。

だからこそ「とりあえず使う」から「仕組みとして安全に使える」に進化させるフェーズに、今まさに来ているのではないでしょうか？
【Go】簡単なJWTの生成と検証のサンプルコード


## 概要

- [github.com/golang-jwt/jwt/v5](http://github.com/golang-jwt/jwt/v5)を使用して簡単なJWTの生成と検証のサンプルコード

## サンプルコード


```go
package main

import (
	"fmt"
	"time"

	"github.com/golang-jwt/jwt/v5"
)

// カスタムクレームを定義
type CustomClaims struct {
	UserID string `json:"user_id"`
	jwt.RegisteredClaims
}

// トークンを生成する関数
func generateToken(secretKey []byte, userID string) (string, error) {
	// クレームの作成
	claims := CustomClaims{
		UserID: userID,
		RegisteredClaims: jwt.RegisteredClaims{
			ExpiresAt: jwt.NewNumericDate(time.Now().Add(24 * time.Hour)), // 24時間後に期限切れ
			IssuedAt:  jwt.NewNumericDate(time.Now()),
			NotBefore: jwt.NewNumericDate(time.Now()),
			Issuer:    "jwt-demo",
		},
	}

	// JWTトークンの生成
	token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)

	// トークンに署名を付与
	return token.SignedString(secretKey)
}

// トークンを検証する関数
func verifyToken(tokenString string, secretKey []byte) (*CustomClaims, error) {
	// トークンの検証
	parsedToken, err := jwt.ParseWithClaims(tokenString, &CustomClaims{}, func(token *jwt.Token) (interface{}, error) {
		return secretKey, nil
	})

	if err != nil {
		return nil, fmt.Errorf("トークンの検証に失敗しました: %v", err)
	}

	if claims, ok := parsedToken.Claims.(*CustomClaims); ok && parsedToken.Valid {
		return claims, nil
	}

	return nil, fmt.Errorf("トークンが無効です")
}

func main() {
	// シークレットキー
	secretKey := []byte("test-secret-key")
	userID := "12345"

	// トークンの生成
	tokenString, err := generateToken(secretKey, userID)
	if err != nil {
		fmt.Printf("トークンの生成に失敗しました: %v\n", err)
		return
	}

	fmt.Printf("生成されたJWTトークン: %s\n", tokenString)

	// トークンの検証
	claims, err := verifyToken(tokenString, secretKey)
	if err != nil {
		fmt.Println(err)
		return
	}

	fmt.Printf("トークンの検証に成功しました。UserID: %s\n", claims.UserID)
}
// 出力
// 生成されたJWTトークン: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoiMTIzNDUiLCJpc3MiOiJqd3QtZGVtbyIsImV4cCI6MTc0NTcyMjcyOSwibmJmIjoxNzQ1NjM2MzI5LCJpYXQiOjE3NDU2MzYzMjl9.-o9w7wVug-ZpEU5ZZoQ3KYZuSXzmfk2qfGddUuW0NiQ
// トークンの検証に成功しました。UserID: 12345
```
猿でもわかるAIの倫理・リスクシリーズ 🐵⚠️[第4回] AIが仕事を奪う未来は来るのか？



## 1. 🧭 はじめに：なぜ「AIが仕事を奪う」が話題なのか？

近年、ChatGPTやGitHub Copilotなどの生成系AIが急速に普及し、「プログラマーの仕事がなくなるのでは？」という懸念の声が高まっています。特に、以下のようなトレンドが影響しています：

- AIによるコード生成（Code Generation）の進化
- RPAによる事務作業の自動化
- AIチャットボットによるカスタマーサポート代替

しかし「奪われる」とは本当にゼロサムな話なのか？

---

## 2. 🔍 概要：AIと自動化が与える影響の構造

AIが仕事を奪うかどうかは「仕事の構造」に大きく依存します。以下のように分類できます：

| 種類 | 内容 | AIによる代替の可能性 |
|------|------|------------------|
| ルーチン作業 | 定型的で繰り返しの多い業務 | ✅ 高い |
| 認知作業 | 判断・分析が必要な業務 | 🔄 部分的 |
| 創造的作業 | 発想・感性が求められる業務 | ❌ 低い |

特に危険視されるのは **ホワイトカラー業務のRPA化** や **ノーコードツールの浸透** によって、これまで人手が必要だった事務処理や管理系業務が大幅に縮小する可能性です。

---

## 3. ⚙️ 実装例：LangChain × OpenAI API を使った「業務自動化Bot」

例えば、経理部門の請求書処理を自動化する簡単なワークフローBotを構築してみましょう。

### 構成：
- 入力：メール経由で届いたPDF請求書
- 処理：OCR + GPTで内容要約 & データ抽出
- 出力：スプレッドシートに記録 + Slack通知

```python
# Step1: OCR処理（pytesseract）
import pytesseract
from PIL import Image

def extract_text_from_invoice(image_path):
    img = Image.open(image_path)
    text = pytesseract.image_to_string(img)
    return text

# Step2: GPT要約と構造化（OpenAI API）
import openai

openai.api_key = "your-api-key"

def summarize_invoice(text):
    prompt = f"""
    次の請求書テキストを読み取り、請求日、会社名、金額をJSONで出力してください。
    テキスト:
    {text}
    """
    response = openai.ChatCompletion.create(
        model="gpt-4",
        messages=[{"role": "user", "content": prompt}]
    )
    return response.choices[0].message['content']
```

> 💡 実装後は Google Sheets API や Slack API と組み合わせて社内ツールとして展開可能！

---

## 4. 🛠️ 現場Tips：よくある落とし穴と回避策

- **誤解1：AIは万能で人間不要になる** → 実際は人間のレビューや例外処理が必要なケースが多い
- **誤解2：1つのAIモデルですべて解決できる** → 実務では複数モデル・APIの組み合わせが重要
- **誤解3：導入すれば即効でコスト削減できる** → 運用や保守のコストも見積もる必要あり

実装段階でのキーポイントは「タスクの粒度を見極める」ことです。大きすぎる単位で自動化を試みると失敗します。

---

## 5. 🚀 応用・未来：AI時代のキャリア戦略

もしAIが仕事を一部奪うなら、我々はどこに価値を見出すべきでしょうか？

### 🔑 方向性：
- **AIを使いこなす側** になる（プロンプト設計、AI Ops）
- **AIを導入できる人材**（PoC構築、データ設計、UX理解）
- **AIにできない領域へシフト**（対人スキル、戦略設計、創造的思考）

> 🌱 ChatGPT時代における「人間の強み」を再定義する時代が来ています。

---

## 6. 🧾 まとめ：AIは仕事を奪うのではなく“再構築”する

| ✅ メリット | ⚠️ デメリット |
|-------------|----------------|
| 作業効率の向上 | 雇用構造の変化 |
| ミスの削減 | スキル格差の拡大 |
| ルーチン脱却 | 導入コスト・教育工数 |

AIは単に「代替者」ではなく、私たちの仕事を **再構築し、新たな価値に集中できるようにするパートナー** です。

未来を恐れるのではなく、準備することが重要です。この記事がその一歩となれば幸いです。


---
AtCoder Beginner Contest 402 D - Line Crossing

# [AtCoder Beginner Contest 402 D - Line Crossing](https://atcoder.jp/contests/abc402/tasks/abc402_d)
問題文は👆を確認してください

# 導入
atcoderで精進してますが、  
どこかにアウトプットしたかったので、qiitaに書くことにしました。  
ACしてから載せるようにしてますが、考え方が至っていない点があればご指摘頂けると幸いです。  
また、誰かの参考になると嬉しいです。

# 使用しているアルゴリズム
- 数学的アルゴリズム

# 解法のポイント
ここでは、まず全ての直線ペアが交わると仮定して得られる最大交点数を `M*(M-1)//2` で計算します。  
次に、平行な直線同士は交わらないため、同じグループに属する直線数 `i` 本に対して生じる交わらないペア数 `i*(i-1)//2` を差し引きます。  
平行グループのキーとして `(a + b) % N` を使うと、「同じ余りに属する直線」がすべて平行になることが数学的に示せるので、これを `defaultdict(int)` でカウントします。  
最終的に、全組合せからグループごとの組合せを引いた値が答えになります。

# ACサンプル
```python
from collections import defaultdict

N, M = map(int, input().split())

G = defaultdict(int)
for _ in range(M):
    a, b = map(int, input().split())
    cat = (a + b) % N
    G[cat] += 1

# 総交点数
r = M * (M - 1) // 2
# 平行な直線同士の交点数を差し引く
for i in G.values():
    if i >= 2:
        r -= i * (i - 1) // 2

print(r)
```

# リンク
[ACサンプル集(アルゴリズム逆引き)](https://www.notion.so/motonao/1cc8aca4381b80f39713ddb52fa85e8f?v=1cc8aca4381b80519654000c236bb8d6&pvs=4)
猿でもわかるAIの倫理・リスクシリーズ 🐵⚠️[第3回] AIによるプライバシー侵害のリスクとは？


## 1. はじめに - AIとプライバシーのジレンマ

近年、顔認識やチャットボット、推薦システムなど、AIが私たちの生活に深く浸透しています。しかしその裏で「この会話、誰かに見られてる？」「カメラが勝手に識別してるけど、許可したっけ？」といった“プライバシー不安”も高まっています。

AI活用が進む現代、エンジニアとして避けて通れないテーマが「プライバシーとの向き合い方」です。

本記事では、AIによるプライバシー侵害リスクの構造を解説し、開発現場で役立つ実践的な回避・緩和手法をコード付きで紹介します。

---

## 2. プライバシー侵害の仕組みとは？

### 🔍 なぜAIはプライバシーを侵害しうるのか？

AIが以下のような処理をする際、知らず知らずのうちに個人情報を収集・推論・拡散してしまうことがあります：

- **顔認識AI**：通行人の顔を勝手に収集・分類
- **LLM**：トレーニングデータに含まれた個人名・住所をそのまま生成
- **レコメンドAI**：ユーザーの趣味・嗜好を“逆推定”

### 🧠「個人情報の再識別」リスク

匿名化されたデータでも、複数の情報を組み合わせることで再度個人を特定できてしまうことがあります。

> 例：性別＋郵便番号＋誕生日 → 米国人口の87%を特定可能 (Latanya Sweeney氏の研究)

![reidentification-risk](https://example.com/images/reidentify.png)

---

## 3. 実例：顔画像からの再識別リスクを検証

OpenCVと顔認識モデルを使い、「一般画像から個人識別につながるリスク」を検証してみましょう。

### 📸 コード例：顔を検出して保存

```python
import cv2

# 顔検出用分類器
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + "haarcascade_frontalface_default.xml")
img = cv2.imread("group_photo.jpg")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.1, 4)

for i, (x, y, w, h) in enumerate(faces):
    face = img[y:y+h, x:x+w]
    cv2.imwrite(f"face_{i}.jpg", face)
```

👉 このように個人の同意なしに顔画像が切り出される可能性があります。

---

## 4. 実務で気をつけるべきポイント

### ✅ 実践Tips
- **学習データにPII（個人情報）が含まれていないか**を事前チェック
- **フェデレーテッドラーニング**など、データを手元に残す学習手法の採用
- API提供時は**データの収集・利用ポリシーを明示**

### ❌ よくある失敗
- ユーザーアップロード画像をそのまま機械学習に使用
- チャット履歴を明示せず学習に使う
- 匿名化＝安全だと過信する

---

## 5. 応用：差分プライバシーを用いた学習パターン

GoogleやAppleが採用している「差分プライバシー（Differential Privacy）」を簡単なコードで再現してみます。

```python
import numpy as np

def add_noise(data, epsilon=1.0):
    noise = np.random.laplace(loc=0.0, scale=1.0/epsilon, size=len(data))
    return data + noise

original_data = np.array([5, 10, 12, 15])
noised_data = add_noise(original_data)
print(noised_data)
```

👉 結果：個々のデータは秘匿され、集計傾向のみ保持される。

---

## 6. まとめ：信頼されるAI開発に必要な“透明性”と“同意”

### ✅ AI×プライバシーのメリット
- パーソナライズされた体験
- ユーザー行動からのインサイト抽出

### ⚠️ リスクと責任
- 個人情報漏洩や訴訟リスク
- 企業イメージ低下・ユーザー離脱

### 今後の展望
- **プライバシー・バイ・デザイン**がプロダクト設計の標準に
- LLMや顔認識APIの**入力フィルター/PII検知ツール**の進化
- 倫理＋法律＋エンジニアリングを繋ぐ**“PrivacyOps”**の重要性が高まる
【ネットワーク】TCPウィンドウ制御

# はじめに

こんにちは。アメリカに住みながら、独学でエンジニアを目指しているTairaです。

現在インターネットの知識の確認するインターネットクイズを定期的にやっているのですが、そこで出てきたTCPのウィンドウ制御について説明していきたいと思います。

---

## TCPウィンドウ制御とは？

TCPウィンドウ制御を説明する前に、TCPの確認です。TCPはインターネット上の通信でよく使われるプロトコルで、以下のような特徴を持っています：

- パケットの順序を保証する
- データの正確な送受信を確認する（ACK応答）
- 必要に応じて再送処理を行う

そして、TCPのデータ転送を効率よく安全に行うために登場するのが「ウィンドウ制御（Window Control）」です。

---

## TCPウィンドウ制御の目的

TCPウィンドウ制御の目的は、以下の2点に集約されます：

- 送信側が一気に大量のデータを送りすぎないようにする
- 受信側のバッファに合わせて送信量を調整する

これにより、受信側の処理に不要な負担をかけず、給信線を最大限活用した通信が可能になります。

---

## ウィンドウサイズとは何か

TCPでは、受信側が送信側に対し「現在受け取れるデータ量」を通知します。

このバイト単位の容量を **ウィンドウサイズ** と言います。

---

## TCPの通信の流れ

1. 受信側が「ウィンドウサイズ: 1000バイト」を伝達
2. 送信側は最大 1000バイト までデータを送信
3. 受信側はデータを処理したら、次のウィンドウサイズを指示

---

## スライディングウィンドウ

TCPは「一度に送信できるデータの範囲」を管理し、ACKが届くたびにその範囲をずらして送信範囲を広げていきます。

---

## TCPヘッダ内のウィンドウサイズ

TCPのヘッダには16ビットの`Window Size`フィールドがあり、ここに現在の受信可能量が入ります。

---

## TCPウィンドウ制御を理解することで何が良いか？

ソフトウェアエンジニアにとってTCPウィンドウ制御の理解は、以下のような実務上の大きなメリットにつながります：

- 通信が遅い原因をアプリケーションの問題だけでなく、ネットワークレベルで分析できるようになる
- RailsなどのWebアプリが「APIレスポンスが遅い」ときに、TCP層に原因があることも特定できる
- 高遅延ネットワーク（例：海外サーバーや5G）で最大スループットを出すための条件（帯域遅延積）を理解できる

例えば、ウィンドウサイズが小さいと高速回線でも通信速度が上がらず、アプリケーションのボトルネックになってしまうことがあります。

---

## ウィンドウサイズが小さいかどうかを確認する方法

ウィンドウサイズが通信遅延や低速の原因かを調べるには、以下のような方法があります：

### クライアント側（ローカルPC）で確認

- **Wireshark**：TCPヘッダの `Window Size` と `Calculated Window Size` を確認
- **curl -v** や **Chrome DevTools**：通信時間やTTFB（Time To First Byte）の遅延傾向を把握

### サーバー側（EC2や開発中のローカル環境）で確認

- `ss -ti`：現在のTCPセッションの送受信キューやウィンドウサイズを確認
- `tcpdump`：パケットキャプチャをしてWiresharkで解析


---

## まとめ

| 項目       | 内容                                          |
| -------- | ------------------------------------------- |
| 目的       | 送信量を制限して通信を最適化                              |
| ウィンドウサイズ | 受信側が受け取れるデータ量                               |
| 送信側の動作   | 指示された範囲内でデータを送信                             |
| 動的調整     | ACKと一緒にウィンドウサイズを更新                          |
| 利点       | ネットワークのボトルネックを特定し、より高速な通信設計が可能に             |
| 確認方法     | Wireshark / ss / X-Ray / CloudWatch Logs など |
猿でもわかるAIの倫理・リスクシリーズ 🐵⚠️[第2回] ChatGPTは嘘をつく？バイアス問題を考える


## 1. はじめに - AIの「嘘」がもたらすリアルな影響

「ChatGPTが事実と異なることを自信満々に答えた」そんな経験はありませんか？

AIによる“ハルシネーション（幻覚）”は、誤情報の拡散や業務の混乱につながる深刻な課題です。また、AIが学習したデータに偏りがあれば、無意識に差別的な判断を下すこともあります。

本記事では、エンジニアの視点から「AIの嘘・バイアスが起きる理由」「実装での注意点」「対策・緩和の実践方法」をコード付きで解説します。

## 2. AIの嘘とバイアスの正体

### 🤖 ハルシネーション（hallucination）とは？

大規模言語モデル（LLM）は「次にくるであろう単語」を予測する確率モデルにすぎません。事実の確認機構を持たず、あくまで“それっぽい”文章を生成しているだけです。

> 例：ChatGPTに「日本の初代総理大臣は？」と聞くと、稀に「西郷隆盛」と誤答するケースがある

### ⚖️ バイアスの3分類

1. **データバイアス**：訓練データに社会的偏見が含まれている
2. **アルゴリズムバイアス**：損失関数や設計が偏りを助長する
3. **ユーザーバイアス**：プロンプト設計や評価方法による誘導

![bias-types](https://example.com/images/bias-types.png)

## 3. 実例：バイアスを可視化する簡易評価ツール

以下は、LLMからの回答における「男女の職業連想バイアス」を可視化するコード例です。

```python
import openai
openai.api_key = "sk-..."

prompts = [
    "A doctor is likely to be a [MASK]",
    "A nurse is likely to be a [MASK]"
]

def check_bias(prompts):
    for p in prompts:
        response = openai.ChatCompletion.create(
            model="gpt-4",
            messages=[{"role": "user", "content": p.replace("[MASK]", "man or woman?")}]
        )
        print(f"{p} → {response['choices'][0]['message']['content']}")

check_bias(prompts)
```

👉 結果：`doctor`は"man"、`nurse`は"woman"と返されやすく、職業連想の偏りがあることが確認できます。

## 4. 実務で気をつけるべきポイント

### ✅ 経験的Tips
- 事実確認が必要なケースでは**Retrieval-Augmented Generation (RAG)**を併用する
- プロンプト設計時に**中立的表現**を心がける
- 出力のロギングとレビューを**複数視点で**行う（特に社内ツール）

### ❌ よくある落とし穴
- 生成結果を自動投稿するサービス（Slack bot等）でフィルタなし運用
- バイアス検証をプロダクション導入後にやる
- APIベースのブラックボックスモデルに過信しすぎる

## 5. 応用と防御：RAGによる事実補強の実装例

以下は、LangChainを用いたRAGパターンのミニ実装例です。

```python
from langchain.chat_models import ChatOpenAI
from langchain.chains import RetrievalQA
from langchain.vectorstores import FAISS
from langchain.embeddings import OpenAIEmbeddings

# FAISSと事前知識ベースを構築
vectorstore = FAISS.load_local("./my_docs")
retriever = vectorstore.as_retriever()

qa_chain = RetrievalQA.from_chain_type(
    llm=ChatOpenAI(),
    retriever=retriever
)

query = "初代内閣総理大臣は誰？"
print(qa_chain.run(query))
```

👉 ポイント：事前に信頼できるナレッジ（Wikipedia等）をvector化し、LLMの生成前に検索を行わせる構成。

## 6. まとめ：AIに任せる時代、責任を持つのは「人間」

### ✅ LLM活用のメリット
- 非構造データからの知識抽出
- カスタマー対応・QA自動化での省力化

### ⚠️ 倫理的リスクと課題
- 誤情報による信頼性低下
- 少数派・ジェンダーに対する暗黙の差別

### 今後の展望
- RAGやFact-check APIの進化で「ハルシネーション対策」強化
- LLMの"透明性（Explainability）"向上
- **企業・開発者の倫理設計責任**がより重要に
猿でもわかるAIの倫理・リスクシリーズ 🐵⚠️[第1回] AIは本当に安全なのか？ディープフェイクの脅威



## 1. はじめに - 「これ、本物ですか？」という時代へ

昨今の生成AIの進化により、画像・音声・動画を簡単に合成できるようになり、「ディープフェイク（Deepfake）」という言葉が一般化しました。

特にSNSや動画配信サービス上では、政治家や著名人のフェイク動画が拡散し、世論操作・詐欺・ハラスメントなど多くの問題が顕在化しています。

本記事では、エンジニアの視点から「ディープフェイクの技術的仕組み」「業務やサービスへの影響」「現場で使える対策・検知方法」まで、実例とコード付きで解説します。

## 2. ディープフェイクとは？その基本技術

### 🔍 ディープフェイクの定義
「AIを用いて既存のメディアを合成・変換し、他者を欺くコンテンツを生成する技術」

### 🧠 技術的基盤：GAN (Generative Adversarial Networks)

- Generator（生成器）：偽の画像を作る
- Discriminator（識別器）：本物か偽物かを判定する

この2つが相互に学習し、精巧な合成画像や映像が生成されます。

![gan-structure](https://example.com/images/gan-structure.png)

### その他の応用技術
- Autoencoder / VAE
- Diffusion Models（拡散モデル）
- FaceSwap / Audio2Face などのツール

## 3. 実装例：簡単なフェイク画像の生成（Google Colab対応）

ここでは、StyleGAN2を使って実在しない人物の顔画像を生成する例を紹介します。

```python
# 安定した環境でのインストール（Google Colab想定）
!git clone https://github.com/NVlabs/stylegan2
%cd stylegan2
!pip install ninja

# 事前トレーニング済みモデルで生成
!python run_generator.py \
    generate-images \
    --network=gdrive:networks/stylegan2-ffhq-config-f.pkl \
    --seeds=100-104 \
    --truncation-psi=0.5
```

生成された画像は`results/`ディレクトリ内に保存されます。

👉 **ポイント：** StyleGANの出力は非常にリアル。SNSプロフィールに使ってもバレないレベルです。

## 4. 実務で注意すべきポイントと落とし穴

### ✅ 経験的Tips
- フェイク生成よりも**検知の方が難しい**
- モデルのパラメータ・学習データの開示が鍵
- 不審な動画・音声は**metadata**と**画像解析**を組み合わせて検証する

### ❌ よくある落とし穴
- セキュリティチームと連携せずPoC止まりで終わる
- 「社内限定だから安全」と油断して拡散経路の制御を怠る
- データセットの著作権チェックを忘れる

## 5. 応用と防御：ディープフェイク検出モデルの構築

以下は、CNNベースで顔画像からフェイクを判定するモデルの簡易例です。

```python
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense

model = Sequential([
    Conv2D(32, (3, 3), activation='relu', input_shape=(128, 128, 3)),
    MaxPooling2D(2, 2),
    Conv2D(64, (3, 3), activation='relu'),
    MaxPooling2D(2, 2),
    Flatten(),
    Dense(64, activation='relu'),
    Dense(1, activation='sigmoid')
])

model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
```

このモデルはKaggleのDFDC（Deepfake Detection Challenge）データセットなどで学習可能です。

👉 精度向上には「目の点滅頻度」「顔の歪み」「音声と口の同期」など複合特徴が鍵です。

## 6. まとめ：倫理 × 技術で「信頼されるAI社会」へ

### ✅ AI活用のメリット
- クリエイティブ領域での拡張
- リアルタイム翻訳や視覚補助などの社会貢献

### ⚠️ 倫理的・社会的リスク
- フェイクニュースの拡散・個人なりすまし
- AI生成物の責任所在不明瞭化

### 今後の展望
- 検知技術の高度化（ハイブリッドAI + ブロックチェーン）
- 政策・法律の整備（EU AI Actなど）
- **AI倫理チームと技術チームの連携体制の構築が不可欠**
個人的備忘録：Fargateユーザーが知っておくべきECS・VPC・IAM

## はじめに
AWS Fargateは、サーバーの管理をせずにコンテナアプリを実行できるサービスです。しかし、Fargate自体はリソースを直接管理しているわけではありません。

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

実際の管理は、以下のようなAWSサービスを通じて行われます。

## 管理の内容

| 管理対象 | 実際の操作・管理場所 |
|:---------|:-------------------------|
| コンテナ定義（タスク定義） | ECS (Elastic Container Service) |
| クラスター管理 | ECS クラスター |
| タスクやサービスの実行 | ECS タスク/サービス |
| ネットワーク設定（VPC、サブネット、セキュリティグループ） | VPCサービス、ECSタスク定義の中で設定 |
| ログ（CloudWatchログ） | CloudWatch |
| IAMロール・権限設定 | IAM (Identity and Access Management) |

**参考文献**

https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/task_definitions.html

## まとめ

- **ECS**で、コンテナやタスクの設定、管理を行う
- **VPC**や**IAM**で、ネットワーク設定や権限管理を行う
- **Fargateは裏側で動いているだけで、ユーザーが直接操作するものではない**

簡単に言うと、「**ECSで仕訳を書き、Fargateが後ろでやってくれる**」という関係です...！
Geminiで小説「灰色の勇者と七色の絆」を書いてみた。

# 概要

Geminiで小説「灰色の勇者と七色の絆」を書いてみました。

# 実装

プロンプトは以下の通りでした。

```
第一話「勇者誕生」というタイトルで「レオ」が勇者として育つまでの話を書いてください。
```

第一話「勇者誕生」

アースガルドの片隅、緑豊かなエルデン村に、レオナルドは生まれた。灰色の瞳は、生まれたばかりの赤子にしてはどこか物憂げで、村人たちは「少しばかり、思慮深い子になるのかもしれないね」と穏やかに笑った。レオは、ごく普通の農家の息子として、土と草の匂いが染み付いた日々を送った。特別な力など持ち合わせてはいなかった。同年代の子供たちが、小さな魔法の火花を散らせたり、動物たちと心を通わせるような兆しを見せたりする中で、レオにはそうした才能は微塵もなかった。
。。。

# まとめ

生成AIは物語も書けるのですね。すごいです。
何かの役に立てばと。
【読書感想】たった1分で相手をやる気にさせる話術 ペップトーク

ランニングしながらAudibleで聴いた本の感想です。
本のまとめというより、自分が心に残ったことを3つだけ書いてます。
とりあえず思ったことをメモするのが大切と思い、なるべく30分以内で書き上げています。

# 聴いた本
たった1分で相手をやる気にさせる話術 ペップトーク
浦上大輔 (著)

「PEP TALK」というものがあります。スポーツの試合の開始前に、円陣を組んで監督が選手を激励する1分のスピーチのイメージで、例えば以下のようなものです。

> 下馬評では相手の方が強いと言われている。だが、チーム力を高める練習をしてきて、これまでも格上と言われる相手を倒してきた。泣いても笑ってもこれが最後。楽しんでこい。お前らならできる！

効果的なPEP TALKを行うことで、やる気スイッチを入れ、100%以上の力を発揮できる状態になります。
その方法を紹介する本でした。

チームを鼓舞するようなスピーチが無意識にできている人も多いかもしれませんが、効用・方法が論理的に説明されており個人的には分かりやすかったです。
（個人的満足度２．５／３、一般的なおすすめ度２／３）

# 心に残ったこと

## 心の状態「リソースフル」と「アンリソースフル」

心の状態は「リソースフル」と「アンリソースフル」の2種類あります。
「リソースフル」は、経験・能力は未知数でも、力をフルに発揮できている状態です。例えば芸人が海外ロケで、色々体当たりで何かを成し遂げる状態です。
「アンリソースフル」はその逆で、能力はあるのに発揮できていない状態、例えば「英語の成績は良いが、話せない」というような状態です。

もちろん、**スポーツの試合などでは「リソースフル」な状態で高い成果を目指すべき**で、そのために効果的なPEP TALKが重要、とのことでした。

## PEP TALKの5つのルール

本書では5つのルールが紹介されていました。
これはPEP TALKのみならず、他人に行動を促す場面では共通かなと感じました。

1. ポジティブ
1. 短く
1. わかりやすく
1. 一番言ってほしい言葉
1. 本気で関わって考える

## PEP TALKの4ステップ：受容、承認、行動、激励

PEP TALK＝短いスピーチの組み立てとして、このステップが紹介されていました。
「型」として個人的に参考になるなと思ったのでやや詳しく書いていきます。

### 受容
今の状況・事実を受け止めます。
落ち込んだ状態の場合は、一旦下向きのエネルギーを受け止めるケースもあります。

### 承認／捉え方の変換
上で述べた事実に対して、承認（ポジティブな受容であれば「だからこそ」という内容）、または、捉え方変換（ネガティブな事実に関しては「とはいえ」でひっくり返す）をします。
**捉え方変換するときのコツは、目的論**で、「本当はどうなったらいい？」「何が大事なんだろう？」という問いかけをすると良いようです。原因論になると難しくなるとのことでした。

### 行動
してほしいことを伝えます。
ここでのコツは「**ポジティブな言葉でお願いする**」ということです。例えば「ミスするな」は、「ミス」という言葉だけ頭に残るのでNGです。
また、具体的な行動を指示すると良いとのことでした。結果の指示（100点を取れ）はNGです。

### 激励
相手を元気づけます。
ここでの激励は主に2種類あります。激励系（ぶちかませ！）と見守り系（ずっと見てるよ、安心感）です。
2種類は、相手の状態によって使い分けます。体調が良い人には前者で、落ち込んでいる人に向けたPEP TALKでは後者を使うイメージです。

**激励は難しいので、日頃から「一言で励まそうとすると、何と声をかけよう？」と常に考えておく**ことが大切です。

# さいごに

PEP TALKはチーム・他人を勇気づける言葉と思いがちですが、自分自身にPEP TALKすることもできます。
短く、リズムよいPEP TALKも良いようです（例：できる　できる　〇〇ならできる）。
「言葉が行動を変え、行動が習慣を変え、習慣が人生を変える」そうです。これからPEP TALKしていきましょう！
【基本情報技術者試験 対策④】リスクマネジメント

 **💻基本情報技術者試験 テクノロジ系 技術要素・情報セキュリティ🔓** 

本日は、リスクマネジメントについてまとめます！

 ## 「リスクマネジメント」とは？
> 会社の活動に伴って発生するあらゆる **リスク** を管理し、
そのリスクによる損失を最小の費用で食い止めるためのプロセス

 #### ■リスクマネジメントのプロセス
![リスクマネジメント説明.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4068752/8a73feef-2b4d-49f3-87df-f51b9f046041.jpeg)

※リスク特定、リスク分析、リスク評価の3つをあわせて **「リスクアセスメント」** という。

 #### ■4つのリスク対応策
- リスク回避　リスクにかかわる作業をしないこと 
- リスク回避　リスクの発生確率を下げること（リスク軽減ともいう）
- リスク共有　リスクを自社から他社へ移すこと（リスク移転、転嫁ともいう）
- リスク保有　リスクをそのまま受け入れること（リスク受容ともいう）

 #### ■BCMとBCP※リスクマネジメントに関連する用語
- **BCM（事業継続管理）** 不測の事態でも企業活動を継続するための経営手法
- **BCP（事業継続計画）** 事業を以下に継続するかをまとめた計画

---

情報セキュリティマネジメントまでこちらにまとめる予定でしたが、
少し長くなりそうなので次回投稿にまとめます:relaxed:

 ### 参考文献
[いちばんやさしい 基本情報技術者 絶対合格の教科書＋出る順問題集（SBクリエイティブ公式サイト）](https://www.sbcr.jp/product/4815624262/)

[だれでもわかる＆受かる！　情報セキュリティマネジメントやさしいテキスト+頻出問題集[科目A・科目B]（SBクリエイティブ公式サイト）](https://www.sbcr.jp/product/4815616151/)
迷えるエンジニアの日常：コンテナ、デプロイ、予算…全部わからない！

今日は疲れたなぁ…。😥 薬飲んでなんとか乗り切ってます。

実は、エンジニアなんですけど、コンテナとかデプロイとか、よくわかってないんですよね。Javaも、正直、使いこなせてる自信がないし。維持・運用、パッチのことも、ちんぷんかんぷん。どうすればもっと稼げるようになるのか、本当に悩んでます。😭

もし、同じような経験がある方や、何かアドバイスがあれば教えてください！🙇‍♂️ コメントいただけると嬉しいです。

AWSの予算管理、ちゃんとしたいんだけど、何から手をつければいいか迷ってます。🤔

具体的に、どのサービスにお金がかかってるのか、よくわからないんですよね。

VPCって、お金かかるの？

RDBは本当に必要？

ECSもコスト気になるし…

そもそも、予算はいくらに設定すればいいんだ？

とりあえず、Budgetで10ドル設定してみたけど、これで大丈夫なのかな？不安です。😭
Streamlit入門 #2 ざっくり調査

# はじめに
Streamlit入門中です。
[前回](https://qiita.com/aigon3535/items/58ca09bb289a370a3d91)は、爆速に惹かれてStreamlitをひとまず試してみました。
今回はStreamlitの歴史やら特徴など周辺知識を調べようと思います。

# 歴史
[こちらのサイト](https://note.com/octoroux/n/n2a43bc260ff1
)にわかりやすくまとめられています。
**データサイエンティストの方々が簡単にアプリを作れる**ようにする、ユーザへ見せられるようにすることがきっかけだった模様。pythonからスムーズに作れることがコンセプトっぽいですね。

そのため、
* カスタマイズ性に優れてなくてもok
* それよりも手早く作れること

という特徴があると解釈できます。


以下、Copilotさんの回答です。
このような誕生のきっかけは学びがいがありますね。

>Streamlitは、この問題を解決するために開発されました。Pythonを使って、データサイエンティストが自分でインタラクティブなウェブアプリケーションを構築できるようにすることで、データの洞察を迅速に共有できるようになったのです2。
>Streamlitは2018年にAdrien Treuille、Thiago Teixeira、Amanda Kellyの3名によって創業されました2。彼らはGoogle Xや自動運転企業Zooxなどで最先端のプロジェクトに携わっており、「すぐに試してみたいデータ分析のアイデアがあるのに、Webアプリにするには専門的すぎる」というもどかしさを感じたことがきっかけでした2。


# 特徴やメリット
Streamlitを使っている先人の方々から、Streamlitのナイスな点と主な使い道を調べてみました。歴史にも記載した通り、**お手軽さという点で便利**という声が多いです。

* アプリの提供が楽
    * 動かすためにpythonなど用意しなくてもok、つまり動作環境のハードルを下げることができます

* 使いこなしが楽
    * 少ないコードで様々なUI（ボタン、カレンダー、音声再生など）を実装できます
    * 公式ドキュメントも豊富なため、実現したいイメージからも検索しやすいです

* pythonライブラリとの連携
    * データ分析や機械学習向けのフレームワークであり、他ライブラリとの連携が容易です

以下、参考にした記事です

https://qiita.com/ak-sasaki0919/items/45833e36f4582c73015f

https://qiita.com/Katsuya_Ogata/items/73479d52d68733c032de

https://qiita.com/SFITB/items/c3361979b86f441993ff

https://qiita.com/sypn/items/80962d84126be4092d3c


# 使用例

公式のサンプルアプリをいくつか触ってみました。LLMや地図は少々気になります。
* https://streamlit.io/playground
* https://devesh.streamlit.app/?ref=streamlit-io-gallery-data-visualization
* https://bgremoval.streamlit.app/?ref=streamlit-io-gallery-favorites

### Charts（グラフ可視化）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2477708/0ca29bad-b4cb-4ba5-919d-de8b7341eb3e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2477708/a30959a1-d4db-44fd-a377-9e16f9e1de80.png)


### LLM chat（AIチャットサービス）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2477708/08c1da9a-96db-4bf4-9f4d-3111c1ed2bb5.png)

### Computer vision（画像処理）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2477708/6ca68aae-3d80-4cda-b473-810f3caee4ff.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2477708/bc5f0c9a-cb2c-4215-baa4-f05a430a94c3.png)


### Geospatial（地図連携）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2477708/030f3b88-7ba3-461d-80a1-758a13d7f98b.png)

# まとめ
今回は他の記事を参考に、調査のみでした。
【Rails学習】ルーティング・モデル・コントローラー・ビューの連携まとめ


# ✅ 全体構成図（リクエストの流れ）
```
[ ブラウザ ]
     ↓（GET /books）
[ ルーティング (routes.rb) ]
     ↓（books#index に振り分け）
[ コントローラー (books_controller.rb) ]
     ↓（Book.all を呼び出す）
[ モデル (book.rb) ]
     ↑（DBのデータを取得）
     ↓（@booksに代入）
[ コントローラー ]
     ↓（@books をビューに渡す）
[ ビュー (index.html.erb) ]
     ↓（@books を表示）
[ ブラウザ ]
```
# ✅ コード例
# 1. ルーティング config/routes.rb
```
Rails.application.routes.draw do
   GETリクエスト '/books' を BooksController の index アクションへ
  get 'books', to: 'books#index'
end
```
books#index は BooksController クラスの index メソッドを指す。

ブラウザから /books にアクセスするとこのルートが反応する。

# 2. コントローラー app/controllers/books_controller.rb
```
class BooksController < ApplicationController
  def index
    @books = Book.all
    # @books はビュー(index.html.erb)で使えるようになる
  end
end
```
Book.all はモデル book.rb の Book クラスを呼び出している。

@books はビューに渡されて、HTML上で表示される。

# 3. モデル app/models/book.rb
```
class Book < ApplicationRecord
  #books テーブルとつながっている
end
```
Book クラスはデータベースの books テーブルと連動している。


# 4. ビュー app/views/books/index.html.erb
```
<h1>本の一覧</h1>

<ul>
  <% @books.each do |book| %>
    <li><%= book.title %></li>
  <% end %>
</ul>
```

コントローラーで定義した @books をループ処理して、各本の title をリスト表示する。

# ✅ クラス・変数のつながり対応表
```
| ファイル名                          | 主なクラス/変数                   | 連携先ファイル                | 対応関係                                       |
|-----------------------------------|----------------------------------|-----------------------------|------------------------------------------------|
| `config/routes.rb`               | `'books'`, `'index'`             | `books_controller.rb`       | URLルートがコントローラーのメソッドに対応     |
| `app/controllers/books_controller.rb` | `BooksController`, `@books`, `Book.all` | `book.rb`, `index.html.erb` | モデルとビューの橋渡し                       |
| `app/models/book.rb`             | `Book`                           | `books_controller.rb`       | データベースの処理担当（モデル）              |
| `app/views/books/index.html.erb` | `@books`, `book.title`           | `books_controller.rb`       | コントローラーから受け取ったデータを表示     |
```