ブログの更新日表示とClaude Code利用コストの月次チャート化、サイト運用と計測の小ネタ集
ブログの更新日表示とClaude Code利用コストの月次チャート化、サイト運用と計測の小ネタ集
新しい機能をつくった日ではない。ブログの表示をひとつ足し、AI利用コストのチャートをひとつ作り、毎朝の自動化の不調をひとつ調べた。ほかにも細かい引っかかりをいくつか潰している。そういう日なのだが、あとから並べてみると、同じ形の出来事が3回起きていた。原因の当たりをつけ、計測し、外れる。外れ方まで含めて残しておきたい一日である。
更新日の表示と、身に覚えのないテスト失敗
ブログ記事のヘッダに公開日は出しているのに、更新日が出ていないことにふと気づいた。古い記事ほど何度も手を入れているのに、読者からは初出の日付しか見えない。DocPage.vue に updatedAt の併記を Claude Code に追加させた。
確認は2段構えでやらせた。更新日あり/なしの2パターンをブラウザの DOM で見て、そのあとクローラーが読む SSR HTML でも日付が出ていることを確かめる。途中で HMR の反映が怪しくてリロードを挟んだが、最終的に両方とも通った。
ここで既存テストが2件赤くなった。記事タイトルと目次のテスト。表示に触った直後だから、自分の変更が壊したに違いない。そう思って原因を調べさせたら、今回の変更とは無関係の、元からあるテスト側の問題だった。1敗目である。
おまけにセキュリティレビューで指摘がひとつ付いた。構造化データ(JSON-LD)の組み立てで、frontmatter のタイトルに </script> が紛れ込むと、innerHTML 経由でスクリプトタグを破れる余地がある。JSON 文字列中の < を \u003c にエスケープする定番の対策を入れさせ、同じ組み立て方をしていた別ページにも横展開した。エスケープ関数は node で4テスト回して挙動を確かめてある。
ccusageの復旧と、Fable 5が高い理由
朝、npx ccusage@latest monthly が動かなかった。7月3日にも踏んだ症状の再発で、真因は ~/.npmrc に残っていた os=linux の1行。npm が Windows 用ネイティブバイナリの代わりに Linux 用を npx キャッシュに入れてしまう。過去に同じ話をしていないか memo を検索させたら当時の記録にすぐ行き当たり、キャッシュ削除と1行削除で復旧した。
せっかく動いたので、今年に入ってからの月次利用量をチャートにしてもらった。7月はここまでで約$9,205。Fable 5 を使い始めてからコストが跳ねて見えるので、「トークンがでかいからか」と聞いたら、数字で否定された。直近3ヶ月のモデル別実績を出させると、Fable 5 とほかのモデルはトークンの食い方(出力比やキャッシュ読み比)がほぼ同じで、違うのは1トークンあたりの換算単価だけ。約2.2倍高い。量ではなく単価。2敗目である。
チャートには円換算も万円単位で足させた。柱の頭ラベルが2行になり、上段が$、下段が円。7月は$9.3K、150万円ほどになる。
ここで欲が出て、2025年まで遡ろうとした。ところが Claude のログバックアップは2025年12月18日開始で、それ以前の記録はそもそも存在しない。Codex 側だけ全量あるチャートは、実態より低い棒が並ぶだけでややこしさしか生まない。2025年分は全部消して、2026年1月以降のチャートに戻した。2026年の累計は$37,841、615万円ほど。トークンは39.7Bである。
毎朝のCodexレビューがタイムアウトする原因
毎朝の日記生成チェーンは、締めに Codex のレビューを挟んでいる。ここ最近、そのレビューがタイムアウトで中断しがちで、この日も途中で止まった。気になって調べさせた。
見立ては「別セッションとの競合」だった。実はこのとき、画像量産のために別セッションで Codex を大量に立ち上げていた。ただ、向こうで何十本も立ち上がるのに、こちらの1本が立ち上がらない理屈がわからない。プロセス数と負荷、落ちたレビュー2回のログ、Codex 側のログを順に見させたら、答えは「競合で立ち上がらない」ではなく「立ち上がりが遅い」だった。量産セッションが同じマシン、同じアカウントから32本を張り続けていて、新規セッションの接続確立が数分単位に伸び、タイムアウト判定に食われていた。
3敗目、と言いたいところだが、これは半分当たっている。量産が主因という理解自体は正しくて、外れていたのは失敗の機構のほうだ。量産が終われば普段の朝には起きない一時的な現象、と切り分けて調査を閉じた。
クイズの出ない学習ゲートと、デプロイ前検証の引っかかり
前日の積み残しをコミットする途中で、学習ゲートの /learn を回したら、ブラウザにクイズの中身が表示されなかった。ゲートはクイズ全問合格が通行条件なので、出ないものには答えられない。今回はパスにして(LEARN_SKIP で通し)、表示不具合は issue に記録だけ残した。
デプロイ時間の計測用に measure-deploy.ps1 も回した。するとデプロイ前検証が「公開記事から非公開記事へのリンク」を2箇所検出して止まった。前日の日記に、意図的に非公開にしている記事へのリンクが残っていた。非公開側は接続手順を含むので公開する選択肢はなく、日記側のリンクを外して検証を通した。この検証、地味だが仕事をしている。
学びメモ
- 表示を触った直後にテストが落ちても、自分の変更のせいと決めつけずに切り分けさせる。今回は2件とも既存の問題だった
- Fable 5 のコスト増はトークン量ではなく単価(約2.2倍)。トークンの食い方は他モデルとほぼ同じだった
- 欠損期間を含む時系列チャートは、注記で補うより期間ごと切り落とすほうが正直。2025年分は削除した
- Codex のタイムアウトは、同一マシンからの大量セッションで新規接続の確立が数分に伸びるのが機構。画像量産と毎朝のチェーンは時間をずらせば済む
~/.npmrcのos=linuxは npx キャッシュ経由でも再発する。ccusage が Linux バイナリを掴んだら、まず .npmrc を疑う