デフォルトのまま使うのは無駄な処理が多く制御もしづらいので、よっぽど単純なテスト目的を除いてやめましょう。
Twitter4J は Streaming API で受け取ったデータをマルチスレッドで処理するために内部で独自のスレッド管理をおこなってますが、これは当然というかほぼ T4J 専用に作られていて非常に応用が利きません。たとえば作られたスレッドが余っていても T4J 専用なので自分のアプリから使うことが出来なかったりします。Android でこの無駄はバッテリーにとても厳しい。
また Java 1.4 との互換性にも縛られているせいで「車輪の再発明」を強いられている感もあり、Java 1.5 環境の Android ならもっとかんたんで便利なものが手軽に利用できるのでそっちにしたほうがいい、というのもあります。
Android の下位互換向け純正ライブラリであるところの Support Package が r6 にアップデートされてました。
Support Package | Android Developers
http://developer.android.com/intl/ja/sdk/compatibility-library.html
これは Android 3.0 で追加された Fragment とかの便利なクラスを Android 1.6 以降でも使えるようになったりする大変ありがたいライブラリですが、今回のアップデートで PagerTitleStrip が追加されていたので試してみました。
iPhone 用の有料 Twitter アプリの中でもなぜかかなりの高人気を誇る Twitter クライアント「カップラーメン大陸」で、アカウント認証がうまくいかないというケースがぽつぽつ見受けられるようで。
せっかくお金払って買ったのにアカウント認証できなくてまったく使えない!何このゴミクズ!カップヌードルのほうがまだ安いしお腹もふくれるからマシだわ!などとブチギレしてる人がいるとかいないとかいう話ですが、原因はたいてい「本人のアカウント設定」にあるようです。
さてその解決策ですが。
Twitter のアカウント設定ページ https://twitter.com/settings/account の下のほうに「HTTPS を常時使用する」というチェックボックスがあります。
このチェックがもし入っていたら、チェックを外して「保存」ボタンを押します。ここで確認のため Twitter のパスワード入力ダイアログが表示されますから、素直にパスワード入力して完了です。
そして改めてカップラーメン大陸を起動し、アカウント認証を試してみましょう。
時代は AsyncTask より AsyncTaskLoader
Android 4.0、通称 Ice Cream sandwich というスマートフォンもタブレット端末もカバーする新しい OS がもうすぐデビューするとかいう時期なので、Android プログラミングもそれの普及をにらんだ実装に切り替えていくべき。
まずは、きっと Activity 上での非同期処理に多用されているであろう AsyncTask を、Android 3.0 以降で追加された AsyncTaskLoader へ乗り換えるところから始めるのもいいんじゃないかと思ってちょっと書いてみます。
あ、これは Activity での非同期処理について、という前提での内容になりますので、たとえば Service の中で非同期処理したい場合はどうすれば的な質問には役に立たないと思います。
TwitterのステータスIDが53bitを越えたお話 - tmytのらくがき
http://d.hatena.ne.jp/tmyt/20101201/1291166929
から引用。
このうちXMLで処理してる場合は内部で64bit INTで処理していれば特に問題は起きません。
こういう微妙なまちがいをしてる人はこの記事書いた人だけでなく大勢いるようだけど、記事としてはまとまっていたので参照。
JSON という書式は、確かに JavaScript から派生したサブセットですので、
JSONを仕様書通りにパースするとidの値はdouble
と考えてしまうのも無理はない気はします。
が、まちがいであるのも確かです。
JavaScript で文字列を繋げるのは += 演算子がベター、というのがもう 1 - 2 年ほど前から定石になっているらしい。
以前は「Array.push() で配列に格納して Array.join() で繋げる」ほうが圧倒的に処理速度が速かったんですが、最近のブラウザだと最適化が進んでパフォーマンスは逆転してるそうな。
JavaScript で、文字列の連結は "+=" が高速 - 地潜の日記
http://blog.livedoor.jp/jimuguri/archives/51347962.html
そういうことを google 検索で上位に来る上のブログで知ったんですけど、この人また他人の書いた記事を鵜呑みにしてて、なぜ配列を使うのが常識になっていたのかも知らないみたいなのでアテになりません。
なので実測。
Twitter の専用クライアントをセットアップするときの FAQ として「アカウントが認証されなくて使えない」というのがあります。
Web だと普通にログインできるアカウントが ID もパスワードも合ってるのに専用クライアントでエラーになってしまう原因は、ほぼまちがいなく PC 内蔵時計がズレてるです。
認証に使われてる OAuth / xAuth プロトコルがタイムスタンプも利用する仕様になっていて、このタイムスタンプがあまりに古いと Twitter では不正なリクエストとしてエラーにされてしまいます。
専用クライアントではタイムスタンプを PC 内蔵時計から得ているので、時計が狂ってるとエラーになってしまうのはそういうわけです。
これは OAuth の仕様で「タイムスタンプが古いリクエストは拒否ってもいいよ」となっていることを受けての Twitter 側の仕様のようです。
で、実際どれくらいズレてたらアウトなのか、手っ取り早く実際に PC の時計ずらして試してみました。
結果からいうと、「タイムスタンプが約 15 分以上標準時から遅れていたら Twitter の OAuth / xAuth 認証は失敗する」でした。
未来に進んでた場合は 24 時間以上先に進めても問題なかったです。
標準時ってのは世界標準時のことですけど、普通ローカルタイムに合わせてる PC 内蔵時計でも OS やプログラムがうまいこと世界標準時に換算して扱ってくれるので、とりあえず時報に時計合わせしとけば特に気にする必要はないです。
専用クライアントでアカウントがうまく設定できない、という人は PC の内蔵時計が遅れてないかチェック、というか ほぼ 100 パーセント遅れてるから時計合わせすれば解決します。きっと。
手前味噌ですけど、Twitter クライアントアプリ・チャーハン諸島には PC の時計が指す日時をポストしてくれる「妖怪ちくわぶ」機能がありますから、日時のズレをチェックしたい場合にはお勧めです!というか、15 分以上遅れてたら認証失敗でポストもできないので意味ないですけど!
15 分も時計が遅れてて認証失敗してたら、Twitter サーバのレスポンスに含まれる日時に時計合わせしてくれるクライアントアプリが存在してもいいと思う。チャーハン諸島は Java なので時計合わせとか超敷居高くてほぼ実装できない機能ですけど。
Twitter のサーバ時計との差が問題なら Twitter サーバの時計に合わせるべきなんじゃないか、という話もあるかと思いますが、Twitter は時刻合わせ用のサーバを公開していませんし、そもそもインターネットの標準として UTC 協定世界時に同期されているので、ユーザー側も自国の標準時に同期させれば問題ありません。
URL 短縮サービスの bit.ly には OAuth 認証用とかで SSL でアクセスできる API のエンドポイント https://aps-ssl.bit.ly/ があるんですけど、ここのサーバ証明書が StartSSL って CA のを使ってて、その CA 証明書を Java 標準のキーストアが持っていないからさあ大変。
知らない CA に署名された証明書だから "sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target" なんて例外が出て通信できません。
Firefox とかでアクセスしてみると普通に成功するので、うさんくさい CA ではないようです。一般的な Web ブラウザがルート証明書を持っているなら信用して問題ないはず。
単に使う分には %JAVA_HOME%/lib/security/cacerts に CA のルート証明書をインポートすればいいんですが、Java のアップデートで cacerts が変わるたびにインポートしないといけないしめんどくさいです。
今回の bit.ly のように StartSSL 使ってるとこに SSL でアクセスするときだけ StartSSL のルート証明書を読むようにすればいいだけなので、専用のキーストアを作って読み込むようにしてみました。
発表は何か月も前でしたが、最近になって対応クライアントがリリースできるようになってきて再注目を浴びてきた Twitter の User Streams。
User Streams とはいったい何なの?スリップストリームの仲間?とか微妙なボケをかます人もいるかもしれませんけど、どういうものなのかかんたんに説明しつつ自作アプリの紹介などしていきたいと思います。
Twitter の BASIC 認証が廃止されて、外部アプリ・サービスは OAuth 認証が必須になったわけですが、この OAuth 認証パラメーターの渡し方でおもしろいことに気付きました。