OmniAICreator/Qiita-1.07M huggingface dataset:
Macで内部音声付きの画面録画をするには？BlackHoleの導入方法（M4 Mac対応）


## はじめに
Twilioで音声通話のデモ動画を作成する際、****通話相手の音声（＝PCから出る音声）も録音したい****という場面があります。  
以前はIntel Macで****Soundflower****を使っていたのですが、M4チップ搭載のMac miniに買い換えたところ、Soundflowerが動かなくなってしまいました。
そこで今回、代替手段として****BlackHole****を導入しました。  
この記事では、****BlackHoleのインストール方法から画面収録時の設定手順まで****、M4 Macでの使用事例を交えて詳しく解説します。

## BlackHoleとは？
[BlackHole](https://existential.audio/blackhole/) は、Mac用の****仮想オーディオドライバ****で、システム内の音声出力をそのまま録音に利用するためのツールです。  
Zoomの録音や、デモ動画など****内部音声をキャプチャしたい場合の定番ツール****です。  
Soundflowerの後継的な立ち位置にあり、Appleシリコンでも安定して動作します。


---
## インストール手順（Homebrew使用）

### 使用環境
- Mac mini 2024 (M4 Pro)
- macOS Sequoia 15.5（24F74）
- Homebrew導入済み

### BlackHoleのインストール

BlackHoleはHomebrew経由でインストール可能です。  
公式では `--cask` の明記が推奨されているので、以下のコマンドでインストールします。  

```

brew install --cask blackhole-2ch

```


#### 補足：私の実行コマンド
  
実際には、以下のように `--cask` を省略してもインストールできました：
  

```

brew install blackhole-2ch

```

Homebrewが自動でCaskを認識してくれたようです。ただし、****明示的に**`**--cask**`**を付ける方が安心です****。

  

### 実行ログ（一部抜粋）

```
==> Downloading https://existential.audio/downloads/BlackHole2ch-0.6.1.pkg
==> Installing Cask blackhole-2ch
==> The install was successful.
==> You must reboot for the installation of blackhole-2ch to take effect.
```

### Macを再起動

ログにもあるように、****再起動が必要です****。  
再起動することでBlackHoleのドライバがOSに正しく読み込まれます。

##  **BlackHoleの設定方法**
### インストール確認
再起動後、「システム設定 → サウンド」を開くと、出力先に `BlackHole 2ch` が表示されているはずです。
![SCR-20250531-syjb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/649595/3834d9fe-3ffd-4307-83e9-e9d68c0fbc50.png)


### 複数出力装置の作成
録音しつつ、****自分の耳でも音声を聞きたい****場合は「複数出力装置」の作成が必要です。
#### 手順：
1. 「アプリケーション」→「ユーティリティ」→「Audio MIDI設定」を開く  
2. 左下の `＋` ボタン → 「複数出力装置」を選択  

    ![SCR-20250531-tbsj.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/649595/9bbb8702-6edc-457a-9404-d8f37ea1e99b.png)

3. 「内蔵出力」および「BlackHole 2ch」の両方にチェックを入れる  

    ![SCR-20250531-tbxz.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/649595/11ace452-b69e-4f28-9e4b-29cb88809be8.png)


### 出力デバイスを切り替える
「システム設定 → サウンド → 出力」から、先ほど作成した****複数出力装置****を選びます。
    ![SCR-20250601-hzyv.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/649595/6ce94ddf-51d8-4757-89c1-1ce8e42167f7.png)


これで「PCからの音声をBlackHoleに流しつつ、スピーカーにも出力」できる状態になりました。

### 実際に画面録画してみる
画面収録ソフト（macOS標準の画面収録やOBSなど）で、****マイク入力に「BlackHole 2ch」****を選択します。
    ![SCR-20250601-icov.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/649595/605475f5-c078-496a-a9cf-31b866e87250.png)

あとは録画を開始すれば、****PC内で再生している音（通話相手の音など）も含めて録音できます！****
***実際に画面収録で録画・録音した動画***
<iframe width="560" height="315" src="https://www.youtube.com/embed/-KB2SiM7rQE" frameborder="0" allowfullscreen></iframe>

## まとめ
- M4 MacではSoundflowerが使えないため、BlackHoleが有力な代替手段です  
- Homebrewを使えば簡単にインストール可能（`--cask`推奨）  
- 複数出力装置を作ることで「録音＋スピーカー出力」を両立できます  
- 画面録画時に「BlackHole 2ch」をマイクとして選べば内部音声をキャプチャ可能です
  
---
## 最後に

Twilioなどの通話デモを録画する際、****視覚と音声の両方が正確に伝わる****ことで、より説得力のある資料になります。  
技術ブログやYouTube収録にも便利なので、****内部音声録音にお困りの方はぜひ試してみてください！****
SAP標準アダプターの移送とデプロイでつまずいた話

# はじめに
今回Integration SuiteでSAP標準アダプターを利用したiFlowを作成し、SAP Cloud Transport Management（cTMS）を使って開発環境から本番環境へ移送しました。
本番環境でいざiFlowのデプロイを行おうとしたところ、エラーとなって原因がわからず解決まで困りましたので、その内容について記載します。

移送については以下で概要を書いています。
[SAP Cloud Transport Managementを利用したiFlowの移送についての概要](https://qiita.com/again_qt/items/19cfd4e67a009cb8d443)

# 遭遇したエラー
開発環境から本番環境へ、SAP標準アダプターを利用したiFlow移送しデプロイをしたところ、以下のエラーが発生しました。
```
[CONTENT][CONTENT_DEPLOY][RuntimeError] : {"message":"CAMEL_CONTEXT_NOT_STARTED"}
```
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486466/99576ff7-6d21-4220-bde8-01353bc6bd92.png)

# 原因調査
調べたところ以下のSAP noteが見つかり、iFlowで利用しているSAP標準アダプターのバージョンが原因なのか？と思い当たります。
SAP note：https://me.sap.com/notes/0003564160

Designからバージョンを確認してみるも、開発と本番環境は同じバージョンでした。
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486466/1cda8ed5-895c-497c-800a-387f6c689bf6.png)
他に原因があるのか？と色々と確認・調査をしましたが、原因が見つからず困り果てていたところ、DesignではなくMonitor＞Manage Integration Contentから確認すると、開発環境のみSAPのデプロイによってバージョンが上がっていることが判明しました。
![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486466/4fe3f639-014f-4dd1-ac5c-29b12eeafd73.png)


# おそらくの原因
なぜ、開発と本番環境でバージョンの差異が発生したのか。
今回、本番環境への移送と、本番環境でのデプロイのタイミングがずれておりました。
本番環境への移送とデプロイの間に、SAPによる内部アップデートが発生、開発環境はデプロイ済みでしたので内部アップデートによりバージョンが更新されたものの、本番環境はデプロイしていなかったので内部アップデートの対象外となり、バージョンに差異が発生したのではと考えられます。
簡単な流れとしては以下です。
![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486466/a8f73f10-11b3-4e2e-b953-44ec240733fc.png)

