ブログ

技術やプロダクト開発に関する知見を発信しています

Engineering

VOICEVOXをApple containerで動かしたらCPUが4コアしか使われていなかったので割り当てを増やした

Mac で常駐の VOICEVOX サーバーを Apple container で動かしたら、デフォルトでコンテナに 4 CPU しか割り当てられず、合成速度を本来の 4.5 分の 1 に落としていました。M5 Max での実測を交えて、cpus と cpu_num_threads を両方詰める設定を紹介します。

Engineering

Apple Foundation Models で意図分解を4層に積み直したら 3B モデルのクセが見えた

macOS 26 の Apple Foundation Models で自然言語アシスタントを試作する中で、1-pass の Guided Generation を「意図 → 動詞/条件 → 詳細」の4層に再帰分解し直しました。3B オンデバイスモデルの hallucination は instructions では消えず、Swift 側の post-validation で span 単位に潰しています。

Engineering

GitHub Pages は Unpublish しても設定が残るので棚卸しでは DELETE API まで叩く

移行元リポジトリの GitHub Pages を片付けたとき、Settings から Unpublish しただけでは Pages 設定オブジェクトが残り、`GET /repos/{owner}/{repo}/pages` が 200 を返し続けることに気づきました。Unpublish と Delete の違い、`status: null` の読み方、棚卸しで漏れを出さないために `gh api -X DELETE` まで踏み込む判断をまとめます。

Engineering

@AppStorage のキー衝突を User Script Sandboxing 有効のままビルドで検知する

SwiftUI の @AppStorage は同じキーを別の型で共有してもコンパイラが咎めません。Bookil の開発中ブランチで踏んだキー衝突を題材に、型安全ラッパーや SwiftLint では塞げない理由と、Xcode の User Script Sandboxing を有効に保ったまま Pre-action と Run Script の役割分担でビルドを失敗させる仕組みを書きます。

Engineering

PDFの表紙サムネイル生成をMediaBoxからCropBoxに揃え直した

書籍リーダー Bookil の開発中ブランチで、一部の PDF だけ表紙サムネイルが見開き(横長)になっていた問題を直しています。原因は印刷入稿由来の PDF が持つ MediaBox と CropBox の差をサムネイル生成側が考慮していなかったこと。修正の判断と、crop≠media な fixture をコードで生成して回帰テストにする方法を扱います。

Engineering

Bookilで漫画の見開きをページ送りで読ませたくて描画を作り直している

iOS の PDFKit は「ページ送り」と「見開き表示」を同時に成立させられません。書籍リーダー Bookil で見開きの読み心地を作りたかった結果、描画層を自前で持つ方針に振って今もその開発を進めています。PDFKit の制約と、判断の軸を扱います。

Engineering

プロダクトサイト群を 1 つの pnpm workspace に集約した

複数のプロダクトサイトを別リポジトリで運用していたところを、`sites/` と `packages/` の2層構成を持つ単一の pnpm workspace モノレポに集約しました。catalog で依存バージョンを揃え、共有パッケージはロジックと構造だけを渡してデザインは各サイトに残す設計、仮移植のサイトを抱えたまま動かす運用までを扱います。

Engineering

GitHub Actions の workflow を 4 項目で安全側に倒した

org 配下の workflow を `defaults.run.shell: bash`、`actions/checkout` の `persist-credentials: false`、サードパーティアクションの SHA pin、`permissions` 最小化の4項目で揃えた経緯と、`git push` を含む `release.yml` や `submodules: true` を併用する workflow で「適用しない」を選んだ判断軸を記録します。

Engineering

gh search code のインデックスは遅延する

Renovateプリセットの旧ファイル削除前に `gh search code` で参照残存を確認したら、マージ済みの新参照がまだヒットしてくれませんでした。コード検索インデックスの遅延に気づいた経緯と、Contents API でファイル本文を直接取得して実体検証する手順、検索ベース API への向き合い方を扱います。

Engineering

Claude Codeのコミットメッセージ生成が遅いのでツール呼び出しをゼロにした

Claude Codeスキルの動的コンテキスト注入でgit diffを事前に本文へ埋め込み、サブエージェントの推論パスを3回から1回に減らした手順を紹介します。