[{"data":1,"prerenderedAt":602},["ShallowReactive",2],{"content-/2026-05-10-diary":3,"all-pages-for-dir":600,"og-image-/2026-05-10-diary":601},{"id":4,"title":5,"body":6,"category":581,"description":582,"extension":583,"meta":584,"navigation":520,"ogImage":585,"path":586,"project_name":587,"published":588,"publishedAt":589,"seo":590,"stem":591,"tags":592,"todo":585,"unpublished":588,"updatedAt":585,"__hash__":599},"pages/2026-05/2026-05-10/diary-2026-05-10.md","2026年5月10日の開発日記 - Cloudflare Pages SSG OOM根本対応と書籍の蔵書DB化",{"type":7,"value":8,"toc":564},"minimark",[9,14,18,22,29,32,37,58,63,107,118,121,125,135,139,156,164,166,170,173,177,201,209,211,215,218,222,243,251,253,257,260,262,265,268,461,463,466,504,506,509,541,543,546],[10,11,13],"h1",{"id":12},"_2026年5月10日の開発日記","2026年5月10日の開発日記",[15,16,17],"p",{},"今日は eurekapu-nuxt4 の Cloudflare Pages SSG ビルドが3日連続で赤くなっていた OOM を、Codex の再帰レビューを挟みながら Excel 教材データ分離で根本対応した。並行して book-knowledge-base 側では yomitoku で書籍を1冊 Markdown 化して Turso DB に放り込み、957件の蔵書すべてから奥付情報を抽出するパイプラインの計画も Codex レビュー2周で固めた。終盤は財務諸表読み方教材の図解インベントリ計画まで進めて1日が終わった。",[19,20,21],"h2",{"id":21},"今日のタイムライン",[15,23,24],{},[25,26],"img",{"alt":27,"src":28},"タイムライン","/2026-05/2026-05-10/timeline-2026-05-10.png",[19,30,31],{"id":31},"今日やったこと",[33,34,36],"h3",{"id":35},"_1-cloudflare-pages-ssg-の-oom-を-excel-教材データ分離で根本対応","1. Cloudflare Pages SSG の OOM を Excel 教材データ分離で根本対応",[15,38,39,40,44,45,48,49,53,54,57],{},"5/7 から赤くなり続けていた SSG ビルド OOM の原因が、",[41,42,43],"code",{},"allMillerChapters.ts"," 等から教材全文を直 import している箇所だと Codex に指摘してもらい、Phase 1〜7 で TS 直 import を JSON fetch に切り替えた。",[41,46,47],{},"top.vue"," の manifest は ",[50,51,52],"strong",{},"490KB → 18KB（3.7%）"," まで縮み、10コース分616KBが public/ 配信に分離された。途中で SSR から fetch が 404 になる罠を踏んだが、",[41,55,56],{},"server/api/content/excel/[...].ts"," 経由で static asset binding を読む方式に切り替えて突破。",[15,59,60],{},[50,61,62],{},"主な成果:",[64,65,66,74,80,87,94,97,100],"ul",{},[67,68,69,70,73],"li",{},"Phase 1: ",[41,71,72],{},"excelBasicFunctionsNarration.ts"," の JSON 化",[67,75,76,77,79],{},"Phase 3: ",[41,78,47],{}," の軽量 manifest 化（490KB → 18KB）",[67,81,82,83,86],{},"Phase 4: ",[41,84,85],{},"no-restricted-imports"," で再発防止 lint",[67,88,89,90,93],{},"Phase 5: ",[41,91,92],{},"MillerViewerLoader.vue"," 新設（ラッパー方式でリスク最小）",[67,95,96],{},"Phase 7: 10コース全部 JSON 化（616KB 分離）",[67,98,99],{},"SSR 404 問題を server API 経由方式で解決",[67,101,102,103,106],{},"Codex CLI の Windows サンドボックスエラーも ",[41,104,105],{},"[windows] sandbox = \"unelevated\""," で根本解決",[15,108,109,112,113],{},[50,110,111],{},"詳細:"," ",[114,115,117],"a",{"href":116},"/excel-data-separation-cloudflare-ssg-oom","Cloudflare Pages SSG の OOM を Excel 教材データ分離で根本対応した話",[119,120],"hr",{},[33,122,124],{"id":123},"_2-yomitokuで書籍pdfをmarkdown化してturso-dbに格納","2. yomitokuで書籍PDFをMarkdown化してTurso DBに格納",[15,126,127,130,131,134],{},[41,128,129],{},"/yomitoku"," スラッシュコマンドで199ページの実務書を日本語特化AI OCRに通し、Markdownと170枚の図を抽出して Turso DB に格納した。",[41,132,133],{},"amazon_metadata"," との紐付けも自動で成功し、書籍内の任意の論点を AI に問い合わせられる状態まで持っていけた。",[15,136,137],{},[50,138,62],{},[64,140,141,144,147,150,153],{},[67,142,143],{},"199ページの実務書を Markdown 化（バックグラウンド実行で他作業と並列）",[67,145,146],{},"図170枚を抽出してリネーム",[67,148,149],{},"Turso DB に格納成功",[67,151,152],{},"amazon_metadata と自動紐付け成功",[67,154,155],{},"検索テストで動作確認",[15,157,158,112,160],{},[50,159,111],{},[114,161,163],{"href":162},"/yomitoku-book-pdf-to-markdown-db","yomitokuで書籍PDFをMarkdown化してTurso DBに格納する",[119,165],{},[33,167,169],{"id":168},"_3-蔵書957件の奥付情報抽出パイプラインの計画策定","3. 蔵書957件の奥付情報抽出パイプラインの計画策定",[15,171,172],{},"Dropbox 配下の「00連番で管理するフォルダ」にある書籍PDF 957件から、奥付（版・刷・発行日・出版社・著者・ISBN・定価・印刷所など22項目）を一括抽出して Turso DB に格納するパイプラインの計画を立てた。Codex レビュー2周＋筆者からの「コスト変じゃない？」指摘で計画 v3 まで磨いた。",[15,174,175],{},[50,176,62],{},[64,178,179,182,189,195,198],{},[67,180,181],{},"計画書 v3 を Codex レビュー通過まで持っていった",[67,183,184,185,188],{},"DB スキーマ ",[41,186,187],{},"008_book_colophons.sql"," 作成",[67,190,191,192,188],{},"スキーマ適用スクリプト ",[41,193,194],{},"scripts/apply_colophon_schema.py",[67,196,197],{},"Phase 1 対象10件のリスト確定",[67,199,200],{},"Anthropic API 直叩きを止めて Claude Code 内完結（追加API課金ゼロ）に修正",[15,202,203,112,205],{},[50,204,111],{},[114,206,208],{"href":207},"/colophon-extraction-pipeline-plan","蔵書957件の奥付情報を一括でDBに入れる抽出パイプラインの計画策定",[119,210],{},[33,212,214],{"id":213},"_4-財務諸表読み方教材の図解インベントリ計画","4. 財務諸表読み方教材の図解インベントリ計画",[15,216,217],{},"Turso DB に既に格納済みの決算書解説書（188チャンク）をベースに財務諸表読み方教材を新設する計画を立てた。著作権配慮で書籍そのままはNGなので、170枚の図のインベントリ→既存サイトとの突き合わせ→PASS/AUGMENT/NEW判定→着手、の3段階フローに決めた。当初はOCRデータから自動判定する設計だったが、筆者の指示で「PDFを199ページ直接精査する」方針に切り替えた。",[15,219,220],{},[50,221,62],{},[64,223,224,230,237,240],{},[67,225,226,229],{},[41,227,228],{},"memo/2026-05-10/zaimu-shohyo-yomikata-plan.md"," に計画書保存",[67,231,232,233,236],{},"配置先 ",[41,234,235],{},"/lessons/zaimu-shohyo-yomikata/"," 確定",[67,238,239],{},"図のSVG化先行 → 判定後に教材本文着手のフロー合意",[67,241,242],{},"明日は「PDF所在の特定 → 20ページ×10バッチでの精査」から再開",[15,244,245,112,247],{},[50,246,111],{},[114,248,250],{"href":249},"/financial-statements-lesson-figure-inventory-plan","財務諸表読み方教材の図解インベントリ計画",[119,252],{},[33,254,256],{"id":255},"_5-pr-18-のレビューとスクワッシュマージ","5. PR #18 のレビューとスクワッシュマージ",[15,258,259],{},"cockpit モーダルズーム下で「ピル飛行」と「ガイド点線」のずれを直す PR #18 を独立レビューし、コード自体は問題なしと確認した。CI が落ちていたが原因は main 側の OOM（上記1番）なので、グリーン化を諦めてスクワッシュマージで終了した。",[119,261],{},[19,263,264],{"id":264},"今日の試行錯誤",[15,266,267],{},"ログから拾った試行錯誤の主な周回を並べる。",[269,270,271,293],"table",{},[272,273,274],"thead",{},[275,276,277,281,284,287,290],"tr",{},[278,279,280],"th",{},"#",[278,282,283],{},"テーマ",[278,285,286],{},"試したこと",[278,288,289],{},"結果",[278,291,292],{},"気づき",[294,295,296,322,339,359,376,400,417,437],"tbody",{},[275,297,298,302,305,308,311],{},[299,300,301],"td",{},"1",[299,303,304],{},"Codex Windows サンドボックスエラー",[299,306,307],{},"回避策（プロンプト直埋め込み）で済まそうとした",[299,309,310],{},"失敗（毎回エラー再発）",[299,312,313,314,317,318,321],{},"筆者の「根本対応してくれ」で ",[41,315,316],{},"~/.codex/config.toml"," を ",[41,319,320],{},"unelevated"," に変更して解決",[275,323,324,327,330,333,336],{},[299,325,326],{},"2",[299,328,329],{},"奥付抽出計画のコスト見積もり",[299,331,332],{},"Anthropic API 直叩きで計画 v2 を書いた",[299,334,335],{},"Codex はOK出した",[299,337,338],{},"筆者の「Claude Code 内でやればコストかからないですよね」で v3 に修正、API課金ゼロに",[275,340,341,344,347,353,356],{},[299,342,343],{},"3",[299,345,346],{},"SSR fetch が 404",[299,348,349,352],{},[41,350,351],{},"useRequestURL()"," で絶対URL組み立てに変更",[299,354,355],{},"失敗（依然404）",[299,357,358],{},"SSR fetch が server middleware に阻まれていた。server API 経由で static asset binding を読む方式に切替",[275,360,361,364,367,370,373],{},[299,362,363],{},"4",[299,365,366],{},"dev server に新ルートが取り込まれない",[299,368,369],{},"HMR で反映を期待した",[299,371,372],{},"失敗（古いキャッシュのまま）",[299,374,375],{},"新規 server routes は Nitro 起動時にスキャンされるため dev server 再起動が必要。筆者が手動で再起動して解決",[275,377,378,381,384,390,393],{},[299,379,380],{},"5",[299,382,383],{},"CI failure を OOM と誤診断",[299,385,386,389],{},[41,387,388],{},"NODE_OPTIONS=--max-old-space-size=6144"," を CI に追加して push",[299,391,392],{},"応急処置として通った",[299,394,395,396,399],{},"詳細ログを見直したら ",[50,397,398],{},"OOM ではなく既存の Stripe webhook unit テスト失敗"," だった。誤診断で延命策を入れた反省",[275,401,402,405,408,411,414],{},[299,403,404],{},"6",[299,406,407],{},"図解インベントリを OCR データから作る計画",[299,409,410],{},"Turso DB の170枚の図情報を使う設計",[299,412,413],{},"筆者から待ったがかかった",[299,415,416],{},"「OCR 取得物は雑。199ページしかないなら PDF を直接見て判定すべき」。データの「質」を見る判断",[275,418,419,422,425,431,434],{},[299,420,421],{},"7",[299,423,424],{},"yomitoku 実行前の PDF 探索",[299,426,427,430],{},[41,428,429],{},"find"," でデフォルトパスを当てに行った",[299,432,433],{},"空振り",[299,435,436],{},"別の場所を探して発見。実行前の所在確認の重要性",[275,438,439,442,445,451,454],{},[299,440,441],{},"8",[299,443,444],{},"DB 格納時の関数シグネチャ",[299,446,447,450],{},[41,448,449],{},"init_books_db"," を呼ぼうとした",[299,452,453],{},"スキーマ衝突",[299,455,456,457,460],{},"既存スキーマがあるのでスキップに切替、",[41,458,459],{},"insert_book"," を直接実行",[119,462],{},[19,464,465],{"id":465},"今日の学び",[64,467,468,474,480,486,492,498],{},[67,469,470,473],{},[50,471,472],{},"「データがあるから使う」と「データの質を見て判断する」は別物","。OCR で取得済み170枚あるからといってインベントリ材料に使うと、後で品質に足を引っ張られる。199ページなら直接見られる、と筆者がスケール感覚で判断した",[67,475,476,479],{},[50,477,478],{},"Codex 再帰レビューは「致命的指摘ゼロ」になるまで回すと計画が立つ","。今日は奥付抽出計画で2周＋筆者指摘1回、Excel 分離計画で3周。クソリプ防止指示（「瑣末な点へのクソリプはしないで」）が効いた",[67,481,482,485],{},[50,483,484],{},"AI 同士のレビューでも「ビジネスの臭い」は人間しか嗅げない","。「Codex がOK出した計画でも、コスト見積もりが筆者にはおかしく見える」のように、判断軸を持っているのは人間",[67,487,488,491],{},[50,489,490],{},"「OOM 再発」と思い込んだら詳細ログを見直す","。Build は通っていて Stripe webhook テスト失敗で落ちていた。応急処置（NODE_OPTIONS=6144）を push したのは反省点",[67,493,494,497],{},[50,495,496],{},"新規 server routes は HMR で取り込めない","。Nitro が起動時にスキャンするため、dev server の再起動が必要というハマりポイントを今日見つけた",[67,499,500,503],{},[50,501,502],{},"計画書に Phase 1〜7 を書いておくと、その日のうちに動くところまで通せる","。ラッパー方式（MillerViewerLoader）で既存コードへのリスクを最小化したのも効いた",[119,505],{},[19,507,508],{"id":508},"明日やること",[64,510,513,523,529,535],{"className":511},[512],"contains-task-list",[67,514,517,522],{"className":515},[516],"task-list-item",[518,519],"input",{"disabled":520,"type":521},true,"checkbox"," book-knowledge-base: Phase 0 のスキーマ適用 → Phase 1 の画像化（10件×末尾5ページ＝約50枚）→ サブエージェント並列で奥付抽出",[67,524,526,528],{"className":525},[516],[518,527],{"disabled":520,"type":521}," eurekapu-nuxt4: NODE_OPTIONS=6144 の延命策を外す検討、Stripe webhook テストの修正",[67,530,532,534],{"className":531},[516],[518,533],{"disabled":520,"type":521}," eurekapu-nuxt4: 財務諸表読み方教材 — PDF所在の特定 → 20ページ×10バッチでの精査開始",[67,536,538,540],{"className":537},[516],[518,539],{"disabled":520,"type":521}," eurekapu-nuxt4: Loader の SSR キャッシュ戦略の整理（dev/prod 差異）",[119,542],{},[19,544,545],{"id":545},"関連記事",[64,547,548,552,556,560],{},[67,549,550],{},[114,551,117],{"href":116},[67,553,554],{},[114,555,163],{"href":162},[67,557,558],{},[114,559,208],{"href":207},[67,561,562],{},[114,563,250],{"href":249},{"title":565,"searchDepth":566,"depth":566,"links":567},"",2,[568,569,577,578,579,580],{"id":21,"depth":566,"text":21},{"id":31,"depth":566,"text":31,"children":570},[571,573,574,575,576],{"id":35,"depth":572,"text":36},3,{"id":123,"depth":572,"text":124},{"id":168,"depth":572,"text":169},{"id":213,"depth":572,"text":214},{"id":255,"depth":572,"text":256},{"id":264,"depth":566,"text":264},{"id":465,"depth":566,"text":465},{"id":508,"depth":566,"text":508},{"id":545,"depth":566,"text":545},"diary","Cloudflare Pages SSG の OOM をExcel教材データ分離で根本対応、Codex Windows サンドボックスの設定変更、yomitokuでの書籍OCR、奥付抽出計画とCodex再帰レビュー、財務諸表読み方教材の図解インベントリ計画。","md",{},null,"/2026-05-10-diary","daily-log",false,"2026-05-10T00:00:00.000Z",{"title":5,"description":582},"2026-05/2026-05-10/diary-2026-05-10",[593,594,595,596,597,598],"日記","Cloudflare Pages","Codex","Turso","yomitoku","蔵書管理","4pqrSOAOCLiPpzoQn8asYZKtH-3PWFi6_lQikNutluI",[],"https://log.eurekapu.com/og/blog/2026-05-10-diary.png?v=2026-05-10T00%3A00%3A00.000Z&title=2026%E5%B9%B45%E6%9C%8810%E6%97%A5%E3%81%AE%E9%96%8B%E7%99%BA%E6%97%A5%E8%A8%98%20-%20Cloudflare%20Pages%20SSG%20OOM%E6%A0%B9%E6%9C%AC%E5%AF%BE%E5%BF%9C%E3%81%A8%E6%9B%B8%E7%B1%8D%E3%81%AE%E8%94%B5%E6%9B%B8DB%E5%8C%96&author=Kei%20Komatsu&sig=453c82a0271e770a",1782528834728]