twitterとwassrに両対応したクライアントに、sabotterと言うのがあって、ずっと愛用している。
しかし、リリース版の公開は0.0.4で止まっていて、codereposのリポジトリではlang/javaからplatform/eclipseへ場所を移して開発が続いているらしい。(最初、lang/javaの方を見ていて、trunkを見ようとすると見れなくてはまった)
今回、twitterのidが32bit signed の限界を超えてしまって、いくつかのクライアントで問題が出たらしいけど、sabotterも新しいタイムラインが流れてこなくなってしまった。
幸いなことに、sabotterもsabotterが使っているtwitter4jもソースが公開されているので、手元でビルドして32bit問題に対応してしまおうじゃないかと言うコーナー。
ただし、場当たり的な対応なので、本家に送るようなパッチにはできていない。また、途中に感想や疑問を思ったままに書くけど、決して批判しているわけではなく、両ソフトの開発者の方々には日々感謝していることを明記しておく。

sabotterはeclipseのプラグインとして開発されたものなので、ビルドにはeclipseが必要。
eclipseにはいろいろなバージョンがあるんだけど、最初はたまたま自分のマシンに入っていた3.2.0で始めたら、どうも古過ぎたらしくいくつかプラグイン開発に必要なクラスが入っていなくてコンパイルできなかったため、PleiadesからEclipse 3.4.2 Ganymede SR2 32bit ベース / Pleiades All in One 3.4.2.20090426 のJava版を持ってきてインストールした。(実は、sabotterのビルドにはこれでは新しすぎたらしい)
これだと最初からsubversion関連が入っているので、ファイルメニューのインポートを選び、SVN - SVNからプロジェクト でソースが持ってこれる。
リポジトリーロケーションに、http://svn.coderepos.org/share/platform/eclipse/sabotter/trunk を入力し、「URLを正規化しますか?」の質問にはいいえと答え、「選択したリソースの子プロジェクトを検索」を選ぶと、sabotterのプラグインプロジェクトがたくさんチェックアウトされる。全体で一つのプロジェクトではなく、プラグイン/フィーチャー毎にプロジェクトが別れている。
Windowsだと、デフォルトの文字コードがMS932になっていてソースが文字化けするので、設定の一般 - ワークスペースで文字コードをUTF-8にしておく。
ソースを追っていくと、今回の32bit問題は、sabotter側ではなくtwitter4j側のようだった。
で、今度はtwitter4jのソースを持ってくる。
ファイルメニューからインポートを選び、SVNからプロジェクトを選ぶところまでは一緒。リポジトリロケーションに http://yusuke.homeip.net/svn/twitter4j/trunk を入力し、今度は「名前を指定してプロジェクトとしてチェックアウト」を選んだが、ウィザードの方が良かったかも知れない。
twitter4jは、MAVENを使っているらしいけど、build.xmlも含まれているのでantでビルドできる。
この場合、eclipseとは別にJDKがインストールしてあって、環境変数JAVA_HOMEとPATHを適切に設定する必要がある。
twitter4jのソースで修正したのは、twitter4j.AsyncTwitterとtwitter4j.Twitterの二つのクラス。
これらのファイルの中で、int statusIdとか、int sinceId とか int idと言う箇所を探して、片っ端から long に変更していく。idのところはフレンドIDとかページのところは変えずに、ステータスIDの所だけ修正した。
build.xmlを右クリックして、実行 - Ant ビルドを選ぶと、文字コード関連でエラーになったので、build.xmlの中のjavacタスクに encoding="utf-8" を追加した。
これで、32bit問題を解決した twitter4jができたので、これをsabotterに組み込む。
jp.xet.sabotter.coreプロジェクトのプロパティを開き、「Javaのビルドパス」を選択する。
そして、twitter4jを選び、「JARファイルのマイグレーション」を選ぶ。
参照ボタンを押し、先ほどビルドしたtwitter4jのライブラリを選択する。(アドホックな対応としては、このとき「既存のファイル名を保存する」にチェックをした方が良かったかも)
同じプロジェクトのbuild.propertiesを開き、bin.includesにあるtwitter4jのライブラリファイル名を変更する。
META-INF/MANIFEST.MFを開き、Bundle-ClassPath にあるtwitter4jのライブラリファイル名を変更する。
ここからいよいよsabotterのビルド。ちなみに、プラグイン版ではなくてスタンドアロン版。
jp.xet.sabotter.standaloneプロジェクトのallinone.productを開き、「構成」タブを開く。
「必須プラグインを計算する際に・・・」のチェックボックスをチェックし、「必須プラグインの追加」ボタンを押す。(これは、おそらく使用したeclipseが新しすぎたために必要な過程で、本来の開発環境と同じバージョンのプラグインSDKが使えていれば不要なはず)
これをやると、何故かplugin.xmlが壊れるので、リポジトリの内容に戻す。
後は、allinone.productの「概要」タブでエクスポートのところにある「Eclipse 製品エクスポート・ウィザード」のリンクを押すと、ウィザードが立ち上がるので、「宛先」に適当なディレクトリを指定してやればビルドしてくれる。
エラーが出たら、logファイルを固めたアーカイブができるので、それの中を見ればエラーがわかる。これ、すごく見づらいんだけど、なんでeclipseのコンソールに出ないのかな。
で、私の場合見事にエラーが出る。
jp.xet.sabotter.eclipseプロジェクトの、jp.xet.sabotter.eclipse.views.SabotterViewのcreatePartControl内のwindow.setStatus()を呼び出している3箇所の日本語が化けるらしい。
twitter4jと違って、build.xmlを使っているわけではなく、eclipseがこのファイルの文字コードはUTF-8だと知っているのに何故怒られるのかわからなかったので、とりあえず英語にしてしまった。(ついでに、remainTime != 0 の判定を、remainTime > 0に変えておいた)
で、無事にビルドが通ったので、出来上がったsabotterを起動してみると、最初にtwitterのIDとパスワードを設定したところで一度だけタイムラインが取れて、その後は応答しなくなってしまった。
ログを見て見ると、twitterのAPIのrate limit にひっかかって、無限リトライをしている模様。
試行錯誤の末、以下のような修正で落ち着いた。修正は、全てjp.xet.sabotter.eclipse.manager.MiniblogServiceManager。
  • ONE_MINUTEと言う定数があって、名前からすると1分をミリ秒であらわした数値が入るものだと思うんだけど、20秒になっていたので60秒に修正。
  • コンストラクタの中で、各種サービス用のフレンドタイムラインとか、Replyとかの取得のタイマをスタートさせているんだけど、私の様にはてな俳句を使ってないと0秒間隔ではてな俳句を取りに行こうとするので、設定が0だったら次のタイマを起動しないように修正。
  • startInterval()で、ONE_MINUTE待ってから最初の取得をするようになっていたので、これを3で割って20秒にした。
これで、とりあえず動いているように見える。
良くわからなかったのが、SabotterViewのremainTime。単純に起動してから300秒のカウントダウンを表示するんだけど、いったいなんのためのものなんだろう?
これで、自宅、会社ではWindows版のsabotter、出先ではiPhone版のsabotterで快適ライフを送れています。と言うお話でした。
# しっかし、文章ばっかりで書くと激しく読みづらいですね。もっと画面ハードコピーとか、ソース差分とかふんだんに入れないと誰も読んでくれないな(笑)

eclipseのプラグイン開発のことについて何も知らないので、正しい別のやり方があったら教えてください。

カテゴリ

トラックバック(0)

このブログ記事を参照しているブログ一覧: sabotterのビルド

このブログ記事に対するトラックバックURL: https://www.wizard-limit.net/cgi-bin/mt/mt-tb.cgi/2004

コメントする

このブログ記事について

このページは、falseが2009年6月14日 19:59に書いたブログ記事です。

ひとつ前のブログ記事は「f-prot」です。

次のブログ記事は「mail2entryでサムネイル対応」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

広告

Powered by Movable Type 6.1.1