[{"data":1,"prerenderedAt":603},["ShallowReactive",2],{"content-/2026-05-13-diary":3,"all-pages-for-dir":601,"og-image-/2026-05-13-diary":602},{"id":4,"title":5,"body":6,"category":582,"description":583,"extension":584,"meta":585,"navigation":510,"ogImage":586,"path":587,"project_name":588,"published":589,"publishedAt":590,"seo":591,"stem":592,"tags":593,"todo":586,"unpublished":589,"updatedAt":586,"__hash__":600},"pages/2026-05/2026-05-13/diary-2026-05-13.md","2026年5月13日の開発日記 - 教科書プロジェクト立ち上げ・都道府県クイズ・デプロイ高速化",{"type":7,"value":8,"toc":565},"minimark",[9,14,18,22,29,32,37,40,52,55,59,62,70,72,76,96,104,106,110,121,129,131,135,138,146,148,151,464,466,469,494,496,499,538,540,543],[10,11,13],"h1",{"id":12},"_2026年5月13日の開発日記","2026年5月13日の開発日記",[15,16,17],"p",{},"朝から3つのプロジェクトを並行で進めた。Eurekapu側では決算書教科書プロジェクトを新しく起こし、Codexにレビューを依頼しては計画を書き直す往復を3〜4周こなした。mdx-playground側では統計年鑑のデータを使った都道府県農作物クイズを実装し、画面の細かいUI指示を10往復ほど受けながら詰めた。book-knowledge-base側では裁断済みの本5冊をyomitokuでOCRしてTurso DBに流し込み、合間にPDFリネームも回した。デプロイ時間が9.3分に伸びていた問題も、原因を切り分けてR2画像移行と_redirectsで決着させた。",[19,20,21],"h2",{"id":21},"今日のタイムライン",[15,23,24],{},[25,26],"img",{"alt":27,"src":28},"タイムライン","/2026-05/2026-05-13/timeline-2026-05-13.png",[19,30,31],{"id":31},"今日やったこと",[33,34,36],"h3",{"id":35},"_1-決算書教科書プロジェクトの立ち上げとsvg統合eurekapu","1. 決算書教科書プロジェクトの立ち上げとSVG統合（Eurekapu）",[15,38,39],{},"クイズ54トピックを土台にした「教科書ページ」を新規に起こした。計画書をCodexに3往復渡してから着手し、Phase X-0で984問の抽出スクリプトとレジストリを作成、Phase X-2でCH2〜CH7をサブエージェント4本+2本の並列で執筆した。書籍テキストを参考にする話で著作権の翻案リスクに気づき、いったん立ち止まって章節見出しレベルの「論点骨組み」のみ抽出する方針に切り替えた。並列実装後にフォントサイズ違反（15px、14px）をgrepで一括検出して20分で全SVGがガイドに準拠した。",[15,41,42,46,47],{},[43,44,45],"strong",{},"詳細:"," ",[48,49,51],"a",{"href":50},"/textbook-prototype-and-svg-integration","決算書教科書プロジェクト立ち上げとSVG統合",[53,54],"hr",{},[33,56,58],{"id":57},"_2-クイズのvoicevox読み上げ章番号リフレッシュハイライト全件レビューeurekapu","2. クイズのVOICEVOX読み上げ・章番号リフレッシュ・ハイライト全件レビュー（Eurekapu）",[15,60,61],{},"ずんだもんでクイズの問題文・選択肢・解説を読み上げる機能を実装した。Codexレビューを4往復しながら計画を固め、984問の音声をPythonスクリプトで一括生成（バックグラウンド実行）。LocalStorageキーをトピック単位からグローバル単一キーに切り替えて、自動再生2倍の設定がトピック移動でも引き継がれるようにした。Phase 4（C/F編6トピック）・Phase 5（分析編12トピック）・Phase 6（開示・企業価値編6トピック）・Phase 7（workbook 2トピック）を並列サブエージェントで生成。参考書籍と目次番号が酷似していたので、displayNumberで「1-1 / 1-2」形式に変えてタイトルも全54ファイル書き直した。",[15,63,64,46,66],{},[43,65,45],{},[48,67,69],{"href":68},"/quiz-voicevox-and-restructure","VOICEVOX読み上げ・章番号リフレッシュ・ハイライトレビュー計画",[53,71],{},[33,73,75],{"id":74},"_3-デプロイ93分問題のr2画像移行とnitroチャンク外出しeurekapu","3. デプロイ9.3分問題のR2画像移行とNitroチャンク外出し（Eurekapu）",[15,77,78,79,83,84,87,88,91,92,95],{},"デプロイ時間が9.3分に伸びていた。dist/総量248MB・5,195ファイル、画像155MBが突出。最初はR2画像移行を最優先に計画したが、Codexから「順序が逆。施策1（21s短縮）ではなくサーバービルド333sを縮める大型データ外出しを最優先にすべき」と指摘を受けて全面改訂。",[80,81,82],"code",{},"slide-artboard-master-map","（1.04MB）と",[80,85,86],{},"client.precomputed.mjs","（694KB）の外出し、",[80,89,90],{},"_redirects","でR2への302リダイレクト、deploy.ps1の修正まで進めて、",[80,93,94],{},"assets.info-accounting.com/images/..."," への302チェーンを目視確認した。",[15,97,98,46,100],{},[43,99,45],{},[48,101,103],{"href":102},"/deploy-optimization-r2-redirects","デプロイ高速化：R2画像移行とNitroチャンク外出し",[53,105],{},[33,107,109],{"id":108},"_4-統計年鑑データで都道府県農作物クイズを実装mdx-playground","4. 統計年鑑データで都道府県農作物クイズを実装（mdx-playground）",[15,111,112,113,116,117,120],{},"統計年鑑（2024/25）の都道府県別主産地データをTurso DBから引いて、左にSVGチャート・右に4択クイズの2ペインレイアウトで実装した。Eurekapuの",[80,114,115],{},"QuizPage","を参考に書き換え、IntersectionObserverで現在表示中のカードを判定して左図と同期。バンドが狭くて初期表示時にQ1がバンド外に出る問題、スクロール中にObserverが一瞬上のカードを拾う問題は",[80,118,119],{},"suppressObserverUntil","で900ms callbackを止める仕組みで解消した。UIの細かい指示が10往復ほど飛んできて、マゼンタ→緑+グレー+✗、件名を隠す→回答後表示、解説16px、選択肢横4列、activeクラスの濃いグレー枠線などを順次反映した。",[15,122,123,46,125],{},[43,124,45],{},[48,126,128],{"href":127},"/prefecture-agriculture-quiz","統計年鑑データで都道府県農作物クイズを実装",[53,130],{},[33,132,134],{"id":133},"_5-書籍ocrパイプラインとpdfリネーム自動化book-knowledge-base-mdx-playground","5. 書籍OCRパイプラインとPDFリネーム自動化（book-knowledge-base / mdx-playground）",[15,136,137],{},"裁断済み書籍5冊をyomitokuでOCR→restructure-bookでチャンク統合（合計1,148→288に圧縮）。WALロックに何度も遭遇したのでEmbedded ReplicaからHTTP直結に切り替える対応を都度入れた。amazon_metadata取得をWebFetchからagent-browserに書き換え、コマンド定義（.claude/commands/yomitoku.md Step 6.5）を更新。PDFリネームでは並列サブエージェントが副題を誤読していた（「光の思想と実践」→正しくは「その思想と実践」）のを画像で確認して修正、給与計算マニュアルは奥付を画像化して「4年版」と特定。",[15,139,140,46,142],{},[43,141,45],{},[48,143,145],{"href":144},"/book-ocr-pipeline-and-pdf-rename","書籍OCRパイプラインとPDFリネーム自動化",[53,147],{},[19,149,150],{"id":150},"今日の試行錯誤",[152,153,154,176],"table",{},[155,156,157],"thead",{},[158,159,160,164,167,170,173],"tr",{},[161,162,163],"th",{},"#",[161,165,166],{},"テーマ",[161,168,169],{},"試したこと",[161,171,172],{},"結果",[161,174,175],{},"気づき",[177,178,179,197,214,231,248,265,282,299,316,335,352,369,386,403,420,444],"tbody",{},[158,180,181,185,188,191,194],{},[182,183,184],"td",{},"1",[182,186,187],{},"教科書計画書",[182,189,190],{},"Codexにレビュー依頼を3往復",[182,192,193],{},"全指摘解消、実装中に「設計から考え直し」が発生せず",[182,195,196],{},"計画フェーズでCodexを回し切るほうが結果的に速い",[158,198,199,202,205,208,211],{},[182,200,201],{},"2",[182,203,204],{},"書籍本文の活用",[182,206,207],{},"「TursoDBの書籍編集済みテキストを参照」と指示を受けたが翻案リスクで停止",[182,209,210],{},"章節見出しレベルの「論点骨組み」のみ抽出に変更",[182,212,213],{},"翻案リスクの相談はAIに代行させず自分で判断する",[158,215,216,219,222,225,228],{},[182,217,218],{},"3",[182,220,221],{},"フォントサイズ違反",[182,223,224],{},"並列実装後にgrepで15px/14px違反を一括検出",[182,226,227],{},"20分で全SVGがガイドに準拠",[182,229,230],{},"サブエージェント並列はルール違反を後で一括検出する前提で組む",[158,232,233,236,239,242,245],{},[182,234,235],{},"4",[182,237,238],{},"VOICEVOX計画",[182,240,241],{},"Codexに4往復レビュー",[182,243,244],{},"致命的指摘ゼロまで詰めて実装着手",[182,246,247],{},"音声の自動進行タイマーやパス分離など見落としやすい点を拾えた",[158,249,250,253,256,259,262],{},[182,251,252],{},"5",[182,254,255],{},"LocalStorage",[182,257,258],{},"トピック単位キーで保存 → トピック移動で設定が消える",[182,260,261],{},"グローバル単一キーに変更、旧データの移行も組み込み",[182,263,264],{},"UI設定はトピック横断のグローバルが正解",[158,266,267,270,273,276,279],{},[182,268,269],{},"6",[182,271,272],{},"デプロイ計画",[182,274,275],{},"R2画像移行を最優先に計画",[182,277,278],{},"Codexから「順序が逆、333s縮めるNitroチャンク外出しが先」と指摘",[182,280,281],{},"大きい数字から潰す原則を計画前に確認する",[158,283,284,287,290,293,296],{},[182,285,286],{},"7",[182,288,289],{},"dynamic import",[182,291,292],{},"チャンク分割で対応する案",[182,294,295],{},"Codexから「Workerバンドルからは消えない」と指摘",[182,297,298],{},"dynamic importはランタイム遅延ロード、バンドル削減には別手段が必要",[158,300,301,304,307,310,313],{},[182,302,303],{},"8",[182,305,306],{},"IntersectionObserver",[182,308,309],{},"判定バンドを狭く設定",[182,311,312],{},"初期表示時にQ1がバンド外に出てQ2/Q3が選ばれる",[182,314,315],{},"バンドは余裕を持って広く取る",[158,317,318,321,324,327,332],{},[182,319,320],{},"9",[182,322,323],{},"自動スクロール",[182,325,326],{},"Observer callbackがスクロール中に上のカードを拾う",[182,328,329,331],{},[80,330,119],{},"で900ms callbackを止める仕組み",[182,333,334],{},"スクロールアニメーション中はObserverを抑止する",[158,336,337,340,343,346,349],{},[182,338,339],{},"10",[182,341,342],{},"UI色設計",[182,344,345],{},"正解=マゼンタで実装",[182,347,348],{},"ユーザーから「マゼンタは現在表示中の図用。正解は緑、誤答はグレー+✗」と指示",[182,350,351],{},"色の役割は最初に整理しておく",[158,353,354,357,360,363,366],{},[182,355,356],{},"11",[182,358,359],{},"都道府県名表示",[182,361,362],{},"グラフ件名に最初から表示",[182,364,365],{},"ユーザーから「答えがバレるので最初は隠して」と指示",[182,367,368],{},"クイズUIは「答えに繋がる情報を出さない」のが原則",[158,370,371,374,377,380,383],{},[182,372,373],{},"12",[182,375,376],{},"yomitoku WALロック",[182,378,379],{},"Embedded Replicaで取り込み",[182,381,382],{},"別プロセスがWALを掴んでロック解除されず",[182,384,385],{},"HTTP直結に切り替えれば回避できる",[158,387,388,391,394,397,400],{},[182,389,390],{},"13",[182,392,393],{},"PDFリネーム誤読",[182,395,396],{},"サブエージェントがタイトル判定",[182,398,399],{},"副題「その思想と実践」を「光の思想と実践」と誤読",[182,401,402],{},"画像で目視確認するレビュー工程は外せない",[158,404,405,408,411,414,417],{},[182,406,407],{},"14",[182,409,410],{},"給与計算マニュアル",[182,412,413],{},"表紙だけで年版を判定",[182,415,416],{},"「令和4年5月20日発行」と誤って取得",[182,418,419],{},"奥付（後ろのページ）を必ず確認する",[158,421,422,425,428,431,437],{},[182,423,424],{},"15",[182,426,427],{},"EDINETDB_API_KEY",[182,429,430],{},"ユーザーから新キー受領",[182,432,433,436],{},[80,434,435],{},".env","書き込みがharnessで拒否",[182,438,439,440,443],{},"Python ",[80,441,442],{},"os.environ","経由でセッション内のみ使用に切り替え",[158,445,446,449,452,455,461],{},[182,447,448],{},"16",[182,450,451],{},"ビルド中の編集",[182,453,454],{},"デプロイ中にファイル修正",[182,456,457,460],{},[80,458,459],{},"app-styles.B3Vj9TBQ","ハッシュ不整合エラー",[182,462,463],{},"ビルド中にファイルを触らない",[53,465],{},[19,467,468],{"id":468},"今日の学び",[470,471,472,476,479,482,485,491],"ul",{},[473,474,475],"li",{},"Codexレビューは計画フェーズで完全に回し切るほうが、実装中の戻りが減って結果的に速い",[473,477,478],{},"並列サブエージェント実装は「ルール違反を後で一括検出する前提」で組むと、品質と速度のバランスが取れる",[473,480,481],{},"AIが回せるパイプライン（OCR・抽出・リネーム）に、人間は判断と違和感検知だけを差し込む構図が今日の主役",[473,483,484],{},"著作権の翻案リスクは、AIに「やります」と言わせる前に自分で立ち止まる必要がある",[473,486,487,488,490],{},"WALロックや",[80,489,435],{},"書き込み禁止のような環境制約は、CLAUDE.mdに書いた教訓が次に効く",[473,492,493],{},"UI設計の細かい指示（色・配置・隠す/表示）は、最初に役割を整理しておくと往復が減る",[53,495],{},[19,497,498],{"id":498},"明日やること",[470,500,503,513,526,532],{"className":501},[502],"contains-task-list",[473,504,507,512],{"className":505},[506],"task-list-item",[508,509],"input",{"disabled":510,"type":511},true,"checkbox"," 業種別16 SVG図（パイロット + 17並列）のインデックスページを整える",[473,514,516,518,519,521,522,525],{"className":515},[506],[508,517],{"disabled":510,"type":511}," Eurekapuのデプロイで",[80,520,82],{},"を",[80,523,524],{},"public/","配下の静的JSONに切り出して効果測定",[473,527,529,531],{"className":528},[506],[508,530],{"disabled":510,"type":511}," 教科書の本文を「書籍からの引用範囲」で再設計する案を検討",[473,533,535,537],{"className":534},[506],[508,536],{"disabled":510,"type":511}," 都道府県クイズのactiveクラス枠線が他のクイズページにも適用できないか確認",[53,539],{},[19,541,542],{"id":542},"関連記事",[470,544,545,549,553,557,561],{},[473,546,547],{},[48,548,51],{"href":50},[473,550,551],{},[48,552,69],{"href":68},[473,554,555],{},[48,556,103],{"href":102},[473,558,559],{},[48,560,128],{"href":127},[473,562,563],{},[48,564,145],{"href":144},{"title":566,"searchDepth":567,"depth":567,"links":568},"",2,[569,570,578,579,580,581],{"id":21,"depth":567,"text":21},{"id":31,"depth":567,"text":31,"children":571},[572,574,575,576,577],{"id":35,"depth":573,"text":36},3,{"id":57,"depth":573,"text":58},{"id":74,"depth":573,"text":75},{"id":108,"depth":573,"text":109},{"id":133,"depth":573,"text":134},{"id":150,"depth":567,"text":150},{"id":468,"depth":567,"text":468},{"id":498,"depth":567,"text":498},{"id":542,"depth":567,"text":542},"diary","Eurekapuの決算書教科書プロジェクトを起こし、Codexレビューを何度も往復しながら計画を固めた。都道府県農作物クイズはUIの細かい指示を10往復こなして仕上げた。デプロイ9.3分問題はR2画像移行と_redirectsで詰めた。","md",{},null,"/2026-05-13-diary","daily-log",false,"2026-05-13T00:00:00.000Z",{"title":5,"description":583},"2026-05/2026-05-13/diary-2026-05-13",[594,595,596,597,598,599],"日記","Nuxt","Codex","VOICEVOX","yomitoku","Cloudflare","h22qU-jIPIHGt-MipRu6U5_4qmNFSuhwUItFdCTM6gg",[],"https://log.eurekapu.com/og/blog/2026-05-13-diary.png?v=2026-05-13T00%3A00%3A00.000Z&title=2026%E5%B9%B45%E6%9C%8813%E6%97%A5%E3%81%AE%E9%96%8B%E7%99%BA%E6%97%A5%E8%A8%98%20-%20%E6%95%99%E7%A7%91%E6%9B%B8%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E7%AB%8B%E3%81%A1%E4%B8%8A%E3%81%92%E3%83%BB%E9%83%BD%E9%81%93%E5%BA%9C%E7%9C%8C%E3%82%AF%E3%82%A4%E3%82%BA%E3%83%BB%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4%E9%AB%98%E9%80%9F%E5%8C%96&author=Kei%20Komatsu&sig=4a4fa0b93300d9e9",1782528836241]