OmniAICreator/Qiita-1.07M huggingface dataset:
AIと現実世界をつなぐ共通プロトコル「Model Context Protocol（MCP）」とは ― 具体例とともに解説


# AIと現実世界をつなぐ共通プロトコル「Model Context Protocol（MCP）」とは ― 具体例とともに解説

## 0. はじめに：AIが現実世界の情報を扱えない理由

近年、生成AIの進化により自然言語での対話が可能になった一方で、「外部情報にアクセスできない」ことが実用上の大きな制約となっています。

例えば以下のような指示を出した場合：

> 「来週の会議、営業部のSlackから日程を調整しておいて」

AIは次のような回答を返すかもしれません。

> 「Slackにアクセスできません」  
> 「“来週”とは具体的に何日を指していますか？」

これは、AIが**外部サービスやファイルに直接アクセスする手段を持っていない**ことに起因しています。

このような課題に対処するために登場したのが「Model Context Protocol（MCP）」です。

---

## 1. MCPとは何か

> **AIと外部ツール・データソースをつなぐための共通プロトコル**

MCPは、AIがSlack、ファイルシステム、データベース、Web APIなどの外部リソースに安全かつ標準的な方法でアクセスできるようにするための仕組みです。

USB-Cがさまざまな機器との接続を統一するように、MCPはAIと外部リソースをつなぐ**インターフェースの標準化**を目指しています。

---

## 2. MCPの構成と仕組み（概念図）

```plaintext:plaintext
[Userの指示]
    ↓ 
[AIアプリケーション]
    ↓（外部情報が必要）
[MCPクライアント]
    ↓ 
[MCPサーバー] ────→ [Slack / Files / DB / APIs]
```

- **MCPクライアント**：AIアプリケーション内に組み込まれ、外部情報が必要な際にリクエストを生成
- **MCPサーバー**：外部サービスやデータソースに実際にアクセスし、結果を返す

この構成により、AIは直接外部APIを操作することなく、安全にリソースを活用できます。

---

## 3. MCPが可能にすること（利用例）

| 利用シーン | 内容 |
|------------|------|
| 📁 ファイル操作 | Excelファイルから売上トップ10を抽出 |
| 🧑‍💼 Slack連携 | 特定チャンネルのやり取りを要約 |
| 📊 データベース操作 | SQLite/PostgreSQLに接続してクエリ実行 |
| 📅 タスク管理連携 | Asana等にタスクを直接登録 |

これらの操作を自然言語の指示のみで実現できる点がMCPの大きな特徴です。

---

## 4. Claude for Desktop + MCP による実践例

### 4.1 ローカルファイルの一覧取得（macOS環境）

#### MCPサーバーの起動

```bash:bash
npx -y @modelcontextprotocol/server-filesystem ~/Desktop/
```

#### Claudeの設定ファイルに追記（通常は `~/Library/Application Support/Claude/` に存在）

```json:json
{
  "mcpServers": {
    "filesystem": {
      "command": "npx",
      "args": [
        "-y",
        "@modelcontextprotocol/server-filesystem",
        "~/Desktop/"
      ]
    }
  }
}
```

Claudeを再起動後、チャット上で「デスクトップのファイル一覧を表示して」と入力することで、実際のファイル一覧が取得可能です。

---

### 4.2 SQLiteデータベースへの接続

```bash:bash
uvx mcp-server-sqlite --db-path ~/test.db
```

```json:json
{
  "mcpServers": {
    "sqlite": {
      "command": "uvx",
      "args": ["mcp-server-sqlite", "--db-path", "~/test.db"]
    }
  }
}
```

Claudeに対して「データベース内の商品の一覧を表示して」と指示すれば、AIがSQLiteの中身を直接参照できます。

---

### 4.3 Supabase（PostgreSQL）との連携（Cursor対応）

```bash:bash
npx -y @supabase/mcp-server-postgrest \
  --apiUrl https://your-project.supabase.co/rest/v1 \
  --apiKey your-api-key \
  --schema public
```

```json:json
{
  "mcpServers": {
    "PostgREST": {
      "command": "npx",
      "args": [
        "-y",
        "@supabase/mcp-server-postgrest",
        "--apiUrl",
        "https://your-project.supabase.co/rest/v1",
        "--apiKey",
        "your-api-key",
        "--schema",
        "public"
      ]
    }
  }
}
```

Cursor上での操作により、PostgreSQLの中身をAIが把握し、対話的に活用可能になります。

---

## 5. まとめ

Model Context Protocol（MCP）は、生成AIと外部リソース（ファイル、データベース、クラウドサービスなど）を**安全かつ標準的な方法で接続**するための共通プロトコルです。

従来、AIは「知識を持つが現実のデータには触れられない」状態でしたが、MCPを活用することで、AIに**現実世界を操作する能力**を持たせることが可能になります。

### 主なポイント

- MCPはAIと外部ツール・データをつなぐ“共通言語”
- ClaudeやCursorなどのアプリケーションがMCP経由でファイルやDBを扱える
- ノーコードでの設定が可能で、業務への応用が現実的

---

## 6. このような方に有用です

- 業務効率化のためにAIエージェントを導入したい方  
- ClaudeやCursorなどのAI活用ツールを最大限に活かしたい方  
- 外部サービス連携をノーコードで実現したいエンジニア・チーム

---

## 補足

MCPは現在も仕様拡張が進んでおり、セキュリティや認証の観点でも柔軟な設計が可能です。導入時はアクセス範囲や公開設定などを慎重に設計することが推奨されます。
第22回 Copilotにteratermマクロの書き方を教えてもらった

## この記事を作成した理由
　本番環境の作業ではテラタームマクロを使用し、ログを取得する工程がどの現場でもある。ただこれは**テラタームマクロを理解している一部の人が作成しているが多く、退職などで当人がいないくなる、または引継ぎが不十分だと、どうやって新しいマクロを作成すればいいかわからないことがある。**
　こういう時、Copilotにテラタームマクロの書き方を聞くことで、**誰でも簡単なログ取得マクロを作成できる**ことが分かったので、備忘録も兼ねてこの記事を書こうと思った。

## Copilotを活用したログ取得マクロの作成フロー例
**対象機器 自宅にあるCisco 892J サービス統合型ルータ**

#### ①エクセルで取得したいコマンドをテーブルでまとめた後、copilotにコードを聞く。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559536/583c3211-4c2b-46ca-ae67-ecce86946410.png)

Excelでまとまったデータの分析などをCopilotで行う場合、**テーブルを作成する必要があります。**

#### ②teratermマクロを使用して、機器にコンソール接続を行うコードを追加で聞く。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559536/607abfa3-df28-4a51-9391-e9fe4ad12165.png)

#### ③Copilotで基本的な骨組みを教えてもらった後、不明点は追加で調べログ取得用のteratermマクロを作成する。
```ruby:ログ取得teratermマクロ
;=================================================== 
;; コンソール接続設定
COM_PORT = '6'
BAUDRATE = '9600'
;=================================================== 
;; ①コマンドオプション
COMMAND = '/C=' 
strconcat COMMAND COM_PORT 
strconcat COMMAND ' /BAUD=' 
strconcat COMMAND BAUDRATE

;; ②機器に接続 
connect COMMAND

;; ③結果をログファイルに保存
logopen 'C:\log\%Y%m%d_%H%M%S_test_log' 0 0

;; ④コマンドを送信
sendln "enable"
sendln "ter len 0"
sendln "show run"
sendln "show standby brief"
sendln "show interface brief"
sendln "show ip ospf neighbor"
sendln "show logging"

;; ⑤コンフィグレーションモードから抜ける
sendln "exit"
```
生成AIはあくまで**補助としての役割**なので、与えられた情報を活用してどういうマクロを作り何を実現したいのか、そのためにどこから何を調べていくのか。このような**創造的な部分はまだヒトが行わなければいけない部分**だと実感しました。

#### ④機器にコンソール接続を行いteratermマクロの実行した結果。ログの取得に成功！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559536/d350729c-bd1d-4c20-add1-6d9f0cce98d6.png)

### やってみた感想
今回は現場がCopilotを使用できる環境だったので、これを使用してコードを作成しました。
マクロを作成して実行した感想として、生成AIはひな形のコードをすぐに教えてくれるが、**教えてもらった情報をどうやって活用するかの判断はヒトが行う**ので、AIを駆使した提案力などを鍛えていけば、**AIを活用することができるネットワークエンジニア**として差別化の要素につながると実感した。
また最近は**ChatGPT、DeepSeek**など他のAIツーㇽも登場しているので、**どのツールを使用すればもっと楽にコードなどを作成でき現場で楽をしていくことができるのか**も模索していきたい。

## 次回
生成AI関連が2回続いたので、ネットワークに戻り**アクセスリストのestablish**に関して作成予定。
ABC400 D - Takahashi the Wall Breaker

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

# 使用しているアルゴリズム
- 0-1 BFS（双端キューによるコスト付きBFS）

# 解法のポイント
- 移動は上下左右の4方向に可能で、基本的にはBFSで進んでいきます。
- ただし、「壁」を2枚まで前蹴り（＝コスト1）で通過できるため、通常のBFSではなく **0-1 BFS** を使います。
- **道（.）を通るときはコスト0で優先的に探索**（`appendleft`）、**壁（#）を通るときはコスト1として後回し**（`append`）にします。
- 前蹴りは2マス先まで有効なので、`i=1,2`で2マス分をループで処理。
- 探索先のコスト（`ans[ny][nx]`）が、すでにより少ないか同じ回数で更新されていた場合はスキップします。
- `i=1`で通れる道があれば、それが最短なので`break`して`i=2`には進みません。
- ゴールに到達した時点で、`ans[goal]`に最小の前蹴り回数が格納されます。

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

