西暦2038年問題!おお新しい!みんな!Y2Kの再来ですよ!YK-2じゃないですよ!←使われ尽くしたギャグ
とまあ全然知らなかったので、ビックラこいたわけですが、銀行のATMが不具合ったのは、これのせいだそうですヨ。内容を聞いて、ハアハア…(イヤらしくない方の)ん、ああ!なるほど…と
この記事を読んで思いますた。
特に↓部分を読んでナットク!単純なことじゃないですか。でも、すぐにシステム変えるのは難しそうですね。
以下、記事より抜粋〜
●コンピュータの西暦2038年問題とは、C言語を使って開発したシステムをUNIX環境で利用している場合に、グリニッジ標準時の2038年1月19日3時14分8秒を過ぎると、システムが正しく時刻を認識できなくなる問題を指す。
●UNIX環境では、システム内部の時刻をグリニッジ標準時(GMT)1970年1月1日0時0分0秒からの経過秒数で保持している。経過秒数で表す時刻データに、4バイトの符号付き整数を使っている場合には、2038年1月19日を過ぎると、本来数字の正負を判断するために使う部分まで時刻を表示するために使わざるを得なくなる。その結果、正しい時刻を認識できなくなるのである。
●この問題が起きた銀行はいずれも日本IBMのソフトを使っていたが、このソフトの内部に、時刻の2倍に足し合わせる処理があり、ちょうど1970年と2038年1月19日の2分の1を超えた2004年1月11日の朝から、2038年問題が顕在化して、システムが正常に稼動しなくなった。
〜ここまで
ということはだよ?2038年問題というくらいだから、2038-1970で、68。68年ですよ。あと34年後にはおかしくなるわけですよ。日付が!この件とは関係ないけどさー、自分はちょうど1970年に生まれたわけですよー。これらコンピュータの時計のカウンツが始まった年なんだよねぇ(笑)
まさか、グリニッジ標準時(GMT)1970年1月1日0時0分0秒(コピペ)に生まれたわけじゃないからいいんだけどさ、ほぼ一緒と仮定して、西暦2038年には約68歳ってことだよ。なんだか悲しくなってきた(笑)68年つったら、人間が生きてたらジジババじゃん?うおおおおおお!フガっ!
あー、秒数でいったら何秒ぐらいなんだろうな〜?つか、そもそも生きてるのか自分?とか思ってたら計算したくなってきた。やっぱキチガイなんだろうな、拙ってば…頭のいい人から見たら『ケッ何を言ってやがるこのウスラトンカチ野郎がっ…!』というくらい稚拙なことを言ってるんだろうけど、時間帯によっては、急に、普段絶対しないことをやってみたかったりもするのです。ああ、いいとも、いいともさ。気違いでも気狂いでも好きなほうで呼んでくれ。これから計算するけど、キチガイの戯言だから読みたくない人は読まないで下さい。つか、呼んでもちっとも面白くないです。自己マンゾクですから。それに
やってることは単純計算なので、ちっとも凄い事ではないし、別にひけらかしてるわけでもなく、自分がやりたいことをやってるだけなので、文句がある人は読まない方がいいです多分。
とりあえず、それでも読んでくれてる奇特な貴兄のために簡単な予備知識。PCで使うプログラム言語では、基本的に時間を取得・保存などする方法として、1970/01/01(日付)の00:00:00(時間)から起算してから、
現在時刻までの経過した秒数をコンピュータ内部に4bytes(1byte=8bits)または32bits(2の32乗)の関数として持っています。基本的にコンピュータは2進法で記録しますから、頭の1bitはシステムが正負の判定に使っているので、この場合使えません。ですので、数字自体は31bits分しか使えないわけですね。
要するに、1970年1月1日の0時から、2,147,483,648秒(2の31乗秒)までしか数えることが出来ないと思ってください。それ以上になると、オーバーフローというエラーを起こすのです。それが1970年から約68年後ってこってす(女神)。わかりましたか?
そだ。今思った。うるう年のこと考えてないじゃん。あ、でもソレ入れても68年だとちょうど割り切れるから、うるう年込み1年の平均秒数を出してからにしてみよう。
[過程1]
1年の秒数がが60 * 60 * 24 * 365 = 31,536,000秒
これを4倍し、うるう年の分を加算。さらに4で割って、1年の平均秒数を取得すると、31,557,600秒。
68年分だから…31,557,600 * 68 = 2,145,916,800
[過程2]
んで、残った端数を計算。2038年1月19日3時14分8秒を過ぎると止まるらしいので、18日と3時間14分8秒だから、(60 * 60 * 24 * 18) + (60 * 60 * 3) + (60 * 14) + 8 = 1,566,848秒ですな。
[過程3]
上記2つの結果を足すと、68年と18日と3時間と14分と8秒の秒数が出る。合計で2,147,483,648秒だ。
[過程4]
次に、4バイト部分。前述の通り、4bytesというのは、bitに直すと32bits(1byteは8bitなので)なのですが、31bitsとして計算するので、2の31乗ですね。2^31 = 2,147,483,648でした。2に2を30回掛けてみてください。
[過程5]
ね、ぴったり!(笑)ということで、68年18日3時間14分8秒は2,147,483,648秒なんです。
と、ここまでは普通の話ですね…こっから下は例のIBMのシステムが正常稼動しない件のやつです。
[過程6]
件のシステムは『時刻の2倍に足し合わせる処理』の時にエラるんだから…過程5の結果を2で割ろう。
2,147,483,648 / 2 = 1,073,741,824
要するに、1,073,741,824秒が2倍に足し合わされて、2,147,483,648を超えると、上位1bitに食い込んで、ニュースに書いてあった
本来数字の正負を判断するために使う部分まで時刻を表示するために使わざるを得なくなるわけですよね。
[過程7]
んじゃ逆に、1,073,741,824秒というのはいつか?を逆算。今年がうるう年だが、その前に問題が発生してるので、1970年から2003年末までのうるう年の回数は…8回ですな。となると(ダック)、34年分の秒数+うるう年8回分だから…
(60 * 60 * 24 * 365 * 34) + (60 * 60 * 24 * 8) = 1,072,915,200
[過程8]
これを1,073,741,824から引けばイイから、1 073 741 824 - 1 072 915 200 = 826,624
ということは、2004年元旦から数えて、32,362,624秒後に止まることになる。
なので、日数、時間、分を計算しよう。まずは1日の秒数86,400秒なので、単純に、9余りなんたらになるのが想像付きます。なので、9日分引いてみよう。残りは49,024秒。さらに時間を引こう。1時間は3,600秒なので13時間(46,800秒)引ける。残ったのは2,224秒。
[過程9]
さらに『分』を引こう。1分は60秒なので37分(2,220秒)引ける。…残りは4秒…できた!やったよパパ!
ということで、計算結果。
日本IBMの時刻の2倍に足し合わせる処理をしてるシステムは2004年1月10日14時38分5秒に起きたと思われます…多分…
でも、
1月11日に23行の銀行でATM(現金自動預払機)が一部の取引で正常に利用できなくなったトラブルと書いてあるのですが、11日は日曜日だから、10日は土曜日でしょ?土曜日もATMってやってますよねえ?土曜日の3時過ぎぐらいはダイジョウブだったのですかね?(笑)
[結果と感想]
というわけで、色々と突っ走ってみましたが、最後まで読んでくれた奇特な貴方(女)に感謝!とりあえずはIBM以外はまだ被害出てないみたいですけど、現行のシステムは2038年のある時を境に、おかしくなります。僕は試してませんが、現状のWindowsでもこの問題は起きるようです。(マイクロソフトのサイトにも載ってるようで、西暦2039年以降に設定すると、日付がおかしくなる問題)
僕はプログラマじゃないし(習ったことがある程度です)、この問題も既に一部では対策済みらしいですが、まだまだ充分じゃないみたいなのと、これからは2038年問題を避けてプログラムを作るでしょうから、多少は安心して良いんだと思いますけど…そう簡単に全てが変わるとは思えませんし、例えば一度に全部64bit化するとも思えない(よく知らないですけど、ATMとかって、C言語だけじゃないよね?>某くん(笑))ので、残りの期間に、システムに漏れがないように全体を見直すべきなんでしょうな。折り返し地点って言われてるし…まあ、その頃は自分は68歳なので、もう関係が無くなってるかもしれませんが(w
あ、んで、本来の目的だった、僕が67歳の1月19日3時14分8秒は、グリニッジ標準時(GMT)1970年1月1日0時0分0秒(コピペ)から数えて、2,147,483,648秒経っているということですが何か?(今更)…にじゅういちおくよんせんななひゃくまんよんじゅうはちまんさんぜんろっぴゃくよんじゅうはちびょうだワーイ!