[{"data":1,"prerenderedAt":618},["ShallowReactive",2],{"content-/2026-05-16-diary":3,"all-pages-for-dir":616,"og-image-/2026-05-16-diary":617},{"id":4,"title":5,"body":6,"category":597,"description":598,"extension":599,"meta":600,"navigation":542,"ogImage":601,"path":602,"project_name":603,"published":604,"publishedAt":605,"seo":606,"stem":607,"tags":608,"todo":601,"unpublished":604,"updatedAt":601,"__hash__":615},"pages/2026-05/2026-05-16/diary-2026-05-16.md","2026年5月16日の開発日記 - 投資判断クイズ75問の音声化とマイクロン決算チャートの作り込み",{"type":7,"value":8,"toc":582},"minimark",[9,14,18,26,30,37,40,45,48,53,80,91,94,98,105,109,123,131,133,137,155,158,162,173,181,183,186,471,473,476,526,528,531,563,565,568],[10,11,13],"h1",{"id":12},"_2026年5月16日の開発日記","2026年5月16日の開発日記",[15,16,17],"p",{},"土曜日。午前中は昨日の積み残しに着手して、Part 2 投資判断クイズ75問のVOICEVOX音声化パイプラインを本番デプロイまで一気に通した。午後はマイクロン（MU）の決算「期待との差」を可視化するSVGチャートを新規実装して、ユーザー視点での違和感を拾いながら11回ほどClaude Codeに作り直してもらった。",[15,19,20,21,25],{},"人間が手を動かしたのは「音声化やっていきましょう」「マージンっておかしい」「数字大きく」程度の判断だけで、SVG座標計算もWAV合成スクリプトもgrep+置換もClaude Codeに丸投げした。",[22,23,24],"strong",{},"判断する係と実行する係","の分担が今日もうまく回った。",[27,28,29],"h2",{"id":29},"今日のタイムライン",[15,31,32],{},[33,34],"img",{"alt":35,"src":36},"タイムライン","/2026-05/2026-05-16/timeline-2026-05-16.png",[27,38,39],{"id":39},"今日やったこと",[41,42,44],"h3",{"id":43},"_1-part-2-投資判断クイズ75問のvoicevox音声化パイプライン","1. Part 2 投資判断クイズ75問のVOICEVOX音声化パイプライン",[15,46,47],{},"朝、昨日の積み残しに着手。既存のA/B/C用JSONベース音声化スクリプトをTSファイル対応に拡張し、誤答パターンDも合成対象に追加。investment-1/2/3の全75問（25+18+32）を順次合成→MP3変換→Cloudflare R2へ並列アップロード→Nuxtページの18箇所にnarrationConfigを一括追加→localhost:3200と本番サイトで音声再生フル確認→デプロイ（5.4分）まで一気通貫で完走。",[15,49,50],{},[22,51,52],{},"主な成果:",[54,55,56,60,63,66,69],"ul",{},[57,58,59],"li",{},"WAV 150問合成、151ファイルMP3変換、R2アップロード完了",[57,61,62],{},"18ページ分の narrationConfig をPython一括置換で挿入",[57,64,65],{},"ローカル・本番の両方で音声再生フロー検証",[57,67,68],{},"PowerShellのhere-string失敗からPython代替への切り替え経験",[57,70,71,75,76,79],{},[72,73,74],"code",{},"INV-NEST"," prefix typo（正しくは ",[72,77,78],{},"NESTEGG","）を404から発見・修正",[15,81,82,85,86],{},[22,83,84],{},"詳細:"," ",[87,88,90],"a",{"href":89},"/quiz-narration-pipeline","投資判断クイズ75問をVOICEVOXで音声化：WAV合成→MP3→Cloudflare R2まで一気通貫の自動化ログ",[92,93],"hr",{},[41,95,97],{"id":96},"_2-マイクロン決算期待との差をsvgチャートで可視化","2. マイクロン決算「期待との差」をSVGチャートで可視化",[15,99,100,101,104],{},"午後、投資の教科書 ch08（投資原則）ページに、マイクロン（ティッカー: MU）の決算「期待との差」を可視化する ",[72,102,103],{},"Part2Ch8MuExpectations.vue"," を新規実装。4指標（売上・EPS・ガイダンス売上・ガイダンスEPS）× 3四半期の実績vs予想を並列棒で並べ、株価バンドを5つ目のチャートとして横長で統合。レスポンシブの目次もフローティングFAB+スライドパネルに改修。",[15,106,107],{},[22,108,52],{},[54,110,111,114,117,120],{},[57,112,113],{},"11回のイテレーションで完成（値ラベル衝突→FY表記修正→株価終値表示→未発表四半期追加→縦積み→バッジ位置→整数化→数字拡大）",[57,115,116],{},"「マージン」誤用の修正（予実の差は「上回り幅」「乖離」「サプライズ%」に置換）",[57,118,119],{},"レスポンシブ時のフローティング目次（FAB+スライドパネル）の実装",[57,121,122],{},"営業CFマージン・安全マージンは会計用語として正規なので残す判断",[15,124,125,85,127],{},[22,126,84],{},[87,128,130],{"href":129},"/mu-expectations-chart","マイクロン決算の「期待との差」をSVGチャートで可視化する",[92,132],{},[41,134,136],{"id":135},"_3-マイクロン売上eps四半期推移チャート3本ペア表示","3. マイクロン売上・EPS四半期推移チャート（3本ペア表示）",[15,138,139,140,143,144,147,148,147,151,154],{},"「期待との差」図とは独立した新規図 ",[72,141,142],{},"Part2Ch8MuFutureProjection.vue"," を作成。売上とEPSの四半期推移を、事前アナリスト予想・実績・会社ガイダンスの3本ペアで縦に積んだ。表示モードを ",[72,145,146],{},"pair"," / ",[72,149,150],{},"reported-only",[72,152,153],{},"future-only"," の3パターンで分岐させ、過去・現在・将来をひとつのコンポーネントで切り替え可能に。",[15,156,157],{},"途中、半年前のコンセンサス予想の所在をClaude Codeに聞いたら曖昧な回答が返ってきて、WebFetchで実画面確認後に訂正させる一幕もあった。AIの曖昧な記憶を鵜呑みにしないこと、を再確認した。",[15,159,160],{},[22,161,52],{},[54,163,164,167,170],{},[57,165,166],{},"実績のみ → ペア化 → ガイダンス追加 → FY2028削除と4段階で構造を組み替え",[57,168,169],{},"凡例とスタイルを3バー対応に拡張",[57,171,172],{},"AIに誤情報を答えられて訂正させた経緯を記録",[15,174,175,85,177],{},[22,176,84],{},[87,178,180],{"href":179},"/quarterly-projection-chart","マイクロン四半期推移チャート：事前予想・実績・会社ガイダンスの3本ペア表示",[92,182],{},[27,184,185],{"id":185},"今日の試行錯誤",[187,188,189,211],"table",{},[190,191,192],"thead",{},[193,194,195,199,202,205,208],"tr",{},[196,197,198],"th",{},"#",[196,200,201],{},"テーマ",[196,203,204],{},"試したこと",[196,206,207],{},"結果",[196,209,210],{},"気づき",[212,213,214,232,249,264,280,297,318,335,352,369,386,403,420,437,454],"tbody",{},[193,215,216,220,223,226,229],{},[217,218,219],"td",{},"1",[217,221,222],{},"VOICEVOX一括合成",[217,224,225],{},"A/B/C用JSONスクリプトをTS対応＋Dパターン追加に拡張",[217,227,228],{},"成功",[217,230,231],{},"既存スクリプトの拡張は新規作成より速い",[193,233,234,237,240,243,246],{},[217,235,236],{},"2",[217,238,239],{},"18ページの一括置換",[217,241,242],{},"PowerShellのhere-stringで narrationConfig 挿入",[217,244,245],{},"失敗（引用符エスケープで詰まる）",[217,247,248],{},"Windowsの長文置換はPython一択",[193,250,251,254,256,259,261],{},[217,252,253],{},"3",[217,255,239],{},[217,257,258],{},"Pythonに切り替えて再実行",[217,260,228],{},[217,262,263],{},"最初からPythonでよかった",[193,265,266,269,272,275,277],{},[217,267,268],{},"4",[217,270,271],{},"R2アップロード",[217,273,274],{},"_common先行→investment-1/2/3を3並列でアップロード",[217,276,228],{},[217,278,279],{},"並列実行で数分で完了",[193,281,282,285,288,291,294],{},[217,283,284],{},"5",[217,286,287],{},"音声再生確認",[217,289,290],{},"localhost:3200 でautoモード→開始ボタン",[217,292,293],{},"一部失敗（404）",[217,295,296],{},"INV-NEST prefix typoを耳と目で発見",[193,298,299,302,305,313,315],{},[217,300,301],{},"6",[217,303,304],{},"prefix修正",[217,306,307,309,310,312],{},[72,308,74],{}," → ",[72,311,78],{}," に修正",[217,314,228],{},[217,316,317],{},"人間は違和感を拾う係、AIが原因特定",[193,319,320,323,326,329,332],{},[217,321,322],{},"7",[217,324,325],{},"チャート値ラベル",[217,327,328],{},"並列棒の真上にラベル配置",[217,330,331],{},"失敗（隣バーと重なる）",[217,333,334],{},"予想は左外側、実績は右外側へ",[193,336,337,340,343,346,349],{},[217,338,339],{},"8",[217,341,342],{},"四半期表記",[217,344,345],{},"「2025 Q4」と書く",[217,347,348],{},"失敗（カレンダーとズレ）",[217,350,351],{},"マイクロンは8月決算、FY表記が必要",[193,353,354,357,360,363,366],{},[217,355,356],{},"9",[217,358,359],{},"株価バッジ",[217,361,362],{},"下落/上昇を色分け＋矢印",[217,364,365],{},"失敗（雑なメッセージライン）",[217,367,368],{},"終値を直接表示に置換",[193,370,371,374,377,380,383],{},[217,372,373],{},"10",[217,375,376],{},"5チャート配置",[217,378,379],{},"横並びで配置",[217,381,382],{},"失敗（1つあたり狭く潰れる）",[217,384,385],{},"全部縦に積む、横長1160pxで",[193,387,388,391,394,397,400],{},[217,389,390],{},"11",[217,392,393],{},"サプライズ%バッジ",[217,395,396],{},"チャート外（四半期ラベル下）に配置",[217,398,399],{},"失敗（視線が散る）",[217,401,402],{},"チャート内・バー上に移動",[193,404,405,408,411,414,417],{},[217,406,407],{},"12",[217,409,410],{},"バッジと値ラベル衝突",[217,412,413],{},"同じ高さに重ねる",[217,415,416],{},"失敗（被る）",[217,418,419],{},"20pxマージンを取って積層",[193,421,422,425,428,431,434],{},[217,423,424],{},"13",[217,426,427],{},"「マージン」誤用",[217,429,430],{},"「15〜20%の大幅マージンで上回る」と表現",[217,432,433],{},"NG（予実差をマージンとは言わない）",[217,435,436],{},"「上回り幅」「乖離」「サプライズ%」に置換",[193,438,439,442,445,448,451],{},[217,440,441],{},"14",[217,443,444],{},"半年前のコンセンサス予想の所在",[217,446,447],{},"AIに口頭で質問",[217,449,450],{},"曖昧な回答が返る",[217,452,453],{},"WebFetchで実画面確認後に訂正させた",[193,455,456,459,462,465,468],{},[217,457,458],{},"15",[217,460,461],{},"将来予想チャート",[217,463,464],{},"実績のみの2チャート",[217,466,467],{},"不十分",[217,469,470],{},"ペア化→ガイダンス追加→FY2028削除と段階的に整理",[92,472],{},[27,474,475],{"id":475},"今日の学び",[54,477,478,484,490,496,502,508,514,520],{},[57,479,480,483],{},[22,481,482],{},"VOICEVOXパイプラインの汎用性",": テキスト→音声→クラウドストレージ→再生エンドポイントの構造は、投資判断クイズでも税務通達でも同じ。コンテンツを差し替えるだけで再利用可能",[57,485,486,489],{},[22,487,488],{},"PowerShellのhere-stringは長文置換と相性が悪い",": 最初からPythonで書く",[57,491,492,495],{},[22,493,494],{},"音声品質チェックは耳が頼り",": 75問全てを聞いたわけではないが、サンプリングで違和感を拾える",[57,497,498,501],{},[22,499,500],{},"チャートのレイアウトは一発で決まらない",": 11回の作り直しを前提に、SVG生成を関数化しておくと差し替えが早い",[57,503,504,507],{},[22,505,506],{},"「マージン」は予実差には使わない",": 営業CFマージン、安全マージンは会計用語として正規。期待値との差は「上回り幅」「乖離」「サプライズ%」を使う",[57,509,510,513],{},[22,511,512],{},"AIの曖昧な記憶は信じすぎない",": 特に有料サービスの機能詳細は、WebFetchやagent-browserで実画面を確認する",[57,515,516,519],{},[22,517,518],{},"未発表四半期もチャートに入れる",": 「これから当てるべき数字」を視野に入れると、過去のトレンドが意味を持つ",[57,521,522,525],{},[22,523,524],{},"データがあるから載せるな",": 読み手が読める範囲だけ残す。FY2028を切った判断と同じ",[92,527],{},[27,529,530],{"id":530},"明日やること",[54,532,535,545,551,557],{"className":533},[534],"contains-task-list",[57,536,539,544],{"className":537},[538],"task-list-item",[540,541],"input",{"disabled":542,"type":543},true,"checkbox"," narrationConfigのデフォルト値を親コンポーネント側に寄せ、ページ側で書かなくても動くようにする",[57,546,548,550],{"className":547},[538],[540,549],{"disabled":542,"type":543}," R2に存在しないキーを叩いた瞬間にコンソール警告を出すフォールバック実装",[57,552,554,556],{"className":553},[538],[540,555],{"disabled":542,"type":543}," WAV→MP3変換のビットレート再検討",[57,558,560,562],{"className":559},[538],[540,561],{"disabled":542,"type":543}," その他の積み残し（業種別実例クイズの状況確認は完了済みなので除外）",[92,564],{},[27,566,567],{"id":567},"関連記事",[54,569,570,574,578],{},[57,571,572],{},[87,573,90],{"href":89},[57,575,576],{},[87,577,130],{"href":129},[57,579,580],{},[87,581,180],{"href":179},{"title":583,"searchDepth":584,"depth":584,"links":585},"",2,[586,587,593,594,595,596],{"id":29,"depth":584,"text":29},{"id":39,"depth":584,"text":39,"children":588},[589,591,592],{"id":43,"depth":590,"text":44},3,{"id":96,"depth":590,"text":97},{"id":135,"depth":590,"text":136},{"id":185,"depth":584,"text":185},{"id":475,"depth":584,"text":475},{"id":530,"depth":584,"text":530},{"id":567,"depth":584,"text":567},"diary","Part 2 投資判断クイズ75問のVOICEVOX音声化を本番デプロイまで完走し、午後はマイクロン（MU）の決算チャートを11回のフィードバックで作り直した1日。","md",{},null,"/2026-05-16-diary","daily-log",false,"2026-05-16T00:00:00.000Z",{"title":5,"description":598},"2026-05/2026-05-16/diary-2026-05-16",[609,610,611,612,613,614],"日記","VOICEVOX","音声合成","SVG","Vue 3","決算分析","IALGLDisgymqDOK8_hl4_d2hlBgGq5fBa75mEFiUXOA",[],"https://log.eurekapu.com/og/blog/2026-05-16-diary.png?v=2026-05-16T00%3A00%3A00.000Z&title=2026%E5%B9%B45%E6%9C%8816%E6%97%A5%E3%81%AE%E9%96%8B%E7%99%BA%E6%97%A5%E8%A8%98%20-%20%E6%8A%95%E8%B3%87%E5%88%A4%E6%96%AD%E3%82%AF%E3%82%A4%E3%82%BA75%E5%95%8F%E3%81%AE%E9%9F%B3%E5%A3%B0%E5%8C%96%E3%81%A8%E3%83%9E%E3%82%A4%E3%82%AF%E3%83%AD%E3%83%B3%E6%B1%BA%E7%AE%97%E3%83%81%E3%83%A3%E3%83%BC%E3%83%88%E3%81%AE%E4%BD%9C%E3%82%8A%E8%BE%BC%E3%81%BF&author=Kei%20Komatsu&sig=d1c5838df2f4e8cf",1782528837171]