H,W = map(int,input().split())
INF = H*W
grid = [list(input()) for _ in range(H)]
ans = [[INF]*W for _ in range(H)]
sy,sx,ey,ex = map(int,input().split()) # 1-index
dys = (1,-1,0,0)
dxs = (0,0,1,-1)

dq = deque()
dq.append((sy-1,sx-1)) #0-index
ans[sy-1][sx-1] = 0

while dq:
  now = dq.popleft()
  
  # goal座標に到達したら終了
  if now == (ey-1,ex-1):
    break
  
  y,x = now
  current_cost = ans[y][x]
  
  for dy,dx in zip(dys,dxs):
    wall = False
    for i in range(1,3):
      ny = y + dy * i
      nx = x + dx * i
      
      if ny < 0 or ny >= H or nx < 0 or nx >= W:
        break
      
      feature_cost = current_cost if i == 1 else current_cost + 1
      if ans[ny][nx] <= feature_cost:
        continue
      
      if grid[ny][nx] == "#":
        wall = True
      
      if not wall:
        if i == 1:
          ans[ny][nx] = current_cost
          dq.appendleft((ny,nx))
          break
      else:
        ans[ny][nx] = current_cost + 1
        dq.append((ny,nx))

print(ans[ey-1][ex-1])
```

# リンク
[ACサンプル集(アルゴリズム逆引き)](https://www.notion.so/motonao/1cc8aca4381b80f39713ddb52fa85e8f?v=1cc8aca4381b80519654000c236bb8d6&pvs=4)

[問題へのリンク](https://atcoder.jp/contests/abc400/tasks/abc400_d)
【Next.js】何でもかんでもサーバーコンポーネントにすれば良いってもんじゃない

結論：アプリの特性に応じて、クライアントコンポーネントとサーバーコンポーネントを適切に使い分けるのがベスト、という話です。

何でもかんでもサーバーコンポーネントにすれば良いってもんじゃない。とは言っても逆もまた然りで、何でもかんでも脳死で "use client" を付けてクライアントコンポーネントにしてしまうのも良くありません。

Next.jsを実務で触っていく中で、「サーバーコンポーネント」という概念を知りました。
要は、サーバー側でHTMLを生成してクライアントに送る仕組みです。APIからのデータフェッチもサーバー側で行えるというのが特徴です。

「へ〜、useEffect はクライアントでレンダリング後に実行されるけど、サーバーでデータを先にフェッチできれば実行タイミングも早くていいじゃん。しかも物理的にDBにも近いし、バンドルサイズも減るからパフォーマンス絶対上がるでしょ！」

…なんて思って試行錯誤してみたのですが、結論としては、**「部分的にサーバーコンポーネントを採用」**という形に落ち着きました。

サーバーコンポーネントには、たとえばローカルストレージのデータを読めなかったり、useState や useEffect のようなフックが使えなかったりといった制約があります。でも、それ自体は大きな問題ではありませんでした。

一番の問題は、サーバーコンポーネントでは Zustand のような状態管理ライブラリに保存されたデータを参照できないという点です。

私が作っているアプリでは、画面の初回表示時にデータをフェッチして、それを Zustand の store に保存します。
以後はその store に保存されたデータを参照し、必要に応じて DB 更新とともに store も更新する設計です。

つまり、「store にデータがあればそれを使い、なければフェッチする」という構成です。
ところがサーバーコンポーネントでは、クライアント側にある store の中身を確認することができません。
つまり、「store にデータがあるかどうかを判定できない」→「毎回フェッチするしかない」という状況になってしまいます。

これでは、せっかく store に保存している意味がありません。

たしかにサーバーコンポーネントを使えば初回表示は高速になります。
でも、クライアントコンポーネントにして初回表示が多少遅れても、その後の画面遷移や操作時にフェッチ不要で store のデータを使えた方が、トータルのユーザー体験は高いと感じました。

サーバーコンポーネントの場合
画面A（fetch）
　↓

画面B（fetch）
　↓

画面A（fetch）

クライアントコンポーネントの場合
画面A（fetch）
　↓

画面B（fetch）
　↓

画面A（store のデータを利用）

ただし、これはあくまでインタラクティブ性の高いアプリケーションの話です。





サーバーコンポーネントが悪いというわけではありません。

Next.js には、フェッチしたデータをキャッシュできる機能もあります。
たとえば「初回フェッチ後は1時間そのデータを使い回す」といったことも可能です。

データの更新頻度が低いアプリや静的な企業サイトのような構成であれば、状態管理ライブラリを使わなくても十分対応できますし、サーバーコンポーネントで初回表示も速く、キャッシュも効いて、とても効率的です。

結論：アプリの特性に応じて、クライアントコンポーネントとサーバーコンポーネントを適切に使い分けるのがベスト、という話です。
Windows上でのDify簡易セットアップ

# 初めに
chatgpt(4o)にWindows環境で Dify を動かすための手順をきいたら聞いたら最初嘘だらけだったので正しい手順をメモ


# 🐳 Windows環境で Dify を動かすための完全セットアップ手順（Docker Desktop + Git + Dify）

---

## ✅ ステップ 0：事前準備

### 🔧 必要なもの

- Windows 10 以降（64bit）
- 管理者権限のあるユーザー
- インターネット接続

---

## 🐳 ステップ 1：Docker Desktop をインストール（WSL2対応）

### ① Docker Desktop ダウンロード

👉 [公式サイト](https://www.docker.com/products/docker-desktop/) からインストーラーをダウンロード

### ② インストール中のチェック項目

- ✅ 「WSL2 バックエンドを使用する」にチェック
- ✅ 「Linuxコンテナモードを使用」が選択されていること

### ③ インストール後

- PCを再起動（必要な場合）
- タスクトレイに 🐳 のアイコン（Docker）が表示されればOK
- コマンド確認：

```bash
docker --version
docker compose version
```

---

## 💻 ステップ 2：Git をインストール

### ① Git for Windows をダウンロード

👉 [https://git-scm.com/](https://git-scm.com/) へアクセス

### ② インストール時の選択（すべてデフォルトでOK）

- Use Git from the command line and also from 3rd-party software（推奨）
- Git Bash も一緒にインストールされます

### ③ インストール確認

```bash
git --version
```

✅ バージョンが表示されれば成功！

---

## 🚀 ステップ 3：Dify のセットアップ

### ✅ クローン

```bash
git clone https://github.com/langgenius/dify.git
cd dify/docker
```

### ✅ 環境ファイルをコピー

```bash
cp .env.example .env
```

### ✅ Dockerで起動

```bash
docker compose up -d
```

### ✅ DB初期化（マイグレーション）

```bash
docker compose exec api bash -c "source .venv/bin/activate && flask db upgrade"
```

### ✅ 再起動

```bash
docker compose restart
```

### ✅ アクセス

ブラウザで開く：

```
http://localhost
```

✅ 管理者アカウント作成画面が出れば成功！
IX2215ファームウェアアップデート

中古で購入したIX2215がVer9.だったのでNetmeisterが使えるVer10.までアップデートします。

NEC公式から最新のファームウェアをとってきてUSBでのアップデートを試します。
(2025/4/10現在Ver10.10.29が最新なようです)
https://jpn.nec.com/univerge/ix/Download/ix2215/index.html

USBも使っていなかったものを拾ってきたのでFAT32でフォーマットし直します。
windowsのクイックフォーマットは予期せぬ不具合が...と書いてたのでチェックを外しておきました。
![{BF8547B9-525E-492A-8428-6C2608179725}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4057947/3ca4e8a0-9c48-4870-9e3a-62fcd4bcf7db.png)

IX側の設定もやっておきます。
```
configure
device USB0
no shutdown
```

USB3.0のものを使ったのですがうまく認識しませんでした...
```
show device USB0

