どうも、マイクです。おはようございます。
2026年1月13日、火曜日の朝7時をまわりました。
ここからの時間は「zenncast」、きょうもZennに上がっているトレンド記事を、ゆるっと楽しく紹介していきます。

さてさて、きょう紹介する記事は全部で5本です。エンジニアリングど真ん中の話から、ゲームの表現の話まで、かなりバラエティ豊かにそろってますよ。通勤通学のおともに、コーヒー片手に、最後までお付き合いください。

まず1本目。タイトルは「サムネイル画像URLはバックエンドで生成すべき」。
これは、画像のサムネイルを動的に変換してCDNでキャッシュするようなサービスを作るとき、「サムネイルURLをフロントエンドで組み立てるのはやめとこうね」という話です。
一見、「クエリパラメータでwidthとheightつければいいでしょ?」ってやりがちなんですが、クライアント側にこのルールを埋め込んじゃうと、あとからバックエンドの仕様を変えたくなったとき、古いモバイルアプリやSPAを全部追いかけないといけなくなる。これがまず、つらいポイント。
さらに、画面幅ごとに微妙に違うサイズでURLを組み立てちゃうと、CDN上のURLパターンが細かく分散してしまって、キャッシュヒット率が落ちます。結果として、帯域もコストも増えるし、レスポンスも遅くなると。
じゃあどうするかというと、バックエンド側で「この画像なら、このURLと、このサイズグループね」と、一括でURLを発行してあげて、フロントはそれをただ使うだけにする。画面幅はざっくり決めたサイズグループに丸めて、picture 要素や srcset に任せて、ブラウザにいい感じに選んでもらう、という設計です。
WebPに対応してるかどうかみたいな微妙な分岐だけ、JavaScriptで判定すればよくて、基本のルールや許可するサイズ集合はバックエンドに寄せておく。これによって、長期的な後方互換性とキャッシュ効率、運用の安定性を確保しよう、という結論になっています。画像配信やっているサービスの方には、かなり刺さる内容じゃないかなと思います。

。。,。。,。。,。。,

続いて2本目。「Agent Skills Scriptsアンチパターン その1」というタイトル。
AIエージェントにスキルとして実行させるスクリプトをどう書くか、そのアンチパターンを解説している記事です。
まず筆者が強く言っているのが、「Bashでなんでも書くのはやめよう」。Windows環境との相性や、可読性・保守性・エラーハンドリング・テスト性・性能など、いろんな面で不利になりがちなので、PythonかJavaScript/TypeScriptをおすすめしています。特に、Claude CodeみたいなBunベースの環境では、JavaScriptが相性いいですよね。
もう一つ大事なのが、エラーの扱い方。スクリプトが例外を吐いたとき、そのまま長いトレースバックをAIエージェントに見せちゃうと、エージェントが本来のタスクじゃなくて「スクリプトの修正」に意識を持っていかれちゃう。
そこで try-except をきちんと書いて、標準出力には「結果だけ」を出す。標準エラーには、Usage やどう直せばいいかがわかる人間向けのメッセージを書く。引数不足や不正な式、型変換エラーなんかも、丁寧にメッセージをそろえておく。さらにスキーマバリデーションを使うことで、「エージェントの使い勝手のいいスキル」に仕立てていこう、という話です。
AIエージェントを業務で使い始めたチームには、「あるあるだな」と思うポイントが多い内容だと思います。

。。,。。,。。,。。,

3本目はガラッと雰囲気が変わって、「ゲームエフェクトってどうやってできてるの?」という記事。
ゲームの派手な魔法や爆発、キラキラした演出って、すごく特殊な技術で作られているように見えるんですが、実は基本構造はかなりシンプルだよ、という話です。
多くのゲームエフェクトは、「テクスチャを、板ポリみたいなシンプルな3Dモデルに貼って、ツール上で複数のパーツを組み合わせて動かす」という構成になっている。UE5のNiagaraを例にすると、エミッターごとにスプライトとマテリアルを設定して、スケールや回転、色なんかを時間変化させて、一つのエフェクトにまとめていきます。
素材も、ものすごい量が必要なわけではなくて、ディスク形状のモデルにUVスクロールをかけるとか、発光テクスチャの一枚絵や、煙・炎のフリップブックをうまく組み合わせることで、かなりいろんな表現ができる。見た目の「すごさ」は、多くの場合、マテリアルとテクスチャの工夫から生まれているんだ、という視点がわかりやすく語られています。
現場では、カメラワークや、敵に向かって飛んでいくホーミング挙動との連携も大事だけれど、いきなり全部やろうとせずに、まずはシンプルな素材とマテリアルでエフェクト単体を作ってみるところから始めよう、というメッセージもいいですね。ゲームエフェクトに興味はあるけど「なんか難しそう…」と思っていた方の背中を押してくれる記事です。

