dabrを玄箱にインストールしたときの記録

twitterのクライアントdabrを玄箱にインストールしたときの記録です。

1.とりあえず導入

PHP5.2.0とApache2は導入済みなんでまあ簡単だろうと、適当に開始。
PHPモジュール(curl,mcrypt)をインストール。
dabrのダウンロードページからzipファイルをダウンロードしてきて展開。PHP実行用ディレクトリにコピー。

2.一応動いたが……

該当ページにアクセスしたところ、ページ表示はあっさり成功。ログインも出来た。
しかしタイムラインにツイートが1件しか表示されない。しかも最新でも無く妙に古い。
何ぞこれ?

dabrのFAQを参照すると似たような現象についての言及があった。
ツイート数が膨大な数になっててIDに割り振られる数値がPHPのint型の限界を超えてるから全部同じ数値扱いになっちゃってどうとか。
でもこれ結構前のバージョンでFIXされてるって書いてあるんだけど……。
オンラインで公開されてるdabrのサイトではちゃんと表示されてるし。

3.仕方が無いので最新版を導入

ダウンロードページじゃなくてSVNリポジトリから最新版(r316)を取得してやり直し。
位置情報が云々って言うチェックボックスは追加されたけどツイートは1件のみ。

4.更に仕方が無いのでソースを見る

twitter.phpのタイムライン解析処理辺りを流し読む。
APIを使ってJSON形式で取得したデータをデコードしてる辺りが怪しい。
ということで解析結果を表示させてみたら……ちゃんと解析されてる。
でも良くみたらIDが全部同じ値(2147483647)だ。
つーかこれint型の限界値じゃないか?
json_decode 2147483647で検索してみるとjson_decodeの既知のバグで、数値を解析するときにintの限界を超えていると同じ値になるとか何とか。
PHPのバージョンをあげるとFIXされてるそうだ。

5.PHPのバージョンをあげる?

軽く検索してみたら何か面倒そう。ていうか玄箱じゃ無理?

6.で、結局どうしたか

数値じゃなきゃ良いんだろ!
ってことでソースに手を入れて、json_decodeする前の文字列を加工してIDを無理やり文字列に変換するように…… こんな感じ。

$ diff -c twitter.php.org twitter.php
***************
*** 290,295 ****
--- 290,296 ----
        {
                case 200:
                case 201:
+               $response = ereg_replace('"id":([0-9]+),', '"id":"\1",', $response);
                        $json = json_decode($response);
                        if ($json)
                        {

こんなので良いのかとも思いますが、まあ一応動いてるんで良いかなと。