```


今回はあきらめてTFTPサーバーを使ったアップデートを行います。
パッケージはtftpd-hpaを使用しました。
```
sudo systemctl tftpd-hpa
```

/srv/tftp配下にアップデート用の.rapファイルを置きます。
```
/srv/tftp
```

IXから疎通がとれるか確認してからコマンドを実行します。
```
software-update tftp://tftpサーバーのIP/〇〇.rap
```
うまくいきました。
ちゃんとバージョンも上がってVer10台になったのでNetmeisterにつながるはずです。

参考
tftpサーバー関連
https://qiita.com/tester09/items/378b0e0b4c1a0df591a7
https://server-network-note.net/2021/10/tftp-ubuntu20-04/
https://zenn.dev/mnod/articles/58c44d6164b5a8
vi
https://qiita.com/blue_camel/items/e2bd59a3b33acd5edfd0
プログラミング練習記録　1日目：環境構築

# プログラミング練習記録　1日目

### 1.はじめに
　プログラミングを練習するにあたり、備忘として記録を残す。
　初日なのでまずは環境構築を行う。

### 2.学習対象
- C#
- React

### 3.本日の作業内容
- 環境構築
  VS Code / Visual Studio / Git / Node.js / .NET SDK インストール

### 4.作業手順
#### 1. Visual Studio Code (VS Code)のインストール
- 公式サイトからダウンロード
   https://code.visualstudio.com/
   
- インストール後、基本的な設定（拡張機能）
  - C＃開発向け
     - C# Dev Kit
       - NuGet Package Manager
  - React開発向け
     - ESLint
     - Prettier - Code formatter
     - JavaScript and TypeScript Nightly
     - React Developer Tools
  - Git連携 
     - GitLens — Git supercharged

#### 2. Visual Studioのインストール
- 公式サイトからダウンロード
  https://visualstudio.microsoft.com/ja/

- インストール時に選択するもの
  - .NET Desktop Development（C#を使用するため）
  - ASP.NET and web development（ウェブ開発を行う場合）
    - 必要に応じて、その他のモジュールを選択。（今回は特になし）

#### 3. Gitのインストール
- 公式サイトからダウンロード
  https://git-scm.com/

#### 4. Node.jsのインストール
- 公式サイトからダウンロード
  https://nodejs.org/ja

- 確認
  ターミナルでnode -vと入力して、バージョンが表示されればインストール成功

#### 5. .NET SDKのインストール
- 公式サイトからダウンロード
  https://dotnet.microsoft.com/ja-jp/download/dotnet

- 確認
  ターミナルでdotnet --versionと入力して、バージョンが表示されればインストール成功
【LocalStack】使用した感想

# AWSの学習環境に最適！って思っていました。

過去にAzureの従量課金で思いもよらぬ出費があり、円安も重なって、AWS利用も個人では控えている最中、DockerでAWSの疑似環境を作れるLocalStackを知り、約2週間のトライアル利用してみる。

使い勝手が良く、AWSで実際に動かす前の実験環境として「超良い！」って思っていました。

月あたり35ドルだし、GWに集中的に学習のため登録しようと手続きをしようと操作していたのですが、、、

# 登録手続きしようと思って手を止める

支払い金額を確認すると420ドルと表示され、「ん？」と手が止まる。

よくよくみると、billed annuallyと記載されているではないですか。

![WS001642771.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530912/6a29fa1f-f40a-4586-8c31-0eb807f6c888.jpeg)

年単位支払いで420ドル。

有償版使用するなら420ドル必要ですよ。これは月あたり35ドルですよ。
ということらしい。

420ドル(約60,000円)かぁ⋯

それだったら普通にAWS環境で停止/削除しながら学習した方が良くない？となってしまいました。

月35ドル契約のサブスクであれば速攻有償版にしようと思っていたんだけど、ずっとAWSの勉強をするわけでもないし、進化の早いAWSの実験環境で6万超えの支払いは個人ではキツイ。

GWは実際のAWS環境使って学習することにしました。

# LocalStackそのものについて

LocalStack Desktopを使えなかったり、一部制限はあるものの学習環境としては非常に優れていることは間違いないですね。

だからこそ、有償版を使いたいと思ったのですが。
OAuth2.0について

## OAuth2.0とは
**トークンの取得方法**と**トークンの使用方法**に関することである
### OAuthの特徴
* システムをまたいで認可を行えるようにする認可プロトコルである
* パスワードの共有のようなアンチ・パターンを委譲プロトコルに置き換えておりより安全で勝つより使いやすいものになっている。
* OAuthは自信が扱う問題の範囲を限定し、その問題を適切に解決することに専念しており、そのことがOAuthをさらに大きなセキュリティの枠組みの中で役割を果たすための一つの要素となっている

## OAuthダンス ~OAuthの構成要素間の相互作用~
### 用語確認
* **トランザクション**
複数の処理を一つのまとまりとして実行し、そのすべてが確実に完了するか、全く実行されないかという一貫性を保証する仕組みです。特にデータベースや分散システムで用いられる概念であり、データの整合性や信頼性を守るために重要な役割を果たします。
### OAuthのトランザクションのイベントの流れ
1. リソース所有者はクライアントにリソース所有者の代わりとしてふるまって欲しいことを支持する
2. クライアントは認可サーバーにリクエストをし、そこでリソース所有者にクライアントを認可するかどうかの判断を行わせる
3. リソース所有者はクライアントを認可する
4. クライアントは認可サーバーからトークンを受け取る
5. クライアントは保護対象リソースにトークンを提示する

### OAuthのしくみにおける4つのアクターとなる構成要素+α
##### クライアント(例:Webアプリケーション、ネイティブアプリケーション、ブラウザ内のJavaScriptアプリケーション)
* ソフトウェアのことであり、リソース所有者の代わりとして保護対象リソースへのアクセスを試みるもの。
* OAuthのしくみの中で最もシンプルな構成要素となっており、その責務は主に**認可サーバーからトークンを取得すること**および**そのトークンを保護対象リソースで使うこと**になる。
##### 保護対象リソース
* HTTPサーバーから提供されていて、そのリソースにアクセスするにはOAuthのトークンが必要になる
* OAuthの構造において、保護対象リソースはトークンを信頼するかどうかの最終的な決定権を持つ存在になる
##### リソース所有者(ユーザー)
* クライアントにアクセス権を委譲する権限を持つ存在
##### 認可サーバー
* OAuthのしくみの中心的な役割を担うHTTPサーバーのこと
* 認可サーバーはリソース所有者とクライアントの認証を行い、リソース所有者にクライアントを認可するための仕組みを提供しトークンをクライアントに発行するもの
##### アクセス・トークン
* 表すものはクライアントによってリクエストされたアクセス権、クライアントを認可したリソース所有者、そして認可処理を経て得られる権限を組み合わせたもの
* 認可サーバーはトークンを発行、保護対象リソースはトークンを検証するためトークン自体について何を表しているか理解する必要があるが、クライアントはトークンについて知る必要が全くないためクライアントはシンプルな構造を保つことができている
##### スコープ
* 保護対象リソースでの権限を表すものである
* 例:写真読み込み、メタデータ読み込みなどの具体的な保護対象リソースでの権限
##### リフレッシュトークン
* リフレッシュ・トークンは認可サーバーによってクライアントに発行され保護対象リソースには送られない
* クライアントはリフレッシュ・トークンを使ってリソース所有者を巻き込むことなく新しいアクセス・トークンをリクエストすることができる

### 認可付与
* **認可付与とは**OAuthのクライアントに保護対象リソースへのアクセス権をOAuthのプロトコルを介して与えるための手段であり、そのことに成功すればクライアントはトークンを取得することになる

### OAuthの構成要素間のやり取り
* OAuthはHTTPベースのプロトコルである
* OAuthでのやり取りは常に単純なHTTPのリクエストとレスポンスを介して行われるというわけではない

#### バック・チャネル・コミュニケーション
* クライアントと認可サーバー、クライアントと保護対象リソース間でのコミュニケーションのこと
#### フロント・チャネル・コミュニケーション
* 直接連携することはなく、Webブラウザを介したHTTPリダイレクトを使った間接的に連携する
* コミュニケーションの方法はURLにパラメータをつけてパラメータを読み込むように伝えることで行っている
Realmを更新しようとしたら"Can't perform transactions on a frozen Realm"が出た

## 事象
Realmを更新しようとしたら以下のエラーが発生してアプリクラッシュした。
```
Terminating app due to uncaught exception 'RLMException', reason: 'Can't perform transactions on a frozen Realm'
```

#### エラーメッセージの意味
```
Can't perform transactions on a frozen Realm
```
直訳すると **凍結されたRealmに対してトランザクションを実行できません** 

読み取り専用オブジェクト（`frozen Realm`）に対してトランザクションの実行（値書き込み）ができないということ。

#### Realmのfreezeとは？
筆者自身まだ勉強中なので詳しくわかっていませんが、Realmデータを読み取り専用にする仕組み（だと認識しています）
読み取り専用にすることで、別スレッドから値を上書きされる心配がないのでマルチスレッドアクセスが可能になります。
今回の場合、上書きNGなfreezeしたデータを更新しようとしたためエラーになったという感じです。

#### freezeはどうやって設定する or 解除する？
freezeは以下のようにすれば明示的に実装できる。
簡単ですね。
``` Swift
let frozenTodo = todo.freeze()
```

freezeを解除するにはthaw()を使う。
``` Swift

