[{"data":1,"prerenderedAt":650},["ShallowReactive",2],{"content-/2026-07-16-diary":3,"all-pages-for-dir":648,"og-image-/2026-07-16-diary":649},{"id":4,"title":5,"body":6,"category":631,"concepts":632,"description":633,"extension":634,"meta":635,"navigation":546,"ogImage":632,"path":636,"project_name":637,"published":638,"publishedAt":639,"seo":640,"stem":641,"tags":642,"todo":632,"unpublished":638,"updatedAt":632,"__hash__":647},"pages/2026-07/2026-07-16/diary-2026-07-16.md","2026年7月16日の開発日記 - Notion内部APIクロール3,000ページ超と語源アプリ本番公開、R2移行計画",{"type":7,"value":8,"toc":612},"minimark",[9,14,18,22,29,32,37,40,46,59,70,73,77,80,84,95,103,105,109,112,116,132,140,142,146,149,153,161,169,171,175,182,186,201,209,211,215,222,230,232,236,287,289,292,508,510,513,530,532,535,561,563,566],[10,11,13],"h1",{"id":12},"_2026年7月16日の開発日記","2026年7月16日の開発日記",[15,16,17],"p",{},"Fable 5のrate limitエラーが9件、連続で並んだ。コンテンツ生成8バッチは全滅に見えた。DBを確認すると、全部書き込み済みだった。エラーの数は、失敗の数ではなかったわけだ。朝イチの積み残し確認とGoogleタスクの断捨離で足場を作り、日中はNotionアーカイブの内部API再帰クロールをChromeタブで回し続けた。その裏で語源英単語アプリのミニテスト4択化と本番公開、書籍図版62,331件のR2移行のCodex委任と完走。夕方には今度はマークダウンの数式化バグを見つけて、115ファイルぶんの宿題を明日に残した。並列度の高い一日だった。",[19,20,21],"h2",{"id":21},"今日のタイムライン",[15,23,24],{},[25,26],"img",{"alt":27,"src":28},"タイムライン","/2026-07/2026-07-16/timeline-2026-07-16.png",[19,30,31],{"id":31},"今日やったこと",[33,34,36],"h3",{"id":35},"_1-notion自動アーカイブを内部api再帰クロールに切り替え","1. Notion自動アーカイブを内部API再帰クロールに切り替え",[15,38,39],{},"初期方針は「公式ZIP＋内部API補完」の二本立てだった。これを捨てた。ZIPエクスポートではデータベースの中身が全部は取れないことを、過去に自分で経験していたからだ。内部API単体で完結させる路線に切り替えて入れ子DBの再帰取得と画像回収を実装させ、Chromeタブに常駐させたJavaScriptの自己監督ループで429を自動回避しながら、当日中に3,000ページ超・10万ブロック超を取得。クローラーは明日へ引き継ぐ形で安全停止した。",[15,41,42],{},[43,44,45],"strong",{},"主な成果:",[47,48,49,53,56],"ul",{},[50,51,52],"li",{},"861ページの初回完走＋常駐ループで+2,316ページ（残キュー4,757）",[50,54,55],{},"画像222/224枚を署名付きURLから回収",[50,57,58],{},"path-traversal / SSRF のセキュリティレビューも実施",[15,60,61,64,65],{},[43,62,63],{},"詳細:"," ",[66,67,69],"a",{"href":68},"/notion-archive-internal-api-crawler","NotionアーカイブをZIP依存から内部API再帰クロールに切り替えた話",[71,72],"hr",{},[33,74,76],{"id":75},"_2-語源英単語アプリ-phase-4-d1本番適用とミニテスト4択化本番公開","2. 語源英単語アプリ Phase 4 — D1本番適用とミニテスト4択化、本番公開",[15,78,79],{},"D1マイグレーション0007を本番適用し、Phase 4A（アトラス3859号）の英語コンテンツを359語まで進めた。rate limitの9連発はこの途中で起きた。並んだエラーと、書き込み済みのDB。信じるべきは後者だった。章末コーナーのレイアウト崩れを直し、ミニテストは自己申告の○×から4択即時判定（18章×5問=90問）に置き換えて、本番環境へのオープン化まで済ませた。",[15,81,82],{},[43,83,45],{},[47,85,86,89,92],{},[50,87,88],{},"D1マイグレーション0007の本番適用",[50,90,91],{},"ミニテスト90問の4択化と履歴保持",[50,93,94],{},"gogen-eitango の本番公開（デプロイ6.4分）",[15,96,97,64,99],{},[43,98,63],{},[66,100,102],{"href":101},"/gogen-eitango-phase4-d1-quiz-multichoice","gogen-eitango Phase 4: D1本番適用と章末ミニテストの4択化",[71,104],{},[33,106,108],{"id":107},"_3-書籍図版62331件のcloudflare-r2移行計画とcodex実装委任","3. 書籍図版62,331件のCloudflare R2移行計画とCodex実装委任",[15,110,111],{},"book-knowledge-base の図版PNG 62,331件・2.96GBは、ローカルディスクが飛べばそれきりの単一障害点だった。R2移行の計画書で答えを出した。設計の分かれ目は、93,505件のDBレコードに焼き込まれたURLをどう扱うか。採ったのはサーバープロキシ方式である。Codexレビューで致命的指摘3件（検証フェーズ新設・rclone check強化・削除前の二次バックアップ）を反映し、実装本体はCodexに委任して同日中に完走させた。",[15,113,114],{},[43,115,45],{},[47,117,118,126,129],{},[50,119,120,121,125],{},"計画書 ",[122,123,124],"code",{},"figures-r2-migration-plan.md"," の完成（レビュー済み）",[50,127,128],{},"全62,331件のR2アップロード・rclone check全件照合（差分0）・Dropbox二次バックアップ・ローカル図版削除まで同日中に完了",[50,130,131],{},"残処理は Dropbox オンライン専用化の確認と移行用トークンの失効のみ",[15,133,134,64,136],{},[43,135,63],{},[66,137,139],{"href":138},"/book-knowledge-base-r2-migration-plan","62,331件の書籍図版をCloudflare R2へ移行する計画づくりとCodexへの実装委任",[71,141],{},[33,143,145],{"id":144},"_4-積み残し確認とgoogleタスク7件の断捨離","4. 積み残し確認とGoogleタスク7件の断捨離",[15,147,148],{},"朝イチで昨日分の積み残しを洗い出し、5分割コミットで完済。続けて開いたGoogleタスクは、7件中5件が3ヶ月前の起票だった。もうタスクリストではない。罪悪感の陳列棚である。復帰用の情報だけmemoに退避してから削除する方針で整理した。Notionの自動アカデミー計画にはGitHubプライベートリポジトリを作成。",[15,150,151],{},[43,152,45],{},[47,154,155,158],{},[50,156,157],{},"昨日分の5コミット（学習ゲート合格込み）で積み残しゼロ",[50,159,160],{},"Googleタスク: 完了扱い2件・削除5件で「アクティブなリスト」を回復",[15,162,163,64,165],{},[43,164,63],{},[66,166,168],{"href":167},"/backlog-cleanup-google-tasks-declutter","積み残し確認とGoogleタスク7件の断捨離",[71,170],{},[33,172,174],{"id":173},"_5-aiユーザー数記事の追記とデプロイスクリプトの改善","5. AIユーザー数記事の追記とデプロイスクリプトの改善",[15,176,177,178,181],{},"昨日のAIユーザー数記事に追加調査を載せた。コーディングエージェントの利用者は、チャット型AIの約100分の1（2桁小さい）。この差は1枚のチャートに収まるだろうか。9億の隣に置いた700万の棒は、もう読めない。比較チャートは見送り、Codex単体の成長だけをSVG折れ線にして埋め込んだ。デプロイは1回目が失敗。原因切り分けから ",[122,179,180],{},"measure-deploy.ps1"," にpre-deploy validationを組み込んで、最終的に本番反映まで完了した。",[15,183,184],{},[43,185,45],{},[47,187,188,191,198],{},[50,189,190],{},"Codex成長の折れ線チャート追加（lint機械検証済み）",[50,192,193,194,197],{},"pre-deploy validation の組み込みと ",[122,195,196],{},"/deploy"," 側の横展開確認",[50,199,200],{},"本番デプロイ成功",[15,202,203,64,205],{},[43,204,63],{},[66,206,208],{"href":207},"/ai-user-count-codex-chart-and-deploy-validation","AIユーザー数記事にCodex折れ線グラフを追記し、デプロイスクリプトにpre-deploy検証を組み込んだ話",[71,210],{},[33,212,214],{"id":213},"_6-マークダウンの数式化バグを発見115ファイルを明日へ","6. マークダウンの$数式化バグを発見、115ファイルを明日へ",[15,216,217,218,221],{},"AX記事を確認していて、表示の崩れが目に留まった。",[122,219,220],{},"$"," に挟まれた区間が、数式として飲み込まれている。横展開調査で括弧隣接の太字崩れを114記事直したが、それでも直らない記事が5件残った。真因はそこにいた。remark-math の1ドル記法である。対象115ファイルのリストと修正スクリプトをmemoに退避し、Googleタスクに登録して明日再開する形にした。",[15,223,224,64,226],{},[43,225,63],{},[66,227,229],{"href":228},"/dollar-sign-math-render-issue-triage","マークダウン記事の$隣接**が数式化されて崩れる問題を発見",[71,231],{},[33,233,235],{"id":234},"_7-そのほか","7. そのほか",[47,237,238,244,255,266,277],{},[50,239,240,243],{},[43,241,242],{},"Windowsストレージ掃除ラウンド2",": Cドライブの空きを45.4GB→129.8GB（+84GB。翌朝の実測では155.3GBまで回復）まで掃除した。OCRデバッグ画像13.76GB・Hugging Faceキャッシュ・Docker・WSL・休止状態オフなどを、アプリのアンインストールは自分の手で、残骸フォルダやデバッグ画像の削除はClaude Codeに任せる分担で進めた（記録は非公開記事に整理）",[50,245,246,249,250,254],{},[43,247,248],{},"マネーフォワード会計への不満ログ",": 自分のXアカウントの過去投稿から会計ソフトへの不満・要望を洗い出し、発生日と解決状況をモニタリングする",[66,251,253],{"href":252},"/money-forward-kaikei-complaints-log","公開記事","にまとめた",[50,256,257,260,261,265],{},[43,258,259],{},"SVG図解スキルの改善",": note記事を題材にデロイト資料の「7つの型」を検証し、",[66,262,264],{"href":263},"/svg-diagram-skill-deloitte-7-types-review","スキルに足りない要素を洗い出した","。強調は「背景塗り」から「文字色」基本へ方針転換",[50,267,268,271,272,276],{},[43,269,270],{},"決算ビートスキャン",": ",[66,273,275],{"href":274},"/earnings-beats-2026-07-15","ASMLのQ3ガイダンス+13.9%ビート&レイズなど","を朝のチェーンで記事化",[50,278,279,282,283],{},[43,280,281],{},"「誰がAXをできるのか」",": 業務をコードに落とし込める人の条件を",[66,284,286],{"href":285},"/who-can-do-ax","記事化",[71,288],{},[19,290,291],{"id":291},"今日の試行錯誤",[293,294,295,317],"table",{},[296,297,298],"thead",{},[299,300,301,305,308,311,314],"tr",{},[302,303,304],"th",{},"#",[302,306,307],{},"テーマ",[302,309,310],{},"試したこと",[302,312,313],{},"結果",[302,315,316],{},"気づき",[318,319,320,338,355,372,389,406,423,440,457,474,491],"tbody",{},[299,321,322,326,329,332,335],{},[323,324,325],"td",{},"1",[323,327,328],{},"Notionアーカイブ",[323,330,331],{},"公式ZIP＋内部API補完の二本立て",[323,333,334],{},"ZIP路線を放棄→内部API単体へ",[323,336,337],{},"ZIPはDBの中身が完全に取れない。自分の実体験が方針を決めた",[299,339,340,343,346,349,352],{},[323,341,342],{},"2",[323,344,345],{},"Notionクロール",[323,347,348],{},"queryCollection APIの再現リクエスト",[323,350,351],{},"50件で頭打ち→allBlockIds発見で突破",[323,353,354],{},"APIレスポンスの別フィールドに全量が入っていることがある",[299,356,357,360,363,366,369],{},[323,358,359],{},"3",[323,361,362],{},"Notion 429対策",[323,364,365],{},"素朴な連続リクエスト",[323,367,368],{},"429を44件浴びた→400msスロットル＋3分自動待機で完走",[323,370,371],{},"常駐ループに「自己監督」を持たせるとタブ任せで回る",[299,373,374,377,380,383,386],{},[323,375,376],{},"4",[323,378,379],{},"Notion画像",[323,381,382],{},"直接fetchで画像取得",[323,384,385],{},"403→ネットワークログの302先から署名付きURLで回収",[323,387,388],{},"CSP/CORSに阻まれたらネットワークログが正解を持っている",[299,390,391,394,397,400,403],{},[323,392,393],{},"5",[323,395,396],{},"gogen Phase 4A",[323,398,399],{},"Fable 5で8バッチ生成",[323,401,402],{},"rate limit 9連発→実は全部書き込み済みだった",[323,404,405],{},"エラーの連発と書き込み失敗は別物。先にDB状態を見る",[299,407,408,411,414,417,420],{},[323,409,410],{},"6",[323,412,413],{},"ミニテスト",[323,415,416],{},"自己申告の○×ボタン",[323,418,419],{},"4択即時判定に置き換え",[323,421,422],{},"「正解できた/間違えた」を押させる摩擦は選択式で消せる",[299,424,425,428,431,434,437],{},[323,426,427],{},"7",[323,429,430],{},"デプロイ",[323,432,433],{},"measure-deploy.ps1 の1回目",[323,435,436],{},"prerender後に失敗→pre-deploy validation組み込み",[323,438,439],{},"10分ビルドの失敗は事前検証で防ぐのが一番安い",[299,441,442,445,448,451,454],{},[323,443,444],{},"8",[323,446,447],{},"デプロイ再試行",[323,449,450],{},"2回目も別エラー",[323,452,453],{},"一過性と判断して再実行→成功",[323,455,456],{},"検証スクリプトの失敗は原因の階層を分けて読む",[299,458,459,462,465,468,471],{},[323,460,461],{},"9",[323,463,464],{},"$数式化",[323,466,467],{},"括弧隣接の太字崩れを横展開修正",[323,469,470],{},"114記事修正→残り5記事の真因は$数式化",[323,472,473],{},"一括修正後の「残り」にこそ真因が隠れている",[299,475,476,479,482,485,488],{},[323,477,478],{},"10",[323,480,481],{},"Googleタスク",[323,483,484],{},"7件を保持したまま眺める",[323,486,487],{},"memo退避→完了2件・削除5件",[323,489,490],{},"3ヶ月放置のタスクリストは「罪悪感の陳列棚」",[299,492,493,496,499,502,505],{},[323,494,495],{},"11",[323,497,498],{},"R2移行の委任",[323,500,501],{},"Codexへの実装委任",[323,503,504],{},"一度分類器にブロック→経路を立て直して同日完走",[323,506,507],{},"委任プロンプトも分類器に引っかかることがあるが、正規の再試行で通る",[71,509],{},[19,511,512],{"id":512},"今日の学び",[47,514,515,518,521,524,527],{},[50,516,517],{},"rate limitエラーが連発しても、書き込み自体は成功していることがある。エラー表示を数える前にDBの実際の状態を確認する",[50,519,520],{},"ZIPエクスポートの「公式だから完全」という思い込みは危険。過去に自分が経験した欠落が、方針転換の一番の根拠になった",[50,522,523],{},"10分かかるビルドの失敗は、失敗してから調べるのではなく、事前検証（pre-deploy validation)で入口で止める",[50,525,526],{},"タスクリストは放置すると「罪悪感の陳列棚」になる。興味が薄れたタスクは復帰情報だけ退避して消すと、リスト全体の信頼性が戻る",[50,528,529],{},"一括修正で直りきらなかった「残り」には別の真因がある。114件直して残った5件が remark-math の仕様に辿り着かせた",[71,531],{},[19,533,534],{"id":534},"明日やること",[47,536,539,549,555],{"className":537},[538],"contains-task-list",[50,540,543,548],{"className":541},[542],"task-list-item",[544,545],"input",{"disabled":546,"type":547},true,"checkbox"," $数式化問題の修正方針を決めて115ファイルに適用（案A: singleDollarTextMath無効化 / 案B: エスケープ横展開）",[50,550,552,554],{"className":551},[542],[544,553],{"disabled":546,"type":547}," Notionアーカイブの残キュー4,757ページの消化とR2複製",[50,556,558,560],{"className":557},[542],[544,559],{"disabled":546,"type":547}," book-knowledge-base R2移行の残処理（Dropboxオンライン専用化の確認・移行用トークンの失効）",[71,562],{},[19,564,565],{"id":565},"関連記事",[47,567,568,572,576,580,584,588,592,597,602,607],{},[50,569,570],{},[66,571,69],{"href":68},[50,573,574],{},[66,575,102],{"href":101},[50,577,578],{},[66,579,139],{"href":138},[50,581,582],{},[66,583,168],{"href":167},[50,585,586],{},[66,587,208],{"href":207},[50,589,590],{},[66,591,229],{"href":228},[50,593,594],{},[66,595,596],{"href":252},"マネーフォワード会計への不満・改善要望ログ",[50,598,599],{},[66,600,601],{"href":263},"デロイトの351ページ資料は「7つの型」だけでできていた",[50,603,604],{},[66,605,606],{"href":285},"誰がAXをできるのか。業務をコードに落とし込める人の条件",[50,608,609],{},[66,610,611],{"href":274},"24時間決算ビートスキャン（2026-07-15〜07-16）",{"title":613,"searchDepth":614,"depth":614,"links":615},"",2,[616,617,627,628,629,630],{"id":21,"depth":614,"text":21},{"id":31,"depth":614,"text":31,"children":618},[619,621,622,623,624,625,626],{"id":35,"depth":620,"text":36},3,{"id":75,"depth":620,"text":76},{"id":107,"depth":620,"text":108},{"id":144,"depth":620,"text":145},{"id":173,"depth":620,"text":174},{"id":213,"depth":620,"text":214},{"id":234,"depth":620,"text":235},{"id":291,"depth":614,"text":291},{"id":512,"depth":614,"text":512},{"id":534,"depth":614,"text":534},{"id":565,"depth":614,"text":565},"diary",null,"NotionアーカイブをZIP依存から内部API再帰クロールに切り替えて3,000ページ超を取得。語源英単語アプリはミニテストを4択化して本番公開し、62,331件の書籍図版のR2移行計画も固めた一日。","md",{},"/2026-07-16-diary","daily-log",false,"2026-07-16T00:00:00.000Z",{"title":5,"description":633},"2026-07/2026-07-16/diary-2026-07-16",[643,644,645,646,430],"日記","notion","cloudflare-r2","gogen-eitango","Tn-3629v7BMTvWrwLfj8tSw5k2FBtDirhsxiQnH4_jA",[],"https://log.eurekapu.com/og/blog/2026-07-16-diary.png?v=2026-07-16T00%3A00%3A00.000Z&title=2026%E5%B9%B47%E6%9C%8816%E6%97%A5%E3%81%AE%E9%96%8B%E7%99%BA%E6%97%A5%E8%A8%98%20-%20Notion%E5%86%85%E9%83%A8API%E3%82%AF%E3%83%AD%E3%83%BC%E3%83%AB3%2C000%E3%83%9A%E3%83%BC%E3%82%B8%E8%B6%85%E3%81%A8%E8%AA%9E%E6%BA%90%E3%82%A2%E3%83%97%E3%83%AA%E6%9C%AC%E7%95%AA%E5%85%AC%E9%96%8B%E3%80%81R2%E7%A7%BB%E8%A1%8C%E8%A8%88%E7%94%BB&author=Kei%20Komatsu&sig=52abe1407a6164f3",1784259706035]