Engineering Blog

Notes from
the Build.

認証基盤、クラウドインフラ、自社プロダクト開発。実際に手を動かして得た設計判断とその理由を、そのまま書き残しています。

01

Latest Articles

2026.10.04Operations

193 日ぶりの再起動で消える tmux 内の Claude Code セッション 8 本を、同じ名前・同じ会話で戻す

tmux は戻らないが会話は --resume で戻る。8 本中 7 本が戻り、1 本は空の transcript で落ちた。

6 min read
2026.09.23Operations

「hvf is not enabled on this aarch64 host」の原因は、avdmanager が書いた target=android-0 だった

ハイパーバイザーの警告の正体は、AVD の ini に書かれた target=android-0 という1行だった。

6 min read
2026.09.10Operations

git tag --contains は「入っている」と答えたが、その版のアプリに機能は無かった

提出タグ7つすべてにコードは含まれ、どの版にも機能は存在しなかった。両方とも正しい。

5 min read
2026.09.07Architecture

保存できたのに「保存失敗」になる — macOS Sandbox で atomic write 後の権限変更が落ちた

JSON は残っているのに保存失敗になる。macOS Sandbox で起きた atomic write 後の権限変更エラーを切り分けた。

5 min read
2026.09.05Operations

App Store Connect の Analytics Reports API で DAU を出したら、同じ日の値が翌日には 2 割増えていた

Unique Devices を足しただけの DAU は、翌日 2 割増え、リリース日は二重に数え、42% の端末しか見ていなかった。

5 min read
2026.09.02Operations

Claude Code のスキルと設定リポジトリを複数マシンで git 同期していたら、settings.json の hook が未追跡スクリプトを指していた

このマシンでは動く設定が、他のマシンで pull した瞬間に壊れる。diff にも動作確認にも出ない欠陥だった。

6 min read
2026.09.01Identity

development RPをstaging IdPへ向けるのをやめた — OAuthの環境境界は直交する

OAuth clientの論理環境とIdPの物理環境は、同じ名前でも別の境界だった。

5 min read
2026.09.01Identity

Cloudflare D1でOAuth client setを原子的に作り、stale rollbackを拒否する

最後のclient ID衝突とstale rollbackを壊して、安全なclient setの境界を確かめた。

5 min read
2026.09.01Operations

Search ConsoleとGA4でSEO改善を自動化した

SEOデータは毎日集めても、AIに毎日ページを直させない設計にした。

5 min read
2026.08.30Operations

dev client のビルドが1周10分なので、SkSL shader は canvaskit-wasm で先にコンパイルした

1周10分のビルドに乗せる前に、SkSL のコンパイルと worklet 変換を開発機で決着させた。実機で残ったのはネイティブの minSdk 分岐だった。

5 min read
2026.08.29Architecture

並べかえの drag が取り残されて、React Native の Pressable まで全部効かなくなった

busy で onTap を付け外しするたびジェスチャーが再マウントされ、残った ACTIVE な handler が root で全タッチを飲んでいた。

5 min read
2026.08.29Operations

Google Play の reviews.list は直近1週間しか返さない — 同期前のレビューを Play Console の CSV から埋め戻す

今日叩いた reviews.list は 38 件・8/21〜8/28 だけ。キャッシュを始めた日より前は、API のどこにも無かった。

6 min read
2026.08.26Architecture

Live Activity の古いボタンが、次の勤務を変更できないようにした

遅れて届いたロック画面 action を現在の勤務へ適用しないため、操作を表示の寿命へ束縛した。

5 min read
2026.08.26Operations

prebuild とテストを通った生成 Swift が、Xcode archive で初めて落ちた

文字列変換と冪等性が正しくても、生成 Swift がコンパイルできることまでは証明していなかった。

5 min read
2026.08.23Operations

Capacitor から Expo に移したら、アプリアイコンのドット絵が iOS では小さく Android では大きくなった

1.x の実測は iOS 70.3% / Android 37.5%。一般論の比率で焼いた素材は 62% / 55% で、逆向きにずれていた。

5 min read
2026.08.23Operations

Google Play の completed は「公開済み」ではなかった — update.json は商品ページから更新する

管理APIの配信設定と、一般ユーザーが取得できる公開状態は別だった。

5 min read
2026.08.23Architecture

adjustResize を書いたのに、Android 16 ではキーボードが入力欄を隠したままだった

タブバーごとキーボードの下に消えていた。adjustResize はマニフェストにあるのに、ウィンドウが縮んでいなかった。

6 min read
2026.08.22Architecture

勤怠の 22:00→02:00 を、日ごとの保存ではなく複数日一括置換で直した

範囲削除に巻き込まれる翌日の記録を再構成し、複数日の打刻を原子的に置き換えた。

5 min read
2026.08.22Architecture

通知権限を確認したら、React Native の AppState が無限に往復した

snapshot() の通知権限確認が Android の AppState 復帰を呼び、同じ snapshot() を繰り返していた。

5 min read
2026.08.18Architecture

Android の戻るボタンで、ダイアログではなくアプリが閉じた