if let todo = frozenTodo {
    // ここでfreezeを明示的に解除し変更可能な状態にする
    if let thawedTodo = todo.thaw() {
        // Realmの上書きも可能になる
        try! realm.write {
            thawedTodo.param1 = "変更可能なので更新します"
        }
    }
}
```

こまかいことはまだ勉強中です。
今回は問題解決できたので、また同様の事象が発生したらその時にまた更新します。
【ローコードのSKE】更新日時による排他処理

今回の記事は、SKEで排他処理を実装するサンプルです。
## 共通設定
以下のテーブルを利用して、サンプルを作成します。
```sql
CREATE TABLE "テストテーブル"
(
  "主キー" integer NOT NULL,
  "名称" character varying(10),
  "作成者" character varying(20),
  "作成日時" timestamp without time zone,
  "最終更新者" character varying(20),
  "最終更新日時" timestamp without time zone,
  CONSTRAINT "テストテーブル_pkey" PRIMARY KEY ("主キー")
)
```


排他用項目は値の表示用フォーマットを行うと更新前後の比較はうまくできないため、表示用と排他用別々にする必要です。このため、クエリ項目を作成します。また、作成者、更新者、作成日時、更新日時は自動的に登録されるように設定します。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476221/1ea53bff-aef3-4ade-99d0-96b31057003d.png)
```sql:クエリ
select *,最終更新日時 as v更新日時 from テストテーブル
```
```js:作成者
{
	"add": function(){
        return session.get("USER_ID");
    },
	"copyAdd": function(){
        return session.get("USER_ID");
    }
}
```
```js:作成日時
{
	"add": function(){
        return new Date();
    },
	"copyAdd": function(){
        return new Date();
    }
}
```
```js:最終更新者
{
	"add": function(){
        return session.get("USER_ID");
    },
	"copyAdd": function(){
        return session.get("USER_ID");
    },
	"edit": function(){
        return session.get("USER_ID");
    }
}
```
```js:最終更新日時
{
	"add": function(){
        return new Date();
    },
	"copyAdd": function(){
        return new Date();
    },
	"edit": function(){
        return new Date();
    }
}
```
## 入力ダイアログ
タイトル「最終更新日時」の項目は表示用で、ビュー項目とリンクします。タイトル「排他用」はhiddenにして、テーブル項目とリンクします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476221/bad0c05f-cc93-4fd9-9e3a-187952892c08.png)
## 効果
2つのブラウザで同じデータを開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476221/29cc4126-6ec0-470f-98ae-eae4566def9f.png)
まず右の画面を保存すると、保存に成功します。次に左の画面を保存すると、排他により保存失敗します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476221/e60db3d0-2713-4f6f-9603-a237833daff7.png)

## まとめ
今回の記事のサンプルには、以下のアドオンを利用しました。
- モード別項目設定値のアドオン
VisionDevCamp 2025 Fukuoka Project Ideas / プロジェクトのアイデア

Project Ideas : VisionDevCamp 2025 Fukuoka Project Ideas

Think out loud about project ideas for the event this week: https://visiondevcamp-fukuoka.pages.dev/

- [x] Wearable lighting for M5stack LED controllable via BLE inside the AppleVisionPro
- Moire Lens application, based on concepts from https://github.com/RazortoothRTC/MoireLens-app
- Point Cloud Cards : convert a photo graphs into spatial point clouds
- Pocket Objects Deck Builder game: found objects based spatial card battle game for multiple players
- Spatial NFC tap tags: drop NFC tags in a location.  Any taps on a phone trigger a notification to the app
- Spatial HUD PoC
- [x] SDL3 Starter Project for AVP
- Wrist based UI concept
- ambient dark to light relaxation concept webxr
- Theramin (spatial)

About Me

I work with startups in the US on mobile and embedded systems oriented projects, with a focus on IoT and Medical devices.

In Japan, I am looking to build products that intersect AR/AI/IoT

https://www.linkedin.com/in/dkords/
https://razortooth.biz/
https://iotoneai.site
Mayaに同梱されているUSDツールセットの利用方法

## 環境
* Windows
* Autodesk Maya 2026

## MayaのUSDツールセット

MayaにはUSDのライブラリと一緒に [USDツールセット](https://openusd.org/release/toolset.html) も同梱されています。
Mayaに同梱されているUSDツールセットはビルド済みのため、環境変数の設定と関連ライブラリのインストールのみで、コマンドラインから [USDツールセット](https://openusd.org/release/toolset.html) が利用できます。

## 設定方法

### PyOpenGLのインストール

pipでPyOpenGLを任意の場所にインストールします。

```bat:インストール例
"C:\Program Files\Autodesk\Maya2026\bin\mayapy.exe" -m pip install PyOpenGL -t D:\work\blog\tools\maya\2026\usd\python -t <任意のパス>
```

### 環境変数の設定

環境変数 ```PATH``` に下記のパスを追加します。
* mayapy.exeのパス
* usdバイナリのパス
* usdライブラリのパス
 
また ```PYTHONPATH``` には下記のパスを追加します。
* usdのpythonライブラリのパス
* PyOpenGLのインストール先のパス

```bat:環境変数の設定例
set PATH=%PATH%;C:\Program Files\Autodesk\Maya2026\bin;C:\Program Files\Autodesk\MayaUSD\Maya2026\0.31.0\mayausd\USD\bin;C:\Program Files\Autodesk\MayaUSD\Maya2026\0.31.0\mayausd\USD\lib
set PYTHONPATH=C:\Program Files\Autodesk\MayaUSD\Maya2026\0.31.0\mayausd\USD\lib\python;<PyOpenGLのインストール先のパス>
```

### 動作確認

USDツールセットの中で、視覚的に確認しやすいビューワーの ```usdview``` をコマンドラインから実行します。

```bat:usdviewの実行例
usdview <usdファイルのパス>
```

設定が問題なければビューワーが起動し、アセットが表示されます。

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3965005/2d6b3746-31d6-4cb7-801d-a4cdf7d7bae2.jpeg">


usdファイルが手元にない場合は、公式ドキュメントの [Assets](https://openusd.org/release/dl_downloads.html#assets) からアセットをダウンロードできるのでそちらを確認用に利用してください。

## 参考

* [Universal Scene Description](https://openusd.org/release/index.html)
* [OpenUSD](https://github.com/PixarAnimationStudios/OpenUSD)
* [Get and Build USD](https://github.com/PixarAnimationStudios/OpenUSD/blob/release/README.md#getting-and-building-the-code)
* [USD Toolset](https://openusd.org/release/toolset.html)
* [Using UsdView and more from the USD Toolset with Maya](https://help.autodesk.com/view/MAYAUL/2026/JPN/?guid=GUID-C452B331-7C4D-4B58-A1BA-D03775F266A8)
* [Kitchen Set](https://openusd.org/release/dl_kitchen_set.html)
ip addressを固定する際にnetplanで沼った話

## 最初に概要

この記事はプログラミング初心者がモチベーションを保つために学んだことなどをひたすらに書いていくものです。

多分qiitaを見ている多くの人は知っていることかもしれませんが温かい目で見てくださると何よりです。

## 結論

いきなり結論です。以下のようにして僕の環境ではできました。


```yml
network:
  version:  2

  ethernets:
    eth0:
      dhcp4:  false
      dhcp6:  false
      accept-ra:  false
      link-local:  [ ]
      addresses:
        -  192.168.0.好きな数字/24
      nameservers:
        addresses:  [192.168.0.1]
      routes:
        -  to:  default
           via:  192.168.0.1
```

```yml
sudo netplan apply
```

ここで他の方が紹介しているのと少し変わっているのが`accept-ra`と`link-local`だと思います。

---

###  `accept-ra` とは？

- **正式名称：** `accept-router-advertisements`
- **役割：** IPv6 ネットワークでルーターから送られてくる「ルーターアドバタイズメント（RA）」を受け取るかどうかを指定します。
- **使いどころ：**
  - `true`：自動でルート情報などを受け取る（クライアント的な動き）。
  - `false`：自動設定を無視する（サーバーやルーターとして自立的に動かしたいとき）。

> 💡 `dhcp6: false` にしていても、`accept-ra: true` だと一部のIPv6設定を自動で拾ってしまうので注意。

---

###  `link-local` とは？

- **意味：** ネットワーク機器が**自動で割り当てるローカル専用IPアドレス**のこと。
- **例：**
  - IPv4：`169.254.x.x`
  - IPv6：`fe80::/10`
- **用途：**
  - DHCPがないときの最小限の通信手段。
  - ルーターや隣接機器との通信。
- **Netplanでの指定：**
  ```yaml
  link-local: [ ]
  ```
---

##  なぜ `accept-ra: false` と `link-local: [ ]` が必要だったのか？

理由としては僕の環境で普通の家庭用のIPv6対応ルーターを使っていたことでした。 
そしてその原因になっていたのが、IPv6関連の自動設定でした。

### `accept-ra: false` を設定した理由
ルーターがIPv6のルーターアドバタイズメント（RA）を送ってきて、  
それを受け取ると、静的に設定したルートやDNSが上書きされることがありました。  
そのため、RAの受信を無効にすることで、手動設定を優先させるようにしました。

### `link-local: [ ]` を設定した理由
IPv6のリンクローカルアドレス（`fe80::` など）が自動で付与されると、  
それ経由で意図しないルーティングが行われることがありました。  
これを明示的に無効にすることで、IPv6の影響を受けない安定した構成になりました。

---

家庭用ルーターを使っている環境では、これらの設定がないと意図しないIPv6の動作でネットワークが不安定になることがあるみたいです。


## 感想
ちなみにこんな感じで書いていますが判明するまでに丸１日かかってます。
もうnetplanは触りたくないです。
CSSの更新後の自動スクロールをオフにしてコーディングを快適に【VSCode, LiveServer】

## 本記事について
VSCodeと拡張機能「Live Server」をお使いの皆さん、
VSCodeでWebコーディングをしていて、自動更新(ホットリロード)されると勝手にページが勝手にスクロールされてちょっと嫌ですよね？

特にCSS編集中だと嫌です。

そこで、本記事ではVSCode, Live Serverをお使いの方向けに、**自動更新後のページスクロールを防ぐ**方法を紹介したいと思います。

Mac, Windowsどちらも対応可能です。


## 設定は簡単
VSCodeを開いて、
### 1. `Ctrl + ,` (コンマキー)で設定を開きます
(VSCode左下の歯車マーク⚙→設定 かｒでも可能です)
![設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3970907/ac75c5c4-5e1d-4867-a8e2-0281820ecd8f.png)

### 2. `Full Reload`と検索
1番上に出てきた、`Live Server > Settings: Full Reload`の項目にチェックを入れてください
![Full_Reload.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3970907/b9f0cba5-fbaf-4054-b57e-6004a64ede9c.png)

### 3. VSCodeを閉じて再度開くと...
HTMLやCSSを更新しても、勝手にページがスクロールされることはありません！


## まとめ
今回は、Webコーディングを快適にする便利な設定を解説しました。
ぜひ、ご活用くださいませ。
続:Freescaleのマイコン

以前調べていた、[HC908](https://qiita.com/yamori813/items/de8979b2ae67d394e82f)をいじってみました。

このチップはVCC(5V)の1.4倍から2倍の高電圧をIRQにかけてモニターモードに入り処理コードやデータを送ってflashへの書き込みを行います。昔はRS232からこの電圧を拾い出して使っていたようですが、もう通常のRS232は無くなって5Vだったり3.3Vだったりします。

PROMの頃の高電圧は25VでEPROMになって21Vとか12Vとかに下がりました。Flashでも12Vが必要なものがありましたが、すぐに5Vだけでよくなりました。HC908は最後の頃の高電圧利用チップだったと思われます.


たまたま以前、MC34063を使った昇圧回路を作っていたので、これを使ってみようと思いつきました。

3.3Vから8.2Vを作ってそれから5Vを作ります。

ピンソケットの並びは5V, 8.2V, GND, DTR, TX/RXにしました。

![IMG_20250412_110907.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/61ecf1a7-d042-40c3-a209-c08da92e943a.jpeg)

TX/RXはダイオードを入れている回路図もありましたが、入れると動かなくなるので直結しています。

回路はこれをベースにしています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/f461da50-5a68-470a-baa7-076387d2fd34.png)

3.3Vは、このチップは3.3Vのレギュレータが内蔵されていて、VREGから出力されているので、これを使います。

sdccでビルドしたs19ファイルをbl08コマンドで焼いてみます。

```
% bl08 -c /dev/cuaU0 -b 9600 -r 100 -t jb8 -x 12 -e -f -g reset blink.s19
bl08 - MC68HC908 Bootloader - version 1.0.0.0
Reading S-records
Line ignored: S9030000FC

