[{"data":1,"prerenderedAt":342},["ShallowReactive",2],{"content-/excel-scene-dev-memory-split-loading":3,"all-pages-for-dir":321,"related-/excel-scene-dev-memory-split-loading":322,"og-image-/excel-scene-dev-memory-split-loading":341},{"id":4,"title":5,"body":6,"category":298,"concepts":299,"description":300,"extension":301,"meta":302,"navigation":303,"ogImage":299,"path":304,"project_name":305,"published":306,"publishedAt":307,"seo":308,"source":309,"stem":310,"tags":311,"todo":299,"unpublished":306,"updatedAt":299,"__hash__":320},"pages/2026-09/2026-09-26/excel-scene-dev-memory-split-loading.md","Nuxtのdevサーバーがheap out of memoryで落ちた原因：再現動画のシーン分割読み込みと終わらない回帰テスト",{"type":7,"value":8,"toc":284},"minimark",[9,13,17,20,25,33,36,43,46,49,56,59,74,77,81,88,91,94,97,104,108,115,126,133,156,159,162,165,172,176,183,186,189,196,199,209,223,226,230,233,236,239,250,257,261,268,271],[10,11,5],"h1",{"id":12},"nuxtのdevサーバーがheap-out-of-memoryで落ちた原因再現動画のシーン分割読み込みと終わらない回帰テスト",[14,15,16],"p",{},"朝、Google Tasks に期日切れのタスクが1つ残っていた。\n「Excel基礎講座 章2（ショートカット講座からの移行計画）」で、期日は前日の9/25。\nまずレビューして、内容に問題がなければ実装しようと、07:13 に開いたセッションの Claude Code に頼んだ。",[14,18,19],{},"調べてもらうと、レビューも実装もすでに済んでいた。\n残っていたのは本番デプロイだけで、Google Tasks を完了にし忘れていただけだった。\nタスクはここで片付くはずだった。",[21,22,24],"h2",{"id":23},"起動から約2分で落ちていた-dev-サーバー","起動から約2分で落ちていた dev サーバー",[14,26,27,28,32],{},"Claude Code は章2を確かめるために :3200 で dev サーバーを立て、報告に「dev サーバーは起動したまま」と書いていた。\nこれは誤りだった。\ndev サーバーは起動から約2分で ",[29,30,31],"code",{},"JavaScript heap out of memory"," を出して落ちていた。\nNode の上限は4GBだった。\n章2の確認（動画4本の読み込み、基本ショートカット一覧の表示、コンソールエラーなし）は落ちる前に済んでいたので、確認の結果は変わらない。",[14,34,35],{},"「もうメモリー落ちちゃったんですか？」と聞き返して、何が起きているのかを調べてもらった。\nアイドル時のメモリは1.4GB（起動直後の山は2.7GB）で落ち着いていた。",[14,37,38,39,42],{},"原因は、章2のページではなかった。\n並行セッションが再現動画の台本（",[29,40,41],{},"app/utils/excelScenes/","）を保存するたびに、dev サーバーがファイルの読み込みと組み立てをやり直し、メモリを大量に使っていた。\n保存が何度か重なったところで、上限の4GBを超えて落ちていた。\nPC 全体の空きは約12GBあり、マシンのメモリが足りなかったわけではない。",[21,44,45],{"id":45},"分割すれば済むのか",[14,47,48],{},"自分は、これはリファクタリングが要る話だと受け取った。\nある程度分割してやればいいのか、そうでもないのか。\n根本の対策をやるほうがいいとは思った。\nただ、まず考えを聞かせてもらい、その内容でよいか Codex のレビューも受けておくよう頼んだ。",[14,50,51,52,55],{},"Claude Code は計画書 ",[29,53,54],{},"memo/2026-09-26/excel-scene-dev-memory-plan.md"," を書き、Codex にレビューさせた。\n判定は「条件付き承認」で、致命的な指摘が1点あった。\nその点は計画書の側で直し、Claude Code 自身も「方針はこのままで進めてよい」と判断していた。\n自分は y で進めた。",[14,57,58],{},"Claude Code は、予告していたメモリの計測を、並行セッションの邪魔になるとしていったんやめていた。\n向こうのセッションが止まったと伝えると、残りは計測とコミットだけだという。\n台本の中身は変えずに保存時刻だけを更新し、保存を10回再現して測ってもらった。",[14,60,61,62,65,66,69,70,73],{},"根本対策の第一弾は、コミット ",[29,63,64],{},"42457103"," に入った。\n中身は API の移設、",[29,67,68],{},"nuxt.config.ts","、",[29,71,72],{},"package.json","、計画書、issue である。\n台本を保存しても、dev サーバーのメモリはほぼ増えなくなった。",[14,75,76],{},"ところが、コミット前の lint とテストが5分を超えても終わらない。\n最後のテストは15分以上終わらず、Claude Code が止めた。",[21,78,80],{"id":79},"_15分で終わらない回帰テスト","15分で終わらない回帰テスト",[14,82,83,84,87],{},"テストが終わらない理由がよくわからなかったので、原因を調べてもらった。\nカメラのテストは6秒で通った。\n残るのは回帰テスト ",[29,85,86],{},"excelSceneBookRegression.test.ts"," だった。",[14,89,90],{},"固まっているのか、それとも今日の変更で遅くなったのか。\n並行セッションも同じテストを調べていて、向こうが起動した vitest（08:15:30 起動）は止めたと連絡をくれた。\n両方の調べを合わせた結論は「固まってはいない」だった。\nもともと数十分かかる重いテストで、15分で止めていただけだった。",[14,92,93],{},"この回帰テストは、21本×2通りの全コマを、1コマごとに頭から計算し直す作りになっている。\n1本あたり30〜40秒かかるので、全体で20〜30分かかっても不思議ではない。\n何をやっているテストなのかを説明してもらい、そのうえで1本だけ回してもらった。",[14,95,96],{},"ほかに何も走らせずに cfws-step1 の1本だけを測ると、変更前が30.5秒、変更後が32.0秒だった。\n差は約5%で、ぶれの範囲に収まる。\n計算した画面も、変更前と変更後の両方で記録と完全に一致した。\n途中で出ていた「31.2秒→43.5秒」という数字は、テストが2つ同時に走っていて膨らんだものだった。",[14,98,99,100,103],{},"この結果を issue に追記して、コミット ",[29,101,102],{},"f55d9b4c"," に入れてもらった。\nこのコミットも、Codex のレビューを通らないまま入った。",[21,105,107],{"id":106},"codex-が-401-を返し続けた朝","Codex が 401 を返し続けた朝",[14,109,110,111,114],{},"この日の朝、Codex は障害で止まっていた。\n障害を突き止めたのは、07:11 に開いた別のセッションである。\nそちらでコミット ",[29,112,113],{},"6614e23f"," を作ったとき、コミット時の Codex レビューが動かないまま通っていた。",[14,116,117,118,121,122,125],{},"Codex の認証を取り直そうと、どのコマンドだったかを聞いた。\nそのセッションの Claude Code の見立ては、ChatGPT のログインは正常なのに、Codex が ",[29,119,120],{},"sk-svcac…"," で始まるサービスアカウント用の API キーで接続しようとして弾かれている、というものだった。\n自分は入力欄から ",[29,123,124],{},"codex login"," を打ったが、「Login cancelled」で終わった。\nコードを入力する方式を勧められ、PowerShell 経由でログインし直した。",[14,127,128,129,132],{},"それでも直らない。\nClaude Code が順に疑ったのは、mise、Windows の資格情報マネージャー（項目名だけを見て、中身は見ない）、PowerShell からの起動、",[29,130,131],{},"codex doctor"," だった。\nどれも原因ではなく、どのモデルでも同じエラーが出た。\n最後に OpenAI 公式の稼働状況ページを見ると、「Codex down due to 401 backend key error」（対応中）が出ていた。\n問題の API キーは、OpenAI のサーバーが内部で使っている鍵で、自分が設定したものではなかった。\nその鍵が壊れていて、どのモデルでも、どの端末から起動しても 401 になっていた。",[14,134,135,136,139,140,143,144,146,147,150,151,139,153,155],{},"ほかのセッションもコミットで引っかかるはずなので、メッセージを投げておいてもらった。\n送り先は ",[29,137,138],{},"eurekapu-nuxt4-0c"," と ",[29,141,142],{},"mdx-playground-8b"," の2つで、コミットは止まらずに Codex のレビューなしで通ること、ログインのし直しは要らないことを伝えた。\n07:13 のセッションの ",[29,145,64],{}," も、この障害でレビューなしで入っている。\n07:11 のセッションでは次のコミット ",[29,148,149],{},"fd42722b"," もレビューなしで通り、復旧したら ",[29,152,113],{},[29,154,149],{}," をあらためてレビューにかける、という申し送りが残った。",[21,157,158],{"id":158},"章2を本番に出す",[14,160,161],{},"回帰テストの件は大体OKなので、デプロイまで進めるよう指示した。\nClaude Code は R2 に上げる25件の一覧を最終確認し、並行セッションに一言伝えてからアップロードした。\n25件すべて成功し、本番から実際に取れることを確かめてから、7分ほどのデプロイに入った。",[14,163,164],{},"本番では章2の動画が読み込まれ、読み上げの再生も 0:13 / 1:10 まで進んだ。\n第3章の再現動画も確かめてもらい、Google Tasks の章2のタスクもここで完了にしてもらった。",[14,166,167,168,171],{},"そのあと、章2の目次をパソコン幅で3段表示に変えた。\nこの講座のビューアーには、全チャプターの中身を常時展開する表示と、セクション／チャプター／トピックの3段表示があり、ページごとに切り替えられる。\nキーボードショートカットのページの1行を変えるだけで済んだ。\n再生ボタンの左の空きも詰め、あわせてコミット ",[29,169,170],{},"8c279096"," に入れた。",[21,173,175],{"id":174},"開いたシーンの分だけ読み込むstep-2","開いたシーンの分だけ読み込む（Step 2）",[14,177,178,179,182],{},"第一弾で、保存のたびに膨らむ問題はつぶれた。\nただ、完全な解決ではない。\n再現動画のページ（",[29,180,181],{},"/dev/excel-scene","）を初めて開いたときだけ、メモリが一時的に3.0GBまで上がる。\nページが全シーンを、ブックのデータ約7MBごと読み込んでいるためだ。\nいまの上限の8GBには収まるが、余裕を広げるには Step 2（開いたシーンの分だけ読み込む）が要る。\n自分はこれに着手してもらい、それまでの変更の本番デプロイとコミットもあわせて任せた。",[14,184,185],{},"本番デプロイは先に済ませた（09:08）。\nビルドの間だけ dev サーバーを止めるので、並行セッションには先に一言伝えてもらった。",[14,187,188],{},"Step 2 は、SCENES の本体を書き換えるところから始まった。\n書き換えたあとも、全57シーンの定義は書き換え前と完全に一致した。\n次に、開いたシーンだけを読み込む入口を作り、テストは67件すべて通った。\n最後に dev ページを新しい入口に切り替えた。",[14,190,191,192,195],{},"初めて開いたときの dev サーバーのメモリの山は、3.0GBから2.0GBに下がった。\nコミットは ",[29,193,194],{},"12062f6d"," で、Codex の指摘はなかった。\n朝に思い浮かべた「分割」は、ここで読み込みをシーンごとに分ける形になった。",[21,197,198],{"id":198},"触る前にひとこと伝える",[14,200,201,202,139,205,208],{},"Step 2 のあとは、並行セッションとの受け渡しが続いた。\n自分の指示を受けて ",[29,203,204],{},"bookScene.ts",[29,206,207],{},"excel-scene.vue"," を触る、と向こうから連絡が来た。\nxlookup のシーンで台本と音声の時刻が食い違い、プレビューのページが500エラーになる件を直すという。\n07:13 のセッションは、向こうが終わるまでその2ファイルに触らないと返した。",[14,210,211,212,215,216,219,220,222],{},"編集が終わると、今度は向こうから xlookup の不具合を直してほしいと頼まれた。\n07:13 のセッションは、関数の活用の台本（段⑥）は担当外だとして引き受けず、判断を自分に回してきた。\n結局、自分が了承して、向こうのセッションが直した（",[29,213,214],{},"2bfb1708","）。\nカメラ欄の組み替え（",[29,217,218],{},"e01f625c","）とあわせ、2件とも Step 2 の ",[29,221,194],{}," の後に積まれていた。",[14,224,225],{},"その後、PC の空きメモリが約4.9GB（全体32GB）まで減り、07:13 のセッションが dev サーバーの起動に使ったシェルを、Claude Code 本体が自動で止めた。\ndev サーバー本体（約0.9GB）は応答を続けていた。",[21,227,229],{"id":228},"api-が落ちても戻るようにする","API が落ちても戻るようにする",[14,231,232],{},"画面が表示されないと自分が言ったので、並行セッションが :3200 の dev を起動し直し、その経緯を報告してきた。\nその報告から、07:13 のセッションが作った再現動画の API サーバーの仕組みに、弱点が見つかった。\n向こうでもう直したように見えたので、本当にこちらの修正が要るのか確認し直させた。",[14,234,235],{},"その確認の途中で、事故が起きた。\n10:37ごろ、07:13 のセッションは検証用に別ポート（3292）で API サーバーを立て、本体だけを止める実験をした。\nこのとき PID を取り違え、並行セッションの dev の API サーバー本体を止めてしまった。\n約1分、:3200 のプレビューの API が502を返した。\n07:13 のセッションは、保存時刻だけを更新して node --watch に起動し直させ、200に戻したうえで向こうに報告を入れている。",[14,237,238],{},"構成は、nuxt → dev の本体 → 見張り役 → API 本体の順になっていた。\nAPI 本体だけを止めて確かめ直すと、並行セッションの修正と今回の問題は別の場面を扱っていた。\nこちらの修正はまだ要る。",[14,240,241,242,245,246,249],{},"自分が了承して、",[29,243,244],{},"modules/excel-scene-dev-server.ts"," に見張りを足してもらった。\n3秒おきに API のポートへつなぎ、3回続けて（約9秒）つながらなければ、node --watch と API 本体を木ごと止めて起動し直す。\n5分のうちに5回を超えたら、ループしないように見張りを止める。\nコミットは ",[29,247,248],{},"b9b404ac"," で、API が落ちても約10秒で自動的に戻るようになった。",[14,251,252,253,256],{},"最後に、このセッションの詰め残しを聞いた。\n残っていたのは origin への push だけだった。\n進捗は計画書、issue、章2の実装記録の3つに書き込み、",[29,254,255],{},"9573ec7c"," にコミットしてもらった。",[21,258,260],{"id":259},"段は進んでいなかった","段⑥は進んでいなかった",[14,262,263,264,267],{},"08:59 のセッションでは、Google Tasks の「関数の活用 段⑥」の状況を確かめてもらった。\nタスクのメモには、先ほどのデプロイで再現動画18本が R2 と本番に載ったので一部は進んでいるかもしれない、と書いてあった。\n計画書 ",[29,265,266],{},"memo/2026-09-24/functions-restructure-plan.md"," の §12-2 と突き合わせると、段⑥は手順1の「19本のプレビュー確認」で止まっていた。\n本番に出た18本は、この19本とは別の組1〜3bだった。\nタスクそのものは進んでいない。",[21,269,270],{"id":270},"学び",[272,273,274,278,281],"ul",{},[275,276,277],"li",{},"dev サーバーが落ちた原因は、見ていた章2のページではなく、並行セッションの台本保存だった。落ちた瞬間に開いていたページより先に、何がファイルを書き換えているかを見る。",[275,279,280],{},"「31.2秒→43.5秒」という遅くなったように見える数字は、同時に走った2本のテストが作っていた。1本だけを単独で回すと30.5秒と32.0秒で、変更の影響はぶれの範囲だった。",[275,282,283],{},"Codex の 401 は、手元の設定をいくら掘っても原因が出てこなかった。公式の稼働状況ページを開いたところで、OpenAI 側の障害と分かった。",{"title":285,"searchDepth":286,"depth":286,"links":287},"",2,[288,289,290,291,292,293,294,295,296,297],{"id":23,"depth":286,"text":24},{"id":45,"depth":286,"text":45},{"id":79,"depth":286,"text":80},{"id":106,"depth":286,"text":107},{"id":158,"depth":286,"text":158},{"id":174,"depth":286,"text":175},{"id":198,"depth":286,"text":198},{"id":228,"depth":286,"text":229},{"id":259,"depth":286,"text":260},{"id":270,"depth":286,"text":270},"dev",null,"Excel講座の章2を仕上げるつもりで開いたセッションで、devサーバーが起動2分でメモリ不足により落ちた。原因は並行セッションの台本保存による再読み込み。Codexレビュー済みの計画で根本対策を入れ、シーンの分割読み込みでメモリの山を3.0GBから2.0GBに下げた。終わらない回帰テストの正体と、Codex障害下のコミットも記録する。","md",{},true,"/excel-scene-dev-memory-split-loading","eurekapu-nuxt4",false,"2026-09-26T00:00:00.000Z",{"title":5,"description":300},"make-diary","2026-09/2026-09-26/excel-scene-dev-memory-split-loading",[312,313,314,315,316,317,318,319],"Claude Code","Nuxt","メモリ不足","devサーバー","Vitest","Codex","並列セッション","Excel講座","REVBwUbin4_i1JSit_fndG00FpsnIqwKTYca3DreWYE",[],[323,326,330,333,337],{"title":324,"path":325,"publishedAt":307},"2026年9月26日の開発日記 - 再現動画のレビュー画面づくりと、メモリで落ちるdevサーバー","/2026-09-26-diary",{"title":327,"path":328,"publishedAt":329},"Claude Codeの並行セッションがメモリを取り合った日：devサーバーの停止、テストの絞り込み、Macへの引き継ぎ","/course-parallel-sessions-memory-mac-handoff","2026-09-25T00:00:00.000Z",{"title":331,"path":332,"publishedAt":329},"2026年9月25日の開発日記 - 並行セッションがメモリを取り合い、関数の章をMacへ送った","/2026-09-25-diary",{"title":334,"path":335,"publishedAt":336},"2026年9月24日の開発日記 - Excel講座とCF精算表の動画化を並列セッションで進め、TTSの読みを台本側で決めた","/2026-09-24-diary","2026-09-24T00:00:00.000Z",{"title":338,"path":339,"publishedAt":340},"形骸化した学習ゲートをやめ、pre-commitでCodexのコードレビューを自動化した","/codex-commit-review-gate","2026-09-14T00:00:00.000Z","https://log.eurekapu.com/og/blog/excel-scene-dev-memory-split-loading.png?v=2026-09-26T00%3A00%3A00.000Z&title=Nuxt%E3%81%AEdev%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%8Cheap%20out%20of%20memory%E3%81%A7%E8%90%BD%E3%81%A1%E3%81%9F%E5%8E%9F%E5%9B%A0%EF%BC%9A%E5%86%8D%E7%8F%BE%E5%8B%95%E7%94%BB%E3%81%AE%E3%82%B7%E3%83%BC%E3%83%B3%E5%88%86%E5%89%B2%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%81%BF%E3%81%A8%E7%B5%82%E3%82%8F%E3%82%89%E3%81%AA%E3%81%84%E5%9B%9E%E5%B8%B0%E3%83%86%E3%82%B9%E3%83%88&author=Kei%20Komatsu&sig=b2d882e8201d6d8d",1790469281877]