[{"data":1,"prerenderedAt":658},["ShallowReactive",2],{"content-/2026-07-24-diary":3,"all-pages-for-dir":638,"related-/2026-07-24-diary":639,"og-image-/2026-07-24-diary":657},{"id":4,"title":5,"body":6,"category":620,"concepts":621,"description":622,"extension":623,"meta":624,"navigation":560,"ogImage":621,"path":625,"project_name":626,"published":627,"publishedAt":628,"seo":629,"stem":630,"tags":631,"todo":621,"unpublished":627,"updatedAt":621,"__hash__":637},"pages/2026-07/2026-07-24/diary-2026-07-24.md","2026年7月24日の開発日記 - 進める判断より、止める判断のほうが多かった日",{"type":7,"value":8,"toc":602},"minimark",[9,14,18,21,25,32,35,40,43,49,65,76,79,83,86,90,104,112,114,118,121,125,142,150,152,156,159,162,166,180,188,190,194,202,205,209,233,241,243,247,250,252,255,507,509,512,544,546,549,575,577,580],[10,11,13],"h1",{"id":12},"_2026年7月24日の開発日記","2026年7月24日の開発日記",[15,16,17],"p",{},"朝いちばんに聞いたのは「昨日の積み残し、何かありましたっけ」だった。答えはすぐ出た。ただ、一緒に困ったことも出てきた。前日に作ったはずの機能の経緯が、コミットにもメモにもどこにも残っていない。やった実感だけが手元にある。",[15,19,20],{},"そこから動き出して、日が暮れるまでに教材が3本増え、挿絵が1,000枚以上生成され、移行サイトの目次が作り直された。ただ、あとから振り返って印象に残ったのは、作った量のほうではなかった。この日は「やめておく」と決めた場面が三度あって、そのどれもが結果として正解だった。",[22,23,24],"h2",{"id":24},"今日のタイムライン",[15,26,27],{},[28,29],"img",{"alt":30,"src":31},"タイムライン","/2026-07/2026-07-24/timeline-2026-07-24.png",[22,33,34],{"id":34},"今日やったこと",[36,37,39],"h3",{"id":38},"_1-コンピュータの原理を扱う教材を1日で3講分積み上げた","1. コンピュータの原理を扱う教材を、1日で3講分積み上げた",[15,41,42],{},"前日の積み残し1本をコミットするところから始まり、続けて2本目の教材化まで未明に片づけた。そこで手を止めて、残り全章のロードマップを作らせ、章ごとに手作業を繰り返す前に共通基盤へのリファクタを挟んだ。この寄り道が効いた。以降は「計画書 → Codexレビュー → データ・図解・ページの3並列 → 検証 → コミット」という同じ型で流せるようになり、第3講・第4講・第5講が同じ日のうちに積み上がった。",[15,44,45],{},[46,47,48],"strong",{},"主な成果:",[50,51,52,56,59,62],"ul",{},[53,54,55],"li",{},"第3講（10進法は絶対じゃない、演習26問）を13時、第4講（ビットの正体、演習25問）を16時、第5講（論理とブール代数、演習20問）を19時にコミット",[53,57,58],{},"学習コース共通基盤を新設し、既存2コースを移行",[53,60,61],{},"セッションは1日で3回切り替え、そのたびに引き継ぎプロンプトでつないだ",[53,63,64],{},"学習ゲートは2回スキップした（1回はその場の判断、1回はクイズ無回答のタイムアウト）",[15,66,67,70,71],{},[46,68,69],{},"詳細:"," ",[72,73,75],"a",{"href":74},"/computing-course-three-lessons-in-a-day","コンピュータの原理を教材化する学習コースを1日で3講分作った",[77,78],"hr",{},[36,80,82],{"id":81},"_2-語源英単語コースの挿絵を全語洗い直しにかけた","2. 語源英単語コースの挿絵を、全語洗い直しにかけた",[15,84,85],{},"例文と挿絵が噛み合っていない。その違和感の出どころを掘っていくと、最初に数千語を一気に生成したときのプロンプトに「人物を描写しない」という制約を入れていたことに行き当たった。人を描けない分、絵は行為や感情を物や図形の比喩に置き換え、意味の通らない構図を量産していた。洗い直しの対象は最終的に1,724語。仕分けにかけた2,418語の7割強で、コース全体の4,000語で見ても4割強にあたる。",[15,87,88],{},[46,89,48],{},[50,91,92,95,98,101],{},[53,93,94],{},"消えていた画像159枚をR2から復元（削除して構わない生成物だと思い込んでいたが、残す約束をしていた141語分が丸ごと含まれていた）",[53,96,97],{},"「R2に反映されていない」と見えた3枚が、読み出しコマンド側の異常だったと切り分け。書き込みは最初から111/111成功していた",[53,99,100],{},"例文不一致340語（Round4）を設計図から書き直して本番反映",[53,102,103],{},"抽象・境界の1,384語（Round5）は並列20で着手し、1,576枚中1,037枚（66%）まで進めて夜間体制に切替",[15,105,106,70,108],{},[46,107,69],{},[72,109,111],{"href":110},"/etymology-course-image-rework","語源英単語コースの挿絵を全語洗い直しした記録",[77,113],{},[36,115,117],{"id":116},"_3-wordpress移行サイトのカテゴリとナビを作り直した","3. WordPress移行サイトのカテゴリとナビを作り直した",[15,119,120],{},"移行済みの記事は200本を超えていた。それでもカテゴリページを開くと、記事が日付順に積まれているだけで、ひとまとまりの目次に見えない。旧サイトの同じカテゴリには30本近い記事が整理されて並んでいるのに、移行先では粗い分類に埋もれていた。",[15,122,123],{},[46,124,48],{},[50,126,127,130,133,136,139],{},[53,128,129],{},"WordPressのカテゴリDBから機械的に組み直したが、本番トップの三段階の枠組みはDBのどこにもなく、HTMLの中にしか存在しなかったと判明。本番構造を洗い直して作り直し",[53,131,132],{},"9トピック28記事のタイトルを内容ベースで判断させ、25個のサブグループに再設計（「その他」落ちゼロを確認）",[53,134,135],{},"長いタイトルで崩れていた横3列を、1トピック全幅の縦積みに変更",[53,137,138],{},"本番と同じ8項目のヘッダーナビとロゴを移植",[53,140,141],{},"書籍紹介は専用ページではなくホームページ下部へ置き直し",[15,143,144,70,146],{},[46,145,69],{},[72,147,149],{"href":148},"/wordpress-migration-category-redesign","WordPress移行サイトのカテゴリとナビゲーションを作り直した一日",[77,151],{},[36,153,155],{"id":154},"_4-本番切替を確認画面の直前で止め旧サーバーの畳み方を決めた","4. 本番切替を確認画面の直前で止め、旧サーバーの畳み方を決めた",[15,157,158],{},"知人から届いた旧サーバーの保守提案を、そのまま受けるのではなく自分で裏取りした。PHPのサポート期限切れもバックアップ不在も、指摘はいずれも事実だった。手動バックアップを取ろうとした段で管理者権限が手元にないことに気づき、起動プロセス経由の復旧を別のCLIに委譲して権限を取り戻した。",[15,160,161],{},"そのうえで、恒久的な保守契約ではなく「一括でバックアップを取って畳む」方針に決めた。近く退役させるサーバーだからだ。同じ日、移行先への本番切替がDNS変更の確認画面まで到達したが、移行先のトップページが挨拶文だけで記事一覧を持っていないことに気づいて中止した。",[15,163,164],{},[46,165,48],{},[50,167,168,171,174,177],{},[53,169,170],{},"保守提案の指摘内容を一次情報で検証し、方針を「契約」ではなく「退役」に確定",[53,172,173],{},"本体とDBの手動バックアップを取得し、ハッシュ照合とアーカイブ整合性まで検証",[53,175,176],{},"切替は中止したが、現行設定値・到達した手順・ロールバック手順は文書に残した",[53,178,179],{},"「トップページに全記事のインデックスを作る」が切替再開の前提条件として確定",[15,181,182,70,184],{},[46,183,69],{},[72,185,187],{"href":186},"/wordpress-cutover-postponed","WordPress本番切替を土壇場で止め、旧サーバーの畳み方を決めた",[77,189],{},[36,191,193],{"id":192},"_5-画像が出ないバグを追ったらビルド除外の設計に行き着いた","5. 画像が出ないバグを追ったら、ビルド除外の設計に行き着いた",[15,195,196,197,201],{},"ローカル専用の記事を開くと、本文は読めるのに画像が31枚とも真っ白だった。devサーバーを再起動しかけて止め、そのまま調べさせると、犯人は配信ミドルウェアのアクセス制御だった。",[198,199,200],"code",{},"getRequestIP"," がプロキシ経由のヘッダーを見ない設定で呼ばれていて、IPが取れず、ローカルホスト判定が常に外れ、常に404を返していた。",[15,203,204],{},"直したあと、話は「そもそもこの仕組みはいるのか」に転がった。既存の非公開記事の一覧と照らし合わせると、既存の仕組みは本番から消すだけでリポジトリには残す。今回の記事は機密情報が写り込んでいて、中間データにも残したくない。守る対象の重さが違うとわかって、追加実装は残すことにした。",[15,206,207],{},[46,208,48],{},[50,210,211,217,227,230],{},[53,212,213,216],{},[198,214,215],{},"getRequestIP(event, { xForwardedFor: true })"," への修正で31枚とも200を確認",[53,218,219,222,223,226],{},[198,220,221],{},"_local-unpublished"," が触る5箇所を洗い出し、",[198,224,225],{},".gitignore"," の1行で記事も画像も一度もGit管理に入っていないことを確認",[53,228,229],{},"溜まっていた未コミットの変更を意味の単位で7本に分けてコミット",[53,231,232],{},"決算データ取得バッチのレート制限対策（71銘柄一括 → 12銘柄チャンク＋バックオフ）で71/71成功",[15,234,235,70,237],{},[46,236,69],{},[72,238,240],{"href":239},"/content-visibility-and-image-path-fixes","Nuxtで画像が表示されないバグを追ったら、ビルド除外の設計に行き着いた",[77,242],{},[36,244,246],{"id":245},"_6-ma案件から事業アイディアを棚卸しした","6. M&A案件から事業アイディアを棚卸しした",[15,248,249],{},"売り案件サイトを調べさせ、自分の開発資産と突き合わせて事業アイディアを検討メモにまとめた。価格や収益の記述は検証エージェントにソースページを再取得させて裏取りさせている。内容が内容なので非公開扱いにしてあり、ここには書かない。",[77,251],{},[22,253,254],{"id":254},"今日の試行錯誤",[256,257,258,280],"table",{},[259,260,261],"thead",{},[262,263,264,268,271,274,277],"tr",{},[265,266,267],"th",{},"#",[265,269,270],{},"テーマ",[265,272,273],{},"試したこと",[265,275,276],{},"結果",[265,278,279],{},"気づき",[281,282,283,301,318,335,352,369,386,403,422,439,455,471,490],"tbody",{},[262,284,285,289,292,295,298],{},[286,287,288],"td",{},"1",[286,290,291],{},"挿絵の品質",[286,293,294],{},"例文と噛み合わない挿絵の原因を掘った",[286,296,297],{},"判明",[286,299,300],{},"最初の一括生成に入れた「人物を描かない」制約が元凶。仕分けた2,418語のうち1,724語（7割強）を洗い直す羽目に",[262,302,303,306,309,312,315],{},[286,304,305],{},"2",[286,307,308],{},"消えた画像159枚",[286,310,311],{},"不要な生成物とみて削除しようとした",[286,313,314],{},"中止",[286,316,317],{},"残す約束をしていた141語分が丸ごと含まれていた。復元へ方針転換",[262,319,320,323,326,329,332],{},[286,321,322],{},"3",[286,324,325],{},"R2の反映不良",[286,327,328],{},"3枚だけ古い内容が返るので削除→再アップを検討",[286,330,331],{},"不要だった",[286,333,334],{},"書き込みは111/111成功済み。読み出しコマンド側の異常。「反映されていない」ではなく「読めていない」",[262,336,337,340,343,346,349],{},[286,338,339],{},"4",[286,341,342],{},"Round5の画像生成",[286,344,345],{},"1,576枚を並列20で一気に流した",[286,347,348],{},"部分成功",[286,350,351],{},"275枚あたりから429で脱落し、20→13→9→5→2→1本に。66%で夜間体制へ",[262,353,354,357,360,363,366],{},[286,355,356],{},"5",[286,358,359],{},"カテゴリ再構築",[286,361,362],{},"WordPressのカテゴリDBから機械的に組み直した",[286,364,365],{},"やり直し",[286,367,368],{},"本番の三段階の枠組みはDBになく、トップのHTMLの中にしかなかった",[262,370,371,374,377,380,383],{},[286,372,373],{},"6",[286,375,376],{},"トピック一覧",[286,378,379],{},"横3列で並べた",[286,381,382],{},"失敗",[286,384,385],{},"長いタイトルが折り返して高さがバラバラに。1トピック全幅の縦積みで解決",[262,387,388,391,394,397,400],{},[286,389,390],{},"7",[286,392,393],{},"著書の置き場所",[286,395,396],{},"専用ページに書影とカリキュラムを置いた",[286,398,399],{},"却下",[286,401,402],{},"置きたかったのはホーム。同じ素材でも置き場所で意味が変わる",[262,404,405,408,411,414,416],{},[286,406,407],{},"8",[286,409,410],{},"画像が表示されない",[286,412,413],{},"devサーバー再起動を疑った",[286,415,314],{},[286,417,418,419,421],{},"触らず調査に切替。",[198,420,200],{}," がプロキシヘッダーを見ておらずIPが取れていなかった",[262,423,424,427,431,434,436],{},[286,425,426],{},"9",[286,428,429],{},[198,430,221],{},[286,432,433],{},"いらない実装とみて消そうとした",[286,435,314],{},[286,437,438],{},"既存の非公開フラグとは守る対象の重さが違うと確認して残した",[262,440,441,444,447,450,452],{},[286,442,443],{},"10",[286,445,446],{},"決算データの一括取得",[286,448,449],{},"71銘柄を一斉にリクエストした",[286,451,382],{},[286,453,454],{},"22銘柄が429。12銘柄チャンク＋バックオフに直して71/71成功",[262,456,457,460,463,466,468],{},[286,458,459],{},"11",[286,461,462],{},"本番DNS切替",[286,464,465],{},"確認画面まで到達した",[286,467,314],{},[286,469,470],{},"移行先トップが挨拶文だけ。記事インデックスの実装を前提条件に設定",[262,472,473,476,481,484,487],{},[286,474,475],{},"12",[286,477,478],{},[198,479,480],{},"git stash pop",[286,482,483],{},"コミット前の退避を戻した",[286,485,486],{},"部分失敗",[286,488,489],{},"3ファイルが戻り切らず。Gitオブジェクトと突き合わせたら、より新しい版で壊れていなかった",[262,491,492,495,498,501,504],{},[286,493,494],{},"13",[286,496,497],{},"自動スクロール追従",[286,499,500],{},"動いていないと思ってDOMを覗いた",[286,502,503],{},"誤診",[286,505,506],{},"動いてはいた。ハイライトの色が薄くて目に入らなかっただけ",[77,508],{},[22,510,511],{"id":511},"今日の学び",[50,513,514,520,526,532,538],{},[53,515,516,519],{},[46,517,518],{},"大量に流す前に、100件だけ見る。"," 挿絵のプロンプト制約も、カテゴリの機械分類も、小さく検収してから広げていれば、この日1日分の作業がまるごと要らなかった。同じ失敗を別のプロジェクトで同じ日に踏んでいる",[53,521,522,525],{},[46,523,524],{},"「反映されていない」と「読めていない」は別の話。"," 対象を疑う前に、見ている側の道具を疑う番があった",[53,527,528,531],{},[46,529,530],{},"消す前に確かめる。"," いらないと思った実装は、既存の仕組みと守る対象の重さが違っただけだった。疑いを晴らすのに使った時間のほうが、バグを直す時間より長い",[53,533,534,537],{},[46,535,536],{},"記録がないと、自分がやったことすら思い出せない。"," 前日に作った機能の経緯が残っておらず、実機を開いて確かめ直すところから朝が始まった",[53,539,540,543],{},[46,541,542],{},"止める判断は、進める判断と同じだけ仕事をしている。"," 削除を止め、切替を止め、レート制限を使い切るのを止めた。三つとも、進めていたら取り返しがつかないか、無駄に終わっていた",[77,545],{},[22,547,548],{"id":548},"明日やること",[50,550,553,563,569],{"className":551},[552],"contains-task-list",[53,554,557,562],{"className":555},[556],"task-list-item",[558,559],"input",{"disabled":560,"type":561},true,"checkbox"," Round5 の残り539枚（週次レート制限の回復待ち）",[53,564,566,568],{"className":565},[556],[558,567],{"disabled":560,"type":561}," 移行先サイトのトップページに全記事インデックスを実装（本番切替の前提条件）",[53,570,572,574],{"className":571},[556],[558,573],{"disabled":560,"type":561}," 教材化シリーズの第6講",[77,576],{},[22,578,579],{"id":579},"関連記事",[50,581,582,586,590,594,598],{},[53,583,584],{},[72,585,75],{"href":74},[53,587,588],{},[72,589,111],{"href":110},[53,591,592],{},[72,593,149],{"href":148},[53,595,596],{},[72,597,187],{"href":186},[53,599,600],{},[72,601,240],{"href":239},{"title":603,"searchDepth":604,"depth":604,"links":605},"",2,[606,607,616,617,618,619],{"id":24,"depth":604,"text":24},{"id":34,"depth":604,"text":34,"children":608},[609,611,612,613,614,615],{"id":38,"depth":610,"text":39},3,{"id":81,"depth":610,"text":82},{"id":116,"depth":610,"text":117},{"id":154,"depth":610,"text":155},{"id":192,"depth":610,"text":193},{"id":245,"depth":610,"text":246},{"id":254,"depth":604,"text":254},{"id":511,"depth":604,"text":511},{"id":548,"depth":604,"text":548},{"id":579,"depth":604,"text":579},"diary",null,"教材化シリーズを1日で3講積み上げる一方、挿絵の全語洗い直し・WordPress移行サイトのカテゴリ再設計・本番切替の中止判断まで走った日の記録。三度の「止める」がどれも正解だった経緯をまとめる。","md",{},"/2026-07-24-diary","daily-log",false,"2026-07-24T00:00:00.000Z",{"title":5,"description":622},"2026-07/2026-07-24/diary-2026-07-24",[632,633,634,635,636],"日記","学習コース","WordPress移行","画像生成","サブエージェント並列","Cg_r5Ch9-Q7Xp1uroSXCGhA6mRnF4Ch_KI3OEjZgPcw",[],[640,644,645,649,653],{"title":641,"path":642,"publishedAt":643},"2026年7月25日の開発日記 - 挿絵1,576枚の完走とクラウド12セッション投入","/2026-07-25-diary","2026-07-25T00:00:00.000Z",{"title":75,"path":74,"publishedAt":628},{"title":646,"path":647,"publishedAt":648},"2026年7月23日の開発日記 - 音声入力の誤変換を辞書で潰し、WordPressの出口を決めた日","/2026-07-23-diary","2026-07-23T00:00:00.000Z",{"title":650,"path":651,"publishedAt":652},"2026年7月21日の開発日記 - 会計アプリの誕生と、サブエージェントが吐いた一つの嘘","/2026-07-21-diary","2026-07-21T00:00:00.000Z",{"title":654,"path":655,"publishedAt":656},"2026年7月18日の開発日記 - 1Password実機検証と画像パイプラインsol採用","/2026-07-18-diary","2026-07-18T00:00:00.000Z","https://log.eurekapu.com/og/blog/2026-07-24-diary.png?v=2026-07-24T00%3A00%3A00.000Z&title=2026%E5%B9%B47%E6%9C%8824%E6%97%A5%E3%81%AE%E9%96%8B%E7%99%BA%E6%97%A5%E8%A8%98%20-%20%E9%80%B2%E3%82%81%E3%82%8B%E5%88%A4%E6%96%AD%E3%82%88%E3%82%8A%E3%80%81%E6%AD%A2%E3%82%81%E3%82%8B%E5%88%A4%E6%96%AD%E3%81%AE%E3%81%BB%E3%81%86%E3%81%8C%E5%A4%9A%E3%81%8B%E3%81%A3%E3%81%9F%E6%97%A5&author=Kei%20Komatsu&sig=c8bd00710c4bc3ca",1785099371326]