スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書く事で広告が消せます。

Flexible Rails: Iteration12 後半

Iteration12 後半

12.3 オンライン/オフラインのサポート
AIR の機能について深く議論することや AIR が Rails とどのように関わるのかは、この本のスコープではない。それだけで1冊の本がかける内容だ。(著者は誰かがそういう本を書くべきだと言っている) この本では、オンラインとオフラインサポートの初歩的な実装で満足することにする。特にオフラインのときは、Notely を見せて、次回オンラインのときに内容を保存できるようにする。

アプリケーションがオンラインかオフラインかを検知する機能を追加し、それに応じてアプリケーションの見た目を更新する。これは、Adobe Labs の John C. Bland II の素晴らしい記事の内容をかなりベースとしたものだ。ローカルファイルに保存してサーバーのデータベースと同期する実装が John の記事にあるが、これを採用するのはエクササイズとする。

UI コードを追加して、オンラインとオフライン状態が変わった際に、pomodo を更新することから始める。もし task, project, location などのオンラインや同期の処理を完全に提供しようとすると、かなりトリッキーな問題だ。幸運にも、ここでは要求を制御しており、そういうことはない。

OfflineMainBox を現在の MainBox をベースとして作ることから始める。こう書いていたのに、一から手で書いてしまった。著者が意図していたのはコピー&ペースト&削除だ。

ほとんどのコンポーネントを削除して、オフライン状態ラベルを追加し、TabNavigator の Notely タブだけ残しておく。しかし、このやり方は MainBox にたくさんのフラグを追加するよりもっとフレキシブルである。レイアウトを全体的に変えることができるなどのメリットがある。

次に、更に共有状態を PomodoModelLocator に加える。
オンラインか否かのフラグと onlineCheckURL と Notely の未保存内容のための unsavedNoteContent 変数を追加する。unsavedNoteContent 変数は、2つの Notely インスタンスが存在し、同じ状態を共有したいために必要となる。onlineCheckURL は remoteURL が参照する URL が自分自身のホスト上の URL(ローカル URL) であり、もしオフラインだとしてもローカル URL は機能する(デモには有効だ。また、オフラインの機能のために Rails サーバを止めたりしたくない) 実際に、全ての関心事は remoteURL にアクセスできるということなのだ。これは本のためのコードであり、デモコードである。

次に、Pomodo を変更して、オンラインかオフラインのときで異なるビューを見せるようにする。
controlViewToShow 関数を変更して、2つの引数 _model.workflowState と _model.online を取るようにする。これにより、mainStack の selectedChild が workflowState か onlie ステータスが変更したときに実行されるようバインディングする。controlViewToShow 内で、もしオンラインなら mainBox を返し、もしオフラインなら offlineMainBox を返す。WipeDown エフェクトを追加し、offlineMainBox が showEffect としてトリガーして実行するようにする。

次に、Notely を変更して PomodoModelLocator に格納する unsavedNoteContent を使うようにする。
notelyTA を変更して、text プロパティを _model.note.content の代わりに _model.unsavedNoteContent にバインドする。そして、この _model.unsavedNoteContent が change イベントで更新するようにする。これにより同期が簡潔になる(かなり簡単だ)。こうするために、doSave 関数を変更して _model.note.content を _model.unsavedNoteContent をベースとして更新するようにする。そして、doRevert 関数を変更して、_model.unsavedNoteContent に _model.note.content を代入するようにする。notelyTA.text に明示的に代入する必要はない。なぜなら、それは _model.unsavedNoteContent にバインドされているからだ。最後に、Save ボタンはオンラインの時だけ使えるようにする点に注目だ。

次に、ShowNoteCommand に小さな変更を加える。
コマンドを変更して model.unsavedNoteContent への代入を行う。これは、Notely へ最初の内容を読み込ませるのに必要だ。

最後に、StatusBox を変更して、今までの変更を結びつける必要がある。
creationComplete イベントのハンドラー handleCreationComplete 関数をアタッチする。この関数は最初に onNetworkChange 関数を Event.NETWORK_CHANGE イベントの EventListener として追加する。handleCreationComplete 関数は checkIsOnline を呼んで、最初のオンライン・オフラインチェックを行う。onNetworkChange 関数もまた、checkIsOnline を呼んで、オンライン・オフラインチェックを行う。(著者によるとトグルによりオンライン・オフラインを切り替えるアプローチも世の中にはあるが、一度同期がずれるとずっと誤った動作になるため、信頼性が低いと考えている) checkIsOnline 関数は _model.onlineCheckURL 実体は http://www.google.com に ping する。Google ならば負荷に耐えられるだろう。リクエストに成功したら、requestCompleteHandler が呼ばれ、_model.online を true にセットし、statusLabel テキストを "Online" にセットし、statusLabel カラーを緑にセットする。リクエストに失敗したら、requestErrorHandler が呼ばれ、_model.online を false にセットし、statusLabel テキストを "Offline" にセットし、statusLabel カラーを赤にセットする。

