スギ薬局のシステム障害で発生した「うるう日」のバグについて

スギ薬局でシステム障害

 スギ薬局は、2月29日の「うるう日」に発生したシステム障害について謝罪した。2月29日の午後1時ごろに復旧し、3月1日も通常通り営業している。

「初めて迎える『うるう日』だった」 スギ薬局、システム障害を謝罪

「初めて迎える『うるう日』だった」と言い訳しているが、プログラムの日付の処理で「うるう日」を考慮するのは基本中の基本です。

システム障害が発生したコードについて

システム障害がどのようなコードおよび言語で発生したかは公表されていないので不明ですが、月の最終日を配列などで保存して判定していた可能性があります。

例えば実行した月の日が最終日かどうかJavaScriptで判定した場合、通常は以下のように書きます。

2月は28日または29日のどちらかになるので、最終日は固定値ではなくnew Dateで判定して値を返します。(他のプログラミング言語でも最終日は固定値にはしない)

function isLastDayOfMonth() {
  const date = new Date('2024/02/29')
  const currentDay = date.getDate()
  const lastDayOfMonth = new Date(date.getFullYear(), date.getMonth() + 1, 0).getDate()

  if (currentDay === lastDayOfMonth) {
    console.log(`${date.toLocaleDateString()}は最終日です。`)
  } else {
    console.log(`${date.toLocaleDateString()}は最終日ではありません!`)
  }
}

isLastDayOfMonth()
// 2024/2/29は最終日です。

しかし、スギ薬局のシステム障害を起こした会社は、おそらく最終日を配列で管理して処理していたものと思われます。

function isLastDayOfMonth() {
  const date = new Date('2024/02/29')
  const currentDay = date.getDate()
  const lastDayOfMonth = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]

  if (currentDay === lastDayOfMonth[date.getMonth()]) {
    console.log(`${date.toLocaleDateString()}は最終日です。`)
  } else {
    console.log(`${date.toLocaleDateString()}は最終日ではありません!`)
  }
}

isLastDayOfMonth()
// 2024/2/29は最終日ではありません!

それぞれを実行してみるとわかりますが、後者だと2月の最終日が28日で固定されてしまっているため、うるう日に実行しても正しい結果を返しません。

このような処理が原因でスギ薬局でシステム障害が発生したと考えられます。

スギ薬局のWebサイトにも問題がある

スギ薬局のWebサイトにもいくつかの問題があります。

例えば今回のシステム障害のお知らせのパソコン向けのWebページの画像がぼやけています。

スギ薬局のシステム障害で発生した「うるう日」のバグについて

システム障害によるお詫びと復旧のお知らせ

これは画像部分のサイズが798px × 456pxなのに対し、サーバー側で書き出している画像が480px × 274pxと小さい画像になっていることが原因です。

cloudfrontで書き出す画像のファイルのサイズを間違えているか、スマートフォン用の画像をパソコン用としても使っているため、画像がぼやけてしまっています。

※ スマートフォン用の画像としてもサイズが小さいので、書き出し設定がおかしい

https://d14p2jubfs5ppc.cloudfront.net/media/image/article/20240301owabi_top.jpg?VersionId=_nIdDl5ZlDNO0pp6ES2Twax1f0yMRwFW

ほかにもスギ薬局のWebサイトにはいくつかの問題があるので、今回の件を機に、制作会社を変えたほうが良いと思いました。