2007/10/08

mixiの大予言

今日は一日中雨だと思ってたし実際昨日寝る前雨降ってたんだけど、起きたら思いっきり晴れてた。なんか損した気分…。

20世紀の頃はなんかノストラダムスの大予言なんていうのがあって「1999年7月に地球が滅亡する」とかいうのがあったのをここの読者の人なら覚えてるんじゃないでしょうか。まぁゆとり世代には通じないんだろうけど!

さて、ふとリニューアルしたmixi見てたらカレンダー機能とかいうのがあったのを思い出したんですけど、これって結局ただ単にGETなメソッドでURL叩いてるだけなんで、URLいじれば好きな月のカレンダーがみれるという(そういう使い方をすれば)便利なツールです。

で、だいたいこういうカレンダーって9999年でリミッターがかかってたり、16384年付近でリミッターがかかってたりするんですが、mixiのカレンダーはそうでもなかった。調子にのって1000000年(西暦ひゃくまんねん)とか入れてみたら、ちゃんとカレンダーがでます(あってるかどうかはしらない)。

さらに調子に乗って10000000年(西暦いっせんまんねん)とか入れてみたらカレンダーが出力されなかったので100万年〜1000万年の間にリミッターがかかってるようなんで、どうせ休日でひまだからということで15分ぐらい延々と調べてみました。

まぁ、「まず500万年でカレンダーがでるかどうか調べてみると出たので、次は750万年でカレンダーがでるか調べたら出なかったので…」とか書いてると日が暮れてしまうので、結論だけ書くよ。100万と1000万の間で二分探索するなら最初の分割点は500万じゃなくて550万だろ、オレ

結論から言うと、カレンダーが表示できる限界点は5879611年7月でした!

5879611年7月のカレンダー
5879611年7月は出てるんだけど、
5879611年8月のカレンダー
5879611年8月は出ない。

つまり、この事実が表しているのは「mixiは地球が滅亡するのは5879611年7月だと予言している」ということなんだよ!! な、なんだってー!!

まぁ、MMRはおいておいて、なんでこんな中途半端なところでリミッターになってるのか考えてみたんですけど、5879611年7月を西暦1年からの経過日数にしてみると概算で2147527400日ぐらいになるような気がするので、これってちょうど2の31乗ぐらいです。2147527400を16進数に直すと0x8000AAE8ぐらい。というわけで、まぁ内部でどんな処理してるかわかんないけど大体32ビットのsignedな値の限界点ってことになるのかなーということで。

でもこの0x8000AAE8って微妙に半端ですよねぇ。経過日数の概算は面倒なので年数に365.25をかけたんですけど、閏年を考えずに単純に365をかけただけだと2146057862とかになるので16進数にしても0x7FEA3E86と、結構まだ0x7FFFFFFFまでは日数があるんです。謎だ…。

逆に過去何年まで表示できるか調べてみると、西暦2年の1月から表示できるようなので、西暦1年からの経過日数が32ビットのsignedな値の限界点になって表示できなくなったという推論は間違ってないと思うんですけどね。もしかしたら使ってるPerlのライブラリかなんかの制限なのかもしれませんが、そっち系は詳しくないのでわかりません。

というわけで、3連休をこんなテクニカル駄文で締めくくってみました。なんか本当に暇人っぽいな。

うされもん @acidlemonについて

|'-')/ acidlemonです。鎌倉市在住で、鎌倉で働く普通のITエンジニアです。

30年弱住んだ北海道を離れ、鎌倉でまったりぽわぽわしています。

外部サイト情報

  • twitter
  • github
  • facebook
  • instagram
  • work on kayac