S-record data address 00FFFE size 000002
S-record data address 00DC00 size 000064

Mass erase
Mass erase
Program FFFE - FFFF .
Program DC00 - DC63 ..
Execute code from DC00
```

bl08のソースはここに置いておきました。

https://github.com/yamori813/hc908_bl08

ターゲットはHardOffで購入した、USB赤外線リモコン受光機から剥がしたチップです。

USBは1.5Mだけなので使い道はHIDなどに限定されます。

Flashの消去保証は10Kなので安心して使えます。

24-Pin QFNのデータシートどっかに転がってないかな。

PTD0にLEDを付けてLチカしてみました。

```c
/* HC908JB8 sample code with sdcc 4 */

#include <mc68hc908jb8.h>

void main() {
        CONFIG = 0x01; // Disable COP
        DDRD |= 0x01;
        while (1) {
                unsigned int i;
                PTD ^= 0x01;
                for (i = 0; i < 50000; ++i)
                        PTD;
        }
}
```

ちゃんと動きました。
磁性に関して

磁性に関して第一原理計算業界での共通認識とハバードモデル業界の認識はかなり違っている。

第一原理計算業界での認識は以下のようなもの。
まずクーロンの長距離力によって局所的電荷中性が強く強要される。これにより、磁気的なゆらぎのみが残り得る。交換相互作用により、電子を半分ずつ詰めるよりも、片側のスピンに一個詰めるのが安定である。これはLDAという単純な近似でもそこそこ再現できる。そして、強磁性が発現する場合は、スピンが揃うことで運動エネルギーゲインを得ることができる場合である。占有電子数とも関係している。実際Slater-Polingカーブなどはかなりうまく再現できる。これは１９８０頃に理解された話であり金属強磁性の理解には何の困難もない。インシュレータでは結合的な軌道（反強磁性）に入ることになるし、もっと広い世界で一般化もできる。しかし、ハバードモデルではどうもそういうシナリオにはならないらしくて話が噛み合わない。

#### ハバードモデル
第一原理ハミルトニアンからハバードモデルを導出するシナリオを考えてみる。
ダイアグラム展開で言えば、クーロン力の波線を点にシュリンクさせたのがハバードモデルというのが単純な理解であるーこのときシュリンクさせたために区別のつかなくダイアグラムが発生する。これは符号だけが逆転しており、キャンセレーションが発生する。これを交換ペアダイアグラムと呼ぶ。一言で言えば、交換ペアダイアグラムのキャンセレーションをあらかじめ組み込んだのがハバードモデルである。$\langle n_\uparrow(1)n_\\uparrow(2) \rangle$は1=2のときにゼロにならないといけないが交換ペアダイアグラムを取ることでこれが保証される。

そして交換ペアダイアグラムをきっちりとるとFLEXとよばれるRPA近似になる。これがいいか、と言われると現実的には問題が多いだろう。そもそもハバードモデルが電荷ゆらぎと磁気ゆらぎの対称性を強要する点が問題である。理論的にはフェルミ統計がキッチリ入ってるし、ネーターの定理の意味で保存近似(Baym-Kadanoff)になってて汎関数から導けるとか、気持ちいいのだがそもそも対称性を強要する点にかなり問題が多い。

クーロン力を真面目に考えるとき、ハバードモデルでは、上述のような近似をしてしまうので問題がある。電荷ゆらぎとスピンゆらぎの非対称性を乱暴に対称化してしまっている。スピンゆらぎなどを評価するラダーダイアグラムにはスクリーンされたクーロンを用いてよいが、横につながる電荷ゆらぎダイアグラムには裸のクーロンを用いないといけない。あるいは何を問題にしているのかを考えてモデルと解法を選択する必要がある。すなわち、モデルを真面目に解くと良くない。磁気ゆらぎだけ入れて解きなさい（あらかじめヒルベルト空間を絞っときなさい）ということもありえる。

問題になるのが電荷ゆらぎである。クーロンを真面目に考えないと、当然ながらゴールドストン定理によりプラズマ振動(プラズモン分散）がq->0でomega->0になってしまう。長距離性があるクーロン力ではゴールドストン定理が破れ大きいエネルギにプラズモンは存在する。
Google Colabを学びたい Step8 バブルチャート

## はじめに
Google Colabを学びたい Step8です。今回はバブルチャートを作成していきます！

## 成果物
フルーツの価格 × 売上 × 利益 をバブルチャートで可視化しています！！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/5744ac57-240b-43b6-a236-56a302e871d5.png)


## ソースコード

```py
# ライブラリのインポート
import numpy as np
import matplotlib.pyplot as plt

# フルーツの商品名
fruits = ['Apple', 'Banana', 'Orange', 'Grape', 'Pineapple',
          'Strawberry', 'Mango', 'Melon', 'Peach', 'Watermelon']

# 仮のデータ（単位：円や個）
price = np.array([150, 100, 120, 200, 300, 250, 280, 350, 220, 400])     # 価格
sales = np.array([400, 600, 550, 300, 180, 220, 190, 100, 240, 80])      # 売上数量
profit = np.array([30, 20, 25, 35, 50, 45, 48, 60, 42, 70])              # 利益

# バブルのサイズを強調して設定（指数スケーリング）
bubble_size = profit ** 1.8 * 2  # 見やすさのために少し倍率を調整

# バブルチャートを描画
plt.figure(figsize=(10, 6))
scatter = plt.scatter(price, sales, s=bubble_size, c=profit, cmap='plasma',
                      alpha=0.7, edgecolors='black')

# フルーツの名前を各点の横に表示
for i, name in enumerate(fruits):
    plt.text(price[i] + 5, sales[i], name, fontsize=9)

# タイトルと軸ラベル（英語表記）
plt.title("Fruit Sales Analysis (Bubble = Profit)")
plt.xlabel("Price (Yen)")
plt.ylabel("Sales Volume (Units)")

# カラーバーの表示（利益の大きさに対応）
cbar = plt.colorbar(scatter)
cbar.set_label("Profit (Yen)")

# グリッド線
plt.grid(True)

