萩萩日記

世界に5人くらい存在するかもしれない僕のファンとドッペルゲンガーに送る日記

twitterの2,147,483,647問題をやってしまった件

「なにそれ?」な人はたぶんさまざまなめりっとがわかりやすいと思われます。

ほんで。

うちの会社でやってるボットで、currykutterっつーのがいるんですね。こいつが先日、

 
currykutter
@currykutter
.@no_image さんがカレー食べたんだって。「中辛はあまり辛くない」らしいよ。http://bit.ly/nJNPX 
(2009-06-14 23:12:10)
link

って発言をしてたんだけど、リンク先が、

http://twitter.com/no_image/status/-2129721170

になってしまって、「That page doesn't exist! 」なことになってたんですね。「-2129721170」なんて数字になってるんで、「ああ、やっちまったなー」と。

2,147,483,647問題というのは、「2,147,483,647がsigned integerの上限だから、それを越える数字がTwitterのIDになってしまった場合、signed integerのまま扱ってるシステムはバグる」という問題で、-2129721170というのはつまり、本来、

http://twitter.com/no_image/status/2165246126

になるはずのリンク先の「2165246126」がオーバーフローしてしまって、-2129721170になってしまっていると。

つーわけでいろいろ設定を調べたりしてみたんだけど、結局のところ原因は、Perlのsprintfでした。

print 2147483647 + 1, "\n";
printf ("%d\n", 2147483647 + 1);

Perlで実行すると、

2147483648
-2147483648

となってしまうと。

と思いつつ一応これまたうちのボットであるscriptterで試してみたところ、

  
HAGIHARA Yoshiaki
@hagitter
@scriptter pl print 2147483647 + 1, "\n";printf ("%d\n", 2147483647 + 1); 
(2009-06-15 15:12:11)
link
scriptter
@scriptter
@hagitter 2147483648\n2147483648\n 
(2009-06-15 15:14:08)
link

ってなったんで、コンパイルの仕方とかにもよるのかな(ちなみにscriptterは小飼弾さんちのAPIを使ってます)。

ま、ひょっとしたら他にも困ってる人とかいるかもなので一応メモ的に。

あ、これってp1dlab日記で書いた方が良かったかな。まあいいや。