[{"data":1,"prerenderedAt":209},["ShallowReactive",2],{"content-/make-diary-cloudflare-workers-cron-plan":3,"all-pages-for-dir":187,"related-/make-diary-cloudflare-workers-cron-plan":188,"og-image-/make-diary-cloudflare-workers-cron-plan":208},{"id":4,"title":5,"body":6,"category":167,"concepts":168,"description":169,"extension":170,"meta":171,"navigation":172,"ogImage":168,"path":173,"project_name":174,"published":175,"publishedAt":176,"seo":177,"source":178,"stem":179,"tags":180,"todo":168,"unpublished":175,"updatedAt":168,"__hash__":186},"pages/2026-09/2026-09-25/make-diary-cloudflare-workers-cron-plan.md","Cloudflare Workers無料プランのcronで毎朝の統計取得は動くか：wranglerでPhase 0を実測した",{"type":7,"value":8,"toc":155},"minimark",[9,13,17,20,25,28,38,41,45,48,52,60,63,66,70,73,76,79,82,85,88,91,95,98,101,104,107,110,113,116,119,122,125,129,132,135,138,141,144,147],[10,11,5],"h1",{"id":12},"cloudflare-workers無料プランのcronで毎朝の統計取得は動くかwranglerでphase-0を実測した",[14,15,16],"p",{},"毎朝の make-diary（前日のログから日記を作るコマンドのチェーン）を1回流すと、コンテキストをだいたい35%まで使う。",[14,18,19],{},"その一部を Cloudflare Workers の cron（定時実行）へ移したらどうか。\nクラウド上で毎日スクリプトが自動で走り、ローカルでは make-diary を実行したときにデータを受け取るだけになる。\nそれならかなり短縮できるはずだ、と筆者は考えた。",[21,22,24],"h2",{"id":23},"make-diary-のステップを3つの問いで仕分ける","make-diary のステップを3つの問いで仕分ける",[14,26,27],{},"最初に、Claude Code にサブエージェントで2つの調査を並行して走らせた。",[29,30,31,35],"ul",{},[32,33,34],"li",{},"make-diary の全ステップについて、何を取りに行くか、判断に LLM が要るか、ログイン済みの Chrome が要るか",[32,36,37],{},"Cloudflare の料金と制限",[14,39,40],{},"筆者は途中で、ほとんど移せないのではないかと質問していた。\n仕分けの結果は、そのとおりになった。\n移せるのは、公開統計を取ってくる部分だけである。\n計画書では、各ステップを4つに分けて整理した。",[21,42,44],{"id":43},"無料プランの壁は-cpu-時間とリクエスト数","無料プランの壁は CPU 時間とリクエスト数",[14,46,47],{},"料金と制限の調査のほうが先に戻ってきた。\n無料プランでは、cron 1回あたりの CPU 時間が 10ms、外部へのリクエストが50本までで、この2つが最初に効く。\ncron トリガーは5本までしか置けない。",[21,49,51],{"id":50},"計画書を-codex-に通し判断は3択ボタンで","計画書を Codex に通し、判断は3択ボタンで",[14,53,54,55,59],{},"調査をもとに、Claude Code に計画書（",[56,57,58],"code",{},"make-diary-workers-offload-plan.md","）を書かせ、Codex でレビューした。\n指摘を受けて、4-1〜4-3節（監視するソースの一覧、ローカル側の受け取り方、「処理済み」の記録）を書き直させた。\n図と判断事項の選択肢も、書き直した内容に合わせて直させた。\n再レビューで Codex が承認した。",[14,61,62],{},"計画書は HTML にして、判断してほしい3点を選択ボタン付きで Chrome に開いてもらった。\n計画書の結論は、無料プランに収まる「見込み」だった。\nこの時点では、まだ Cloudflare の上で何も動かしていない。\n筆者は3点とも推奨案を選び、コメントは付けなかった。",[14,64,65],{},"そのあと、取得結果とエラーを D1 に残して Claude Code が読む節を足すよう指示した。\n実行ログを Turso ではなく D1 に置く理由も書き足させた。\nTurso には全部が入っているわけではなく、あるのは決算系を含む2種類のデータだけだった。\nこの変更も Codex の再レビューで承認された。",[21,67,69],{"id":68},"cli-使えるはずなんで","「CLI 使えるはずなんで」",[14,71,72],{},"Phase 0（事前確認）は、読み取りだけで済む確認から進めていた。\n筆者はそのあとで、「Cloudflare 側のなんか作るやつは、あなた CLI 使えるはずなんで、ちょっとそれで見てもらえませんか」と頼んだ。\nそこから先は、wrangler の CLI で Phase 0 を進めてもらった。",[14,74,75],{},"まず、既存の取得スクリプトが叩いている URL を集め、使い捨ての Worker から取りに行かせた。\nCloudflare の IP からでも、全ソースが200を返した。\n台湾 MOF の 2026年9月分のファイルだけは404だったが、まだ公表前なので正しい応答である。",[14,77,78],{},"次にログで CPU 時間を見る段で、一度つまずいた。\nログのパースをインラインのワンライナーで書いて失敗し、スクリプトファイルへ移して書き直させた。",[14,80,81],{},"もう一つのつまずきは、メモリ価格を載せた公開ページで起きた。\nページ自体は中身ごと返ってきた。\n価格表が6つあり、タイムスタンプは 2026-09-24 18:10 だった。\nところがパーサーに通すと0件になった。",[14,83,84],{},"既存のスクリプトでの呼び方を確かめさせると、パーサーは R2 に置いた HTML をそのまま読む作りだった。\nその形で読ませると、DRAM の4グループ、19品目が取れた。\n最後に e-Stat の1年分（一覧ページと CSV）の CPU 時間を単独で測らせた。",[14,86,87],{},"片付けとして、Worker の削除と、R2 のバケットが0件になったことの確認までやらせた。\n結果は計画書に書き戻し、ここも Codex の承認を取った。",[14,89,90],{},"実測で分かったのは、無料プランで動くということだ。\n条件は、1回の実行で取るソースを1つに絞ること。\nPhase 0 のうち、KDI の新号検知の調査だけが残った。",[21,92,94],{"id":93},"_5本の上限と移さないもの","5本の上限と、移さないもの",[14,96,97],{},"報告を読んで、筆者は cron の上限が5本しかないことに目を留めた。\nここがおそらく、有料プランへ切り替えるときの分岐点になる、と筆者は考えた。\nでは今回は5本で足りるのか。",[14,99,100],{},"答えは、この計画で使う cron は1本だけ、というものだった。\n上限の5本は実行回数ではなく、予定表の数の上限である。\n1本の cron に「10分おき」と書けば、1日に何回でも走る。\n今回はその1本を朝4:00〜5:50に10分おき（1日12回）で回し、各回で1ソースずつ取る設計にした。\nCPU 10ms の壁を、1回の仕事を小さく刻んでくぐる形になる。",[14,102,103],{},"金融データサービスAについても聞いた。\nここだけはクラウドへ移すのが難しそうだと感じていた。\n筆者は、金融データサービスAは移さなくてよいと決めた。",[21,105,106],{"id":106},"韓国の統計も調べる",[14,108,109],{},"続けて、韓国の統計（make-diary の 11.5 ステップ）も同じ仕組みに乗るか調べてもらった。\nまずサブエージェントに、各系列の取得元、公表時期、取り方を洗い出させた。",[14,111,112],{},"戻ってきた報告では、4つの系列が公開ページを curl で見るだけで新号を判定できた。\nただしこの確認は、手元の日本の回線から行ったものだった。\nそこで再び使い捨ての Worker をデプロイさせ、Cloudflare の IP から同じページに届くかを試させた。",[14,114,115],{},"CPU 時間はどのソースも 0〜2ms に収まった。\n一方、韓国の貿易統計サイト（tradedata.go.kr）の応答は24バイトしかなかった。\n中身を読むと「웹방화벽에서 차단되었습니다」（ウェブファイアウォールで遮断されました）で、Cloudflare の IP ははじかれていた。",[14,117,118],{},"判定と取得で、結果が分かれた。\n新しいデータが公表されたかどうかの判定は、クラウドでできる。\n値そのものの取得は、手元に残る。",[14,120,121],{},"この結果を計画書に足し、Codex でレビューした。\nほかのセッションが並行して Codex を使っていた可能性があるので、前回のレビューを引き継がず、新しいセッションで見てもらった。\n承認は通った。\n計画書には Phase 2.5 として韓国の統計を足したが、着手は筆者の確認を待つ扱いにしてある。",[14,123,124],{},"途中で PC のメモリが足りなくなり、別のセッションから dev サーバーを立てないでほしいという連絡が届いた。\nこのセッションは dev サーバーを使っていなかったので、止めるものはなかった。\nただ、メモリ不足のせいか、Chrome の再読み込みには時間がかかった。",[21,126,128],{"id":127},"_35はどこまで下がるのか","35%はどこまで下がるのか",[14,130,131],{},"Phase 0 に入る前、筆者はこの計画をプロンプトも含めて Google タスクの今日のタスクに入れるよう頼んだ。\nあわせて、見積もりを仮説でいいので計画書に入れてほしいと指示した。\n中身は、35%がどれくらい下がる余地があるかを、前日の分などをもとにフェーズごとに見ることだ。\nメインのコンテキストに限らず、サブエージェントを使う場合はその分も含めて、という条件を付けた。",[14,133,134],{},"Claude Code に 2026-09-24 の make-diary のセッションログを探させ、測らせた。\nメインのコンテキストは、開始時の約130kから終了時の約316kまで伸びていた。\n筆者の「だいたい35%」という感覚と合う。\n統計チェーンを受け持つサブエージェントは、実行中に約88k増えていた。",[14,136,137],{},"結論は期待より小さかった。\nこの計画の範囲では、メインのコンテキストは1%も減らない。\nPhase 0 のあとで「結局どれくらい減らせるんでしたっけ」と聞き直したときも、答えは同じだった。\nWorkers への移行（Phase 1〜2）だけでは、メインのコンテキストはほとんど減らない。",[14,139,140],{},"統計チェーンの約88kの伸びは、サブエージェントの側で起きていた。\nメインの35%を下げたいなら Workers とは別の手が要り、計画書にはその話を参考として別の節に分けてある。",[14,142,143],{},"Google タスクは、Phase 0 が終わった時点で Phase 1 から始める内容に更新してもらった。",[21,145,146],{"id":146},"学び",[29,148,149,152],{},[32,150,151],{},"無料プランの cron 上限5本は、実行回数ではなく予定表の数の上限だった。1本を10分おきに回し、1回で1ソースずつ取れば、CPU 10ms とリクエスト50本の枠に収まる",[32,153,154],{},"「クラウドに移せば make-diary が軽くなる」という見立ては、前日のログを測ると外れた。統計チェーンの約88kの伸びはサブエージェントの側で起きており、この計画の範囲ではメインのコンテキストは1%も減らない",{"title":156,"searchDepth":157,"depth":157,"links":158},"",2,[159,160,161,162,163,164,165,166],{"id":23,"depth":157,"text":24},{"id":43,"depth":157,"text":44},{"id":50,"depth":157,"text":51},{"id":68,"depth":157,"text":69},{"id":93,"depth":157,"text":94},{"id":106,"depth":157,"text":106},{"id":127,"depth":157,"text":128},{"id":146,"depth":157,"text":146},"dev",null,"make-diary のうち公開統計の取得を Cloudflare Workers の cron へ移す計画を立て、wrangler で Phase 0 を実測した。1回の実行で取るソースを1つに絞れば無料プランで動く。一方、期待していたコンテキスト削減はほとんど出なかった。","md",{},true,"/make-diary-cloudflare-workers-cron-plan","claude-code-tools",false,"2026-09-25T00:00:00.000Z",{"title":5,"description":169},"make-diary","2026-09/2026-09-25/make-diary-cloudflare-workers-cron-plan",[181,182,183,184,178,185],"Cloudflare Workers","wrangler","cron","Claude Code","Codex","01hLo591Yva9Fz5ogPASb-Art-1YV5ZMlhIHtoktacM",[],[189,193,197,201,205],{"title":190,"path":191,"publishedAt":192},"Claude Codeのコンテキスト消費をセッションログで実測し、make-diaryの最大工程をサブエージェントへ委譲した","/make-diary-token-audit-delegation","2026-09-18T00:00:00.000Z",{"title":194,"path":195,"publishedAt":196},"Claude Codeの日次チェーンを完走した朝と、AIの説明を訂正して生まれた記事","/morning-chain-and-dialogue-article","2026-09-01T00:00:00.000Z",{"title":198,"path":199,"publishedAt":200},"毎朝の /make-diary を並列ワークフロー化できるか調査して試作スクリプトを検証した","/make-diary-parallel-workflow","2026-05-29T00:00:00.000Z",{"title":202,"path":203,"publishedAt":204},"2026年9月26日の開発日記 - 再現動画のレビュー画面づくりと、メモリで落ちるdevサーバー","/2026-09-26-diary","2026-09-26T00:00:00.000Z",{"title":206,"path":207,"publishedAt":204},"Nuxtのdevサーバーがheap out of memoryで落ちた原因：再現動画のシーン分割読み込みと終わらない回帰テスト","/excel-scene-dev-memory-split-loading","https://log.eurekapu.com/og/blog/make-diary-cloudflare-workers-cron-plan.png?v=2026-09-25T00%3A00%3A00.000Z&title=Cloudflare%20Workers%E7%84%A1%E6%96%99%E3%83%97%E3%83%A9%E3%83%B3%E3%81%AEcron%E3%81%A7%E6%AF%8E%E6%9C%9D%E3%81%AE%E7%B5%B1%E8%A8%88%E5%8F%96%E5%BE%97%E3%81%AF%E5%8B%95%E3%81%8F%E3%81%8B%EF%BC%9Awrangler%E3%81%A7Phase%200%E3%82%92%E5%AE%9F%E6%B8%AC%E3%81%97%E3%81%9F&author=Kei%20Komatsu&sig=d9dd3e458ab94282",1790469281736]