[{"data":1,"prerenderedAt":617},["ShallowReactive",2],{"content-/2026-07-27-diary":3,"all-pages-for-dir":601,"related-/2026-07-27-diary":602,"og-image-/2026-07-27-diary":616},{"id":4,"title":5,"body":6,"category":583,"concepts":584,"description":585,"extension":586,"meta":587,"navigation":518,"ogImage":584,"path":588,"project_name":589,"published":590,"publishedAt":591,"seo":592,"stem":593,"tags":594,"todo":584,"unpublished":590,"updatedAt":584,"__hash__":600},"pages/2026-07/2026-07-27/diary-2026-07-27.md","2026年7月27日の開発日記 - 画像3,810件の配信復旧とHeroku停止の実測",{"type":7,"value":8,"toc":564},"minimark",[9,14,18,22,29,32,37,40,46,59,70,73,77,85,89,99,107,109,113,116,120,131,139,141,145,148,152,160,168,170,174,177,181,192,200,202,206,209,213,224,232,234,238,246,248,251,474,476,479,502,504,507,527,529,532],[10,11,13],"h1",{"id":12},"_2026年7月27日の開発日記","2026年7月27日の開発日記",[15,16,17],"p",{},"朝、Udemy講座の「リソース」から解説スライドを開いたら真っ白だった。前日のデプロイをしくじったに違いない。そう思って調べさせたら、デプロイは無事で、前日のWordPress移行に旧アップロードパスへの転送が1本も無いことが真因だった。画像3,810件がまとめて落ちていた。この復旧から始まった一日は、旧アプリを静的化してHerokuを止められるかの実測、ChatGPT Proディープリサーチの空振り、Notion移行計画の作り直しまで、4プロジェクト20セッションに広がった。",[19,20,21],"h2",{"id":21},"今日のタイムライン",[15,23,24],{},[25,26],"img",{"alt":27,"src":28},"タイムライン","/2026-07/2026-07-27/timeline-2026-07-27.png",[19,30,31],{"id":31},"今日やったこと",[33,34,36],"h3",{"id":35},"_1-wordpress移行で落ちた画像3810件の調査とr2復旧","1. WordPress移行で落ちた画像3,810件の調査とR2復旧",[15,38,39],{},"真っ白なスライドの原因を突き止めさせ、ローカルの8.3GBバックアップから原本を発掘させてCloudflare R2に投入させた。最初は「全部上げる」つもりだったが、展開したらDBダンプ入りのWordPressフルバックアップzipが混在していて、ホワイトリスト方式で847MB・4,222件に絞り直した。転送ルール1行で旧パスが復旧し、Udemy全7コース180件のリソースリンクを突き合わせて移行起因の欠落0件まで確認した。",[15,41,42],{},[43,44,45],"strong",{},"主な成果:",[47,48,49,53,56],"ul",{},[50,51,52],"li",{},"画像3,810件（延べ5,274箇所・91スライドページ）の配信復旧",[50,54,55],{},"R2投入は失敗0・約95分（8→32並列に調整）",[50,57,58],{},"Udemy全講座のリンク台帳（TSV）を作成し欠落0件を確認",[15,60,61,64,65],{},[43,62,63],{},"詳細:"," ",[66,67,69],"a",{"href":68},"/wp-uploads-outage-r2-recovery","WordPress移行で画像3,810件が配信不能になった",[71,72],"hr",{},[33,74,76],{"id":75},"_2-旧アプリの静的化を実測してheroku停止に王手","2. 旧アプリの静的化を実測してHeroku停止に王手",[15,78,79,80,84],{},"サイトポートフォリオ整理のフェーズ2として、Herokuで動き続けている旧Nuxt 2アプリを ",[81,82,83],"code",{},"nuxt generate"," で静的化できるか実測させた。ビルドは4回で 134→1→0→0 と収束し、想定していたOpenSSL問題ではなくメモリが関門だった。参照402箇所の照合で出た「25件の欠け」は集計側の正規表現バグで、実際の欠けは0件。停止の最終判断はアクセスが消えたことの確認待ちで明日に残した。",[15,86,87],{},[43,88,45],{},[47,90,91,96],{},[50,92,93,95],{},[81,94,83],{}," 完走（失敗0）と参照402箇所の無傷確認",[50,97,98],{},"リンク切れ5パターンのうち4つは正しい行き先が実在すると分かり、外すのではなく直す判断に変更",[15,100,101,64,103],{},[43,102,63],{},[66,104,106],{"href":105},"/app-static-build-heroku-retirement","Herokuを止められるか、nuxt generate を4回回して確かめた",[71,108],{},[33,110,112],{"id":111},"_3-移行サイトのseoai-seo改善-phase-c","3. 移行サイトのSEO・AI-SEO改善 Phase C",[15,114,115],{},"朝にPhase A/B（canonical・sitemap・404静的化・208記事のメタ改訂）を仕上げさせ、本番デプロイとapex転送先の変更まで実行させて、午後はPhase Cを回した。alt未設定947件はCodexに図を読ませて480件を並列適用し、記事の要点203本とllms.txtも整備した。検索コンソールが「プロパティ0件」を返した件は、確認方法の誤りだと押し返して実データ221件を回収した。",[15,117,118],{},[43,119,45],{},[47,121,122,125,128],{},[50,123,124],{},"画像alt 480件適用（並列10で逐次比4.7倍・失敗0）、残21件は装飾とデッドリンクのみ",[50,126,127],{},"記事の要点203本・llms.txt・カテゴリ28ページの説明文・FAQ土台",[50,129,130],{},"転送チェーンを3ホップ→2ホップに短縮、sitemap 234 URL全件200を実測",[15,132,133,64,135],{},[43,134,63],{},[66,136,138],{"href":137},"/wordpress-nuxt-ai-seo-phase-c","移行サイトのSEO・AI-SEO改善を1日で回した",[71,140],{},[33,142,144],{"id":143},"_4-蔵書コンテンツ企画トラックc-ディープリサーチの空振りと再走","4. 蔵書コンテンツ企画トラックC: ディープリサーチの空振りと再走",[15,146,147],{},"蔵書DB（352冊）からオリジナルコンテンツを作る企画で、ChatGPT ProのディープリサーチをChrome経由で走らせた。送信は成功を返したのにプロンプトは空で、空のリサーチが走っていた。計画カードの一行目で気づいて止め、貼り付け方式で入れ直して再実行。取り出させたレポート35,417バイトを無改変で保存させ、テーマの陳腐化しにくさと読者像（職業ではなく用途で切り直す）を検討した。",[15,149,150],{},[43,151,45],{},[47,153,154,157],{},[50,155,156],{},"ディープリサーチのレポート回収と生出力の保存",[50,158,159],{},"テーマ候補の陳腐化耐性と読者の切り口を整理",[15,161,162,64,164],{},[43,163,63],{},[66,165,167],{"href":166},"/book-db-deep-research-content-plan","ChatGPT Proのディープリサーチが空振りした日",[71,169],{},[33,171,173],{"id":172},"_5-notion-9375ページの移行計画を作り直す","5. Notion 9,375ページの移行計画を作り直す",[15,175,176],{},"移行後の構成図を作らせて眺めたら、Markdown・画像・予備の3系統はどれも派生物で、原本の243MB JSONがどこにも入っていなかった。Codexレビューでも同じ指摘が出て計画を修正。GoogleドキュメントへのMarkdown反映も実測させ、Drive画像のリンク貼り付けは4形式とも実体が入らず、pandoc→DOCX経由でローカル画像100%を確認した（外部参照の画像は欠落が残る）。孤立ページ3,318件などエクスポートの3欠陥も直させ、教材開発のまとめページ199ページの再生成で修正を確認した。",[15,178,179],{},[43,180,45],{},[47,182,183,186,189],{},[50,184,185],{},"原本を含む移行構成への計画修正",[50,187,188],{},"pandoc→DOCX経由のGoogleドキュメント変換を実データ3ページ（画像146/105/103枚）で検証",[50,190,191],{},"ファイル名規約（スラッシュ→アンダースコア）とプロパティのフロントマター化",[15,193,194,64,196],{},[43,195,63],{},[66,197,199],{"href":198},"/notion-archive-migration-google-docs","Notion 9,375ページの移行先を設計し直す",[71,201],{},[33,203,205],{"id":204},"_6-学習サイト-苦手語ページの指標見直しと設定同期の統合","6. 学習サイト: 苦手語ページの指標見直しと設定同期の統合",[15,207,208],{},"仕掛かりだった苦手語ページを実測確認し、「連続正解1回でカウントが0に戻り、慢性的な苦手語ほど一覧から消える」穴に気づいた。通算の取りこぼし回数（8回以上を慢性）で切り直させ、3階層のページをデプロイさせた。午後は自動再生設定が旧キーとD1同期済みキーの2系統に割れていた件を、排他であることを実機で確かめさせてから1系統へ統合させた。こちらのデプロイとpushは明日に送った。",[15,210,211],{},[43,212,45],{},[47,214,215,218,221],{},[50,216,217],{},"苦手語ページを累積判定に切り替えて本番反映",[50,219,220],{},"自動再生設定のD1同期漏れを解消（デプロイは翌日）",[50,222,223],{},"構造変更に追随できていなかったE2E失敗15件を修正",[15,225,226,64,228],{},[43,227,63],{},[66,229,231],{"href":230},"/weak-words-page-and-d1-settings-sync","苦手な語だけを解き直すページを作った日",[71,233],{},[33,235,237],{"id":236},"_7-その他","7. その他",[47,239,240,243],{},[50,241,242],{},"MicronとMetaが共著したLPDDR5Xデータセンター白書を読み、比較の土台（DDR5と直接比べているのは電力だけ）を整理した要約記事を非公開の下書きとして作成した",[50,244,245],{},"VOICEVOX読み上げのサーバーレス化を検討し、実測の結果、保留ステータスで計画メモに落とした",[71,247],{},[19,249,250],{"id":250},"今日の試行錯誤",[252,253,254,276],"table",{},[255,256,257],"thead",{},[258,259,260,264,267,270,273],"tr",{},[261,262,263],"th",{},"#",[261,265,266],{},"テーマ",[261,268,269],{},"試したこと",[261,271,272],{},"結果",[261,274,275],{},"気づき",[277,278,279,301,318,337,353,373,389,406,423,440,457],"tbody",{},[258,280,281,285,288,291,294],{},[282,283,284],"td",{},"1",[282,286,287],{},"スライド真っ白",[282,289,290],{},"デプロイ失敗を疑って調査",[282,292,293],{},"外れ",[282,295,296,297,300],{},"真因は移行時の転送ルール欠落。",[81,298,299],{},"ERR_BLOCKED_BY_ORB"," は404に見えない",[258,302,303,306,309,312,315],{},[282,304,305],{},"2",[282,307,308],{},"R2への復旧投入",[282,310,311],{},"バックアップ8.3GBを全部上げる",[282,313,314],{},"方針転換",[282,316,317],{},"DBダンプ入りのフルバックアップzipが混在。ホワイトリストで847MBに絞った",[258,319,320,323,326,331,334],{},[282,321,322],{},"3",[282,324,325],{},"app静的化",[282,327,328,330],{},[81,329,83],{}," 1回目",[282,332,333],{},"失敗（EXIT=134）",[282,335,336],{},"関門は想定したOpenSSLではなくメモリだった",[258,338,339,342,344,347,350],{},[282,340,341],{},"4",[282,343,325],{},[282,345,346],{},"12GB割当て→リンク修正して3〜4回目",[282,348,349],{},"成功（失敗0）",[282,351,352],{},"「参照25件欠け」は集計の正規表現バグ。実際は0件",[258,354,355,358,361,364,367],{},[282,356,357],{},"5",[282,359,360],{},"ディープリサーチ",[282,362,363],{},"Chrome経由でプロンプト投入",[282,365,366],{},"空振り",[282,368,369,372],{},[81,370,371],{},"insertText"," が複数行を落とし、送信成功のまま空リサーチが走った",[258,374,375,378,380,383,386],{},[282,376,377],{},"6",[282,379,360],{},[282,381,382],{},"停止→貼り付け方式で再投入",[282,384,385],{},"成功",[282,387,388],{},"レポートはMarkdownエクスポートで35,417バイト回収",[258,390,391,394,397,400,403],{},[282,392,393],{},"7",[282,395,396],{},"Notion移行構成",[282,398,399],{},"3系統の構成図を作成してレビュー",[282,401,402],{},"作り直し",[282,404,405],{},"原本243MBがどこにも入っていない。派生物だけの移行だった",[258,407,408,411,414,417,420],{},[282,409,410],{},"8",[282,412,413],{},"Googleドキュメント化",[282,415,416],{},"Drive画像のリンク貼り付け4形式",[282,418,419],{},"全滅",[282,421,422],{},"非公開のままでは実体が入らない。pandoc→DOCX経由で画像100%",[258,424,425,428,431,434,437],{},[282,426,427],{},"9",[282,429,430],{},"alt一括付与",[282,432,433],{},"Codexに図を読ませ並列10で適用",[282,435,436],{},"480件成功",[282,438,439],{},"逐次比4.7倍・失敗0。残21件は装飾とデッドリンクのみ",[258,441,442,445,448,451,454],{},[282,443,444],{},"10",[282,446,447],{},"苦手語の抽出指標",[282,449,450],{},"連続誤答カウンタで一覧化",[282,452,453],{},"穴あり",[282,455,456],{},"正解1回で0に戻り慢性語を取りこぼす。累積8回以上の判定へ",[258,458,459,462,465,468,471],{},[282,460,461],{},"11",[282,463,464],{},"読み上げが沈黙",[282,466,467],{},"VOICEVOXが鳴らない原因調査",[282,469,470],{},"自滅と判明",[282,472,473],{},"自分でPowerShellの窓を×で閉じてサーバーごと止めていた",[71,475],{},[19,477,478],{"id":478},"今日の学び",[47,480,481,487,490,493,496,499],{},[50,482,483,484,486],{},"404に見えない失敗（",[81,485,299],{},"）でも、原因がパス転送の欠落ということがある。移行の翌日は旧パス参照から疑う",[50,488,489],{},"「全部上げる」は原本の中身を確認してから。バックアップzipにはDBダンプや設定ファイルが混ざっている",[50,491,492],{},"送信が成功を返すことと、入力が実際に入っていることは別。長文投入は先頭行を目視で確かめる",[50,494,495],{},"移行計画は派生物の置き場所ではなく、原本がどこに残るかから点検する",[50,497,498],{},"ビルドが落ちる理由は、想定（OpenSSL）と実際（メモリ）がずれる。コード調査より実測が早い",[50,500,501],{},"連続カウンタは慢性を測れない。取りこぼしの累積で切る",[71,503],{},[19,505,506],{"id":506},"明日やること",[47,508,511,521],{"className":509},[510],"contains-task-list",[50,512,515,520],{"className":513},[514],"task-list-item",[516,517],"input",{"disabled":518,"type":519},true,"checkbox"," 旧アプリへのアクセスが消えたことを確認してHeroku停止を最終判断",[50,522,524,526],{"className":523},[514],[516,525],{"disabled":518,"type":519}," 学習サイト午後分（自動再生設定の統合）のデプロイとpush",[71,528],{},[19,530,531],{"id":531},"関連記事",[47,533,534,539,544,549,554,559],{},[50,535,536],{},[66,537,538],{"href":68},"WordPress移行で画像3,810件が配信不能になった — 原本の発掘とCloudflare R2への復旧",[50,540,541],{},[66,542,543],{"href":105},"Herokuを止められるか、nuxt generate を4回回して確かめた — 旧Nuxt 2アプリ静的化の実測",[50,545,546],{},[66,547,548],{"href":137},"移行サイトのSEO・AI-SEO改善を1日で回した — 画像altを480件、記事の要点を203本、OG画像を署名付きに",[50,550,551],{},[66,552,553],{"href":166},"ChatGPT Proのディープリサーチが空振りした日｜送信は成功、プロンプトは空だった",[50,555,556],{},[66,557,558],{"href":198},"Notion 9,375ページの移行先を設計し直す — 原本243MBの抜けと、Markdown→Googleドキュメント変換の実測",[50,560,561],{},[66,562,563],{"href":230},"苦手な語だけを解き直すページを作った日 - 正解1回で消える穴と、自動再生設定のD1同期漏れ",{"title":565,"searchDepth":566,"depth":566,"links":567},"",2,[568,569,579,580,581,582],{"id":21,"depth":566,"text":21},{"id":31,"depth":566,"text":31,"children":570},[571,573,574,575,576,577,578],{"id":35,"depth":572,"text":36},3,{"id":75,"depth":572,"text":76},{"id":111,"depth":572,"text":112},{"id":143,"depth":572,"text":144},{"id":172,"depth":572,"text":173},{"id":204,"depth":572,"text":205},{"id":236,"depth":572,"text":237},{"id":250,"depth":566,"text":250},{"id":478,"depth":566,"text":478},{"id":506,"depth":566,"text":506},{"id":531,"depth":566,"text":531},"diary",null,"WordPress移行で配信不能になった画像3,810件をR2で復旧し、旧アプリの静的化をnuxt generate 4回で実測。ChatGPT Proディープリサーチの空振り、Notion移行計画の作り直し、苦手語ページの指標見直しまで4プロジェクトを回した一日。","md",{},"/2026-07-27-diary","daily-log",false,"2026-07-27T00:00:00.000Z",{"title":5,"description":585},"2026-07/2026-07-27/diary-2026-07-27",[595,596,597,598,599],"日記","WordPress移行","Cloudflare","Notion","AI-SEO","Ccv2iqAAALjgA2BRP6lkziBHtFfKbK6-AmV0Jde5iAY",[],[603,607,608,609,612],{"title":604,"path":605,"publishedAt":606},"2026年7月26日の開発日記 - WordPressサイトをついに本番切替した日","/2026-07-26-diary","2026-07-26T00:00:00.000Z",{"title":558,"path":198,"publishedAt":591},{"title":548,"path":137,"publishedAt":591},{"title":610,"path":611,"publishedAt":606},"WordPressサイトの本番DNS切替と、移行後に見つかった301の穴","/wordpress-cutover-phase4",{"title":613,"path":614,"publishedAt":615},"2026年7月24日の開発日記 - 進める判断より、止める判断のほうが多かった日","/2026-07-24-diary","2026-07-24T00:00:00.000Z","https://log.eurekapu.com/og/blog/2026-07-27-diary.png?v=2026-07-27T00%3A00%3A00.000Z&title=2026%E5%B9%B47%E6%9C%8827%E6%97%A5%E3%81%AE%E9%96%8B%E7%99%BA%E6%97%A5%E8%A8%98%20-%20%E7%94%BB%E5%83%8F3%2C810%E4%BB%B6%E3%81%AE%E9%85%8D%E4%BF%A1%E5%BE%A9%E6%97%A7%E3%81%A8Heroku%E5%81%9C%E6%AD%A2%E3%81%AE%E5%AE%9F%E6%B8%AC&author=Kei%20Komatsu&sig=32276a17e4361832",1785379945906]