2月29日とクソコードの思い出

ether_fungus
·

近年、というか直近の何回か、うるう年でシステム障害とか見てなかった気がするんですが。今年は豊作なようで。

神奈川、新潟、岡山、愛媛の4県警で29日朝から運転免許証を発行できない状態になったことが、警察庁などへの取材で判明した。警察庁によると、各県警の運転免許センターなどにある免許作成機の日時を管理する機能で、うるう年の設定をしていなかったことが原因という。4県警は同じメーカーの機器を使用していた。岡山、愛媛、神奈川県警は全面復旧した。

4県警の免許センターで運転免許が発行できなかったり、

大手ドラッグストアのスギ薬局を展開するスギホールディングスは29日、処方箋管理システムの障害が起き、全国のスギ薬局で処方薬の会計ができなくなったと明らかにした。うるう年の影響という。

大手ドラッグストアで処方箋会計ができなかったり。

「令和やぞ??」って言われてましたがほんとにね。

月末判定と思い出のクソコード

Q. なんでうるう年にシステム死ぬんですか。馬鹿なの?

例: 馬鹿は月末日の導出ができないので、2月28日を月末処理日とハードコードしても平気。たぶん java.time.LocalDate の atEndOfMonth() とかを知らない

https://twitter.com/ktgohan/status/1763144044098814423

近年うるう年関連のシステム障害が減ったのって、各言語の組込み日付関数とかライブラリが充実したおかげだよなあ、といううっすらとした感想があります。裏はとってないのでお気持ちだけですが。

月末日導出を見ると思い出すのが、はるか昔(もう20年以上前)にバイト先で見たクソコード。クソコードって言いきっていいレベルのクソだった。

個人のホームページ☆彡なら別に何がどうなってても(実害が無ければ)どうでもいいんですよ。これ一応お金もらってやってる公式サイトの構築だよな、という案件で。WebサイトのフロントUI部分で、詳細忘れましたが、当該日と月末日を比較判定するロジックがあったわけですよ。

で、月末を判定するのに、月が4,6,9,11だった場合は30を変数にいれ、月が2だった場合に年を4で割った剰余を求め、100で割った剰余と400で割った剰余を求め、if文でネストして、28か29を変数にいれ、それ以外だった場合は31を変数にいれて、引数(日付の日の値)と比較していた。

は??????

まあわかります。西暦が4で割り切れたらうるう年、4で割り切れても100で割り切れて400で割り切れない場合は平年っていうのは。一般常識として。

どの年がうるう年になるの? | 国立天文台(NAOJ)

うるう年の判定を自前で実装する必要あったか?????(反語)

ここで必要なのは「当該日付が月末日より一週間以上手前か否か」であって、うるう年か否かは判定に関係ないよね。なんでうるう年にこだわるの??

ちなみにですが、クソコード作っちゃう人っていうのは「うるう年の判定を自前実装する必要性はありますか?」ってうっかりレビューコメントに書くと、「isLeapYearで判定するように変更しました」って修正してくるタイプです。違う、違うんだ、そもそもうるう年かどうか判定する必要性がないんだよ、なんでうるう年の判定にこだわるんだよ。

まあ盛大に判定ロジックがバグってたのでさっくり全部消して書き直したんですけど。「頑張って書いたコード」をがっつり消したから恨まれてたかもしれません。そいつの進捗遅れの尻ぬぐいで相当ムカついてたんで反省はしませんが。当時プログラマーですらなかったし。なんでオペレーターの学生バイトにデバッグやらせてんだよ。

ちなみに修正方法ですが、引用ポストの通り、atEndOfMonth関数がその言語にあるならそれでいいと思います。当時のjavascriptには無かった気がする。

実装がかなりプアな言語や何ならExcelの関数は、だいたい翌月の1日をセットして1日マイナスすると当月の末日になります(3/1の前日⇒2月の末日)。

JavaScriptの日付計算は月末考慮しないとハマる #JavaScript - Qiita

様々な言語で月末の日付を求める(C#,Java,Ruby,Javascript,VBA,Excel,MySQL,SQLite3,Oracle) #JavaScript - Qiita

「当該日付が月末日より一週間以上手前である場合」っていう仕様を読んだときに、基準日を「月末日」じゃなくて「翌1日の前日」と定義しなおせるかどうかがコーディングのセンスなのかな、って思ったので、あのクソコードはいまだに記憶に残ってる。書いた奴は名前も顔も覚えてないけど。

追記

セルフ給油機使えず、うるう年でソフトウエアに不具合か NZ 写真2枚 国際ニュース:AFPBB News

  • NZランドでガソスタの決済が障害起こしてたらしいので追記(2024.3.1)

@ether_fungus
備忘のためにつらつらと。 プロフィール画像はPlan 9のGlendaです。