どうもー、おはようございます。FMラジオ風テック番組「zenncast」、パーソナリティのマイクです。
時刻は朝7時を少し回ったところ、今日は2025年12月18日、木曜日ですね。
この番組では、エンジニアのみなさんの朝のウォーミングアップにぴったりな、Zennのトレンド記事をゆるっと紹介していきます。
今日はお便りコーナーはお休みで、そのぶんしっかり記事を追いかけていきますよ。
ということで、今日ご紹介する記事は全部で5本です。AIのスキル設計から、Pydantic、迷路生成、V8メモリ、そして新世代のルーターの話まで、かなりバラエティ豊かです。それぞれ500文字くらいで、通勤中でもイメージしやすいようにかみくだいてお届けします。
まず1本目。
タイトルは「Anthropic SkillsからAIプロダクト開発者が学べること:Skillsは"業務マニュアル付きの道具箱"」。
これ、最近話題のAnthropic Skillsを、「ただのTool Useの延長」じゃなくて、「業務マニュアル付きの道具箱」として捉え直している記事です。従来のツール呼び出しって、「このAPI叩けます」「このDB参照できます」みたいに“何ができるか”だけ渡していたのに対して、Skillsは「こういう順番でやってね」「このケースはこう判断してね」という“振る舞い”までMarkdownでパッケージ化してる。SKILL.mdとスクリプト、参照ドキュメントを組み合わせて、必要なときだけ段階的にロードするので、コンテキストウィンドウがぐちゃぐちゃになる問題も抑えられる。Toolは能力、Skillsは振る舞い、MCPは接続レイヤーと役割を分けることで、人のノウハウや優先順位はSkillsに、厳密ロジックはコード側に残せる。つまり、ドメイン専門家が自分で「AIエージェントの行動指針」を育てられる基盤になるよ、という話ですね。ポイントは「コンテキストは増やすものじゃなくて管理するもの」という視点。今後のAIプロダクトでは“強いモデル”より“ちゃんとした業務マニュアル”の設計が差になるんだろうな、という示唆に富んだ内容でした。
。。。。
続いて2本目。
タイトルは「Pydantic の居場所は “境界” がちょうどいい」。
Python使いの方、耳が痛くなるかもしれませんが、Pydantic万能モデルを中心に据えちゃうとだんだん設計が“溶けていく”よ、というお話です。Pydanticに全部乗せすると、値検証・変換、シリアライズ都合、DB都合、さらには業務ルールまでが1つの巨大モデルに合体して、「型ヒントと実態がズレる」「よくわからない暗黙変換が起きる」みたいな状態になりがち。そうすると、Always-Validなドメイン設計もしづらいし、Pydantic v2への移行も怖いし、LLMにリファクタを頼むのも難しくなる。この記事で提案されているのは、「Pydanticは外の世界との窓口に使おう」という整理です。HTTPリクエストやレスポンス、設定ファイル読み込みなど“境界”はPydanticでしっかり検証しつつ、中に入ったら不変条件を持つ素直なドメインモデル(たとえばdataclass)で扱う。そして、境界とドメインの間は明示的な変換関数にする。こうすると、ライブラリのバージョンアップや置き換えの影響は境界側に閉じ込められて、テストもしやすい。一方で、CRUDが中心とか、プロトタイピングの段階では、Pydanticメインでもいい場面はある。ただ判断基準として、「外部入力や互換性ならPydantic」「業務の意味や不変条件はドメイン」と線を引こう、ときれいにまとめてくれています。
。。。。
3本目。ここから急に数学濃度が上がります。
タイトルは「ダンジョン生成に一様分布を求めるのは間違っているだろうか」。
ゲーム好き、アルゴリズム好きにはたまらない内容です。迷路を「頂点と辺からなる連結・ループなし多重グラフ」としてとらえ、閉路を持たない部分グラフ=全域木を「迷路」と定義する。で、「公平な迷路生成」とは、「土台グラフの全域木を一様ランダムにサンプリングすること」だよね、と。ここで出てくるのが行列木の定理。土台グラフのラプラシアン行列の任意の余因子を取ると、それが全域木の本数になる。さらに話は代数的グラフ理論の世界に踏み込んで、Div(G)とかJac(G)といった群の構成、チップ発射ゲーム、砂山モデル、スミス標準形まで登場します。これを使うと、任意の因子からq-簡約因子という“正規形”を一意に求められて、q-簡約因子と全域木の間にはCori–Le Borgne全単射がある。なので、(1)ラプラシアン単因子からヤコビアンの元を乱択生成して、(2)それをq-簡約因子に正規化して、(3)そこから全域木にマッピングする、という3ステップで「ちゃんと一様な」迷路が作れる、というわけです。Haskell実装で、格子状、穴あき、十字型などいろいろなグラフで迷路を描画しつつ、ヤコビアンの群構造がローカルな回転対称性の制御にも効きそうだ、という実験も紹介。最後にはランダムウォーク系の高速アルゴリズムとの比較や、代数曲線論・トロピカル幾何との類似にまで触れていて、「迷路生成からこんなところまで行けるのか…」というロマンのある記事でした。
。。。。
4本目。
タイトルは「V8 JavaScript engineにおけるオンヒープメモリとオフヒープメモリを理解してNext.jsのビルドを救う」。
Next.jsをDocker上でビルドしていたら、npmからpnpmに変えたタイミングで「cannot allocate memory」でコケるようになった、という実録系トラブルシュート記事です。`--max-old-space-size`をいじっても直らないので、`process.memoryUsage()`を見てみたら、`external`と`arrayBuffers`が異常に大きい。ここからV8のオンヒープ/オフヒープの仕組み、そしてArrayBufferの構造を深掘りしていきます。ArrayBufferには、オンヒープ側のJSArrayBufferと、オフヒープ側のBackingStoreがあって、GCはJSArrayBufferを起点に間接的にBackingStoreを解放する。つまり、ArrayBufferを大量に作ると、GCが追いつかないときにオフヒープだけがどんどん食い潰されていく状況が起きる。調査の結果、犯人はNext.jsのwebpackファイルシステムキャッシュで、シリアライズのためにBuffer(=ArrayBuffer)を大量に生成していたと推測。これを「ファイルシステムキャッシュ」から「メモリキャッシュ」に変えたところ、ArrayBuffer使用量がガクッと減って、ビルドが安定した、という結末です。ここで重要なのが、`--max-old-space-size`はオンヒープの上限しかいじらないので、オフヒープには効かないというポイント。Nodeのメモリトラブル、オプションで殴る前に、「オンとオフ、どっちが詰まってるのか?」という観点で見ていくのが大事だなと感じさせてくれます。
。。。。
そしてラスト5本目。
タイトルは「FUNSTACK Router: Navigation APIを用いたルーターライブラリ」。
こちらは、History APIにあまり頼らず、Navigation APIを前提に設計したReact向けルーターのPoC紹介記事です。特徴的なのは、`<Link>`専用コンポーネントを用意しなくても、aタグのクリックを`navigate`イベントで拾ってルーティングできるところ。ルート定義と`<Router>`があれば動き始める、かなり薄いラッパーになっています。もう一つの肝が、ルートごとの`loader`関数。ここでデータ取得をして、そのPromiseをコンポーネントに渡す設計になっているので、`event.intercept`を使って「データが取れるまでナビゲーションの完了を遅らせる」ことができる。するとブラウザ標準の「読み込み中」インジケーターをそのまま活かせるんですね。また、NavigationHistoryEntryの`id`をキーにして履歴ごとのキャッシュを持つことで、戻る・進むときには再フェッチを避けられる。FUNSTACK Router自体は`navigate`と`currententrychange`だけを使うミニマル設計にしてあって、他のNavigation APIイベントはユーザーが直接扱える、という立ち位置です。今後の拡張としては、遷移ガード、フォーム送信対応、View Transition APIとの連携などが挙げられていて、「Navigation API時代のルーターってこうなるのかも」というひとつの提案になっています。
というわけで、今日は全部で5本の記事をご紹介しました。
Anthropic Skillsで「業務マニュアル付きの道具箱」としてAIの振る舞いを設計する話、Pydanticを“境界”に押しとどめてドメインを守る設計の話、一様ランダムな迷路生成から広がるグラフ理論の世界、V8のオンヒープ/オフヒープを理解してNext.jsビルドを救った話、そしてNavigation API前提のFUNSTACK Routerで次世代ルーティングを探る話まで、かなり濃いラインナップでした。
気になった記事があった方は、番組のショーノートに詳しい情報を載せておきますので、ぜひそちらから元記事も読んでみてください。
「zenncast」では、番組の感想や「こんなテーマを取り上げてほしい」といったリクエストも大歓迎です。あなたの開発の現場での悩みや、最近はまっている技術ネタなんかも、ぜひ教えてください。
それでは、そろそろお別れの時間です。
次回の配信でまたお会いしましょう。
お相手はマイクでした。いってらっしゃい!