#
605
2026/1/17
今日のトレンド

jjの哲学とHonoの型推論

どうも、おはようございます。マイクです。FMラジオ風テック番組「zenncast」、2026年1月18日、日曜日の朝7時になりました。今日もZennで話題になっているトレンド記事を、いくつかピックアップしてご紹介していきます。エンジニアのみなさんの朝活のお供に、ゆるっと聞いていってください。

今日は全部で5本の記事をご紹介します。どれも「開発体験」とか「AI活用」とか、2026年っぽさ満載のラインナップになってますよ。

まず1本目。「jjを使っていて驚いた『1変更1コミット』という哲学」という記事です。Gitを普段から使っている方、多いと思うんですけど、「コミット=作業履歴」っていう感覚、ありますよね。細かくコミットを刻んでいって、それをそのままGitHubにプッシュして、PRにして…みたいな。この記事の著者が衝撃を受けたのは、jj、正式名称JujutsuというGit互換のVCSで採用されている「1つの論理的変更につき、1つのコミット(change)を更新し続ける」という思想なんですね。
Gerrit由来のスタイルで、「1 issue = 1 change」。作業途中の細切れコミットはローカルに留めておいて、チームに共有するのは“完成形”のコミットだけ。ブランチも細かく切らずに、1つのchangeをアップデートし続けることで、履歴がめちゃくちゃクリーンになる。レビューする側も、「このchangeは何をやろうとしているのか」が明確で、追いやすい。
一方で、これって結構パラダイムシフトで、「コミット=タイムライン」から、「コミット=論理的変更のスナップショット」への頭の切り替えが必要なんですよね。チーム全体の理解も不可欠。jjは内部でChange-Idを管理していて、同じchangeの更新をきちんと追跡してくれますし、`jj git push -c @`とか`--all`を使えば、途中経過のバックアップもクラウド側に逃がせるので、「履歴はきれいにしたいけど、作業の安全性も欲しい」というわがままを、いい感じに満たしてくれるワークフローになっています。Git運用にモヤモヤを抱えている方には、かなり刺さる内容だと思います。

。。.。。.。.

続いて2本目。「Honoの型推論は好きだけどRPCの書き方が苦手な人のための、RESTな型安全クライアント『hono-typed-rest』を作った」という記事です。Hono使っている方、あるいは気になっている方、多いんじゃないでしょうか。Honoって型推論が強力で、Hono RPCを使うと `client.api.user.$get()` みたいな、サーバー側の定義からクライアントの型も全部乗っかってくる、すごくDXのいい世界があるんですが、「このRPCっぽい書き方、ちょっとしっくり来ないんだよな…」という人もいると。
著者が欲しかったのは、昔ながらの `client.get('/users/:id')` みたいなREST的な書き味のまま、「パスから型が自動でついてくれる」体験。そこで登場するのが「hono-typed-rest」です。Honoの`AppType`からルート情報やレスポンススキーマを抽出して、2xxの成功レスポンスだけを型レベルでフィルタ。パスパラメータの置き換えも実行時に面倒を見てくれるので、`createRestClient`でクライアントを1個作っておけば、`client.get('/users/:id')` みたいな形で、エディタがパスの補完や、パラメータの型、戻り値の型まで推論してくれるんですね。ルートを変更しても、型エラーでちゃんと教えてくれるのでリファクタリングにも強い。
もちろん、トレードオフもあって、パスパラメータの指定が少し直感的じゃなかったり、成功レスポンスはJSON前提なので204とかHEADメソッドは追加の設定が必要だったり、実行時のバリデーションはこのライブラリ単体ではやらなかったり。でも公開後にはHono本体の作者からも反応があったり、Issueでの提案も生まれているようで、Honoエコシステムの1ピースとして、今後も育っていきそうな雰囲気です。Honoが好きだけどRPCのメソッドチェーンがしっくり来ない、という方にはかなりフィットしそうですね。

。。.。。.。.

3本目。「iOS Safariでhaptic feedbackを自由に扱えるOSSを公開しました」という記事です。これ、モバイルWebのユーザー体験が好きな方にはたまらない内容です。iOS Safariって、Androidみたいに `navigator.vibrate()` が使えないので、「ボタンを押した時にちょっとだけブルッとさせたい」という、あのハプティックな気持ちよさをWebで表現するのがずっと難しかったんですよね。
著者が公開したのは、React用のカスタムフック「use-haptic」。iOS 18.0で `<input type="checkbox" switch>` に標準のハプティックがついた、っていう仕様変更を逆手に取っています。フックの中でこのスイッチ用のinput要素を裏側で生成しておいて、label経由でクリックイベントを発火させることで、任意のタイミングでハプティックを鳴らす、というアイデア。仕様上、スクリプトから直接「ブルッとして!」とは言えないので、「ユーザー操作として扱われるクリック」をいい感じにラップしてあげているわけですね。
使い方もシンプルで、npmやjsrからインストールして `useHaptic` を呼び出せば、ボタンコンポーネントなどに簡単に組み込める。すでに自社サービスでも実戦投入しているということで、実用性も確認済み。将来的にiOSでWebKit以外のエンジンが使えるようになれば、よりネイティブアプリに近いリッチなWeb体験が実現できそうだ…という期待も語られていました。今の制約の中で、いかに工夫してユーザー体験を上げていくか、というエンジニアリングの面白さが詰まっている記事です。