# 解決のために
ひとまずもう一度、開発から本番環境へアダプターを移送しましたが、Designから確認できるバージョンが適用されるのか、バージョンは更新されませんでした。どうやらアダプター自体を差し替える（一度削除の上、改めて追加）必要があるようです。
今回は開発と本番環境のバージョンを揃えるため、開発環境でアダプターを差し替え、本番環境へ移送しました。本番環境への移送時、またしてもエラーが発生しました。
エラーの内容は「[UniquenessViolationException](https://qiita.com/again_qt/items/01c9bbc0ea0ba1728692#%E3%82%A8%E3%83%A9%E3%83%BC4uniquenessviolationexception)」です。
開発環境のアダプターを差し替えているので、本番環境とアダプターの名称は同じですが、内部IDが変わってしまっています。そのため、本番環境のアダプターが入っているパッケージを削除してから再度移送を実施することで、やっとエラーが解決しました。

# おわりに
今回はアダプターの移送とデプロイの期間が空いてしまっていたので、移送時にデプロイまで行っておけばよかったと振り返って思いました。そうすれば今回のエラーは避けられたかと思います。
またバージョンも、どこから確認するかで違う場合があるのは今回初めて知りました。次回以降、気をつけたいと思います。
WSL2 + Docker + React開発でHot Reload

## はじめに

Windows + WSL2 + Docker で React アプリを開発していると、ソースを保存しても Hot Reload が効きませんでした。

これは、ファイル監視ライブラリ `chokidar` が Linux（WSL2やDocker）から見た Windows 側のファイル変更をうまく検知できないために発生します。

そんなときの対処法を紹介します。

## 環境

- OS：Windows 11
- WSL2（Ubuntu）
- Docker CE
- React（`create-react-app`）
- ソースコードは Windows 側に配置

## 問題：Hot Reload が効かない

Docker コンテナからバインドマウントされた Windows 側のソースは、Linux 側からはネイティブなファイル監視が効かないため、React の開発サーバーで使用されている `chokidar` による変更検知がうまく動作しません。

## 解決策：`CHOKIDAR_USEPOLLING` を使う

```bash
CHOKIDAR_USEPOLLING=true
```

この環境変数を使うことで、`chokidar` はネイティブ監視を諦めて、ポーリング方式（定期チェック）でファイル変更を検知するようになります。

## ポーリングの欠点と改善：`CHOKIDAR_INTERVAL`

デフォルトではポーリング間隔が非常に短いため、CPU使用率が上がってしまうことがあります。

```bash
CHOKIDAR_INTERVAL=1000
```

と設定すれば、ポーリング間隔が1秒になり、負荷が大きく下がります。開発時には十分な応答性があります。

## Docker Compose での設定方法

`docker-compose.yml` に次のように環境変数を追加します：

```yaml
version: '3'
services:
  frontend:
    build: .
    volumes:
      - .:/app
    working_dir: /app
    ports:
      - "3000:3000"
    environment:
      - CHOKIDAR_USEPOLLING=true
      - CHOKIDAR_INTERVAL=1000
    command: npm start
```

## その他の設定方法

### `.env.development` を使う

```env
CHOKIDAR_USEPOLLING=true
CHOKIDAR_INTERVAL=1000
```
Claude4 + MCPで作る！なんちゃってコーディングエージェント体験

こんにちは。
今日は、Claude4 + MCPを使った**擬似**コーディングエージェント体験についてまとめます。

# なぜ、やろうと思ったか？
世の中にはGithub CopilotやCursorやDevinなどコーディングをサポートしてくれるアプリケーションが多々あります。
私自身、Devinは使ったことがないですが、CopilotやCursorを使う中で一つどうにかならんかなあと思うことがありました。

それは、ライブラリやフレームワークの最新状態についていけてないという点です。
いうほどヘビーユーザーではないので、もしかしたら使い方が悪いってだけな話かもですが、新しいライブラリを試している時や、新しい仕様になったAPIを使う時、昔の情報に書き換えられたらすごく嫌なのです。（動けばok説もある）

しかし、ChatGPTをはじめ、ClaudeにもSearchの機能がついており、最新状態を反映しようと思えばいつでもできます。
そして、Claudeのデスクトップアプリであれば、MCPを使って簡単にローカルのディレクトリをリソースとして渡せます。だからこそ、今回の用途にぴったりだと思いました。

# ⚙️ 実現方法
Claudeデスクトップアプリでアクセスさせたいディレクトリの情報を与えます。

## 1. 設定ファイルの編集

Claude Desktopを起動し、メニューから「Settings（設定）」を選択します。左側の「Developer（開発者）」タブをクリックし、「Edit Config（設定を編集）」を選択すると、設定ファイル `claude_desktop_config.json` が開きます。

## 2. 設定内容の追加

開いた設定ファイルに以下の内容を追加します（username はご自身のユーザー名に置き換えてください）：

macOSの場合

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

**Windowsの場合**

```
{
  "mcpServers": {
    "filesystem": {
      "command": "npx",
      "args": [
        "-y",
        "@modelcontextprotocol/server-filesystem",
        "C:\\Users\\username\\Desktop",
        "C:\\Users\\username\\Downloads"
      ]
    }
  }
}
```

### 必要に応じて、他のディレクトリパスを追加することも可能です。

**3. Claude Desktopの再起動**

設定を反映させるために、Claude Desktopを完全に終了し、再起動してください。

# 感想
Cursorは0 -> 1を作る段階やライブラリ等のバージョンがハマっている時には非常に便利だし、積極的に使っていきたいのですが、
変えたくない部分を弄らなきゃいけない時なんかにすごくフラストレーションを感じました。

そこで、ClaudeのようにSearch機能を備えたアプリケーション上でコーディングエージェントらしく振る舞わせることにより、上記の課題を解決することを試みました。

メリットとしては上記に挙げた、情報への追随があります。

デメリットとしては、コーディングエージェントとして設計されていないが故のUXの悪さです。
たとえば、ターミナルが使えなかったり、ファイルの変更に対して簡単に巻き戻せなかったりします。

この辺りも実はやる方法があるかもしれません。
ターミナルなんかはcomputer useとか？MCPでもなんとかなるやも？

個人的に一番あったら嬉しいのはCursorとかコーディングエージェント側にそういった機能を提供してもらうことですね。
それが一番楽で嬉しいです。

何かご意見ご指摘等あれば遠慮なくいただければと思います。

ありがとうございました。

## 仲間を募集中

株式会社ホープでは、福岡で働くエンジニアを募集中です。
ぜひ、求人を見てみてください！
▼ Wantedly求人
https://www.wantedly.com/projects/1684027
▼ コーポレートサイト
https://www.zaigenkakuho.com/recruit/
「自治体を通じて人々に新たな価値を提供し、会社及び従業員の成長を追求する」
この理念の実現に向けて、今後も自治体の課題解決に取り組んでいきます。
ご応募お待ちしております！
【SharePoint Online】モダンUIフォームで列を条件付き表示／非表示にする方法

# 【SharePoint Online】モダンUIフォームで列を条件付き表示／非表示にする方法

こんにちは、river_mouth(りばーまうす)です。
今回の記事では、SharePoint Onlineの**モダンUIフォーム**で列の表示／非表示を条件に応じて切り替える方法を記載しています。

本記事では、**選択されたカテゴリによって入力欄を動的に切り替える方法**について解説します。
※私のメモ的な要素もありますが、同じようなことで悩んでいる方の助けになれば幸いです。

---

## 🎯 やりたいこと（目的）

SharePointリストにて、**「カテゴリ」列の選択値に応じて「PC用品名」などの入力欄を表示／非表示にしたい。**

これにより、入力フォームをすっきりさせて、ユーザーが関係ない情報を入力しないよう誘導することができます。

---

## 🛠 対象環境

- **SharePoint Online**
- **フォーム種類：標準モダンUIフォーム**（Power Appsは未使用）

---

## 💡 具体的な表示条件の例

たとえば、以下のような要件があったとします：

- **Category =「パソコン本体」** の場合のみ「PC_Maker」列を表示したい

---

## 🧪 条件付き表示の設定方法

### ① 対象列を選択

フォームの列設定画面で、**表示／非表示を制御したい列（例：PC_Maker）** を開きます。
以下の画像でPC_Makerの右側に「・・・」があるのでクリックして、**「条件式の編集」**を選択します。
![01_Form.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4102831/1f35a855-8705-45be-9c67-0ec5c697da7a.png)

そうすると、以下の入力フォームが表示されます。
![02_Form.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4102831/ef28d548-7790-40a8-87ed-eec1ffe30017.png)

### ② [表示の条件] に式を入力

**「表示の条件」** 欄に、以下のような式を入力します。
![03_Form.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4102831/9bfced1d-9dfa-478c-be43-0c6a2fa2f5c9.png)


```plaintext
=if([$Category] == 'パソコン本体','true','false')
```

### ③ 実際の動きを確認
入力フォームでは、Categoryのみ表示されています。
![04_form.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4102831/1608acdc-e881-465d-956b-febd9e76ef02.png)

Categoryで「パソコン本体」を選択します。
![05_form.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4102831/f3fef5c2-e0c5-4fa9-bd1b-45c04df53842.png)

そうすると、、
以下のようにPC_Makerが表示されました！
![06_form.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4102831/5f88fc27-a2bd-4d65-9367-6791af42f89a.png)

## 🔄 複雑な条件式の例
### ① OR条件（いずれかに一致すれば表示）
次の式では、[Category]が’パソコン本体’または’パソコン周辺機器’の場合、表示します。
```plaintext
=if([$Category]=='パソコン本体'||[$Category]=='パソコン周辺機器','true','false')
```

### ② AND条件（両方に一致すれば表示）
次の式では、[Category]が’パソコン本体’または’パソコン周辺機器’の場合、表示します。
```plaintext
=if([$Category]=='パソコン本体'&&[$Category]=='パソコン周辺機器','true','false')
```

##  🧭 注意点
■ 内部列名は開発者ツールやURLから取得可能
■ 選択肢の表記ゆれ（例：「パソコン用品」vs「パソコン 本体」）にも注意
■ true / false は文字列として書きます（クォート必須）

## ✅ まとめ
SharePoint Onlineの標準フォームでも、ちょっとした条件式を加えるだけで入力フォームのUXを大きく改善できます。

「必要な項目だけを出す」というシンプルな工夫が、現場での入力ミス防止や作業効率向上に繋がるはずです。

## 参照サイト（MS公式）
https://learn.microsoft.com/en-us/sharepoint/dev/declarative-customization/list-form-conditional-show-hide#specify-conditional-formula-to-show-or-hide-columns
Google Agentspace で業務を加速させる：導入方法と活用ユースケースまとめ



## 📌 はじめに

2025年4月に Google Cloud Next で発表された **Google Agentspace** は、企業内の情報検索やAIエージェント活用を支援するプラットフォームです。

Google Workspace や Salesforce、Jira、Confluence、SharePoint などのデータソースを統合し、**自然言語での業務支援を実現**します。

この記事では、**部門ごとの導入ユースケース**と、導入時のポイントを解説します。

---

## 🧠 Google Agentspace とは？

- マルチモーダル検索（画像・テキスト・ファイルを横断的に検索）
- Google Gemini での要約／生成／対話型エージェント
- コーディング不要でエージェント構築可能（Agent Designer）
- Google WorkspaceやSaaS連携、VPC Service Controls対応のエンタープライズ仕様

---

## 🎯 業務別ユースケース

### 🧾 経理・財務部門

- **ユースケース例**：
  - 社内経費ルールの即時検索（「旅費規定の最新バージョンは？」）
  - スプレッドシートの内容をもとに自動レポート生成
  - 月次締め作業に関する手順書の要約提示

- **効果**：
  - ヘルプデスク負担軽減、月末業務の効率化

---

### 🧑‍💼 営業・マーケティング部門

- **ユースケース例**：
  - 「過去6か月で競合他社が提案した内容をまとめて」→ 自動で提案書要約
  - 顧客との過去メール、CRM情報、議事録を統合して提案の方向性を提示
  - マーケ資料（PDF）からFAQや要約スライドを生成

- **効果**：
  - 資料作成時間を70%以上削減、ナレッジの再利用促進

---

### 👩‍💻 エンジニアリング部門

- **ユースケース例**：
  - 過去の障害対応ログから「似た事例の原因と対応策」を抽出
  - コードレビューコメントやPRから学習したテスト観点の提案
  - NotebookLM連携で技術仕様書の要約・解釈支援

- **効果**：
  - 障害対応速度アップ、属人化リスク低減

---

## 🛠️ 設計・導入のポイント

| 項目                  | 内容                                                                 |
|-----------------------|----------------------------------------------------------------------|
| ✅ データ連携設計     | Google Workspace, SharePoint, Confluence, Jira, Salesforceなどとの接続 |
| ✅ アクセス制御       | RBAC（IAM）, VPC Service Controls, Context-Aware Access活用         |
| ✅ エージェント設計   | Agent Designerでプロンプト＋アクション設定                           |
| ✅ 導入フェーズ分割   | PoC → 部門展開 → 全社展開                                            |

---

## 🚀 導入ステップ（初期PoCの場合）

1. **対象部門の選定（例：営業 or 情シス）**
2. **Agentspace Enterpriseライセンスの取得**
3. **ドキュメント・Google Drive・Jiraなどの連携設定**
4. **NotebookLM や Deep Research Agent の構成**
5. **ユーザーからのフィードバック収集と調整**
6. **エージェント自作（Agent Designer）による自動化領域の拡張**

---

## 💬 まとめ：なぜ今、Agentspace か？

- 社内の情報が**分散・属人化**している企業にとって、Agentspace は「AIによる全社的な検索と自動化ハブ」として非常に有効。
- Gemini の進化により、**ただのチャットボットではなく、"業務代行エージェント"**として活躍可能。
- 小さく始めて大きく展開できる柔軟さも魅力。

---

## 🔗 関連リンク

- [Google Cloud Agentspace 公式サイト](https://cloud.google.com/products/agentspace)
- [NotebookLM Enterprise](https://notebooklm.google.com/)
- [Google Cloud Next 2025 Recap](https://cloud.google.com/blog)

---

## 🙌 最後に

今後、Agentspace を使った自作AIエージェント構築や、Workspaceとの連携Tipsも紹介予定です。
【Python】`cpython`にコントリビュートしたテストが本当にプロジェクトを壊さないために役立ったお話

## はじめに: 前回のあらすじと新たな課題
本稿は、以前に公開した記事から続く物語として、Pythonエコシステム内で発生した互換性問題とその解決に至る経緯を詳述するものです。

前回の記事では、Python 3.13での`ctypes`の変更がcomtypesに与えた影響と、その解決、そして将来的な互換性問題の防止のためにテストをコントリビュートした経緯をお話ししました。

https://qiita.com/junkmd/items/cc89852d78419fe50b77

本稿では、そのテストがどのように機能し、comtypesが新たな互換性問題に直面するのを未然に防いだのか、そしてCPythonコミュニティとの協議を通じてどのように解決策を見出したのかを紹介します。

## CPythonの内部変更: `ctypes`ポインタ型キャッシュの進化
### Python 3.13以前にあった問題
CPythonに「同梱」されている標準ライブラリ`ctypes`は、PythonからC言語の共有ライブラリを呼び出すための強力なインターフェースを提供します。

https://docs.python.org/ja/3/library/ctypes.html

このモジュールには以前からポインタ型を管理するためのキャッシュ機構が存在していましたが、特定の条件下で問題を引き起こしていました。
具体的には`ctypes.POINTER`関数がファクトリ関数内でループを使って呼び出されると、キャッシュが原因でメモリ使用量が無制限に増加し、解放できないという問題が報告されていました。

https://github.com/python/cpython/issues/100926

この問題は、Windowsで可変長型ファクトリを使用する際に顕著でした。
例えば関数内で`ctypes`型を継承したクラスを定義しその返された型を`ctypes.POINTER`に渡すと、内部的なキャッシュメカニズムはこれらの型への参照を保持し続けるため、使用メモリは際限なく増大する可能性がありました。

## PRのOpenと当時の未解決問題
この問題は有志によって解決方法の議論が行われ、実装の詳細についてレビューコメント上でやり取りするためにPRもOpenされました。

https://github.com/python/cpython/pull/131282

しかし、この時点では私が以前追加した`comtypes`のメタプログラミングの挙動を担保しているテストについてはまだ対応していませんでした。

## コミュニティの力: 議論と解決への道のり
私は上記のissueと関連するPRをCPythonリポジトリ内の`topic-ctypes`ラベルがついたissueを確認していたときに発見しました。私は`comtypes`が将来のPythonバージョンでも動作するようにするため、その議論へ参加しました。

初期の分析では、問題の具体的な症状と、`comtypes`のメタプログラミング部分が`ctypes`の新しいポインタキャッシュの挙動とどのように衝突しているかが特定されました。

議論の中では、一時的な回避策や代替アプローチも検討されましたが、最終的には`comtypes`側でPythonバージョンに合わせた条件分岐(「バージョンブリッジ」)を実装するという決定がなされました。

この変更は`comtypes`側で実際にPRとしてOpenされ、Python 3.14をサポートするバージョンをリリースする際にマージ予定です。

https://github.com/enthought/comtypes/issues/837

https://github.com/enthought/comtypes/pull/839

もし以前に追加した上流の変更から下流を保護するセーフティネットであるテストがなければこのような議論は行われず、`comtypes`を用いて構築された多くのアプリケーションはPythonのアップグレード時に壊滅的に機能しなくなっていた可能性があります。

## まとめと今後の展望
この事例は、包括的なテスト、プロジェクト間の効果的なコミュニケーションと協力が、オープンソースエコシステムにおける問題解決に不可欠であることを明確にしていると思います。

この経験は、ソフトウェア開発が単にコードを書くことだけでなく、変化を管理し、コミュニケーションを促進し、共有された責任を通じて回復力のあるシステムを構築することであると教えてくれたと考えています。

特に、Pythonのような広範に利用される言語の低水準部分に関する変更は、予期せぬ大きな影響をもたらすことがあります。今回のストーリーは、テストとコミュニティの連携によって、そのような事態を未然に防げたケースと言えるでしょう。

ソフトウェアエコシステムは常に進化しており、互換性の課題は継続的に発生します。これに効果的に対処するためには、技術的な専門知識に加え、プロジェクト間の積極的な関与、明確なコミュニケーションチャネル、そして堅牢なテスト文化が不可欠です。この物語は、これらの要素が組み合わさることで、いかに複雑な問題が解決され、ソフトウェアの未来が守られるかを示す強力な証拠となると考えています。
[Go] 素数の個数を求める

# はじめに
Goで2以上N以下(Nは任意の自然数)の素数の個数を求める問題を解いていて、いつも素数系の問題ってどうやって解くんだったっけ？となるので備忘録としてまとめておこうと思います。
今回は、標準入力から自然数Nを読み込み、2以上N以下の素数の個数を求めて標準出力に出力します。

# 対象読者
- 素数判定のアルゴリズムを知りたい人
- Goで素数の個数を数える方法を知りたい人

# 2以上N以下(Nは任意の自然数)の素数の個数を求める
下記のプログラムではNを標準入力から読み込み、2以上N以下の素数の個数を求めて標準出力に出力します。素数とは、自然数Xの約数が1とXのみであるようなXのことを指します。

**プログラム**
```main.go
package main

import (
	"fmt"
)

func main() {
    // 整数nを標準入力から入力
    var n int
    fmt.Scanf("%d", &n)
    
    // nが2未満なら素数の個数は0個
    if n < 2 {
        fmt.Println(0)
        return
    }
    
    // エラトステネスのふるい
    isPrime := make([]bool, n+1)
    for i := 2; i <= n; i++ {
        isPrime[i] = true
    }
    
    for i := 2; i*i <= n; i++ {
        if isPrime[i] {
            for j := i*i; j <= n; j += i {
                isPrime[j] = false
            }
        }
    }
    
    // 素数の個数を数える
    count := 0
    for i := 2; i <= n; i++ {
        if isPrime[i] {
            count++
        }
    }
    
    // 結果を出力
    fmt.Println(count)
    
}
```
**入力例1**
```
3
```
**出力例1**
```
2
```
**入力例2**
```
10
```
**出力例2**
```
4
```

# エラトステネスのふるい
上記のプログラムでは素数を求めるアルゴリズムとして**エラトステネスのふるい**を利用しています。

エラトステネスのふるいとは、指定された自然数以下のすべての素数を効率的に求めるためのアルゴリズムです。このアルゴリズムは、2以上の整数を順に調べていき、その素数の倍数を消去していくことで、最終的に素数のみを抽出します。

まず、`make`関数を使用してインデックス番号が`0`から`n`までの`bool`型の`isPrime`スライスを作成します。この時、値の全ては`false`で初期化されます。`isPrime`スライスの各値はインデックス番号の数字が素数か否かという情報を保持します。

その後の`for`文で2以上n以下の値を全て`true`にしています。つまり、初めは2以上n以下のすべての整数が素数だと仮定して、後に素数でないものを省いていきます。

```go
 // エラトステネスのふるい
    isPrime := make([]bool, n+1)
    for i := 2; i <= n; i++ {
        isPrime[i] = true
    }
```
次に以下の部分で素数でないものを省いていきます。具体的には`isPrime`スライスのインデックス番号が調べる整数を表しているため、素数でない整数のインデックス番号の値をfalseにしていきます。
外側の`for`ループで調べる倍数分ループを回し、内側の`for`ループで調べた倍数の値をfalseにしています。もう少し具体的に言うと、2~30までの素数の個数を調べたいとしたら、`5*5 <= 30`なので、2,3,4,5の倍数で4回ループを回し、2の倍数の時は2,4,6・・・、3の倍数の時は3,6,9・・・、4の倍数の時はすでに2の倍数で消されている、5の倍数の時は5,10,15・・・と値を`false`にして素数候補から省いていきます。

```go
 for i := 2; i*i <= n; i++ {
    if isPrime[i] {
        for j := i*i; j <= n; j += i {
            isPrime[j] = false
        }
    }
 }
```
これで`isPrime`スライスはインデックス番号の整数が素数か否かである情報を保持するようになりました。

素数の判定ができたら`isPrime`スライスの中で素数になっている値(`isPrime`の値がtrue)を数えて結果を出力すればOKです。
```go
 // 素数の個数を数える
 count := 0
 for i := 2; i <= n; i++ {
     if isPrime[i] {
         count++
     }
 }

 // 結果を出力
 fmt.Println(count)
```

# まとめ
今回は、Goで2以上N以下(Nは任意の自然数)の素数の個数を求める方法について説明しました。具体的には、標準入力から自然数Nを読み込み、2以上N以下の素数の個数を求めて標準出力に出力します。
素数を数える(判定する)アルゴリズムとして、エラトステネスのふるいを使用しました。
AWS全冠した振り返り

# AWS資格取得の振り返り

2023年度に業務でAWSを本格的に触れ始め、2024年度に全冠を達成することができました！(*^^)v
3年後に更新しなければならないため、今回は半分自分用に、やって良かったことや悪かったことを振り返ってみたいと思います。

## 成績と取得順


| 資格名                                             | レベル        | 取得日         | 失効予定日     | 点数 |
|--------------------------------------------------|---------------|----------------|----------------|------|
| AWS Certified Solutions Architect - Associate     | Associate     | 2023/12/2     | 10/06/2027     | 745  |
| AWS Certified Cloud Practitioner                   | Foundational  | 2023/12/25    | 12/17/2027     | 821  |
| AWS Certified SysOps Administrator - Associate     | Associate     | 2024/3/15     | 11/16/2027     | 753  |
| AWS Certified Developer - Associate                | Associate     | 2024/6/1      | 11/16/2027     | 755  |
| AWS Certified Solutions Architect - Professional   | Professional  | 2024/10/6     | 10/06/2027     | 785  |
| AWS Certified AI Practitioner                      | Foundational  | 2024/10/26    | 12/17/2027     | 719  |
| AWS Certified DevOps Engineer - Professional       | Professional  | 2024/11/16    | 11/16/2027     | 766  |
| AWS Certified Data Engineer - Associate            | Associate     | 2024/11/28    | 11/28/2027     | 840  |
| AWS Certified Machine Learning Engineer - Associate | Associate     | 2024/12/17    | 12/17/2027     | 839  |
| AWS Certified Machine Learning - Specialty         | Specialty     | 2024/12/25    | 12/25/2027     | 833  |
| AWS Certified Security - Specialty                 | Specialty     | 2025/1/30     | 01/30/2028     | 828  |
| AWS Certified Advanced Networking - Specialty      | Specialty     | 2025/3/2      | 03/02/2028     | 859  |

## やって良かったこと

- **隙間時間での勉強**  
  SAPまでは通勤時間メインの学習で進めていました。間違えた問題や気になったサービス、仕事で使えそうなことはNotionにメモして、職場か家で再度確認するってスタイルでした

- **メリハリのある勉強（ポモドーロ勉強法）**  
  巷で話題のポモドーロ勉強法という存在を知っていたものの、最初は自分のやり方を貫いて全くやっていなかったのですがSpecialty系の勉強のときに試しにやってみたところ、効果の大きさに気づきました。広告のないスマホアプリもありますのでこれは使わない手はありません！

- **Skill Builderの公式問題集（20問）**  
  全体感を把握するのに適しており、問題の難易度や出題範囲を探るのに役立ちました。全試験で必ずやるようにしました。

- **Udemyの問題集・講義**  
  SAA、CLF、DEA、AIFはUdemyオンリーでいきました。Udemyは実試験より難易度難しめで、SAAに関してはテキストについている問題が一番実試験の問題っぽかったです。

- **CloudTechの問題集**  
  Specialty系の対策に利用しました。SAProは全ての問題に図解があって非常に参考になりました。

- **読書：「AWSで実現するモダンアプリケーション入門」**  
  AWSから紹介された良書で、モダンなアプリの在り方がわかるようにまとめられており、全ての試験に通じる内容でした。

## やらなくても良かったこと

- **参考テキストの流し読み**  
  流し読みしてから問題集を解く方法を取っていましたが、AWSの場合は問題集を中心に学習する方が良かったかもしれません。

## 取得順について

Professional系の試験からAIF、DEA、MLSへと進んだおかげで、AIFとDEAをほぼ勉強せずに乗り切ることができました。DEAがアソシエイトの中で最も幅広く感じました。

## 個人的難易度

DOP＞＞SAP＞SCS＞ANS,MLS  
DOPは開発側の深い知識が必要で、試験直後は合否が不安でしたが、結果的に全てストレートで合格できたのが嬉しかったです。

## 「All AWS Certifications Engineers」と「AWS Top Engineers」について

3月までに全ての資格を取得する計画を立て、これが良いモチベーションになりました。

## 今後について

今後は、試験でつまずいた点や参考にしたURLをまとめ、Qiitaで記事として残していきたいと思います。
[Power BI]ビジュアルのツールヒントはいい感じ

## 🔍 背景：ドリルスルーだけじゃもったいない！

これまで、Power BIでビジュアルの明細を見たいときは「ドリルスルー」を使っていました。  
もちろん便利なんですが、

- ページ遷移が発生する  
- 戻るのがちょっと面倒  
- クリックしないと見られない  

といった小さなストレスがありました。

そんなときに出会ったのが「**ビジュアルヒント**」。  
これを使えば、**マウスホバーだけで関連データを表示**できるんです！

---

## 🛠 実装手順：4ステップでOK！

### ① マトリックスビジュアルを作成

まずは、明細を表示したい内容でマトリックスビジュアルを作成します。  
このページが「ヒント」として使われます。

---

### ② ヒントページの設定

1. ヒント用ページを開く  
2. ページの書式設定 > **ページ情報**  
3. 「このページをヒントとして使用することを許可する」を **オン**
![ページをヒントに使用する_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2987347/b8c080fa-9a28-4686-a0ab-eaf4ae5ea976.png)

---

### ③ ヒントの設定を有効化

1. メインのビジュアルを選択  
2. ビジュアルの書式設定 > 全般 > **ヒント** を開く  
3. 「型」を「レポートページ」に設定  
4. 「ページ」で①で作成したページを選択
![ページをヒントに使用する_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2987347/30e39891-39fb-4cb3-a70b-5fe34a152736.png)

---

### ④ヒントページのキャンバス設定

1. ヒント用ページを開く  
2. ページｎ書式設定 > **キャンバスの設定**  
3. 「型」を「カスタム」に設定  
4. 「高さ」、「幅」、「縦方向の配置」を設定
![ページをヒントに使用する_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2987347/3b0acdcf-cd00-4267-8b90-665fc720e350.png)



これで実装完了！
![ページをヒントに使用する_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2987347/b2cf8977-8a5f-4d76-a1e1-a3422e72c3c5.png)


---

## 🔄 ドリルスルー vs ビジュアルヒント

| 機能             | ドリルスルー         | ビジュアルヒント       |
|------------------|----------------------|--------------------------|
| 表示方法         | クリックで遷移       | ホバーでポップアップ     |
| ページ遷移       | あり                 | なし                     |
| カスタマイズ性   | 高い                 | やや制限あり             |
| ユーザー体験     | やや手間             | スムーズ＆直感的         |

---

## 💡 まとめ

ビジュアルヒントは、**ユーザーにとってストレスの少ないデータ探索体験**を提供できます。  
特に、ダッシュボードを「見せる」用途で使うときに効果絶大です。

ドリルスルーと併用することで、より柔軟なレポート設計が可能になります。  
ぜひ一度試してみてください！

---

## 🗨 コメント歓迎！

「こんな使い方もあるよ！」というアイデアがあれば、ぜひコメントで教えてください。
フォローもお待ちしてます！

---
APT攻撃（Advanced Persistent Threat）とは？

APT攻撃とは、**特定のターゲットに対して長期間にわたって継続的に行われる高度な標的型サイバー攻撃**です。

---

## 🔍 特徴

| 特徴 | 説明 |
|------|------|
| 🎯 標的型 | 特定の企業・組織を狙い撃ち |
| 🕰️ 持続的 | 数ヶ月〜年単位で潜伏・攻撃 |
| 🧠 高度な技術 | ゼロデイ脆弱性や標的型メール |
| 🏢 組織的 | 国家や大規模犯罪組織による関与も |

---

## 🔁 攻撃のライフサイクル（APT Kill Chain）

1. **偵察（Reconnaissance）**
2. **初期侵入（Initial Compromise）**
3. **C2通信（Command & Control）**
4. **内部活動（Lateral Movement）**
5. **情報窃取・破壊（Exfiltration/Sabotage）**
6. **長期潜伏（Persistence）**

![APT攻撃ライフサイクル](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520895/b7967fae-2d49-4fa4-ab60-a1038640936c.png)


---

## 🧠 MITRE ATT&CK マッピング例

| フェーズ | Tactic | 代表的なTechnique |
|----------|--------|-------------------|
| 偵察 | Reconnaissance | T1595 - Active Scanning |
| 初期侵入 | Initial Access | T1566 - Spearphishing, T1190 - Exploit Public App |
| C2通信 | Command & Control | T1071 - Application Layer Protocol |
| 内部活動 | Lateral Movement | T1021 - Remote Services |
| 窃取/破壊 | Exfiltration | T1041 - Exfiltration over C2 Channel |
| 潜伏 | Persistence | T1053 - Scheduled Task, T1547 - Logon Autostart |

---

## ☁️ クラウド環境における対策例

| 分類 | Google Cloud | AWS |
|------|--------------|-----|
| ネットワーク制御 | VPC Service Controls / Cloud Armor | WAF / NACL / Security Group |
| ゼロトラスト | BeyondCorp Enterprise | IAM Identity Center / Verified Access |
| ログ監視 | Cloud Logging / Chronicle | CloudTrail / GuardDuty |
| エンドポイント保護 | OSConfig / SCC | Systems Manager / Inspector |
| 権限制御 | IAM Conditions / Recommender | IAM Analyzer / SCP |
| 情報保護 | DLP API / Cloud KMS | Macie / AWS KMS |
| メール防御 | Gmail ATP | SES + Lambda Filter |

---

## 💥 有名なAPT事例：Operation Aurora

- **時期**：2009年〜2010年
- **標的**：Google、Adobeなど
- **目的**：ソースコードの窃取、政治活動家の情報収集
- **手法**：IEのゼロデイ脆弱性を悪用、スピアフィッシング

---

## 🔐 まとめと対策ポイント

- セキュリティは「多層防御」と「ゼロトラスト」の組み合わせが重要
- 監視・ロギング・脆弱性対応の自動化
- MITRE ATT&CKのようなフレームワークを用いた脅威モデリングと可視化
- クラウド特有の設定ミス対策（SCP/IAM最小権限設計）

---

## 📚 参考リンク

- [MITRE ATT&CK](https://attack.mitre.org/)
- [GoogleのAurora攻撃に関する記事](https://googleonlinesecurity.blogspot.com/2010/01/operation-aurora.html)
- [AWS Security Best Practices](https://docs.aws.amazon.com/security/)

---
Azure AI Foundry の Agent を VS Code から活用してみた（NewsAPI連携事例）

最近、Azure AI Foundry のプレビュー版を試しており、カスタム AI Agent を構築して、NewsAPI.org のニュースデータと連携するプロトタイプを作成しました。本記事では、完成した Agent をどのように使えるか、特に外部クライアントからの利用がまだ制限されている状況下で、どうやって開発環境からうまく使いこなすかを紹介します。

## 背景と目的

Azure AI Foundry では、簡単にエージェント（LLMベースの会話Bot）を構築できますが、**現時点（2025年6月）では、パブリックなAPIエンドポイントを使って自由に呼び出す方法は用意されていないようです**。

そこで、以下の2つの方法でエージェントと対話できる環境を整えました：

* Foundry の Web Playground
* Visual Studio Code 拡張（Azure AI Foundry for VS Code）

これにより、ブラウザまたはローカルの開発環境から簡易的に対話できるようになりました。

---

## 全体構成の概要

エージェントは NewsAPI.org のデータを取得し、日付付きの要約を提供する機能を持ちます。以下のような構成になっています：

1. Azure AI Foundry 上で Agent 作成
2. Logic Apps を使って NewsAPI.org からニュースデータ取得
3. エージェントがその情報を受け取り、整形して応答
4. VS Code または Playground から対話

詳細は別記事にあります。
https://qiita.com/yoshiwatanabe/items/0ef2996fd43a87c16a9b

📷 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103139/2a6cf680-a68c-486f-ae78-ac509e2ea082.png)


---

## エージェント構成の詳細

プロジェクト名：`MyFirstAiProject`

Agent 名：`Agent856`

モデル：`gpt-4o-mini-test1`

インストラクション：

```
You are going to help user to obtain and understand the latest news about AI
```

**Playgroundでの応答例（ニュースの要約）**
📷 　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103139/129044ea-ed67-4142-8171-df79c7752ee4.png)


---

## Logic Apps を使った NewsAPI.org 連携

Logic App を作成し、HTTP リクエストで NewsAPI.org から最新記事を取得しています。APIキーは KeyVault に保管し、GETリクエストのクエリには日付などを動的に挿入しています。

Logic Apps の実行履歴からAgent経由でトリガーされたことが確認できます（記事は６月１日に書きました）

📷 **Logic App の設定と呼び出し結果**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103139/3fa8c093-d1a9-4172-8a24-93cb5e5a842e.png)

この Logic App は Foundry のエージェントに `getnewsapiorgdata_Tool` として登録済みです。

📷 **エージェントに Logic App を接続した様子**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103139/38b0f6d2-6983-450b-b4ca-f8a411b4902f.png)


---

## VS Code 拡張機能からの利用

ブラウザのPlaygroundと同様に、VS Code 上の拡張機能「Azure AI Foundry」を使えば、ローカルから直接 Playground にアクセスして Agent に話しかけることができます。

拡張機能名：`Azure AI Foundry`

📷 **VS Code で拡張を有効化した画面**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103139/6f871fd9-20fe-47bb-a22a-b25060d6c27c.png)


📷 **VS Code Playground で Agent にクエリしている様子**

ニュース見出しの日付からモデルのカットオフではなくエージェントがツールを利用したことが確認できます（記事は６月１日に書きました）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103139/c6221138-0344-400b-8dac-962826e5de04.png)


---

## 現時点での制約と今後

### 制約

* 外部クライアント（curl, Python など）から Agent を直接呼び出すための REST API はまだ未公開
* 認証・認可の管理もエンタープライズ用途では課題が残る

### 妥協点

* VS Code からの対話が可能になったことで、ローカル開発においては十分な UX を確保できた

### 今後の展望

* Public API のサポートが入ると、Logic App や Power Platform を介さずに Agent を直接操作可能になることが期待されます

---

## まとめ

Azure AI Foundry は今後の拡張が非常に楽しみなプラットフォームです。現時点では Web/VS Code Playground を使う方法に制限されていますが、エージェント設計・外部ツール統合・プロンプト設計において試行錯誤するには十分な柔軟性があります。（なお、別のLogic AppからAgentを呼び出す方法はすでにあるようなので、次回試してみようと思います）

「ちょっと試してみたい」「PoCを作ってみたい」という方には、VS Code 経由の利用が特におすすめです。
PythonのLLMをopenllmetryで計測する (GCP Cloud Trace)

## はじめに

LLMの呼び出しがあるAPIの場合、Latencyが大幅に増えるケースが多いので、Traceabilityがとても重要になります。
Performanceだけでなく、実際にLLMがどこでどのように呼ばれてどんな結果が帰っているのかも含めて一連の呼び出しを紐づけるTracingは調査に役立ちます。

## openllmetry

https://github.com/traceloop/openllmetry

> Open-source observability for your LLM application, based on OpenTelemetry

Open-sourceのOpenTelemetryベースのLLM app用のObservabilityツールです。

DatadogやGoogle Cloudをはじめとする多数のExporterがサポートされており、Tracing、Metrics、Loggingを紐づける事ができます。

## Example

今回は、前回紹介した [Flask appをOpentelemetryでGCP Cloud Traceに連携する](https://qiita.com/nakamasato/items/ca7ef5610e1876443cfb)を拡張して、Flaskで作ったLLM appにopenllmetryを入れる例を紹介します。

## コード

```py:main.py
from traceloop.sdk import Traceloop
from opentelemetry.exporter.cloud_trace import CloudTraceSpanExporter
from opentelemetry.instrumentation.flask import FlaskInstrumentor

Traceloop.init(
    app_name="<app name>",
    exporter=CloudTraceSpanExporter(resource_regex="env|version|service.name"),
    resource_attributes={
        "env": os.getenv("ENV", "dev"),
        "version": os.getenv("VERSION", "unknown"),
    },
)


app = Flask(__name__)

FlaskInstrumentor().instrument_app(app)

@app.route("/")
def hello():
    return "Hello!"

if __name__ == "__main__":
    app.run(debug=True)
```

前回設定していた`CloudTraceSpanExporter`を同様にTraceloop.initのexporterに渡してあげるだけでOkです。

これで、flask appの中で使われる openai, anthropicなどのLLMの呼び出し、LangChain、LangGraphの呼び出し部分の計装が自動的に行われます。

## Cloud Trace

この設定をするとCloud Traceで以下のようなTraceが取れるようになります :tada: 

![Screenshot 2025-06-02 at 7.58.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7059/7d63919c-beca-4150-8e8e-c69f69c638ba.png)

:::note warn
このトレースは上のサンプルコードから出たものではありません。
:::
プロデル、調査 その16


# 概要
プロデルが、CLRらしいので、調べて見た。
サンプル、やってみた。

# シェルピンスキーのジャスケットを描く

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/fbef8d2b-b282-45e4-9545-0b71041853bb.png)


# サンプルコード


```
【辺の長さ】だけ、描く手順
	3回繰り返す
		かめさんを辺の長さだけ進める
		かめさんが120度回る
		辺の長さが20より大きければ
			辺の長さ/2だけ描く
		そして
	そして
終わり

窓というウィンドウを作る
	その内容は「シェルピンスキーのジャスケットを描く」
	その位置と大きさは｛0,0,490,450｝
	その設計スケール比率は{144,144}
窓を表示する
ピクチャー１というピクチャーを窓に作る
	そのドッキング方向は「全体」
かめさんというカメを作る
	かめさんを窓のピクチャー１に表示する
	かめさんの位置は{350，300}
	かめさんの向きは-90
300だけ描く
待機する

```

以上
【冨井悠平】エンジニアの仕事に慣れた頃が要注意！

こんにちは、冨井悠平です。
今回は「エンジニアの仕事に慣れてきた頃こそ注意したいこと」を、経験をもとに3つご紹介します。

最初は誰しも必死です。ドキュメントを何度も読み、レビューにドキドキし、1つの機能を実装するのに何時間もかけたり…。
でも、数ヶ月〜数年経つと、だんだんと「こなせるように」なってきますよね。
その時こそ、思わぬ落とし穴が待っています。

① 「わかったつもり」にならない
慣れてくると、何となく手が動くようになります。
でも、本当にそのコードが「なぜ」動くのかをちゃんと理解できていますか？
特にフレームワークやライブラリに頼りがちな現代の開発では、「黒魔術」になりがちな部分もあります。

ちょっとでもモヤッとしたら、公式ドキュメントやソースに立ち返るクセをつけましょう。
“わかったつもり”はバグの温床です。

② チームメンバーに頼ることを忘れない
慣れると、「ひとりで完結」しがちです。わかる気持ち、すごくあります。
でも、開発はチーム戦。困ったら、迷ったら、相談しましょう。
むしろ経験がある人こそ、壁打ちやレビューの精度が上がっているはず。
その知見を共有すれば、チーム全体のレベルアップにもつながります。

孤独なプロフェッショナルより、頼られる先輩の方が、仕事も楽しくなりますよ！

③ アップデートを止めない
慣れてくると、新しい技術やツールに対して「また別に覚えないといけないのか…」と感じる瞬間も。
でも、技術は日進月歩。止まった時点で、ちょっとずつ“古く”なってしまいます。

Qiitaの記事を読むこと、何か小さな検証をしてみること。ほんの少しでもいいので、新しい刺激を取り入れてみましょう。
その積み重ねが、気づけば大きな武器になります。

最後に
「慣れ」は成長の証。けれど、その先にある「油断」や「惰性」に気づけるかどうかが、エンジニアとしての飛躍を左右すると思います。
自分を振り返る時間を大切にしながら、一緒に楽しく学び続けましょう！
オープンソースカンファレンス 2025 名古屋 に行ってきた

2025/05/31 に 愛知県名古屋市の [吹上ホール](https://www.nipc.or.jp/fukiage/)で行われた [オープンソースカンファレンス 2025 名古屋](https://event.ospn.jp/osc2025-nagoya/) の参加レポートです

詳細や写真は X にて [#oscnagoya の検索結果](https://x.com/search?q=%23oscnagoya&src=typed_query)に譲ります

## 参加理由
 - ご近所開催だったから（同じ沿線）
 - PostgreSQL 17 の情報が欲しかったから
 - Proxmox に関する情報が欲しかったから
 - Alma Linux 10 の情報が欲しかったから
 - 古い基幹システムの更新案件の実態を知りたかったから
 - チームのまとめ方を参考にしたかったから
 - 自分のモチベ維持のため

## 参加時間
 - 10:00〜 13:00 / 15:00〜
 - 途中、家事をするため家に帰ってました。途中入退室だいじょうぶです

## 名古屋駅からのアクセス
 - JR/新幹線/名鉄/近鉄 --> 市営地下鉄（桜通線）名古屋駅 --> 桜通線 吹上駅 5番出口から道なり

## 目的別の立ち回り
### PostgreSQL
- セミナー参加
  - 朝いちでセミナーがありました。系統的に概要の理解ができました
- ブースでの質問
  - Web アプリに絡んで REST API 化している件でお話を伺う
  - その他、パフォーマンス調整の相談に乗っていただく
  - スケールアップした先の知見をお持ちだったため、大変参考になりました
- 懇親会
  - 席がお近くだったため、色々お話をきけました
### Proxmox VE
- ブースでのお話
  - ユーザー会の方とリアルで話したことはなかったので、お話できて楽しかったです
- セミナー参加
  - お昼にセミナーがあり、現状の Proxmox の立ち位置的なものや有償サポートについて理解できました
### Alma Linux 10
 - セミナー参加
   - 概要の理解ができました。有償サポートが神がかっていて良いです。
### 古い基幹システムの更新案件
 - 懇親会
   - 近い案件で動いていた（る？）かたのお話を聞けました。実際のお話をきかないとわからないことって多いです。
### チームのまとめ方
 - セミナー参加
   - Open Source Summit Japan のボランティアリーダー、鯨井さんの話を聞けました
   - [体験記](https://www.opensourcetech.tokyo/entry/20231224/1703429785)にあったお話を、追加情報を含めて教えていただけました
   - 東京住みだったら次のイベントに参加したくなるようなお話でした

## 雑感
 - Proxmox VE に関して、自分自身が LXC --> Proxmox VE の流れの人なので、技術セッションがもう１件ほしかったかも --> お前がやれって話でしょうか、LT で良いでしょうか
 - 相変わらず知らないことを発見できるので、おっさんでも楽しいです。ネット越しだと情報に対してナチュラルに選別をかけていることがわかります
 - ちょっと声をかけた人から随分面白い話を聞けたりするので、オープンマインドで参加できればより楽しいです
 - 次回はスタッフで参加したいなー、仕事のスケジュール大丈夫かなー
Storybookをv8からv9にアップグレードしたメモ

# 概要
普段は`npx ncu -u`でパッケージの更新を行っているが、Storybookのメジャーバージョンをあげるときにはそれではアドオンの依存関係などが壊れてしまいうまく行かない。
特に今回は`essentials`が統合されたので既存アドオンの削除や置換がはっせいしｔ
Storybookが提供しているマイグレーションツールを使ったら結構楽にアップグレードできたのでメモ。

[マイグレーションガイド](https://storybook.js.org/docs/migration-guide)

[この時点のソース](https://github.com/hibohiboo/odyssage/blob/c1c83e6ab5ea2c234bac4194d6403996800d367c/packages/ui/package.json)


# 環境
- React + Vite + TypeScript
- monorepo
- UIはライブラリ的に運用
- Storybook v8 では主に @storybook/react-vite を使用
- vitest による単体テスト + @storybook/addon-vitest による story test も導入済み

# コマンドでアップグレード

```
npx storybook@latest upgrade
```

選択肢はすべて `y` で答えた。

# アップグレード後の問題
`packages\ui\vitest.config.ts`で下記のエラーが発生するようになった。

```
Type 'import(".../node_modules/vite/dist/node/index").Plugin<any>' is not assignable to type 
```

monorepoかつbunで管理しているせいか、`vite`のバージョンの不整合が発生してしまった。
`node_modules`を削除し、再度 `bun i`を行い、vscodeを再起動することで解決した。


# v9での主な変更点まとめ

| 項目 | 内容 |
| --- | --- |
| 📦 パッケージ構成 | renderer パッケージ廃止、統合された addon 構成へ |
| 🧹 不要パッケージの削除 | addon-essentials、旧アドオンの除去 |
| 🧩 ESLint 統合 | Storybook 向け ESLint プラグインの導入 |
| 🧪 テストアドオン | experimental-addon-test → addon-vitest へ移行 |
| 🧭 モノレポ対応 | `main.js` に wrap-require 設定追加 |
| 🔄 インポート整理 | パッケージ名変更に対応してコードのインポートも自動変換 |

# gfmのアップグレード (2025/06/16)

`@storybook/addon-mdx-gfm@8.4.7 which depends on ^8.4.7`のようなエラーがでてマイグレーションに失敗してしまう。
[トラブルシューティング](https://storybook.js.org/docs/writing-docs/mdx#markdown-tables-arent-rendering-correctly)に従って、`remark-gfm`をインストールして設定する

```
$ npm uninstall @storybook/addon-mdx-gfm
$ npm install -D remark-gfm
```

```diff:packages/ui/.storybook/main.ts
+ import remarkGfm from 'remark-gfm';

// 省略
  addons: [
    getAbsolutePath('@storybook/addon-links'),
-   getAbsolutePath('@storybook/addon-docs'),
+    {
+      name: getAbsolutePath('@storybook/addon-docs'),
+      options: {
+        mdxPluginOptions: {
+          mdxCompileOptions: {
+            remarkPlugins: [remarkGfm],
+          },
+        },
+      },
+    },
  ],
```

[addon-mdx-gfm](https://www.npmjs.com/package/@storybook/addon-mdx-gfm)

# CJSのWarningを消す

下記のエラーが出るようになった。

```
The CJS build of Vite's Node API is deprecated. See https://vite.dev/guide/troubleshooting.html#vite-cjs-node-api-deprecated for more details.
```

動的インポートで警告を消すことが可能。
[issues](https://github.com/storybookjs/storybook/issues/26291)

```diff:packages/ui/.storybook/main.ts
- import { loadConfigFromFile, mergeConfig } from 'vite';
// 省略
  async viteFinal(config) {
+    const { mergeConfig, loadConfigFromFile } = await import('vite');
// 省略
```

[修正こみｔｔ](https://github.com/hibohiboo/Yakumi/commit/2fbebed43ad6293281fd0027cb12a6763352709f)
【簡単Kubernetes】【コンテナ】Kubernetesにおける「ワークロードコンテナ」と「初期化コンテナ」の違い


今回は Kubernetes の**ワークロードコンテナ**と**初期化コンテナ**について、違いを簡単にまとめてみました。これらは Pod 内でのコンテナの役割が異なり、使い方も異なるので、それぞれの特徴を理解することが大切です。

---

## 🎯 目的

- Kubernetes の Pod 内で使われる「ワークロードコンテナ」と「初期化コンテナ」の役割の違いを理解する
- 各コンテナがどのようにPodのライフサイクルに影響を与えるかを把握する

---

## 🛠️ ワークロードコンテナとは？

ワークロードコンテナ（Workload Containers）は、**アプリケーションのメインの処理を実行するコンテナ**です。Pod内に1つ以上のワークロードコンテナを含めることができ、通常はユーザーのアプリケーションやサービスが動作します。

- **ライフサイクル**: ワークロードコンテナは、Podが稼働している間ずっと動作し続けます。
- **例**: Webアプリケーション、バックエンドAPIサーバー、データベースなど。

### ワークロードコンテナの特徴

- コンテナ内でメインアプリケーションが実行される
- Podが起動した後、コンテナが稼働している間ずっと実行され続ける
- Podの再起動やスケーリング時には常に新しいワークロードコンテナが立ち上がる

---

## 🛠️ 初期化コンテナとは？

初期化コンテナ（Init Containers）は、**Podが実際にアプリケーションコンテナを起動する前に実行されるコンテナ**です。これらのコンテナは、アプリケーションが実行されるための準備を行います。例えば、依存するファイルのコピーや、設定ファイルの作成などが行われます。

- **ライフサイクル**: 初期化コンテナは Pod 起動時に実行され、全ての初期化コンテナが正常に終了した後に、ワークロードコンテナが実行されます。
- **例**: データベースのマイグレーション、設定ファイルの生成、依存サービスの待機など。

### 初期化コンテナの特徴

- Pod 起動時に実行され、順番に実行される
- すべての初期化コンテナが正常に終了するまで、ワークロードコンテナは起動しない
- 初期化コンテナは、コンテナ内でのファイル作成や環境のセットアップを行うため、ワークロードコンテナがそのまま依存できる状態にする

---

## ⚙️ ワークロードコンテナと初期化コンテナの違い

| 特徴                   | ワークロードコンテナ           | 初期化コンテナ               |
|------------------------|---------------------------------|-----------------------------|
| **役割**               | アプリケーションの実行         | Pod起動前の準備作業         |
| **実行タイミング**       | Pod起動後、稼働中ずっと実行   | Pod起動時、順番に実行       |
| **ライフサイクル**       | Podが生きている間に常に動作   | 全ての初期化コンテナが終了後にワークロードコンテナが実行 |
| **依存関係**             | 他のコンテナと並行して動作可能 | 他の初期化コンテナが終了するまで待機する |

---

## 🔍 実際の使い方の例

たとえば、データベースのマイグレーションを初期化コンテナで実行し、その後にアプリケーションコンテナが起動するように設定できます。これにより、マイグレーションが成功した後にのみアプリケーションが実行されることを保証できます。

```yaml
apiVersion: v1
kind: Pod
metadata:
  name: example-pod
spec:
  initContainers:
  - name: migrate-db
    image: my-database-migration-image
    command: ["sh", "-c", "run-database-migration.sh"]
  containers:
  - name: my-app
    image: my-app-image
    ports:
    - containerPort: 80
```

上記の例では、`initContainers` でデータベースのマイグレーションが実行され、その後に `my-app` コンテナが実行されます。

---

## ✅ まとめ

- **ワークロードコンテナ**は、アプリケーションが実行されるメインのコンテナです。
- **初期化コンテナ**は、Pod の初期化作業を行い、準備が整った後にワークロードコンテナを実行します。
- これらを組み合わせることで、Pod の起動前に必要な処理を完了させることができます。

これらのコンテナをうまく使い分けることで、Kubernetes の Pod をより柔軟かつ効率的に管理することができます。

---

## 🔗 関連リンク

- [Kubernetes公式ドキュメント - Init Containers](https://kubernetes.io/ja/docs/concepts/pods/init-containers/)
- [Kubernetes公式ドキュメント - Containers](https://kubernetes.io/ja/docs/concepts/pods/containers/)

---

何かの参考になれば幸いです！  
質問や改善点があれば、コメントでぜひ教えてください 🙌
ViteでReactプロジェクト（例：npm create vite@latest）を新規作成した際のデータ構成


# 📁 Vite（React）の初期構成と削除してよいファイル一覧

ViteでReactプロジェクト（例：`npm create vite@latest `）を作成すると、以下のような構成になります。

---

## ✅ デフォルトのディレクトリ構成

```
my-blog/
├── node_modules/         # npmパッケージの依存フォルダ（触らない）
├── public/               # 静的ファイルを置く場所
│   └── vite.svg          # 初期ロゴ。不要なら削除可
├── src/                  # ソースコード
│   ├── assets/           # 画像などのアセット（vite.svgが入ってる）
│   ├── App.css           # App用のスタイル
│   ├── App.jsx           # メインのReactコンポーネント
│   ├── index.css         # グローバルCSS
│   └── main.jsx          # アプリのエントリーポイント
├── .gitignore            # Git管理で無視するファイルの指定
├── index.html            # HTMLのテンプレート
├── package.json          # プロジェクトの設定・依存関係
├── vite.config.js        # Viteの設定
└── README.md             # プロジェクト説明（不要なら削除可）
```

---

## 🧹 削除しても大丈夫なファイル

| ファイル/フォルダ             | 削除OK | 理由                   |
| --------------------- | ---- | -------------------- |
| `src/assets/vite.svg` | ✅    | Viteのロゴ画像。使わなければ不要。  |
| `src/App.css`         | ✅    | 独自にCSSを書く場合は不要。      |
| `src/index.css`       | ✅    | グローバルCSSを別で用意するなら不要。 |
| `public/vite.svg`     | ✅    | 使用しないなら削除OK。         |
| `README.md`           | ✅    | GitHubに上げないなら不要。     |
| `App.jsx` の初期表示部分     | ✅    | ロゴなど初期表示は自由に変更可能。    |

---

## 🛑 削除しない方がよいファイル

| ファイル/フォルダ        | 理由                    |
| ---------------- | --------------------- |
| `src/main.jsx`   | Reactアプリの起点。必須。       |
| `index.html`     | HTMLのエントリーポイント。       |
| `package.json`   | npmスクリプトや依存関係を管理。     |
| `vite.config.js` | プロジェクト設定。プラグイン追加時に使う。 |

---

## ✍️ 最小構成で始めたいとき

以下のようにシンプルな構成にするのもおすすめです：

```
src/
├── App.jsx
└── main.jsx
```

* `App.jsx`：自作のReactコンポーネント
* `main.jsx`：ReactDOMでAppを表示するだけ

---

## 💬 補足

* 名前や用途に応じて構成は自由に変更してOK。
* 例えばブログの場合は `/src/pages/` や `/src/components/` のように分けても便利。

---
Automating GIS Processes 2024 写経　Lesson 3（Overview）


https://autogis-site.readthedocs.io/en/latest/lessons/lesson-3/overview.html

今回はソースコードありません。

> In this lesson, we will learn about two interesting problem sets that GIS professionals often come across. First, we will look at different options of converting addresses into coordinates and vice versa, i.e. geocoding. Then, we will learn how to carry out spatial join operations in geopandas, first in the specific use case of finding points inside a polygon, then more generally joining two data sets based on their locations.

このレッスンの主題は２つです。
- 住所を座標に変換する、または座標を住所に変換する、ジオコーディング
- ジオコーディングを`godpandas`のspatial join（空間結合）で実践する

まずは、特定の座標がポリゴンの内側にあるかどうかを検出し、次に、２つのデータセットをそれぞれの場所に基づいて結合します。

## Learning goals

このレッスンのゴールは以下です。

> - geocode addresses, i.e., convert a list of addresses into a list of coordinates,
> - query whether a point is inside a polygon, and
> - join two vector data sets based on their features’ location

- 住所のリストを座標のリストに変換する
- とある点がポリゴンの内側にあるかどうかを問い合わせする
- ２つのベクターデータを、それぞれの地物の場所に基づいて結合する

## Discussion

> - How would you determine if a specific location (like a park or café) is within a neighborhood boundary?
> - If you have two areas, like a commercial and a residential zone, how might you identify where they overlap? Why would this be useful?
> - Imagine you have datasets for schools and hospitals—how could you link them spatially to find schools near hospitals?
> - What types of data would you need to start analyzing spatial relationships between locations?
> - Can you think of real-world applications where knowing the location relationships (inside, near, overlapping) is critical?

- 公園やカフェなど特定の場所が、近所にあるかどうかをどうやって判断するか？
- 商業用と住宅用ゾーンの２つのエリアがある場合、重なる場所をどうやって判断するか？　また、それは何の役に立つのか？
- 学校や病院のデータセットがある場合、病院の近くの学校を見つけるために、どうやって空間的に結び付けるか？
- 複数の場所の空間関係を分析するには、どのような種類のデータが必要か？
- 複数の場所の位置関係（内側、近傍、重複）を判断ことが不可欠なアプリケーションとは？
Java解説 20250602

## プログラムの作成
```java
class sample {
# メインメソッドは下記の記述。
 public static void main (string[] args) {
  system.out.println("Hello")
 }
}

```
## main() メソッド
・プログラムの実行開始位置を表している。
・メソッドとは、ロジックを使用して処理を実行するブロック(中カッコ{})。

## クラスファイル
・下記コマンドを実行するとフォルダに.classというファイルが作成される。
・.classファイルは、JVMが解釈し実行できるファイル。
```
javac ソールファイル名.java
```
## JVM
Javaのプログラムを動作するのに必要なソフトウェアです。

<br>

[オラクル認定資格教科書 Javaプログラマ Bronze SE(試験番号1Z0-818)](https://www.amazon.co.jp/%E3%82%AA%E3%83%A9%E3%82%AF%E3%83%AB%E8%AA%8D%E5%AE%9A%E8%B3%87%E6%A0%BC%E6%95%99%E7%A7%91%E6%9B%B8-Java%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E-Bronze-SE-%E8%A9%A6%E9%A8%93%E7%95%AA%E5%8F%B71Z0-818/dp/479816206X/ref=pd_lpo_d_sccl_1/357-5313211-9846263?pd_rd_w=VQCzo&content-id=amzn1.sym.855d8f70-df76-4181-80b0-56e48ae3bb9b&pf_rd_p=855d8f70-df76-4181-80b0-56e48ae3bb9b&pf_rd_r=JRR4W9RKV32K4AXF1WRZ&pd_rd_wg=l7VoD&pd_rd_r=1d465f85-0562-4b51-b523-77f8486c1508&pd_rd_i=479816206X&psc=1 "オラクル認定資格教科書 Javaプログラマ Bronze SE(試験番号1Z0-818)")
Geminiでラーメンを使う魔法少女を描いてみた。

# 概要

Geminiでラーメンを使う魔法少女を描いてみました。

# 実装

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

```
聖なるラーメンを使う魔法少女を描いてください。
```

![聖なるラーメンを使う魔法少女_20250602.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/8357574a-8dd5-411e-a975-db803e412fe6.png)

# まとめ

何かの役に立てばと。
ABC408回答メモ

# 0.はじめに
　バタバタしてて投稿が送れた今日この頃。
　今回はCまでがカンタンだったのでD以降もいけるか！
　と思ったものの難易度が急にあがり（あくまで個人の感想）
　あえなく３問正解でフィニッシュ。
　解説を読んでもD以降が解けるきがしない・・・。
　（その後出てきたユーザー解説を見てなんとか行けそうな気はしました。）
　それでもレートは+4の707となりました。


# 1. A - Timeout
　Aにしてはやや難しいと感じましたが、よくみたら
　150点問題。
　リストAを先頭から見ていき、肩をたたいた秒数(A[i])前に肩をたたいた秒数A[i-1](i=0の時は0)を
　マイナスし、Sを超えていたらNoを出力、最後まで超えなかったらYesを出力でAC
　長老は寝かせてやれよとおもいつつ、肩たたかないと起きていられないなら
　更新に譲れよ（違う意味で肩をたたかれている）とも思う問題でした。

　https://atcoder.jp/contests/abc408/submissions/66300526


# 2.B - Compression
　こちらも150点の難易度問題。
　普通にソートしても良かったのですが、なんとなくSortedSetを使い
　リストAをSortedSetに変換、最後にリストに戻して出力としました。

　https://atcoder.jp/contests/abc408/submissions/66314654


# 3.C - Not All Covered
　イモス法の例題のような問題。
　問題を城壁毎に、カバーされている砲台数をもとめ
　その最小値を求める問題と読み替えて解きました。

　【考え方】
　　1.城壁毎のカバーされている砲台数リストW(N+2項目初期値0)を用意
　　2.LとRを順に読み込み、W[L]に1を加算、W[R+1]から1を減算
　　3.W[2]から、W[N]まで、W[i]+＝W[i-1]を計算
　　4.端っこ（W[0]、W[N+1]にMをセット
　　5.リストW内の最小値を出力して終了

　リストWはN+1個で済んだなと書いていて思いました。

　https://atcoder.jp/contests/abc408/submissions/66323847

以上
【React】useNavigateでのページ遷移がJestでうまくテストできない2


前回の記事で紹介した修正方法を適用しても、特定のケースでページ遷移のテストがうまくいかない問題に直面しました。

https://qiita.com/KM_20005/items/2762ec6e2e487e384b8b

## 原因

調査の結果、以下の問題が原因であることが判明しました。

**ライブラリの混在**  
 テストコードと実際のページコードで、`react-router` と `react-router-dom` が混在して使用されていました。これにより、Jest でモックした`useNavigate`と実際にページで使用している`useNavigate`が異なっていたためモックが意図通りできていませんでした。

## 修正方法

### ライブラリの統一

`react-router` と `react-router-dom` のどちらかに統一する必要があります。通常、`react-router-dom` を使用するのが一般的です。以下のようにインポートを修正します。

```javascript
// 修正前
import { useNavigate } from "react-router";

// 修正後
import { useNavigate } from "react-router-dom";
```

## まとめ

`import`は基本的に VSCode で自動的に追加していたためどのライブラリから取得しているかを意識していませんでした。そのためこのようなバグが発生していました。

今後は気を付けて`import`していきたいです。

この記事が皆様のコーディングライフの助けになれば幸いです。

## 参考

https://reactrouter.com/api/hooks/useNavigate
【Day0】アプリが完成するまで毎日投稿

## はじめに

webアプリ開発の初心者ですが、勉強とアウトプットを兼ねて、アプリが完成するまで毎日投稿してみます！

厳密には **「毎日1コミット」** することをマイルールにしてみます。

コミットした内容を進捗報告のように記事にしてみます。

また、Chat GPTにはめちゃくちゃお世話になる予定です。

## 作りたいアプリ

### 題材

今回の題材は「写真をアップロードしたらInstagramのサムネイルを自動生成してくれるアプリ」です。

最近カメラを新調したため写真モチベが高く、Instagramで写真用のアカウントを作ってみたりしたのですが、いざ投稿してみると以下のような課題を感じてしまいました。

- 横長の写真のサムネイルが縦長に切り取られてプロフィールのトップページに統一感がない
- キャプションにカメラ情報（機種、レンズ、F値、ISO、シャッタースピード）を入れるのがめんどくさい

### 要件

上記の課題を解決できるように以下のようなアプリを作ってみようと思います。

- 画像をアップロードするとインスグラムのサムネイルの比率に合わせてフレームを作ってくれる
  - フレームは白色で、下部に写真のexif情報からカメラの機種、レンズ、F値、ISO、シャッタースピードを表示する
- キャプション用に写真のexif情報から抽出したカメラの機種、レンズ、F値、ISO、シャッタースピードのテキストを作成する
- 上記のテキストにはカメラの機種、レンズのハッシュタグも追加する

## Chat GPTに相談

自分の構想がお門違いかどうかも分からないのが初心者ってやつです笑
なのでChat GPTに実現可能性を聞いてみます！

また、上記のアプリですが、ぶっちゃけ類似機能を持ったアプリはすでに存在しています。
なので類似アプリと差別化するにはどうしたらいいのか、も聞いてみたいと思います。

### 質問内容

```text
webアプリを作ろうと思ってます。要件は以下のとおりです。
・画像をアップロードするとインスグラムのサムネイルの比率に合わせてフレームを作ってくれる
・フレームは白色ですが、下部に写真のexif情報からカメラの機種、レンズ、F値、ISO、シャッタースピードを表示する
・キャプション用に写真のexif情報から抽出したカメラの機種、レンズ、F値、ISO、シャッタースピードのテキストを作成する
・上記のテキストにはカメラの機種、レンズのハッシュタグも追加する

上記アプリの実現可能性と類似アプリを教えてください。
類似アプリがある場合はどうやって差別化したら良いかアドバイスをください。
```

### 回答

```text
あなたの構想しているWebアプリは十分に実現可能です。以下に要件の実現性と類似アプリ、および差別化の方向性を解説します。

✅ 実現可能性の評価
要件1：画像アップロード＋Instagram比率のフレーム作成
実装難易度：低〜中

Instagramのサムネイル比率（1:1 または 4:5, 16:9 など）にリサイズ＆キャンバスに余白追加。

HTML5 Canvas や画像処理ライブラリ（例: Sharp、Pillow）を使えばOK。

要件2：白フレーム下部にEXIF情報表示
実装難易度：中

EXIF情報の抽出は exif-js（フロント）や piexifjs、バックエンドでは exifread（Python）や exiftool で可能。

表示位置やデザインはCSSで調整可能。

要件3：EXIF情報からキャプション自動生成
実装難易度：中

機種名やレンズ名などからテンプレート文を生成（例：「Sony α7 IV + FE 24-70mm F2.8｜f/2.8, ISO 100, 1/200s」）。

プレーンテキスト出力なので難易度は低め。

要件4：キャプションにハッシュタグ付与
実装難易度：低

機種名やレンズ名を定義済み辞書で変換してハッシュタグに（例：「α7 IV」→ #α7IV）。

🔍 類似アプリの例
1. Frame.io（とは無関係）系のEXIF表示加工ツール
一部の写真好き向けツールに、EXIFオーバーレイを画像に焼き込むものがあります。

例: ExifShot（EXIF入りの画像生成）

例: LensTagger（Lightroom用プラグイン）

2. インスタ投稿支援アプリ
投稿前に画像加工＋キャプション支援してくれるアプリ（例：UNUM, Preview）

ただしEXIF連動型ではない

✨ 差別化のポイント
差別化軸	具体的なアイデア
自動化	EXIFを元に完全自動でフレームとキャプション生成（既存アプリは手動が多い）
デザイン性	Instagram投稿用に映える「余白付きの美しいテンプレート」提供
クリエイター向け特化	カメラ・レンズ愛好家向けUI（例：「FUJIFILM風フレーム」「Leica調」など）
SNS共有の最適化	自動でハッシュタグ生成、コピー用UIなどSNS運用支援要素追加
クラウド保存	写真＋キャプションのセット保存・再ダウンロード機能など

🛠 技術スタックの例（参考）
フロント：Next.js + Tailwind CSS + exif-js

画像処理：Canvas API or sharp (Node.js)

バックエンド：Node.js / Python (Flask) + ExifTool

キャプション生成：テンプレートエンジン (Handlebars風)

デプロイ：Vercel / Render / Firebase Hosting

✅ まとめ
実現可能性は高い。画像処理とEXIF抽出は既存ライブラリで対応可能。

類似ツールはあるが、EXIF→フレーム＋キャプションまで自動化しているものはほぼなし。

差別化の鍵は「写真愛好家視点でのデザイン性」と「投稿補助機能の強化」。


```

### 結論

いけそう！

類似アプリとも何かしらで差別かできそうですね

## 改めて要件を整理

改めて実現したいことを整理してみます。

- 主な機能
  - アップロードされた画像に自動でInstagramのサムネイルサイズに合わせたフレームを作成する
    - フレームは白色
    - フレームにはカメラのExif情報（カメラの機種、レンズ、F値、ISO、シャッタースピード）を記載する
  - キャプションを自動生成する
    - カメラのExif情報（カメラの機種、レンズ、F値、ISO、シャッタースピード）を記載して、機種とレンズについてはハッシュタグも記載する

一旦現時点ではこんな感じですかね！
開発都合で要件が変わったら都度対応していければと思ってます。

## おわりに

毎日Web開発をやってみることにしました。

できるかな、、、不安ですがChat GPTに助けてもらうながら無理のない範囲でやっていきます！