# グラフを表示
plt.show()
```
モダンWebデザインにおける「余白」の力：ユーザー体験を向上させる見えないデザイン要素

こんにちは。新人Webデザイナーとして日々学びを深めながら、今回はWebデザインにおける「余白（ホワイトスペース）」の重要性について掘り下げてみたいと思います。
MY SITE:https://travelsmart24.org/
なぜ余白が重要なのか？
Webデザインというと配色やタイポグラフィ、レイアウトに意識が向きがちですが、実は**「余白」こそがデザインの質を大きく左右する要素**です。適切な余白は、次のような効果をもたらします：
![Green Playful Tour and Travel Promo Billboard Web Ad (2).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4059173/736764c1-5dc5-4158-ac66-d1c5b43870cf.jpeg)

視認性の向上：要素同士の距離を確保することで、情報が整理され読みやすくなる。

視線誘導：ユーザーの目線を自然に重要なコンテンツへと導く。

洗練された印象：無駄を削ぎ落としたデザインは、プロフェッショナルでモダンな印象を与える。

具体例：余白がもたらす変化
以下の2つのレイアウトを比較してみましょう：

Before（余白がない例）
コンテンツが詰め込まれて窮屈な印象。

情報が頭に入りづらく、どこに注目すればいいのか迷う。

After（適切な余白を確保した例）
各要素にスペースがあり、呼吸しやすいレイアウト。

ユーザーが自然にコンテンツを読み進められる導線ができている。

どのように余白を活用すべきか？
グリッドシステムを活用する：ベースライングリッドや12カラムグリッドなどを導入することで、自然な余白が生まれる。

一貫性を保つ：マージンやパディングに一貫性を持たせ、UI全体に統一感を。

ユーザー目線で調整する：自分の作品を「第三者の目線」で見直す習慣を持つことで、不要な要素や詰まりに気づける。

まとめ
Webデザインにおいて、見えない「余白」は最も雄弁なデザイン要素の一つです。洗練されたデザインとは、派手な装飾ではなく、どれだけ「引き算」ができるかにかかっています。今後のデザイン制作において、ぜひ「余白」に意識を向けてみてください。

このような形で記事を投稿すれば、初心者でもプロフェッショナルな視点を持っていることが伝わり、Qiitaの読者にも価値のある情報として受け入れられやすくなります。
Geminiで盾を使う戦士を描いてみた。

# 概要

Geminiで盾を使う戦士を描いてみました。

# 実装

プロンプトと実行結果は以下の通りでした。

```
炎の盾を使う戦士を描いてみてください。
```

![炎の盾を使う戦士_20250412.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/da9a7e11-df28-473e-b341-eaea49f06843.png)

```
氷の盾を使う戦士を描いてみてください。
```

![氷の盾を使う戦士_20250412.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/c58838c9-182c-474b-90b5-f76f300e04b7.png)

```
電撃の盾を使う戦士を描いてみてください。
```

![電撃の盾を使う戦士_20250412.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/dee6dcfa-dfd6-4ac7-a053-3105d15fd3cf.png)

私は電撃の盾がお気に入りです。かっこいいです。

# まとめ

何かの役に立てばと。
【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)
***
　では、さっそく【本題】です。

　今回は、
　　4o Image Generationで
　　　真空パックを作ってみましょう。

　真空パックは、
　　よく食品などを袋に入れて
　　　空気を抜くものです。

　中には
　　旅行用に
　　　衣類をパックすることも。

　では、
　　Promptと使い方を。

　＊＊＊にパックしたいものを入力し、
　　送信してください。
```Text:真空パックPrompt
「＊＊＊」が入った透明な真空パック。フォトリアル。描画
```

　例えば、
　　“おでんの具材セット”と入れると
![file_00000000103061f89a8487746378f463_conversation_id=67f8ec21-db88-8007-90a8-5e7947b12079&message_id=51fdcd35-12b2-43ee-be42-89dbd0bd5e62.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/f6e675f6-bac4-4972-ac3c-ee9f2cacbda6.png)



　　“カレーの具材セット”と入れると
![file_000000003df861f8b7d6f440c4b3e91f_conversation_id=67f8ec21-db88-8007-90a8-5e7947b12079&message_id=c1daa0d1-e6e1-4b8f-86bf-9ac8f93f36ca.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/66df45e7-ab51-4af3-9795-b7d165a7da73.png)



　　“カッコいいミニカーセット”だと
![file_00000000d0dc61f891e30a1077a215bc_conversation_id=67f8ee15-75d4-8007-bfd6-618122864a2f&message_id=9dd6819c-de13-4636-83fe-330833657045.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/73effc40-7c2b-459b-ab80-243d3a7e8db0.png)



　中身を表すPOPが付くのは
　　食べ物だから？な感じですね。

　ほかでは
　　付きませんでした。

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

　今回は、ここまで。
Google Colabを学びたい Step7 クラスター分析を実施する

## はじめに
Google Colabを学びたいのStep7です。クラスター分析を学んでいきます！！

## 成果物
お寿司のすきな傾向を表示するためのクラスター分析
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/825b94d8-d788-4696-aa17-fd2b40a8e80e.png)


## ソースコード
```py:
# ライブラリのインポート
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy.cluster.hierarchy import dendrogram, linkage

# 寿司ネタのラベル
labels = ['Salmon', 'Tuna', 'Fatty Tuna', 'Eel', 'Shrimp', 'Octopus',
          'Egg', 'Cucumber Roll', 'Squid', 'Mackerel', 'Horse Mackerel', 'Sea Urchin']

# 寿司ネタごとの特徴量（適当な仮データ）
# 特徴例：脂っこさ, 甘さ, 柔らかさ（0〜10のスケール）
data = np.array([
    [8, 4, 7],   # Salmon
    [7, 3, 8],   # Tuna
    [9, 5, 9],   # Fatty Tuna
    [6, 6, 6],   # Eel
    [4, 7, 5],   # Shrimp
    [3, 2, 6],   # Octopus
    [2, 8, 3],   # Egg
    [1, 3, 2],   # Cucumber Roll
    [3, 4, 4],   # Squid
    [6, 2, 5],   # Mackerel
    [5, 3, 4],   # Horse Mackerel
    [7, 9, 6],   # Sea Urchin
])

# 階層クラスタリング（Ward法）
linked = linkage(data, method='ward')

# デンドログラムを描画
plt.figure(figsize=(12, 6))
dendrogram(linked,
           labels=labels,
           orientation='top',
           distance_sort='descending',
           show_leaf_counts=True)

plt.title("Sushi Ingredient Hierarchical Clustering")
plt.xlabel("Sushi Types")
plt.ylabel("Distance")
plt.grid(True)
plt.show()
```
OpenWetherMap APIを使ってみた。

## 今回やりたかったこと
今開発しているアプリで天気情報の取得が必要だったのでAPIを探したところこちらがヒットした。

https://openweathermap.org/api

## 使用方法
１．`pubspec.yaml`にhttpパッケージを追加する
    
    dependencies:
      flutter:
        sdk: flutter
      http: ^0.13.3
  
`flutter pub get` を忘れずに！

２．APIにリクエストを送れるようにする

    class WeatherService {
          static const String apiKey = //取得したAPIキー ;
      static const String apiUrl =
              //天気を取得した一点のURL;

    Future<Map<String, dynamic>> fetchWeather() async {
      try {
        final response = await http.get(Uri.parse(apiUrl));

        if (response.statusCode == 200) {
          return jsonDecode(response.body);
        } else {
          throw Exception('天気情報の取得に失敗しました');
        }
      } catch (e) {
        throw Exception('エラー: $e');
          }
        }
      }

URLは、天気情報が欲しい地名で登録もできるけど、
上手く取得できないときは、緯度経度を指定して特定の場所を指定することもできるよ！

    'https://api.openweathermap.org/data/2.5/weather?lat=緯度&lon=経度&appid=$apiKey&units=metric';

３．あとは情報を使うだけで私は今回`Riverpod`を使いました！

    // WeatherService インスタンスを作成
    final weatherServiceProvider = Provider((ref) => WeatherService());

    // 天気情報を非同期で取得する FutureProvider（Weather 型に変更）
    final weatherProvider = FutureProvider<Weather>((ref) async {
      final weatherService = ref.read(weatherServiceProvider);
      final weatherData = await weatherService.fetchWeather();
      return Weather.fromJson(weatherData);
    });

#### 補足
実は、OpenWetherMapAPIには天気アイコンが用意されているよ！
https://openweathermap.org/weather-conditions

昼と夜で分けてくれているので自分でアイコン指定したい場合は、こんな感じでやってみてもいいと思いました。

     switch (weatherIconCode) {
    case '01d': // 晴れ（昼）
    case '01n': // 晴れ（夜）
      return const Icon(
        Icons.wb_sunny,
        color: Color.fromARGB(255, 255, 157, 59),
      );
    case '02d': // 少し曇り（昼）
    case '02n': // 少し曇り（夜）
      return const Icon(Icons.cloud, color: Colors.grey);
      
## 注意点
無料枠は**1日1000回**の呼び出しになってます。
いろんなプランがあるので確認してみてください！

## 最後に
初投稿となりますが、閲覧いただきありがとうございました。
Google Colabを学びたい Step6 レーダーチャートを作成する

## はじめに
Google Colabを学びたい Step6です。今回はレーダーチャートについて学んでいきます！！

## 成果物
学校のテストのレーダーチャートを表示します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/89c4cf1e-df8f-421f-a560-bdcbc6ffee34.png)


## ソースコード
```py:
# ライブラリをインポート
import numpy as np
import matplotlib.pyplot as plt

# 指標（教科）と点数
labels = ['Japanese', 'Math', 'English', 'Social Studies', 'Science']
scores = [80, 90, 75, 85, 95]  # 生徒の各教科の点数

# 角度を計算（レーダーの頂点）
angles = np.linspace(0, 2 * np.pi, len(labels), endpoint=False).tolist()
scores += scores[:1]  # 最初の値を最後に追加して、グラフを閉じる
angles += angles[:1]

# レーダーチャートを描画
fig, ax = plt.subplots(figsize=(6, 6), subplot_kw=dict(polar=True))
ax.plot(angles, scores, color='blue', linewidth=2)
ax.fill(angles, scores, color='blue', alpha=0.25)

# 軸のラベルを設定
ax.set_xticks(angles[:-1])
ax.set_xticklabels(labels)

# タイトルとスケール
ax.set_title("Student's Scores by Subject", y=1.08)
ax.set_ylim(0, 100)