Capacitor 本体は back を1行も処理していない。何も書かない状態は無反応ではなく、既定の終了だった。

5 min read
2026.08.18Operations

product flavor を足したら、Gradle は成功したまま 9 時間前の APK が署名された

存在チェックを足しただけでは防げなかった。Gradle の前に出力先を消して初めて「無ければ落ちる」が成立した。

5 min read
2026.08.17Operations

プライマリ言語を日本語にしても、App Store の「言語」は英語のままだった

メタデータは日本語、言語宣言は英語。同じ商品ページの2つの値が、別のシステムから来ていた。

4 min read
2026.08.17Architecture

Server Component に Context がないので、表示漏れの防止をビルドの手前に出した

Context が使えない Server Component で、コンポーネントの使い方をどう強制するか。

5 min read
2026.08.16Architecture

kind を増やしても表せない — discriminatedUnion の軸と、読者が知りたい軸は直交していた

分類の軸を増やしても表せないものがある。公開21件を数えたら、食べ物は kind を跨いでいた。

6 min read
2026.08.13Operations

archive が通っても Distribution 証明書は1枚も発行されていない — SSH 越しの Mac mini で iOS を Ad Hoc 署名する

archive は手元の Apple Development 証明書で成功する。Distribution 側の発行可否は export まで分からない。

5 min read
2026.08.13Architecture

text-pretty を日本語の本文に付けると、Safari だけ右が余る

本文カラム 350px のうち最大 78px が空いていた。Chrome では再現しない崩れだった。

5 min read
2026.08.12Architecture

opengraph-image を1枚置いても、OG 画像が付いたのはそのページだけだった

ビルドは通り、画像の URL も 200 を返す。それでも og:image は8ページ中2種類にしか出ていなかった。

9 min read
2026.08.10Architecture

ミニ PC 1台の自宅サーバーに何を載せているか — 層の切り方と、状態の置き場所

自宅サーバー3部作の第1部。1台に何が乗っていて、リクエストが何を通り、状態がどこに置かれているかを図2枚で示す。

10 min read
2026.08.10Operations

LAN の中だけで動く HTTPS を組む — 実在する TLD にワイルドカードを張らないという判断

ワイルドカードは実装が最小で影響が最大になる。自宅 LAN の名前解決と自動 TLS を、どこまで自分のものだと主張するかで設計した記録。

10 min read
2026.08.10Operations

自宅サーバーの操作を自作 CLI 一本に寄せた — 14 コマンドの中身と、どの端末からでも同じように動く仕組み

手で触った1回はどこにも記録されない。状態を変える経路を1本にした CLI の全体像と、SSH 自動転送・マルチノード・巻き戻し・ドリフト検知の設計。

17 min read
2026.08.10Identity

パスキーの verified: true は「この署名が正しい」以上のことを言わない — 自前 OP に WebAuthn を実装して書いた 6 つの防御

ライブラリが検証してくれるのは署名だけ。誰の鍵か・その鍵は進んでいるか・この登録は正当かは、全部その外側に書くことになった。

10 min read
2026.08.10Operations

デプロイ先に入れた secret は読み戻せない — 署名鍵の唯一の恒久コピーは削除対象の中にあった

デプロイ先は値を注入する場所であって、保管する場所として設計されていない。環境を作り直す日まで、その違いは表面化しない。

9 min read
2026.08.10Architecture

PostgreSQL から Cloudflare D1 へデータを移す専用ツールを書いた — 型の対応と、間違えたときに止まる仕組み

移行ツールが最初に見つける問題は、たいてい移行ツールのバグではなく移行元のデータのほうだった。

10 min read
2026.08.10Architecture

fail-closedで設定漏れを全遮断する管理画面の認証ゲート設計

その middleware が唯一の防壁なら落とす、他に本命があるなら通してよい。設定漏れを機能停止として可視化する設計の話。

9 min read
2026.08.10Serverless

Cloudflare Workers の PBKDF2 は 100,000 回までしか回せない — テストが全部通ったまま本番だけ落ちた

ランタイム固有の制限は、ローカルの互換レイヤーが「動いてしまう」方向に嘘をつく。発覚から修正、CPU 時間の壁までの記録。

9 min read
2026.08.10Operations

Workers route をデプロイしても本番は切り替わらなかった — cutover の実体は DNS だった

移行手順のどの操作が実際にトラフィックを動かしているのか。それが分かればロールバック手順も自動的に決まる。

8 min read
2026.08.10Architecture

動いている実装を作り直すとき、仕様ではなく byte 一致を検証手段にする

仕様は複数の実装を許すが、移行で求められているのはそのうちの1つとの一致。判定に解釈が入らない基準を置いた話。

10 min read
2026.08.10Business

DUNS番号を個人事業主が取得|屋号で申請した手順

難しいのは申請そのものではなく、その前提となるドメイン・メール・サイトを揃える部分にある。実際に通した順序。

8 min read
2026.07.28Identity

OpenID Connect の認可コードフローを、実装しながら理解する

リクエストとレスポンスを1本ずつ追いながら、PKCE・state・nonce がそれぞれ何を守っているのかを整理する。

12 min read