。。.。。.。.

4本目。「AgentCore Gateway で MCP サーバー・ツールのアクセス制御を実現する 3 つの方法の徹底比較」という記事です。ここからはガラッと変わって、生成AIの運用まわり、特に権限制御の話ですね。題材になっているのは、Amazon BedrockのAgentCore Gateway経由でMCPサーバーにアクセスする構成で、「RAG用のツールを一般ユーザーと管理者で使い分けたい」というユースケース。
前提として、ユーザーのロールや、どのツールを使えるかといった情報を、CognitoのJWTのカスタムクレーム(roleやallowed_tools)に入れておきます。その上で、アクセス制御の方法として3つのアプローチを比較しています。
1つ目は「Inbound authorization」。これはもう入り口でJWTを検証して、「このGateway自体にアクセスできるかどうか」だけを判定するシンプルな方法。粒度は粗いけど、設定はとにかく楽。
2つ目は「AgentCore Policy」。ポリシー言語のCedarを使って、「誰が、どのツールを、どんな条件で実行できるか」を宣言的に書いていくスタイルです。tools/list の結果を自動的にフィルタリングしてくれるので、「そのユーザーがそもそも見えないツールは最初から一覧に出ない」という、気持ちのいいツール単位のFGACが実現できます。ロールベースの制御なら基本的にはこれが“本命”。
3つ目が「AgentCore Gateway interceptors」。これはLambdaで挟み込む一番柔軟なやり方で、JWTの中身だけじゃなく、リクエストの内容や外部DB、さらには検索結果を見てから、「このツール実行していいか」「返すドキュメントをさらにフィルタするか」といった高度な制御ができます。たとえばSemantic Searchの結果から、ユーザーがアクセス権を持つドキュメントだけを残したり、PIIを除去したり、カスタムヘッダーを付けたり。自由度の代わりに、実装コストとレイテンシーは上がります。
計測ではレイテンシーは(1) < (2) < (3) の順で遅くなりますが、差は数百ミリ秒程度で現実的。まとめとしては、「Gateway単位のざっくり制御なら(1)、ロールベースでツール単位の宣言的制御なら(2)、外部サービス連携や入出力の高度な加工が必要なら(3)、そしてこれらは組み合わせてもOK」という指針になっています。企業で本格的にAIエージェントを運用していきたい方には、かなり実戦的な内容ですね。

。。.。。.。.

そして5本目。「Qwen3-VL-Embeddingを用いたローカル画像検索アプリをつくった」という記事です。これはマルチモーダルAIと検索が好きな方にドンピシャの内容。Alibaba Cloudの「Qwen3-VL-Embedding」というマルチモーダル埋め込みモデルを使って、テキストと画像を同じベクトル空間に埋め込むことで、「テキストで画像を探す」「画像から似ている画像を探す」ができるローカル検索システムを作ったお話です。
ベースとなる公式リポジトリをフォークして、Web UIとドキュメント管理機能を追加。テキスト、画像、PDFをまとめて扱えるようになっていて、PDFはページごとに画像化して登録することで、ページ単位の検索ができるようになっています。検索はベクトル検索方式で、コレクションやファイル種別でのフィルタリング、削除やダウンロード、Markdown表示などもサポート。
動作環境としてはMacとNVIDIA GPU環境に対応していて、2Bのモデル利用が推奨とのこと。GUIは「検索」「ライブラリ」「コレクション」の3画面で構成されていて、ドラッグ&ドロップやクリップボードからのアップロード、PDFの自動ページ分割など、日常使いを意識した作り込みがされています。
何よりポイントなのが「すべてローカルで完結する」という点。クラウドに上げたくない機密ファイルや社内資料でも、安全にベクトル検索ができる。ユースケースとしては、テキストクエリで社内ドキュメント検索をしたり、画像を投げて類似画像を探したり、PDFスライドの中から特定のグラフだけを探し出したり。さらに、この仕組みをAPIとして公開しておけば、別のシステムから呼び出す「画像検索RAG」や、視覚情報も扱えるエージェントの基盤としても活用できるということで、ローカルAI時代の1つの理想形を見せてくれる内容になっています。

。。.。。.。.

ということで、今日は5本の記事をご紹介しました。
1本目は、jjがもたらす「1変更1コミット」という新しいバージョン管理の哲学。
2本目は、Honoの型推論を活かしつつRESTライクに書ける「hono-typed-rest」。
3本目は、iOS Safariでもハプティックフィードバックを扱えるReactフック「use-haptic」。
4本目は、AgentCore GatewayでMCPツールへのアクセス制御をどう設計するか、3つのアプローチの比較。
そして5本目は、Qwen3-VL-Embeddingで実現するローカル完結のマルチモーダル画像検索アプリのお話でした。

気になる記事があった方は、詳しい内容をショーノートにまとめてありますので、ぜひそちらから元の記事もチェックしてみてください。この番組「zenncast」では、感想や「こんなテーマを取り上げてほしい」というリクエストもお待ちしています。
それでは、そろそろお時間です。日曜日の朝、これからコードを書く方も、ちょっとゆっくり過ごす方も、良い一日になりますように。お相手はマイクでした。また次回のzenncastでお会いしましょう。

Related episodes

内容の近いエピソードを推薦しています