Featured image of post コードテイマー【Token Bucket】窓が改まる刹那、汲み手は源を二度干す〜窓で区切らず、雫の溜まる速さで流量を律する〜

コードテイマー【Token Bucket】窓が改まる刹那、汲み手は源を二度干す〜窓で区切らず、雫の溜まる速さで流量を律する〜

配水技師は源が涸れるたび善意で「一刻あたりの汲み上限」を設けた。どの刻も帳簿はきっちり上限で止まる。一度も超えていない。なのに街は渇く——決まって、刻の変わり目に。固定窓は窓ごとにカウンタを0へ戻す。その「0に戻す」一瞬が前の刻をまるごと忘れさせ、継ぎ目をまたいだ手は忘れられた帳簿で二度、上限まで汲む。上限の2倍が源を干す。窓で刻むのをやめ経過ぶん雫を連続で溜める器(Token Bucket)に差し替えれば、継ぎ目そのものが消える。境界バーストを注入時計の模擬戦で決定的に再現し、同時数(門番)とは別の物差し=時間あたり流量を律するTypeScriptの契約の物語。

Featured image of post コードテイマー【Deadlock】二つの釜が、互いの鍵を見つめ合って石になる〜鍵を拾う順を一つに定め、にらみ合いを解く〜

コードテイマー【Deadlock】二つの釜が、互いの鍵を見つめ合って石になる〜鍵を拾う順を一つに定め、にらみ合いを解く〜

二つの自動錬金釜は、単体ではどちらも完璧だった。なのに同時に動かすと、片方が水の鍵を握って火の鍵を待ち、もう片方が火の鍵を握って水の鍵を待ち——互いの一手を見つめ合ったまま石になる。データは壊れない。ただ、永久に止まる。JSはシングルスレッドでもデッドロックは無縁ではない。鍵を拾う順を全アプリで一つに揃え、循環の待ち合いを構造から断つLock Orderingと、復旧策のTimeoutの代償を、永久ハングを決定的に可視化した模擬戦で確かめるTypeScriptの契約の物語。

Featured image of post コードテイマー【Semaphore】一斉になだれ込む群れが、宝の通路を圧し潰す〜門番が通すのはN体、溢れは行列で待たせる〜

コードテイマー【Semaphore】一斉になだれ込む群れが、宝の通路を圧し潰す〜門番が通すのはN体、溢れは行列で待たせる〜

採れ高を上げようと、監督官は使い魔を一斉に坑道へ放った。群れは宝の通路を同時に塞ぎ、坑道ごと圧し潰す。鍵は総数でも投入の間隔でもなく、同時に通路を占める数だった。入口に門番を立て、同時に通すのをN体に絞り、溢れた群れは行列で待たせる——同時占有ピークを物差しにした模擬戦で、有界並行こそ最速の持続採掘だと確かめるTypeScriptの契約の物語。

Featured image of post コードテイマー【Exponential Backoff】焦りの雷鳥は、嵐の前に羽を使い果たす〜待つ刻を倍にし、揺らぎで群れを散らす〜

コードテイマー【Exponential Backoff】焦りの雷鳥は、嵐の前に羽を使い果たす〜待つ刻を倍にし、揺らぎで群れを散らす〜

魔力嵐で本塔が黙るたび、通信士は雷鳥を連発した。だが連発するほど届かない——焦りの雷鳥は、嵐が去る前に羽を使い果たす。失敗ごとに待ちを倍へ伸ばす指数バックオフと、群れを散らすFull Jitterの契約を、sleepを論理時計に変えた模擬戦で検証する物語。

Featured image of post コードテイマー【AbortController】消えた検索が、書庫の奥で魔力を啜る〜AbortSignalを鎖に、残影の霧を断つ〜

コードテイマー【AbortController】消えた検索が、書庫の奥で魔力を啜る〜AbortSignalを鎖に、残影の霧を断つ〜

