[{"data":1,"prerenderedAt":506},["ShallowReactive",2],{"content-/2026-07-19-diary":3,"all-pages-for-dir":489,"related-/2026-07-19-diary":490,"og-image-/2026-07-19-diary":505},{"id":4,"title":5,"body":6,"category":470,"concepts":471,"description":472,"extension":473,"meta":474,"navigation":404,"ogImage":471,"path":475,"project_name":476,"published":477,"publishedAt":478,"seo":479,"stem":480,"tags":481,"todo":471,"unpublished":477,"updatedAt":471,"__hash__":488},"pages/2026-07/2026-07-19/diary-2026-07-19.md","2026年7月19日の開発日記 - 朝に足した内部リンクが夕方のビルドを3倍遅くしていた",{"type":7,"value":8,"toc":452},"minimark",[9,14,18,22,29,32,37,40,46,59,70,73,77,80,84,95,103,105,109,112,116,127,135,137,141,144,148,159,167,169,173,176,180,191,199,201,205,213,215,218,366,368,371,388,390,393,425,427,430],[10,11,13],"h1",{"id":12},"_2026年7月19日の開発日記","2026年7月19日の開発日記",[15,16,17],"p",{},"朝、Search Consoleの数字を眺めて「検索が伸びない原因は内部リンクだ」と結論を出し、その場で関連記事セクションとタグページ553枚を実装させてデプロイした。手応えは十分だった。ところが夕方、同じサイトのデプロイが26分を超えて返ってこない。調べさせると、ビルドを膨らませていたのは朝の自分の施策だった。1ページ描画するたびに全記事1,700本を引き直すO(N²)構造を、内部リンクと一緒に持ち込んでいた。",[19,20,21],"h2",{"id":21},"今日のタイムライン",[15,23,24],{},[25,26],"img",{"alt":27,"src":28},"タイムライン","/2026-07/2026-07-19/timeline-2026-07-19.png",[19,30,31],{"id":31},"今日やったこと",[33,34,36],"h3",{"id":35},"_1-search-console分析と内部リンク実装","1. Search Console分析と内部リンク実装",[15,38,39],{},"Google Search Consoleの直近28日間をChrome DevTools経由で棚卸しさせ、検索流入が伸びない主因を内部リンク構造の欠如と特定した。改善サマリーを非公開レポートとして書かせたあと、その足で実装まで進めた。関連記事選定の純粋関数、タグページ553枚、タグチップ、トップの301撤去。タグチップが表示されない・スラッシュ入りタグが404になるといった往復を挟みつつ、テスト18,577件を通してデプロイと7分割コミットまで終えた。",[15,41,42],{},[43,44,45],"strong",{},"主な成果:",[47,48,49,53,56],"ul",{},[50,51,52],"li",{},"関連記事セクション（related-articles.ts）とタグページ553枚を1日で実装",[50,54,55],{},"プリレンダー3,129ルートの本番デプロイと表示確認",[50,57,58],{},"積み残し: スラッシュ入りタグの再デプロイ反映、2週間後の効果測定",[15,60,61,64,65],{},[43,62,63],{},"詳細:"," ",[66,67,69],"a",{"href":68},"/gsc-internal-linking-implementation","Google Search Console分析から内部リンク実装へ",[71,72],"hr",{},[33,74,76],{"id":75},"_2-ssgビルド3倍遅延の原因調査とプリレンダー共有キャッシュ","2. SSGビルド3倍遅延の原因調査とプリレンダー共有キャッシュ",[15,78,79],{},"夕方のデプロイが26分を超え、過去計測と突き合わせて原因を追わせた。音声生成のCPU競合を疑ったが、それは1.3倍の増幅要素にすぎず、主因は朝の内部リンク施策が持ち込んだ全記事クエリの繰り返しだった。「更新のない記事はスキャンしない差分ビルド」を最初に思いついたものの、static presetの404リスクと記事間依存で見送り、ビルド内1回のsingle-flightキャッシュ＋タグ逆引き索引を共有する案に切り替えて計画書化。pages-lite.ts / pages-index.tsとテストの実装まで済ませた。検証の途中で、公開記事19本が7/14から本番404だった既存バグも見つけて直している。効果測定は次回デプロイに残った。",[15,81,82],{},[43,83,45],{},[47,85,86,89,92],{},[50,87,88],{},"遅延の主因をO(N²)クエリ構造と特定（CPU競合説は切り分けで棄却)",[50,90,91],{},"プリレンダー共有キャッシュ計画（prerender-fullscan-cache-plan.md）と実装・テスト",[50,93,94],{},"公開記事19本の本番404バグを発見・修正",[15,96,97,64,99],{},[43,98,63],{},[66,100,102],{"href":101},"/ssg-prerender-fullscan-cache","NuxtのSSGビルドが3倍遅くなった原因調査",[71,104],{},[33,106,108],{"id":107},"_3-メモリ半導体の先行指標統計を4本拡充して毎朝チェーンへ","3. メモリ半導体の先行指標統計を4本拡充して毎朝チェーンへ",[15,110,111],{},"統計公表スケジュールページを起点に、未追跡の先行指標をdeep-research（2ラウンド・約210エージェント）で13系統洗い出させた。並べてみると追跡網が数量系に偏り、価格系が空白だと分かる。履歴の残らないTrendForceのDRAM/NAND価格は日次取得を即決し、候補5統計のうち4本（メモリ価格・シンガポールNODX・台湾外銷訂単・MediaTek月次）を同日中にページとパイプラインまで実装。それぞれ独立スラッシュコマンドに切って、毎朝の日記チェーンStep 11.8/11.85/11.87に組み込んだ。GA30だけは先方サーバーの復旧待ち。",[15,113,114],{},[43,115,45],{},[47,117,118,121,124],{},[50,119,120],{},"未追跡の先行指標13系統をリサーチで棚卸し、価格系の空白を特定",[50,122,123],{},"統計4本のページ＋取得パイプラインを同日実装、毎朝チェーンに組み込み",[50,125,126],{},"mdx-playgroundと~/.claude双方のコミットまで完了",[15,128,129,64,131],{},[43,130,63],{},[66,132,134],{"href":133},"/memory-leading-indicators-expansion","メモリ半導体の月次先行指標を拡充",[71,136],{},[33,138,140],{"id":139},"_4-aiトークン工場の解説記事を仕上げる","4. AIトークン工場の解説記事を仕上げる",[15,142,143],{},"「AI企業はトークン製造工場」という切り口の解説記事の続き。ChatGPT Proのディープリサーチ（1時間超）と並走しながら、SVG図解とドラフトを進めた。「最終版にした」つもりの原稿にドラフト表記とファクトチェック反映待ちの数値が残っているのを指摘して直させ、原価内訳をウォーターフォール図にする往復も重ねた。モルガン・スタンレー推計の図は「二重計上だから作れない」と記憶していたが、問い直すと半分だけ正しく、混ぜて足せないだけで単独図は作れる。図は3枚構成に増えた。有料コンテンツの要約を含むため記事本体は非公開にした。",[15,145,146],{},[43,147,45],{},[47,149,150,153,156],{},[50,151,152],{},"ウォーターフォール図3枚構成で原価・P/L構造を図解",[50,154,155],{},"ドラフト表記・反映待ち数値を最終版に反映",[50,157,158],{},"記事本体はunpublished化",[15,160,161,64,163],{},[43,162,63],{},[66,164,166],{"href":165},"/ai-token-factory-writing-process","AIトークン工場の解説記事ができるまで",[71,168],{},[33,170,172],{"id":171},"_5-英単語レッスンサイトにtts音声7700ファイルと自動発音モード","5. 英単語レッスンサイトにTTS音声7,700ファイルと自動発音モード",[15,174,175],{},"昨日の積み残しから再開した英単語レッスンサイト。単語と例文に無料のローカルTTS（Piper）で約7,700ファイルの音声を付けた。生成が遅くてGPU化を考えたが、原因は1ファイルごとのモデル読み直しで、バッチ入力への切替だけで11倍速になりGPUは不要だった。PC画面の余白過多はビューア専用スタイル（901px以上のみ）で調整し、例文最長88字の実測から幅を決定。ヘッダーには「単語/例文」2チェック式のページ遷移自動発音モードをlocalStorage保存付きで載せた。セクション区分の再編は語源情報3,859語の全数集計まで済ませ、着手判断は持ち越し。",[15,177,178],{},[43,179,45],{},[47,181,182,185,188],{},[50,183,184],{},"Piper TTSで約7,700ファイルの音声を無料生成（バッチモードで11倍速）",[50,186,187],{},"PC幅レイアウト調整と自動発音モードの実装",[50,189,190],{},"画像バッチはdone 4,212 / failed 0で完走",[15,192,193,64,195],{},[43,194,63],{},[66,196,198],{"href":197},"/vocab-lesson-tts-and-ui-modes","Piper TTSで英単語3,859語の音声を無料生成",[71,200],{},[33,202,204],{"id":203},"_6-その他","6. その他",[47,206,207,210],{},[50,208,209],{},"Windows Defenderの「サンプル送信」ダイアログが毎回出る問題を、除外パス登録で止めた。対応ログは非公開記事として残した",[50,211,212],{},"朝の日記チェーン（前日分の日記生成と決算・統計データ更新）を実行",[71,214],{},[19,216,217],{"id":217},"今日の試行錯誤",[219,220,221,243],"table",{},[222,223,224],"thead",{},[225,226,227,231,234,237,240],"tr",{},[228,229,230],"th",{},"#",[228,232,233],{},"テーマ",[228,235,236],{},"試したこと",[228,238,239],{},"結果",[228,241,242],{},"気づき",[244,245,246,264,281,298,315,332,349],"tbody",{},[225,247,248,252,255,258,261],{},[249,250,251],"td",{},"1",[249,253,254],{},"TTS生成の高速化",[249,256,257],{},"遅いのでGPU化を検討",[249,259,260],{},"不採用",[249,262,263],{},"原因はモデルの読み直し。バッチ入力で11倍速になりGPU不要",[225,265,266,269,272,275,278],{},[249,267,268],{},"2",[249,270,271],{},"タグページ553枚",[249,273,274],{},"実装してデプロイ",[249,276,277],{},"一部持ち越し",[249,279,280],{},"スラッシュ入りタグが404。再デプロイ反映待ち",[225,282,283,286,289,292,295],{},[249,284,285],{},"3",[249,287,288],{},"ビルド遅延の切り分け",[249,290,291],{},"音声生成のCPU競合を疑う",[249,293,294],{},"棄却",[249,296,297],{},"競合は1.3倍の増幅要素。主因は全記事クエリのO(N²)",[225,299,300,303,306,309,312],{},[249,301,302],{},"4",[249,304,305],{},"ビルド高速化の方式",[249,307,308],{},"差分ビルド（未更新記事のスキップ）",[249,310,311],{},"見送り",[249,313,314],{},"static presetの404リスクと記事間依存。共有キャッシュ案に転換",[225,316,317,320,323,326,329],{},[249,318,319],{},"5",[249,321,322],{},"推計図の追加",[249,324,325],{},"「二重計上だから作れない」と記憶していた",[249,327,328],{},"記憶が半分誤り",[249,330,331],{},"混ぜて足せないだけで単独図は作れる。図3枚構成に",[225,333,334,337,340,343,346],{},[249,335,336],{},"6",[249,338,339],{},"GA30統計の初回取得",[249,341,342],{},"取得を試行",[249,344,345],{},"失敗",[249,347,348],{},"先方サーバー障害。復旧待ちで残置",[225,350,351,354,357,360,363],{},[249,352,353],{},"7",[249,355,356],{},"Defenderの通知抑止",[249,358,359],{},"確認/閉じるボタンで対処",[249,361,362],{},"再発",[249,364,365],{},"仕様どおりの挙動。除外パス登録で止まった",[71,367],{},[19,369,370],{"id":370},"今日の学び",[47,372,373,376,379,382,385],{},[50,374,375],{},"ページ間参照（関連記事・タグ）はSSGだとページ数×全記事のクエリになって跳ね返る。機能を足した日はビルド時間も見る",[50,377,378],{},"生成処理の遅さはGPU不足より「毎回のモデルロード」を先に疑う。バッチ化だけで11倍変わった",[50,380,381],{},"追跡している統計は数量系に偏りがちで、価格系の空白は履歴の残らないソースだと日次取得でしか埋まらない",[50,383,384],{},"「最終版にした」という自分の記憶は当てにならない。ドラフト表記の残存は機械チェックで拾う",[50,386,387],{},"別目的の検証中に見つかるバグ（公開記事19本の404）があるので、検証は本題以外の画面も開く",[71,389],{},[19,391,392],{"id":392},"明日やること",[47,394,397,407,413,419],{"className":395},[396],"contains-task-list",[50,398,401,406],{"className":399},[400],"task-list-item",[402,403],"input",{"disabled":404,"type":405},true,"checkbox"," プリレンダー共有キャッシュの効果測定（次回デプロイで所要時間を比較）",[50,408,410,412],{"className":409},[400],[402,411],{"disabled":404,"type":405}," スラッシュ入りタグの再デプロイ反映確認",[50,414,416,418],{"className":415},[400],[402,417],{"disabled":404,"type":405}," GA30統計の初回取得（先方サーバー復旧後）",[50,420,422,424],{"className":421},[400],[402,423],{"disabled":404,"type":405}," 英単語サイトのセクション再編の着手判断",[71,426],{},[19,428,429],{"id":429},"関連記事",[47,431,432,436,440,444,448],{},[50,433,434],{},[66,435,69],{"href":68},[50,437,438],{},[66,439,102],{"href":101},[50,441,442],{},[66,443,134],{"href":133},[50,445,446],{},[66,447,166],{"href":165},[50,449,450],{},[66,451,198],{"href":197},{"title":453,"searchDepth":454,"depth":454,"links":455},"",2,[456,457,466,467,468,469],{"id":21,"depth":454,"text":21},{"id":31,"depth":454,"text":31,"children":458},[459,461,462,463,464,465],{"id":35,"depth":460,"text":36},3,{"id":75,"depth":460,"text":76},{"id":107,"depth":460,"text":108},{"id":139,"depth":460,"text":140},{"id":171,"depth":460,"text":172},{"id":203,"depth":460,"text":204},{"id":217,"depth":454,"text":217},{"id":370,"depth":454,"text":370},{"id":392,"depth":454,"text":392},{"id":429,"depth":454,"text":429},"diary",null,"Search Console分析から内部リンク553ページを実装した数時間後、デプロイが26分に膨張。犯人は自分の施策だった。TTS音声7,700ファイル生成、先行指標統計4本の毎朝チェーン組み込みも。","md",{},"/2026-07-19-diary","daily-log",false,"2026-07-19T00:00:00.000Z",{"title":5,"description":472},"2026-07/2026-07-19/diary-2026-07-19",[482,483,484,485,486,487],"日記","Nuxt","SSG","内部リンク","TTS","半導体統計","hTZtsYp-jahg7x3lHPOBTsnSNabXGvvcj6_wOOZbGLQ",[],[491,493,495,497,501],{"title":492,"path":68,"publishedAt":478},"Google Search Console分析から内部リンク実装へ — Nuxtブログに関連記事セクションとタグページ553枚を一日で載せた",{"title":494,"path":101,"publishedAt":478},"NuxtのSSGビルドが3倍遅くなった原因調査 — 差分ビルドではなくプリレンダー共有キャッシュで立て直す",{"title":496,"path":197,"publishedAt":478},"Piper TTSで英単語3,859語の音声を無料生成 ― GPUより効いたバッチモード11倍速と自動発音モード",{"title":498,"path":499,"publishedAt":500},"語源英単語アプリの例文を作り込んだ日 — 実写画像から抽象イラストへの方針転換・単語のマゼンタ強調・Piper TTSの再生ボタン","/gogen-eitango-example-images-and-audio","2026-07-15T00:00:00.000Z",{"title":502,"path":503,"publishedAt":504},"2026年7月6日の開発日記 - 学習ゲート付き開発ループを1日で実装して全リポジトリに広げた","/2026-07-06-diary","2026-07-06T00:00:00.000Z","https://log.eurekapu.com/og/blog/2026-07-19-diary.png?v=2026-07-19T00%3A00%3A00.000Z&title=2026%E5%B9%B47%E6%9C%8819%E6%97%A5%E3%81%AE%E9%96%8B%E7%99%BA%E6%97%A5%E8%A8%98%20-%20%E6%9C%9D%E3%81%AB%E8%B6%B3%E3%81%97%E3%81%9F%E5%86%85%E9%83%A8%E3%83%AA%E3%83%B3%E3%82%AF%E3%81%8C%E5%A4%95%E6%96%B9%E3%81%AE%E3%83%93%E3%83%AB%E3%83%89%E3%82%923%E5%80%8D%E9%81%85%E3%81%8F%E3%81%97%E3%81%A6%E3%81%84%E3%81%9F&author=Kei%20Komatsu&sig=c8556a8537980d12",1784510943904]