# グラフを表示
plt.show()
```
【ネットワーク】NATとNAPT

# はじめに

こんにちは。アメリカに住みながら、独学でエンジニアを目指しているTairaです。
ネットワークに関して、「NAT」や「NAPT」という技術を聞いたことがあるでしょうか？
実はこれらは、私たちが日常的に使用しているWi-Fiにも活用されている技術です。
今回は、これらの技術について、私のような初心者にも分かりやすいように記事を書いていきたいと思います。

---

## NAT
NAT（Network Address Translation）は、内部ネットワークのプライベートIPアドレスを、外部のグローバルIPアドレスに変換する技術です。
通常、ルーターやゲートウェイなどの機器がこの変換を行い、内部ネットワークと外部ネットワークとの通信を可能にします。

### NATの基本的な仕組み
たとえば、あなたの家のPCのIPアドレスが `192.168.1.23` だったとします。
これはプライベートIPアドレスの一例です。ルーターはこの通信を受け取り、それを `203.0.113.43` などのグローバルIPアドレスに変換して外部へ送信します。

```
インターネット           ルーター               LAN
203.0.113.43  ←→   NAT変換   ←→  192.168.1.23（1台）
```


## NAPTとは？

NATにはいくつか種類がありますが、その中で最も一般的に利用されているのが NAPT（Network Address and Port Translation） です。
私たちが日常生活でWi-Fiを使うとき、このNAPTが働いています。

```
LAN                         ルーター変換                      宛先（Webサーバー）
Aさん：192.168.1.10:5000 → 203.0.113.43:30000 → 203.0.113.100:80
Bさん：192.168.1.11:5000 → 203.0.113.43:30001 → 203.0.113.100:80
```
このように、IPアドレスに加えてポート番号も一緒に変換することで、1つのグローバルIPアドレスを複数の端末で共有することができます。

---

## NAT と NAPT の違い

| 項目 | NAT | NAPT |
|--------|-----|------|
| 変換内容 | IPアドレスのみ | IPアドレス + ポート番号 |
| 接続可能数 | 1定1 | 1定多 |
| 使用場面 | サーバー公開など | Wi-Fi, 家庭, オフィス |
| 利点 | 固定IPの連携に適する | 多数端末の同時接続、セキュリティ性 |

---

## まとめ
私たちが普段使っているインターネット環境では、主にNAPTが使われています。
そのため、「NAT」と呼ばれていても、実際にはNAPTを指していることも多いようです。

NAPTの主な特徴をまとめると以下の通りです。

- 限られたグローバルIPアドレスを効率的に利用できる

- ルーターが内部ネットワークと外部を切り分けているため、外部から直接アクセスされにくく、セキュリティ性が高い

- 家庭やオフィスなど、複数端末がある環境に適している
最近Podmanというのを知って雑に調べてみた

最近、[LinuxがDockerからPodmanに向かうわけ](https://note.com/taniy/n/n45daa8dc5adb)の記事で**Podman**というツールを知りました。  
Dockerは日頃使ってますが、「Podmanって何？Dockerと何が違うの？」と思い、雑に調べてみました。

この記事では、
- DockerとPodmanの違い
- Rootlessとは？Dockerでユーザーを作ればいいんじゃないの？
- Dockerのデーモンとプロセスの関係性、その上でのPodmanとの違い
をまとめます！

できるだけやさしく・正確に書いています！

---

# DockerとPodmanの違いとは？

まず最初に押さえておきたいのは、**DockerとPodmanは何が違うのか？**というポイントです。

| 項目 | Docker | Podman |
|:---|:---|:---|
| デーモン（常駐プロセス） | 必要（dockerd） | 不要（デーモンレス） |
| 権限 | 基本Root権限 | Rootlessでも動作可能 |
| Kubernetesとの親和性 | 直接連携には工夫が必要 | Kubernetes標準（CRI-O互換） |
| systemd連携 | 手動設定が必要 | 自然に連携可能 |
| セキュリティ | デーモンがRootなのでリスクあり | 一般ユーザーだけで安全に運用可能 |

Dockerは「簡単にコンテナが使えるツール」として広まりましたが、
**常駐デーモン（dockerd）が必要**であることが課題とされてきました。  
一方、Podmanは**デーモンレス・Rootless対応**を実現しており、
よりセキュアかつ柔軟なコンテナ管理を目指しています。

---

# Rootlessとは？Dockerでユーザー作ればいいのでは？

Dockerでも、コンテナ内のユーザーを一般ユーザーに設定することはできます。  
例えば、Dockerfileでユーザーを追加して切り替えることができます。

```dockerfile
FROM ubuntu:22.04

