[{"data":1,"prerenderedAt":754},["ShallowReactive",2],{"content-/2026-07-30-diary":3,"all-pages-for-dir":738,"related-/2026-07-30-diary":739,"og-image-/2026-07-30-diary":753},{"id":4,"title":5,"body":6,"category":719,"concepts":720,"description":721,"extension":722,"meta":723,"navigation":655,"ogImage":720,"path":724,"project_name":725,"published":726,"publishedAt":727,"seo":728,"stem":729,"tags":730,"todo":720,"unpublished":726,"updatedAt":720,"__hash__":737},"pages/2026-07/2026-07-30/diary-2026-07-30.md","2026年7月30日の開発日記 - 3つのリポジトリに同じ問いを投げた朝",{"type":7,"value":8,"toc":701},"minimark",[9,14,18,21,25,32,35,40,43,46,52,65,76,79,83,86,89,93,104,112,114,118,121,124,128,139,147,149,153,156,159,163,174,182,184,188,191,194,197,201,209,217,219,223,226,229,233,249,257,259,262,614,616,619,639,641,644,670,672,675],[10,11,13],"h1",{"id":12},"_2026年7月30日の開発日記","2026年7月30日の開発日記",[15,16,17],"p",{},"朝、3つのリポジトリに同じ問いを投げた。「昨日の積み残しって何でしたっけ」。自作の会計システム、eurekapu の Nuxt4 版、mdx-playground。どれも前日の自分が途中で手を離した場所を覚えていない。覚えていないから聞く。聞けば残りが並ぶ。",[15,19,20],{},"並んだものを順に潰していったら、夜には会計システムに消費税が通り、Worker のバンドルに 287KiB の空きができ、AMD の市場規模を扱う記事が3本に分かれていた。ついでに、ストアで配っている Chrome 拡張の中身がそのまま読めることも知った。",[22,23,24],"h2",{"id":24},"今日のタイムライン",[15,26,27],{},[28,29],"img",{"alt":30,"src":31},"タイムライン","/2026-07/2026-07-30/timeline-2026-07-30.png",[22,33,34],{"id":34},"今日やったこと",[36,37,39],"h3",{"id":38},"_1-自作会計システムに消費税を通した","1. 自作会計システムに消費税を通した",[15,41,42],{},"「これ何のプロジェクトでしたっけ」から棚卸しを始めて、積み残し7件を一気に片付けさせた。消費税はスキーマ、ドメイン関数、API、仕訳入力の税区分と税額プレビューまで一本で通した。",[15,44,45],{},"途中で画面が壊れた。共通ロジックを composable に切り出したところで、内部の await が連続して Nuxt のコンテキストが失われていた。Chrome DevTools MCP がブラウザに繋がらなかったので、描画確認は Playwright に切り替えさせている。",[15,47,48],{},[49,50,51],"strong",{},"主な成果:",[53,54,55,59,62],"ul",{},[56,57,58],"li",{},"消費税対応をスキーマからUIまで実装、税区分マスタと集計APIを追加",[56,60,61],{},"トップページのダッシュボード化、反対仕訳の自動起票、ユーザー管理・会社設定画面",[56,63,64],{},"ユニット67件から100件、E2E 6件から18件へ。型チェックも通過",[15,66,67,70,71],{},[49,68,69],{},"詳細:"," ",[72,73,75],"a",{"href":74},"/accounting-system-consumption-tax-phase6","自作会計システムに消費税を通した日。composable の await 連続で Nuxt コンテキストが消えた",[77,78],"hr",{},[36,80,82],{"id":81},"_2-配布済みchrome拡張の中身がそのまま読めた","2. 配布済みChrome拡張の中身がそのまま読めた",[15,84,85],{},"クラウド会計向けの既存拡張を調べていて、ミニファイされていない拡張はストアからそのまま原本が読めると気づいた。「これってストアにある拡張って、ミニファイされてなければ解析不要で原本そのまま読めるんですか」と聞き返したのがこの日の起点になった。",[15,87,88],{},"別の拡張にはソースマップが同梱されていて、そこからコードを復元できた。読んだものをそのまま既存拡張に足すのではなく、独立したプロトタイプで動かしてから取り込む順番に決めた。最後に Codex へ解説書を書かせて HTML で残した。",[15,90,91],{},[49,92,51],{},[53,94,95,98,101],{},[56,96,97],{},"拡張の中身をどこまで読めるかを実物で確認、ソースマップからの復元まで到達",[56,99,100],{},"独立プロトタイプを作って検証、そこで出たバグを潰した。ただし Chrome への初回読み込みだけは自動化できず手作業のまま残った",[56,102,103],{},"リバースエンジニアリングの手順を Codex にドキュメント化させた",[15,105,106,70,108],{},[49,107,69],{},[72,109,111],{"href":110},"/chrome-extension-reverse-engineering-workflow","ストア配布のChrome拡張はどこまで読めるのか。解析から自作プロトタイプの実機検証まで",[77,113],{},[36,115,117],{"id":116},"_3-worker-のバンドル削減2日目","3. Worker のバンドル削減、2日目",[15,119,120],{},"Cloudflare Workers のバンドル上限に向けた削減の続き。教科書12章を外部HTMLへ出したら margin が 656.3KiB から 943.3KiB へ広がった。287KiB の空き。",[15,122,123],{},"次の miller-viewer 島は33ページあるので、同じくらい削れると踏んでいた。実際の削減は予測の 10.4% で止まった。理由を追う前に、grep で作ったばかりのホストファイルを自分で消す事故も起こしている。",[15,125,126],{},[49,127,51],{},[53,129,130,133,136],{},[56,131,132],{},"教科書12章の外部HTML化で margin を +287.0KiB",[56,134,135],{},"miller-viewer 島33ページを切り出し、本番で 33/33・594項目を確認",[56,137,138],{},"削減量が読み違いだったので、次は先に内訳を確定させる方針に変更",[15,140,141,70,143],{},[49,142,69],{},[72,144,146],{"href":145},"/nuxt-worker-bundle-reduction-miller-viewer","Cloudflare Worker のバンドル削減2日目、外部HTML化で287KiB空けて miller-viewer 島は予測の1割だった",[77,148],{},[36,150,152],{"id":151},"_4-amdのサーバーcpu市場規模を記事にしたら思い込みが2回崩れた","4. AMDのサーバーCPU市場規模を記事にしたら、思い込みが2回崩れた",[15,154,155],{},"AMD の公式ブログと Advancing AI 2026 の配布資料を起点に、2030年のサーバーCPU市場が1200億ドルから2200億ドルへ書き換わった件を記事にした。差分がどの層に積み上がったのかを確認し、CPU が増えるなら DRAM もついてくるはずだと考え、この市場は二強だと思っていた。二強の前提は途中で崩れた。",[15,157,158],{},"チャートは最初、スライドの棒をピクセル単位で実測させていた。実測しているならその値で自前のSVGを描けばいい、と指摘して作り直させたら、表の合計が合わない箇所（52と53）が出てきた。記事は結局3本に分かれた。",[15,160,161],{},[49,162,51],{},[53,164,165,168,171],{},[56,166,167],{},"サーバーCPU TAM の記事本体を公開",[56,169,170],{},"TAMを公表する会社としない会社という切り口の記事が派生",[56,172,173],{},"実測値をSVGの積み上げ棒に置き換え、縦808pxを568pxへ",[15,175,176,70,178],{},[49,177,69],{},[72,179,181],{"href":180},"/amd-tam-article-writing-and-chart-verification","AMDのサーバーCPU市場規模を記事にした日｜画素で測った棒を自前のSVGチャートに置き換え、記事が3本に分かれるまで",[77,183],{},[36,185,187],{"id":186},"_5-メモリ供給編と56件の文章推敲","5. メモリ供給編と、56件の文章推敲",[15,189,190],{},"メモリ4社の低PERを扱うシリーズの供給編。設備投資の発表額と、そのビットが実際に売れる時期を分けて書いた。ファクトチェックは4本を並列で走らせている。",[15,192,193],{},"図の文字が読めなかった。実効フォントサイズが 6.87px しかなく、12.53px に直させた。テーブルは8列980pxで、最重要の列が画面の外にいた。5列720pxへ絞った。",[15,195,196],{},"午後は56件の例文を推敲させた。1回目はスキルを1つ指定しただけだったので、共通チェーンごと指定し直してもう一度回している。",[15,198,199],{},[49,200,51],{},[53,202,203,206],{},[56,204,205],{},"供給編を公開、SVG図とテーブルを読める寸法に修正",[56,207,208],{},"推敲チェーンを指定し直して56件を再実行、検証記録つきで出力",[15,210,211,70,213],{},[49,212,69],{},[72,214,216],{"href":215},"/memory-supply-article-and-prose-polish","設備投資の発表と販売可能ビットを分けて書いたメモリ供給編と、56件の推敲を共通チェーンで回した1日",[77,218],{},[36,220,222],{"id":221},"_6-環境バックアップを仕上げ復旧手順をスキルにした","6. 環境バックアップを仕上げ、復旧手順をスキルにした",[15,224,225],{},"前日から持ち越した2つの論点（認証情報の置き場、保護範囲）を決めた。そのうえで思いついたのが、復旧の手順書自体をユーザーレベルのスキルにして、日次でGitHubへ載せるという形。手順書が消える場所に置いてあったら、消えたときに読めない。",[15,227,228],{},"バックアップ先の片方が3回続けて失敗していたことも、このとき気づいた。ほかに、X の動画が落ちてこない件の切り分け、ffmpeg のPATH訂正、フェーズタイマー付きで流したビルドが検証スクリプトに止められた件。",[15,230,231],{},[49,232,51],{},[53,234,235,243,246],{},[56,236,237,238,242],{},"復旧手順を ",[239,240,241],"code",{},"/restore-claude-env"," スキルとして切り出し、版管理下に置いた",[56,244,245],{},"失敗していたバックアップ系統を検知、落ちても理由が読める形に直した",[56,247,248],{},"31分21秒の動画を2つに割り、ffmpeg も最新版へ入れ替えた",[15,250,251,70,253],{},[49,252,69],{},[72,254,256],{"href":255},"/claude-env-backup-and-restore-skill","開発環境のバックアップを仕上げ、復旧手順をスキル化してGitHubで版管理する",[77,258],{},[22,260,261],{"id":261},"今日の試行錯誤",[263,264,265,287],"table",{},[266,267,268],"thead",{},[269,270,271,275,278,281,284],"tr",{},[272,273,274],"th",{},"#",[272,276,277],{},"テーマ",[272,279,280],{},"試したこと",[272,282,283],{},"結果",[272,285,286],{},"気づき",[288,289,290,308,325,342,359,376,393,410,426,443,459,476,493,509,526,543,560,577,598],"tbody",{},[269,291,292,296,299,302,305],{},[293,294,295],"td",{},"1",[293,297,298],{},"会計システムの画面確認",[293,300,301],{},"Chrome DevTools MCP で描画確認",[293,303,304],{},"失敗（ブラウザに繋がらず）",[293,306,307],{},"Playwright に切り替えて確認を通した",[269,309,310,313,316,319,322],{},[293,311,312],{},"2",[293,314,315],{},"会計システムの不具合",[293,317,318],{},"共通ロジックを composable に切り出し",[293,320,321],{},"画面が壊れた",[293,323,324],{},"内部の await 連続で Nuxt コンテキストが失われていた",[269,326,327,330,333,336,339],{},[293,328,329],{},"3",[293,331,332],{},"エラー表示",[293,334,335],{},"サーバー側の理由を画面に出す",[293,337,338],{},"二重表示が発生",[293,340,341],{},"モーダル表示中はページ側を隠す形に",[269,343,344,347,350,353,356],{},[293,345,346],{},"4",[293,348,349],{},"Chrome拡張の解析",[293,351,352],{},"ストア配布物をそのまま読む",[293,354,355],{},"成功",[293,357,358],{},"ミニファイされていなければ原本が読める",[269,360,361,364,367,370,373],{},[293,362,363],{},"5",[293,365,366],{},"拡張の取り込み順",[293,368,369],{},"既存拡張に直接足す案",[293,371,372],{},"採用せず",[293,374,375],{},"独立プロトタイプで動かしてから取り込む順に変更",[269,377,378,381,384,387,390],{},[293,379,380],{},"6",[293,382,383],{},"Workerバンドル削減",[293,385,386],{},"教科書12章を外部HTML化",[293,388,389],{},"成功（+287.0KiB）",[293,391,392],{},"島の外に出すのが効く",[269,394,395,398,401,404,407],{},[293,396,397],{},"7",[293,399,400],{},"同上",[293,402,403],{},"miller-viewer 島33ページを切り出し",[293,405,406],{},"削減は予測の10.4%",[293,408,409],{},"ページ数と削減量は比例しない。先に内訳を測る",[269,411,412,415,417,420,423],{},[293,413,414],{},"8",[293,416,400],{},[293,418,419],{},"grep でホストファイルを整理",[293,421,422],{},"事故（作ったばかりのファイルが消えた）",[293,424,425],{},"対象の絞り込みを先に確認する",[269,427,428,431,434,437,440],{},[293,429,430],{},"9",[293,432,433],{},"AMDのチャート",[293,435,436],{},"スライドの棒をピクセル実測",[293,438,439],{},"実測値は取れたが用途が中途半端",[293,441,442],{},"実測したなら自前のSVGを描けばいい",[269,444,445,448,450,453,456],{},[293,446,447],{},"10",[293,449,400],{},[293,451,452],{},"実測値で表を作り直し",[293,454,455],{},"合計が合わない（52と53）",[293,457,458],{},"作り直したから見つかった",[269,460,461,464,467,470,473],{},[293,462,463],{},"11",[293,465,466],{},"AMD市場の理解",[293,468,469],{},"二強という前提で確認",[293,471,472],{},"前提が崩れた",[293,474,475],{},"崩れた分だけ記事が増えた",[269,477,478,481,484,487,490],{},[293,479,480],{},"12",[293,482,483],{},"メモリ供給編の図",[293,485,486],{},"SVGをそのまま配置",[293,488,489],{},"実効6.87pxで読めず",[293,491,492],{},"12.53pxへ。表示サイズで実効値を測る",[269,494,495,498,500,503,506],{},[293,496,497],{},"13",[293,499,400],{},[293,501,502],{},"テーブル8列980px",[293,504,505],{},"最重要列が画面外",[293,507,508],{},"5列720pxへ絞る",[269,510,511,514,517,520,523],{},[293,512,513],{},"14",[293,515,516],{},"56件の推敲",[293,518,519],{},"スキルを1つ指定して実行",[293,521,522],{},"不十分",[293,524,525],{},"共通チェーンごと指定し直して再実行",[269,527,528,531,534,537,540],{},[293,529,530],{},"15",[293,532,533],{},"バックアップ",[293,535,536],{},"手順書をユーザー配下に置く",[293,538,539],{},"危険と判断",[293,541,542],{},"消える場所の外（スキル＋GitHub）へ",[269,544,545,548,551,554,557],{},[293,546,547],{},"16",[293,549,550],{},"サーバー死活確認",[293,552,553],{},"curl の応答で判定",[293,555,556],{},"誤判定",[293,558,559],{},"応答だけでは決められない",[269,561,562,565,568,571,574],{},[293,563,564],{},"17",[293,566,567],{},"X動画のダウンロード",[293,569,570],{},"yt-dlp の更新を疑う",[293,572,573],{},"別の原因",[293,575,576],{},"保存先ドライブ側の状態を先に見る",[269,578,579,582,585,592,595],{},[293,580,581],{},"18",[293,583,584],{},"ビルド計測",[293,586,587,588,591],{},"フェーズタイマー付きで ",[239,589,590],{},"pnpm generate"," を実行",[293,593,594],{},"途中で停止",[293,596,597],{},"検証スクリプトが記事1本のカレンダー未表示を検出（234/235）。原因は未確定のまま持ち越し",[269,599,600,603,606,609,611],{},[293,601,602],{},"19",[293,604,605],{},"動画の分割",[293,607,608],{},"31分21秒の動画を2つに割る",[293,610,355],{},[293,612,613],{},"15分40.5秒で切り、再エンコードなしのストリームコピー",[77,615],{},[22,617,618],{"id":618},"今日の学び",[53,620,621,624,627,630,633,636],{},[56,622,623],{},"前日の自分は残りを覚えていない。3つのリポジトリで同じ問いから始めたのは無駄ではなく、そこにしか残りの一覧がなかった",[56,625,626],{},"手順書は、それが守る対象と同じ場所に置いてはいけない。消えるときは一緒に消える",[56,628,629],{},"「実測した」で止めると値の置き場所が中途半端になる。実測したなら、その値で描き直すところまでが一続き",[56,631,632],{},"作り直すと合わない数字が出てくる。作り直さなければ合わないまま公開していた",[56,634,635],{},"島の数と削減量は比例しない。ページ数から削減量を見積もると、今回のように1割で止まる",[56,637,638],{},"ストアで配っているものは、ミニファイしていなければ読まれる前提で作られている",[77,640],{},[22,642,643],{"id":643},"明日やること",[53,645,648,658,664],{"className":646},[647],"contains-task-list",[56,649,652,657],{"className":650},[651],"task-list-item",[653,654],"input",{"disabled":655,"type":656},true,"checkbox"," miller-viewer 島の削減量が伸びなかった理由を、先に内訳を測ってから追う",[56,659,661,663],{"className":660},[651],[653,662],{"disabled":655,"type":656}," Chrome拡張のプロトタイプを既存拡張へ取り込む",[56,665,667,669],{"className":666},[651],[653,668],{"disabled":655,"type":656}," 会計システムの初回読み込み自動化（手作業のまま残っている）",[77,671],{},[22,673,674],{"id":674},"関連記事",[53,676,677,681,685,689,693,697],{},[56,678,679],{},[72,680,75],{"href":74},[56,682,683],{},[72,684,111],{"href":110},[56,686,687],{},[72,688,146],{"href":145},[56,690,691],{},[72,692,181],{"href":180},[56,694,695],{},[72,696,216],{"href":215},[56,698,699],{},[72,700,256],{"href":255},{"title":702,"searchDepth":703,"depth":703,"links":704},"",2,[705,706,715,716,717,718],{"id":24,"depth":703,"text":24},{"id":34,"depth":703,"text":34,"children":707},[708,710,711,712,713,714],{"id":38,"depth":709,"text":39},3,{"id":81,"depth":709,"text":82},{"id":116,"depth":709,"text":117},{"id":151,"depth":709,"text":152},{"id":186,"depth":709,"text":187},{"id":221,"depth":709,"text":222},{"id":261,"depth":703,"text":261},{"id":618,"depth":703,"text":618},{"id":643,"depth":703,"text":643},{"id":674,"depth":703,"text":674},"diary",null,"「昨日の積み残しって何でしたっけ」を3つのリポジトリで聞いて回った日。消費税対応を通し、Workerのバンドルを287KiB空け、AMDのTAM記事を書き、配布済みChrome拡張の中身を読み、環境バックアップを仕上げた。","md",{},"/2026-07-30-diary","daily-log",false,"2026-07-30T00:00:00.000Z",{"title":5,"description":721},"2026-07/2026-07-30/diary-2026-07-30",[731,732,733,734,735,736,533],"日記","Nuxt","Cloudflare Workers","Chrome拡張","AMD","メモリ半導体","6XvhcBnZlub5g-Lrf0gg25d1WuMwIH5fqG8W-AolKbo",[],[740,744,745,746,749],{"title":741,"path":742,"publishedAt":743},"2026年7月29日の開発日記 - 朝いちで ~/.claude が消えた日に、7本の作業が並走した","/2026-07-29-diary","2026-07-29T00:00:00.000Z",{"title":256,"path":255,"publishedAt":727},{"title":146,"path":145,"publishedAt":727},{"title":747,"path":748,"publishedAt":743},"Vueページは必ずWorkerバンドルに載る — 静的HTML化と「島マウント」でCloudflare Workersの上限から逃げる","/worker-bundle-reduction-content-islands",{"title":750,"path":751,"publishedAt":752},"2026年7月19日の開発日記 - 朝に足した内部リンクが夕方のビルドを3倍遅くしていた","/2026-07-19-diary","2026-07-19T00:00:00.000Z","https://log.eurekapu.com/og/blog/2026-07-30-diary.png?v=2026-07-30T00%3A00%3A00.000Z&title=2026%E5%B9%B47%E6%9C%8830%E6%97%A5%E3%81%AE%E9%96%8B%E7%99%BA%E6%97%A5%E8%A8%98%20-%203%E3%81%A4%E3%81%AE%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%81%AB%E5%90%8C%E3%81%98%E5%95%8F%E3%81%84%E3%82%92%E6%8A%95%E3%81%92%E3%81%9F%E6%9C%9D&author=Kei%20Komatsu&sig=78df3d9a53e0798a",1785464018792]