インターネットに接続できることを確認し、リビルドして再読み込みしてみよう。

ludwig でログインすると、ブラウザー版と同じような画面が開く。
次にインターネットへの接続を遮断して2、3秒たつと、カレンダーと Notely だけの画面に変わる。うん、確かに変わる。遮断した状態でログインすると、Location や Project が取得できないという警告が出て、オフラインの画面が表示された。

StatusBox がどのようにオフライン状態を示すのかに注目だ。また、UI がどのようにスワップアウトして OfflineMainBox が表示されるのかも注目してほしい。更に、Notely 内の Save ボタンはオフライン Save や同期をサポートしないため、disable になっている。

Notely にテキストを入力してインターネットに再接続してみると、2、3秒後に AIR はオンライン状態に変化したことを検知し、Google へのリクエストが実施され、Pomodo はオンラインモードに戻る。全てのタブが現れて Save 機能も戻る。確かに動作した。Notely も自動的にオフラインのものがオンラインのものにコピーされた。

rake でテストを実施し、全て機能することを確認しよう。うん、Flex ばかりいじってたような気がするので、特に問題は生じなかった。

12.4 サマリ
AIR を実行することはかなり簡単であることがわかった。pomodo を AIR アプリケーションとしてビルド、実行し、新しい機能をほんの少しのコードで追加することができた。

12.5 エクササイズ
ローカルファイルへの Save 機能を追加してみるとか、同期させてみるとか。ログインしていないユーザにはオフライン状態で、ログインしたら同期して全ての機能が利用できるようにしてみるとか。やはるスルーする。

12.6 まとめ
rails pomodo と実行してから長い道のりだった。Flex と Rails を統合して次世代のリッチインターネットアプリケーションを構築するやり方を見てきた。その中で、興味深く複雑な十分な例により Flex と Rails を一緒に使って開発するということがどのようなものかを示した。Pomodo は完全ではないが、大抵の本にあるコードサンプルよりは現実的だ。

読者へのエクササイズとして残したのは、良かったのか悪かったのか。どんな意見でも、良いとか悪いとか、本について著者にどうかメールして欲しい。もし印刷物やオンラインで引用されることを気にしないのならば、メールでそのように言ってほしい。そして、名前とオプションで肩書きやブログの URL などを書いてほしい。心配しなくても、メールアドレスを公開したりしない。

Pomodo のソースコードは MIT ライセンスなので、自由に使って読者のアプリケーションのスタート地点としてもよい。著者は本を通じて時々 Web 2.0 を楽しんだけれど、Web 2.0 スタートアップ会社を作り、世の中を変えるきっかけをつくる、少なくとも名声と幸運を手に入れる人を皆尊敬している。こういった他の皆と同じように、著者も少しだけ Web 2.0 スタートアップのアイディアを持っている。著者は、Flex と Rails の組み合わせが読者の製品開発に使えて、市場を素早く獲得し、規模を拡大して買収されるか IPO を実現(これも読者へのエクササイズだ!)するためのものになればと願っている。もし実現したら、送り物や株を譲渡してもらっても断らないよ。。。

著者が Flexible Rails を執筆し始めてから1年以上がたち、アイディアを構想してから18ヶ月以上になる。今、それは達成され、Manning の書籍となった。(これは完全に著者の自己満足だが、Manning の Swing の本は、著者が読んだ本の中でベストの一冊で、コードサンプルのナンバリングフォーマットをインスパイヤーしてくれたものである。しかしながら、著者が Swing を読んだとき、若くて BPM スタートアップのシリコンバレーの開発者に憧れていて、現在のような年取ってひどい、ではなく、年季の入った開発者ではなかった)

更に、著者は Rails on AIR という本を執筆予定で、それは Flexible Rails の Pomodo を例に、興味深い新しい方向性を持ったものを完全な Adobe AIR アプリケーションとして取り扱うものだ。http://www.railsonair.com を 2008年初頭にチェックして情報を得てほしい。秘密のアイディアがあるのだ。うーん、既に2009年になったが、まだこのURLは稼働していないようだ。それか、もう閉鎖してしまったのかもしれない。

この本が本当に終わるのが信じられない!

これで、この本の本編をなぞるのは終わりだ。付録があるので、ちょっと見てみる。

テーマ : プログラミング
ジャンル : コンピュータ

コメントの投稿

非公開コメント

検索フォーム
RSSリンクの表示
リンク