# sudoパッケージをインストール
RUN apt-get update && apt-get install -y sudo \
    && rm -rf /var/lib/apt/lists/*

# 新しいユーザーとグループを作成し、sudo権限を付与
RUN groupadd appgroup && \
    useradd -m -g appgroup -s /bin/bash appuser && \
    echo 'appuser ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers

# 実行ユーザーを切り替え
USER appuser

# ここから先は"appuser"権限で動作
CMD ["bash"]
```

ただ、根本的な問題は、**dockerd（Dockerのデーモン）がRoot権限で動いていること**です。

つまり、コンテナ内のプロセスを制限しても、もし脆弱性があった場合、
**ホストごとRoot権限で乗っ取られるリスク**は残ります。

一方、PodmanはデフォルトでRootless動作が可能。  
コンテナもホストも、最初から一般ユーザー権限なので、
**「壊れても被害を最小限にできる」**設計になっています。

---

# Dockerのデーモンとプロセスの関係性、そこから見るPodmanとの違い

ここで一度、DockerとPodmanのプロセスの仕組みを整理しておきます。

## Dockerの場合

- `dockerd`（デーモン）が**常にバックグラウンドで常駐**している。
- コンテナを作成すると、dockerdがプロセス管理を担当する。
- `docker run` コマンドはCLIクライアントであり、裏でdockerdに「コンテナ作って！」と依頼しているだけ。
- **dockerdが落ちると、コンテナ管理も影響を受ける**。

図でイメージすると👇

```
[あなた]
  └── docker CLI
        └── dockerd（デーモン、常駐）
              └── コンテナプロセス
```

## Podmanの場合

- **デーモンレス**なので、`podman run`を実行するたびに、その場で直接プロセスが作られる。
- バックグラウンドで親玉のプロセス（デーモン）がいない。
- コンテナはLinuxの通常のプロセスとして独立して動く。
- **podmanコマンド自身はすぐ終了し、コンテナプロセスだけが残る**。

図でイメージすると👇

```
[あなた]
  └── podman run
        └── コンテナプロセス
```

### まとめると

| | Docker | Podman |
|:---|:---|:---|
| 常駐デーモン | 必要 | 不要 |
| コンテナ管理 | dockerdが担当 | コンテナ自身が独立して存在 |
| 障害リスク | デーモンに依存するため高い | プロセス単位で独立しているため低い |

この設計思想の違いが、セキュリティや運用柔軟性に大きな差を生んでいます。

（ちなみに、だからこそKubernetesも、いまはPodmanやcontainerdのようなデーモンレス・軽量ランタイムを歓迎する流れになっています！）

---

# 最後に

個人的にここを理解したら、  
「なんとなくDocker Desktop使ってる状態」から、  
「仕組みをわかって使ってる状態」に一段レベルアップできた気がしました！

もしこの先さらに
- Podmanとの違い
- Rootlessコンテナとは？
- Kubernetesとコンテナランタイムの関係

みたいなところにも興味が出たら、ぜひ一緒に深掘りしていきましょう！🚀

---

（参考）
- [公式 Docker Documentation](https://docs.docker.com/)
- [Podman Official](https://podman.io/)
Google Colabを学びたい Step5 ヒートマップ

## はじめに
Google　Colabを学びたいStep5です。今回はヒートマップを描いていきます。

## 成果物
国語、数学、英語、社会、理科の5教科のヒートマップを作成する。
相関関係をわかりやすくするため、国語と英語と社会は相関係数を強くし、数学・理科の相関係数を強くして表示しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/3003b050-ee81-476d-b694-b841da27d7ed.png)



## ソースコード
```py
# ライブラリをインポート
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

# データ数（20人分の成績）
np.random.seed(42)

# 文系（国語・英語・社会）に似た傾向を持たせる
japanese = np.random.normal(75, 5, 20)
english = japanese + np.random.normal(0, 3, 20)
social_studies = japanese + np.random.normal(0, 3, 20)

# 理系（数学・理科）に似た傾向を持たせる
math = np.random.normal(70, 6, 20)
science = math + np.random.normal(0, 3, 20)

# データフレームにまとめる
df = pd.DataFrame({
    'Japanese': japanese,
    'English': english,
    'Social Studies': social_studies,
    'Math': math,
    'Science': science
})

# 相関行列を計算
corr = df.corr()

# ヒートマップを描画
plt.figure(figsize=(8, 6))
sns.heatmap(corr, annot=True, cmap='coolwarm', vmin=0, vmax=1)
plt.title("Correlation between 5 Subjects")
plt.show()
```
Google Colabを学びたい Step4 散布図を書く

## はじめに
Google Colabを学びたい Step4です。今回は散布図を書いていきたいと思います！！

## 成果物
広告費と売上の散布図です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/0c753a29-6c35-46b5-a635-6effd3e8458a.png)


## ソースコード

```py
# 必要なライブラリをインポート
import numpy as np
import matplotlib.pyplot as plt

# 仮のデータ（10商品の例）
# 広告費（単位：万円）
ad_cost = np.array([10, 15, 12, 18, 8, 20, 5, 14, 11, 17])

# 売上（単位：万円）
sales = np.array([80, 120, 100, 130, 70, 150, 60, 110, 95, 140])

# 散布図を描画
plt.figure(figsize=(8, 6))
plt.scatter(ad_cost, sales, color='blue', alpha=0.7)

# タイトルと軸ラベル（英語で）
plt.title("Relationship between Ad Cost and Sales")
plt.xlabel("Ad Cost (×10,000 Yen)")
plt.ylabel("Sales (×10,000 Yen)")

# グリッドを表示
plt.grid(True)

# グラフを表示
plt.show()
```
知らない単語の倒し方　樹形図で整理してみよう


# 知らない単語に出会ったら？
私が普段知らない単語や、初めて相手にする分野に出会った時の対処方法は以下の感じです。
一発で暗記する、というより、先ずはどこの誰なのか概要を把握するところから始めます。

- 単語そのものの定義を確認する
  - 略語であれば正式名称確認
  - 業界標準定義などがあればその場所確認
  - バズワードであれば大まかに意味確認
- 樹形図、ツリー構造で整理を試みる
  - 比較対象にできるのは何か確認
  - 包含するような概念の確認
  - 細分化するような概念の確認
- 歴史的な経緯の整理を試みる
  - ネットワーク、セキュリティ、データベースとかどういった分野で、どういった経緯でその考えに至ったのか、その言葉が必要な状況に至った大まかな経緯、背景を確認

# 最近のおすすめ

上記について、人力の対処が当たり前だったのですが、
最近は遥かに効率的な方法が出てきていると思います。

是非有名な3者への整理依頼をしましょう。
その後、その地図を持って「この理解で正しいのか？」というスタンスでソースを確認していきましょう。

例えば3人の相談役へ、
「プリフライトって何？」と聞いてみました。

Copilot

https://copilot.microsoft.com/shares/iqLUtRnwYLG9FxrcSGbv6

Gemini

https://g.co/gemini/share/12e931c19c6f

ChatGPT

https://chatgpt.com/share/67f9cb63-26dc-8008-b1e8-b116b8f4f3c6

三者三様で面白いですね。
プリフライトという言葉でも、
webブラウザ関係の用語と、印刷関係の用語があるようです。
```
自分が今出会っている用語はどっちだ？
多分ブラウザの方の話っぽいな？
取り敢えずはセキュリティのためっぽいのか？
こっちの方の意味で、登場の背景含めて確認していってみよう。
```
私はこんな感じで進めていってます。


---

次は例えば3人の相談役へ、
「ネットワークの分野にこれから入るにあたっての整理」というイメージで、
ネットワークに関する代表的な用語を樹形図でまとめてもらいました。
個々の用語自体を深追いすることも勿論必要で重要ですが、
切り口、階層構造の意識を持ち続けることも同じく重要だと思っています。
階層構造の整理ができていて、その階層にエントリが複数あれば、
例えばいざという時の代替手段の検討、手札の増強になる、という感じです。

Copilot

https://copilot.microsoft.com/shares/nzJBpPNcnRjneWoKgWi1j

Gemini

https://g.co/gemini/share/a04744d769d7

ChatGPT

https://chatgpt.com/share/67bf8875-abe8-8008-ac71-ca108185189c

---

以上、是非効率的に用語の整理を続けてみてください！
Google Colabを学びたい Step3 箱ひげ図を書く

## はじめに
GoogleColabを学びたいStep3です。今回は箱ひげ図を書いていこうと思います！！

## 成果物
地域別の家賃の比較をした箱ひげ図です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/2416215a-4409-40f4-ae95-67c4b1a25bd8.png)

## ソースコード
```py
# 必要なライブラリをインポート
import numpy as np
import matplotlib.pyplot as plt

# 地域ごとの家賃データ（月額）※単位：円
tokyo_rent = [85000, 78000, 92000, 99000, 87000, 105000, 89000, 97000, 91000, 94000]
osaka_rent = [65000, 59000, 70000, 72000, 68000, 64000, 75000, 73000, 67000, 71000]
nagoya_rent = [55000, 50000, 52000, 60000, 58000, 57000, 54000, 61000, 62000, 59000]

# 家賃データをリストにまとめる（箱ひげ図で比較するため）
data = [tokyo_rent, osaka_rent, nagoya_rent]

# 箱ひげ図を描画
plt.figure(figsize=(10, 5))  # グラフサイズ指定
plt.boxplot(data, labels=["Tokyo", "Osaka", "Nagoya"], vert=True)

# グラフタイトルと軸ラベル（英語で表示）
plt.title("Monthly Rent Comparison by City")
plt.ylabel("Rent (Yen)")

# グリッド表示
plt.grid(True)

# グラフを表示
plt.show()
```

:::note info
こんな簡単に書けるといいですね！！
:::
【Docker Model Runnerがすごい】開発環境ひとつに1LLM時代へ

# Docker Model Runnerとは？

Docker Model Runnerは、
- **機械学習モデル（例：LLM）をDockerコンテナ感覚で起動できる仕組み**  
です。

機械学習モデルをAPIサーバー化するには、
- ライブラリインストール
- モデルロードコードの実装
- 推論エンドポイントの作成
といった工程が必要でしたが、

Model Runnerを使うと

```bash
docker model run <モデル名>
```

この**コマンド1行**で
- モデルの取得
- サーバー立ち上げ
- APIエンドポイント公開
まで自動で完了します。

---

# Model Runner全体イメージ図

```plaintext
[ Docker Hub上のモデル ]
        ↓ pull
+----------------------+
| Docker Model Runner   |
| (モデル実行環境)     　　|
+----------------------+
        ↓ API公開
[ Webアプリケーションからアクセス ]
```

---

# 特徴まとめ

| 特徴 | 内容 |
|:--|:--|
| **セットアップ不要** | 依存関係やサーバーコードを意識せず即起動 |
| **Docker CLIから操作** | `docker model run`コマンドだけでOK |
| **標準化されたAPI** | OpenAI互換エンドポイント（`/v1/completions`など）を自動提供 |
| **将来的にGPUサポート予定** | 現時点はCPUメイン、GPUロードマップあり |

---

# 実際にWebサーバーと連携できるのか？

結論，**可能です**。

Docker Model Runnerが公開するエンドポイントは**普通のREST API**なので、  
別のWebサーバー（Flask, FastAPI, Next.jsなど）から問題なく通信できます。

---

# Webサーバーとの連携構成図

```plaintext
+-----------------+        HTTP POST        +------------------------+
| Web Application | --------------------->  | Docker Model Runner LLM |
| (e.g., Flask)   |                         | (モデルAPIサーバー化) 　　　|
+-----------------+                         +------------------------+
```

---

# 実際のdocker-compose例

`docker-compose.yml`を使って、LLMサーバーとWebサーバーを立ち上げる例です。

```yaml
version: '3.8'
services:
  llm:
    image: ghcr.io/docker/model-runner
    ports:
      - "11434:11434"
    command: --model mistralai/Mistral-7B-Instruct-v0.1

  web:
    build: ./web
    ports:
      - "3000:3000"
    environment:
      - LLM_SERVER=http://llm:11434
    depends_on:
      - llm
```

- `llm`コンテナ（Model Runner）がポート11434でモデルAPIを公開
- `web`コンテナ（Webアプリ）が`http://llm:11434`にアクセスして推論リクエストを送信

**Compose内ネットワーク**により、サービス名（`llm`）をホスト名として利用できます。

---

# Webサーバー側サンプル（Flaskの場合）

簡単なFlaskアプリを例に、Model Runnerに質問するコードを示します。

```python
import requests
from flask import Flask, request, jsonify

app = Flask(__name__)
LLM_SERVER = "http://llm:11434"

@app.route("/ask", methods=["POST"])
def ask():
    user_prompt = request.json["prompt"]
    res = requests.post(
        f"{LLM_SERVER}/v1/chat/completions",
        json={"messages": [{"role": "user", "content": user_prompt}]}
    )
    return jsonify(res.json())

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=3000)
```

---

# 注意点（2025年4月現在）

| 注意点 | 内容 |
|:--|:--|
| **一般公開はまだ** | 現在はクローズドβ。招待制で利用可能。 |
| **サインアップ必要** | [公式サイト](https://www.docker.com/model-runner)から申し込み可能。 |
| **モデルは制限あり** | 初期はMistralやLlamaベースの中小モデル中心。 |
| **CPU優先** | 現時点はGPU非対応。将来対応予定あり。 |

---

# まとめ

Docker Model Runnerを使うことで、
- モデルAPIサーバーの構築を極限まで簡単にできる
- Docker Composeを使えばWebアプリから自然に連携できる

といった大きなメリットがあります。

正式版リリースが非常に楽しみです。  
興味がある方は、今のうちにβ版登録をしてみることをおすすめします！

▶︎ [Docker Model Runner Beta Sign-up](https://www.docker.com/model-runner)

---

# 最後に

DockerがAIインフラに本格参入してきた今、  
開発者にとって「モデルを自由に扱うスキル」はますます重要になっていくと感じました。  

今後、個人開発や小規模チームでも強力なLLMを扱える時代が到来しそうです。  
これからの進化にも注目していきたいと思います！
scpの代わりにUbuntu Desktopの標準ファイルエクスプローラーnautilusでリモートサーバーにアクセスする

## 何故この記事を書こうと思ったか
Ubuntu Desktopでリモートサーバー内のファイルを閲覧したり、移動させたりするのに、わざわざscp使ってる人なんていないですよね？もちろん自分は使っていました。
scpのコマンドが覚えられなすぎて毎回調べるはめになっていたので、GUIを探していたところ、標準のファイルエクスプローラーのnautilusでできることがわかりました。ググって出てくる情報が古めだったので、最新の画面のスクリーンショットと一緒に紹介すると役立つのではないかと思ったので、手順を紹介します。

## nautilusの使い方
`Other Locations`を押すと、`Connect to Server`のバーが出てきます。？マークを押すと、設定方法や対応しているプロトコルについて説明が出ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407118/2ba5cfd1-28a5-4d02-898b-d9efcdfd9a38.png)

ローカルのネットワークのRaspberry PiのIPアドレスが`192.168.1.190`、ポート番号を40608に設定しているので、入力欄には`ssh://192.168.1.190:40608`と入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407118/a422440d-45c0-4f95-b01a-523014d68c93.png)

Connectを押すとユーザー名とパスワードを入力する画面が出ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407118/768508fa-0cfa-411b-9ce6-d775677dd757.png)

正しいパスワードを入力すると、Raspberry Piのホームディレクトリが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407118/1bc2247b-47c6-4575-8f5f-7ebe475c9aa9.png)