という記事が公開されている。なんでも Twitter メッセージの ID が 32bit 符号付き整数 (32bit signed int) で解釈された場合、この週末あたりで
2,147,483,647 (= 01111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111)
を越えて負の値になってしまうそうだ。 現在の ID をカウントするサイト
が末期的雰囲気を醸し出している。一部では Twitter が崩壊するぐらいの勢いで噂されている。

‥‥が、どうもおかしい。本当に致命的な不具合だったら本家サイトで何らかの大がかりなアナウンスがあってもよいように思える。そこで、本当のところどうなのか少し調べてみた。
データが化けそうな(丸めや変換による劣化が起きそうな)ポイントとしては大きく3つに分けられる。
- Twitter サイト側のデータベースおよびサーバ側の処理
- Twitter サーバとクライアント間の送受信のデータフォーマット
- Twitter クライアントの処理
このうち、Twitter 側サーバ内の ID の取り扱いについては以下のような明快な回答が公開されている。
http://twitter.com/twitterapi/status/2048659057
Valid points by @cwichura& @ NickMoline: we’re using a unsigned 64-bit bigint internally to store status_ids. You should, too. ^DW
(我々は status_ids の格納に、内部的に 符号なし 64bit 整数を使っている)
従って、Twitter サーバ側では既に対処済みである。Twitter の Web サイトのみを使っている場合はおそらく大丈夫。
次に、サーバから送られる Twitter のフォーマットについては、次の資料を見ていけばわかる。
Twitter サーバのデータフォーマットは xml, json, rss, atom の4つの形式から選択できる。いずれもテキストフォーマットであり、バイナリを含まないため、フォーマット自体には桁あふれや解釈の違いによるデータ化けは原理的に発生しない。
Twitpocalypse のサイトで指摘しているのは、3つめのクライアント側の処理である。API では変数の bit 長や最大値、型は指定されていないので、クライアント側で十分大きい値を受けられる変数に格納できているかで勝負が決まる。またはパーサの仕様により全ての数値を読み取られるようになっているか。
32bit 符号付き整数型 (C言語でいうところの signed long int) で格納した場合、2,147,483,647 に 1 を足すとオーバーフローを起こして -2,147,483,648 となる。前回読んだつぶやきから最新のつぶやきまでを表示するというタイムラインの処理の場合、前回の つぶやき ID を保存しておいて、ダウンロードしたつぶやき ID と比較する処理を行うはず。負の値になると上下が逆転するのでそれ以降のつぶやきは表示されないかもしれない。
また、Reply を送信する場合、相手のつぶやき ID を in_reply_to_status_id に格納して送信する仕様になっているが、Twitter クライアントが負の値で文字列にしてしまうと、サーバ側で ID と異なる数値を受け取るので、受け取ってもらえないかエラーになる可能性がある。
さて、手元には何種類もの Twitter クライアントがある。Mac 用には Tweetie, Twitterific, iPhone 用は Twitterfon, Twittelator Pro, Tweetie, Twitterific Premium, Fasttweet。Adobe AIR アプリの TweetDeck もある。
今のところ、6/13(土) の日本時間 16:30 ごろに 2,147,483,647 を越える見込み。どのクライアントが生き残るのか、直前にアップデートされるのか、全滅なのか、実は全く問題がないのか。注目していよう。
最近のコメント