夕暮れになると図書館の魔力が漏れる。打ち直して閉じたはずの検索が、裏で書庫を潜り、鍵を握り続けていた。AbortSignalを潜行前・潜行後・待機中の三つの刻にhonorさせ、残影を霧散させるTypeScriptの契約を、同時保持カーソル数の模擬戦で検証する物語。

Featured image of post コードメカニック【Mediator】部品は全部直したのに、最後に全部が絡んでいた〜直結をやめ、仲介役にすべてを捌かせる〜

コードメカニック【Mediator】部品は全部直したのに、最後に全部が絡んでいた〜直結をやめ、仲介役にすべてを捌かせる〜

キャンセル機能を足したら、同じ確認メールが客に二通届いた。在庫・課金・通知・配送は綺麗に分けたのに、繋ぎ方だけが直結のN対Nで、通知を出す係が配線に散っていた。部品同士の直結をやめ、仲介役に連絡を集約するMediatorの整備記録。

Featured image of post コードメカニック【Middleware】一行変えるのに、三十回ボンネットを開けた〜各車に貼った同じ点検を、通り抜ける一本のラインへ〜

コードメカニック【Middleware】一行変えるのに、三十回ボンネットを開けた〜各車に貼った同じ点検を、通り抜ける一本のラインへ〜

ログ・認証・recover・処理時間の計測といった同じ前置きが、30個のハンドラーにコピペされていた。リクエストIDの形式を一行変えるだけで30ファイルを直す羽目になる。先頭で呼ぶ共通関数では後処理とrecoverが括れない理由を解き、ハンドラーを包む func(http.Handler) http.Handler の層に横断処理を集約するMiddlewareの整備記録。

Featured image of post コードメカニック【Command】一日見積もりが、底なしだった〜ハンドラーに作り付けた仕事を、一個の命令に切り出す〜

コードメカニック【Command】一日見積もりが、底なしだった〜ハンドラーに作り付けた仕事を、一個の命令に切り出す〜

共通関数に抽出しても、引数に http.ResponseWriter を握っている限りHTTPの外からは呼べない。物件登録のロジックを Execute(ctx) error だけで話すCommandに切り出し、HTTPハンドラーからもフィード取り込みワーカーからも、同じ部品を組み立てて実行できるようにした整備記録。

Featured image of post コードメカニック【Template Method】同じ直しが、三本目にだけ当たらなかった〜丸写しの骨格を、一本の手順書に組み直す〜

コードメカニック【Template Method】同じ直しが、三本目にだけ当たらなかった〜丸写しの骨格を、一本の手順書に組み直す〜

夜間バッチ3本が骨格ごとコピペで動いていた。共通のエラー処理改修が一本だけ当てられず、接続断の朝、そのバッチだけ黙って正常終了——在庫が昨日のまま荷主に渡る。骨格を一本に固定し工程だけ差し込むTemplate Methodの整備記録。

Featured image of post コードメカニック【Decorator】1年眠った証跡が、監査の朝に開かなかった〜専用型の掛け算を、積み重ねの一枚に解く〜

コードメカニック【Decorator】1年眠った証跡が、監査の朝に開かなかった〜専用型の掛け算を、積み重ねの一枚に解く〜

1年前に長期保管した取引証跡が、いざ復元すると末尾が欠けて開かない。圧縮・暗号化・バッファを組み合わせごとの型で抱え、最も複雑な型の閉じ処理を落としたのが原因。同じio.Writerを一枚ずつ被せるDecoratorで、掛け算で増える型を積み重ねに解く整備記録。

Featured image of post コードメカニック【Dependency Injection】ローカルでは動くのにテストが一行も書けない〜内部で組み込んだ部品を外から受け取る形へ〜

コードメカニック【Dependency Injection】ローカルでは動くのにテストが一行も書けない〜内部で組み込んだ部品を外から受け取る形へ〜

配送料の見積りにテストを書こうにも、関数の奥で本物のDBと運送業者APIを直接呼んでいて一行も書けない。依存を内部で作るのをやめ外から受け取り、mainで組み立てて、本物に繋がず試験台で回せるようにする整備記録。