2010-03-03 04:38
とりあえず「Gread」完成!
iPhoneを買ってからGoogle Readerを本格的に使うようになった。
しかし使用頻度としては相変わらずほとんどiPhoneからでPCからはたまに見る程度だ。
正直、常に表示されててもいいくらいなのにそれのためだけにWebブラウザを開いておくのも目障りだし邪魔。
できればTwitterクライアントみたいに記事がタイムラインに流れてくるものがあればいい。
そう思って探してはみたものの、RSS自体が浸透しきれてないせいかほとんどないに等しい。
ならばないものは作ってしまおうということでFlashにて自作してみることにした。
(「Gread」のダウンロードは記事の中段付近)
まずぶち当たったのがどうやってGoogle Readerからデータをとるのか。
もちろんあまり作ってる人がいないこともあって情報もかなり少ない。というかない。
ヘルプを見たり色々したけど結局よくわからず、設定のページを色々いじくっていた。
すると「フォルダとタグ」の項目に自分のRSSフィードを公開するという項目があった。
フォルダ別に公開するか設定できるようになっていて、試しに公開モードにしてみると公開ページというのができて、そのフォルダに登録されているフィードの一覧が表示された。
そしてここのページで見つけたのがAtomフィードだ。(公開ページの右列にある)
なんと自分の公開ページをフィードとして登録できるようになっていた。
Google Reader自体からデータを取る方法はよくわからないのでとりあえずはこれを活用して実装してみることにした。
Flash側でやることとしては簡単でこの公開ページのAtomフィード、つまりXMLをloadすればいいだけだ。
Atomフィードからは次のようなデータが取れる。
- <entry>.<published> … 記事の更新された時刻
- <entry>.<title> … 記事のタイトル
- <entry>.<source>.<title> … ソース元フィード名
- <entry>.<content> もしくは <entry>.<summary> … 記事本文
ほかにもあるのだが今回は使ってないので割愛。
記事の更新された時刻のデータは「2010-03-02T17:47:16Z」というような形であるとともに、これは日本時刻(GMT+9)ではなく世界標準時刻(GMT+0)であるというところに注意。
今回は日本時刻でほしかったので一旦Splitで「-」「T」「:」「Z」を消して「20100302174716」という状態にしてからDateオブジェクトに変換する方法をとった。
var TSNum:Number = 20100302174716;
var kijiTS:Date = new Date(
Math.floor(TSNum/10000000000) ,
Math.floor(TSNum/100000000)%100 ,
Math.floor(TSNum/1000000)%100 ,
Math.floor(TSNum/10000)%100 + 9 ,
Math.floor(TSNum/100)%100 ,
TSNum%100
);
trace(kijiTS);
出力: 2010/03/03 02:47:16
このタイミングでGMT+9になるように9時間プラスしている。
ちなみにDateオブジェクトはよくできていて、今回の場合でいえば17時に9をプラスして26時となってしまうわけだが、24時を過ぎると自動で日に繰り上げられるので気にする必要はない。
もちろんif文を用いて24時を過ぎていたら 日付+1 をして 時-24 としてもよいのだが、そうなると月の変わり目は月も変えねばならず、なおかつ月の変わり目は月によってばらつきがあったりうるう年のように例外もあったりする。
それを色々やるのは面倒ということでDateオブジェクトに置き換えたわけだ。あとはgetMinuteなどで分解して使えばいい。
余談ながらN日後を指定したいときもDateオブジェクトを使えば便利だったりする。
今回はまったのがなんといってもNamespace(名前空間)だ。
XMLを取得したときにそのままtraceしても出るのになぜか個々のノードは取得できない。
いままで名前空間がなんなのかよくわかってなかったが同じXMLでも記述方法が何パターンかあるらしく、それを読めるようにするために解読するものを定義しなければならないようだ。
var ns:Namespace = new Namespace(“http://www.w3.org/2005/Atom“);
今回はAtomなのでこれでいけたが他にも数種類あるようだ。
記事本文はフィードによって形式が違っていて<content>と<summary>の2種類があるようだ。
なのでこれに関しては if ( <content> == null ) という条件分岐にしてみた。
ここまでできてしまえばあとはデータを流し込むテキストフィールドを用意するだけなのですぐだ。
ちなみに手動更新と一定時間経ったら自動更新の機能もつけて、新着があればSEを鳴る。
読み込むフィードを個々で変えられるように外部XMLファイルを置いてそこから読むようにした。
そして最後はAir形式でパブリッシュして完成。
■ 現在かかえている問題点と打開案
まず環境設定を維持できないということ。現行バージョンでは外部XMLファイルで編集するようにして環境設定では設定内容が見えるというだけにしてある。
それと現行のデータの取得方法だと自分のフィードを公開モードにしなければならないのとそのAtomフィードのアドレスを取ってくるなど初期設定がわかりづらい。それに加えて20件までしか表示されないので過去記事を追うことができない。
なによりもAtomフィードを読んでるだけなので既読管理やスター付けなど一切のGoggle Readerの機能が使えないということだ。
これらは Google Reader API というものがあったのでこれを用いることで解決できそうだが、英語が理解できずに挫折してしまったのでこれはまた次のメジャーアップデートに期待ということで。
あと現行バージョンではサイズ変更は無効にしてます。というのも構造的な仕様でアプリサイズを変更すると記事領域が広がるのではなく、アプリそのものが拡大縮小されてしまうため応急処置。これについては打開策を模索中。
■ 「Gread」ダウンロードと使い方
※展開にはAdobe AIRが必要です。入ってなければ勝手にインストールされます。
事前準備として自分のフィードを「公開モード」にします。
公開にすると右に「公開ページを見る」という項目が出るのでここを開きます。
右のほうに「Atomフィード」というリンクがあるのでこれを開きます。
XMLタグの文字列が大量に表示されますがこのページのアドレスを使うのでコピーします。
事前準備はこれで終わりです。
次にアプリをインストールします。
インストールが終わったらアプリをインストールしたフォルダの中に入っている「source.xml」をテキストエディターなどで開きます。現行バージョンではこのファイルが環境設定用のファイルです。
- 3行目: <newSE pset=”on”>ファイル名</newSE>
更新があったときに鳴らす効果音です。初期設定では newpost.mp3 という水の音の効果音です。newpost.mp3を別のものに差し替えるか指定するファイル名を変えれば音を変えられます。MP3のみ対応です。また、pset=”on” を pset=”off” にすることで効果音を鳴らさなくできます。
- 4行目: <updateInterval>60</updateInterval>
自動更新の間隔(秒)の設定です。初期設定は60秒で、設定範囲は 20秒~ です。20秒以下を指定しても更新間隔は20秒となります。
- 5行目以下: <source>.<rsspath> / <source>.<rsstitle>
ここで読み込むアドレスを指定します。<rsspath>には初期設定で私のアドレスが入っているので、ここにさっきコピーしたAtomフィードのアドレスをペーストします。<rsstitle>はフィードのタイトルで、アプリのフィード切り換えタブに表示される名前です。タイトル名はGoogle Readerのものと同じものにする必要はありません。
また、フィードがたくさんあるときは、
<source>
<rsspath>ここにフィードのアドレス</rsspath>
<rsstitle>ここにフィードのタイトル</rsstitle>
<source>
この部分を増やせばいくらでも増やせます。ただし極端に多かったりすると読み込みに多少の時間がかかるかもしれないです。
設定が終わったら上書き保存をしてアプリを開いて下さい。
「Gread」を開いたらこんな感じの画面が出ます。
「Timeline」タブには登録したフィード全てが時系列順に表示され、その右には個々のフィードのタブが表示されます。
記事の上でダブルクリックすると記事の元ページがブラウザで開かれます。
環境設定は現行バージョンでは新着サウンドのON / OFFのみ切り替えられて、あとは「source.xml」の設定の内容を表示しているだけです。なお新着サウンドの設定も保存されているわけではないので次回起動時には引き継がれません。初期設定を変えたいときは他の項目と同様に「source.xml」から行って下さい。
■ 今後の予定
- 環境設定をアプリ内から反映できるようにする。
- アプリのサイズを変更できるようにする
- バグがまだあるはずなのでそれを1つずつ潰す。
- 上の問題点で挙げた通り、Google Readerとの連携が取れておらずただ単に読んでいるだけなのでAPIを使って既読管理などGoogle Readerの機能を使えるようにする。