。。,。。,。。,。。,

4本目。「2026年開発環境のことはじめ」。
これは筆者の現在進行形の開発環境紹介なんですが、AIとの付き合い方も含めて、スタンスがとてもおもしろい内容です。
まずAIの使い方。コードを丸ごと書かせるというよりは、「自分の理解度を測る」「知らない領域に入る入口」「設計や方針の相談」といった用途に絞っているとのこと。メインは Claude Desktop を使いながら、コーディングそのものは自分でやるスタイルです。
その理由として、公式ドキュメントを読むことで得られる知識や、偶然の発見、コードを書きながら考え抜く楽しさがある、という話をしていて、紙の辞書と電子辞書の関係にたとえているのが印象的でした。
開発環境としては、M1 Mac 上で Nix + home-manager を使い、Git、neovim、zsh、tmux、alacritty、ssh、direnv、curl、jq、yq、フォント類などをグローバルで管理。各プロジェクトごとに flake.nix と direnv を使って、AWS/Terraform や Rust のバージョン固定(fenix 利用)、AtCoder 用の環境などを閉じた形で用意しているそうです。
エディタはプラグイン控えめの neovim で、nvim-autopairs や telescope-nvim を愛用。インフラは IAM Identity Center でマルチアカウント運用して、高コストなNeuron関連だけ別アカウントに分ける構成。ドメインは管理アカウントで集約しながら、サブドメインを各アカウントに委譲する、といった具合に、実務的な設計も具体的に書かれています。AI全盛の2026年に、「あえて自分の手で書く」ことを大事にした環境づくりが参考になります。

。。,。。,。。,。。,

そしてラスト5本目。「OrvalでスキーマとしてZodの選択と、Fetchクライアントでのランタイムバリデーションが可能になりました」。
APIクライアント生成ツールの Orval が v8.0.0 RC でどう進化したか、という記事です。TypeScript や Zod を使っている方には嬉しいアップデートですね。
一つ目のポイントは、`output.schemas` をオブジェクト形式で設定して `type: 'zod'` を指定するだけで、Zod スキーマを生成できるようになったこと。これまで TypeScript の型定義と Zod スキーマを別々に管理していたようなケースでも、「Zodの定義ひとつあれば、型推論とバリデーションの両方に使える」という形に寄せていけます。定義の重複が減るので、保守もだいぶ楽になりますよね。
二つ目が、Fetch クライアントとの連携強化。`override.fetch.runtimeValidation: true` をオンにすると、生成されるクライアントコードが自動的に Zod スキーマを import して、レスポンスを `parse()` で検証してくれるようになります。
これによって、OpenAPI の仕様と実際のレスポンスがズレていたときに、その場で ZodError として検知できる。外部APIを叩いていると、「ドキュメント通りじゃなかった…」っていうこと、まあまあありますよね。そういう差異をランタイムで拾えて、型安全性も高められる。インテグレーションテストでもかなり心強いはずです。設定もシンプルになっているので、Orval+ZodでのAPIクライアント生成を検討している方には、ぜひチェックしてほしい内容です。

……というわけで、きょうの「zenncast」は、
サムネイルURLの設計はバックエンド主体でいこうという話、
AIエージェントのスクリプトで避けたいアンチパターン、
ゲームエフェクトの意外とシンプルな作り方、
2026年時点の開発環境とAIとの付き合い方、
そして Orval と Zod によるAPIクライアントのランタイムバリデーション、
この5本をご紹介しました。

気になった記事があった方は、番組のショーノートから元の記事に飛べるようになっていますので、ぜひ本編も読んでみてください。ここでは話しきれていない細かいテクニックやコード例なんかも載っています。

番組「zenncast」では、感想やリクエストもいつでもお待ちしています。「こんなテーマを掘り下げてほしい」「この技術がいま熱いよ」などなど、ゆるく送ってもらえたらうれしいです。

それでは、きょうも良い一日をお過ごしください。
お相手はマイクでした。また次回の zenncast でお会いしましょう。

Related episodes

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