予約在庫は「5本」と出ていた。本当は0本だった
“数えるスクリプトが間違っていたら、在庫が尽きたことにすら気づけない。”
このブログは、未来の日時を書いておくとその時刻に勝手に公開される作りになっています。書き溜めておけば、あとは放置で1日1本ずつ出ていく。仕組みの話は静的サイトに予約投稿を後付けした記事に書きました。
放置できる仕組みには、在庫を数える係が要ります。毎朝9時に予約の残りを数えて、2本を切ったら知らせてくる。その係が、ずっと嘘をついていました。
1「予約中5本」の中身
9月23日、在庫を確認しようとして手元のCLIを叩きました。出てきたのはこうです。
記事148本。公開済み143本、予約中5本。
5本あるなら、あと5日は放っておける。そう読むのが普通だと思います。ところが一覧を見ると、5本とも公開予定が「01/01 00:00」になっていました。年は表示されていません。
最後に公開された記事は9月20日。つまり21日、22日、23日の3日間、ブログは何も出していなかった。予約中の5本は、1本も来ない予定だったわけです。
22,000字の窓が、隣の記事を覗いていた
記事データは data/blog.ts という1つのファイルに並んでいます。在庫を数えるスクリプトは、これをTypeScriptとして読み込まずに、正規表現で拾っていました。slug・title・date の3行を見つけたら、そこから後ろ2,000字の中で publishedAt を探す。
問題はこの「後ろ2,000字」です。
本文が段落2つしかない短い記事が4本、並んで入っていました。どれも公開日時の指定は無く、date の日付で出る普通の記事です。ところが4本とも短すぎて、2,000字の窓が次の記事、さらにその次の記事まで届いてしまう。そこに、案件の都合で非公開にしている記事が1本あって、publishedAt に2099年1月1日が書いてありました。
4本はその2099年を自分の公開日時だと思い込んだ。非公開の1本と合わせて、予約中5本。数字の出どころは、これで全部です。
同じデータを、修正前と修正後のスクリプトで数えた結果(2026-09-23 実測)
| 修正前 | 修正後 | |
|---|---|---|
| 公開済み | 143本 | ◎147本 |
| 予約中 | 5本 | ◎0本 |
| 非公開(遠い未来の日付) | 区別なし | ◎1本 |
| 在庫の警告 | 出ない(5本あるので) | ◎出る(0本) |
3毎朝の通知も、同じ1本を数えていた
手元のCLIとは別に、毎朝9時に走る在庫チェックがあります。こちらはTypeScriptで記事を正しく読んでいるので、2,000字の窓の問題は起きません。
ただ、2099年の非公開記事は「未来に公開される記事」として素直に1本に数えていました。在庫0本の日でも、通知の文面は「残り1本」になる作りです。しきい値が2本なので警告自体は出ますが、1本あると書かれていれば、急ぐ理由は薄くなる。
2つの係が、それぞれ別の理由で在庫を多めに言っていたことになります。
4直したこと
直したのは2か所だけです。
1つめ。CLIの窓を「次の記事が始まる手前まで」で切るようにしました。上限の2,000字は残して、そこに次の記事の開始位置を足しただけ。これで隣の記事の日付は拾わなくなります。
2つめ。1年以上先の日付は「予約」ではなく「非公開の置き場」として、CLIでも毎朝の通知でも在庫から外しました。CLIの表示には「非公開 1」と別枠で出ます。
直したあとの表示は、公開済み147本・予約中0本・非公開1本。警告もちゃんと出ました。
5やらなかったこと
本当は、正規表現で記事を読むのをやめるのが筋です。TypeScriptのファイルをそのまま読み込めば、窓の長さで悩むことはもう起きない。
それでも今回はやっていません。このリポジトリには同じ正規表現の読み方をしているスクリプトがサムネ生成・OG画像・採点と何本もあって、全部を置き換えると、今日書くはずだった7本の記事が今日書けなくなる。在庫が0本の日に、在庫を数える仕組みの作り直しから始めるのは順番が違う気がしました。
実はこの読み方で転ぶのは2回目です。前は、空の文字列 "" があると引用符の対応がずれて、そこから先の記事を読み落としていました。そのときも正規表現側を直して済ませた。3回目が来たら、さすがに作り直します。
6正直に言うと
3日空いたこと自体より、数字を疑わなかったことの方がこたえています。
「5本」という数字は、見た瞬間に安心できる数字でした。安心できる数字ほど、中身を開かない。一覧に並んだ「01/01」を見て初めておかしいと気づいたので、もし一覧を出さずに件数だけを表示する作りだったら、まだ気づいていなかったと思います。
もう1つ。9月8日の次は9月17日で、その間の8日間も空いています。こちらは在庫の表示とは関係なく、単に書いていなかった。仕組みが正しくても、書かなければ出ない。当たり前の話ですね。
7まだ分からないこと
この種の「数える係が間違える」バグを、次はどうやって先に見つけるか。答えはまだ持っていません。
今のところの対策は、件数と一緒に中身を必ず並べること、それと年をまたぐ日付を表示するときは年まで出すことくらいです。「01/01」が「2099/01/01」と出ていたら、最初の1秒で気づけたはずなので。
予約の在庫はこの記事から7本、9月30日まで積んであります。数え直した上での7本です。ほかの運用の話はブログ一覧からどうぞ。
この記事を書いた人
NextCode(沖縄県宜野湾市)は、iOSアプリ・ホームページ/LP・NFCデジタル名刺・AI業務自動化を作っている開発スタジオです。 ここで書いているのは、実際に作って公開したものと、その過程で詰まったことだけです。
お問い合わせフォームは24時間受け付けています。