FindAFriendを動かしてみた

Jerome DiMarzio氏の「初めてのGoogle Androidプログラミング」(邦訳版)のサンプルプログラムを動かしているのだけども、最後のFindAFriendが動かなかった。
初めてのGOOGLE ANDROIDプログラミング
プログラムが長いので入力ミスでもあったのかと思い、再度Walk Throughをしてみたが、間違いらしきところもない。仕方ないのでEclipseのデバッガで追いかけてみたら、次の箇所がおかしいことに気付いた。

友人の名前と緯度・経度をデータベースから読んで来てGoogole Map上のOverlayにプロットする“FriendMap”というクラスがある。その中の“loadFriends”というメソッドで、データベースから読み出した緯度・経度が正しいフォーマットか確認のため正規表現でマッチングしている部分がある。その正規表現がおかしい。原書もGoogle Booksで(たまたまプレビューできたので)確認してみたが、正規表現が次のようになっている。

final String geoPattern = "(geo:[\\-]?[0-9]{1,3}\\.[0-9]{1,6}\\,[\\-]?[0-9]{1,3}\\.[0-9]{1,6}\\#)";

つまり、緯度経度がデータベースに次のような形式で登録されていなければならない。

(geo:45.0,141.0#)

ところが邦訳版280ページの操作説明では単に“45.0,141.0#”と入力しているだけだし、データベースへもそのままの文字列が登録される。また、データベースから読み出してアプリケーションに渡されるのも元の文字列のままとなる。

本の通りにタイプするとデータベース上にあるすべてのお友達の座標が無効になってしまう。それだけだったら、地図上に誰も表示されないだけの話なのだが、さらに事態をややこしくしているのが、このアプリケーションは最低でも1人の友人が登録されて初めて地図にプロットできる、という前提で作られていることだった。同じloadFriendsというメソッドで“friendLocation”という変数があり、データベース上の最後にマッチした友人の座標がはいっている“ハズ”なのだが、これがnullのままsetCenterというMapControllerのメソッドに引き渡されるのでNullPointerExpectionを発生する。

このアプリケーションを正しく動かすためには、データの入力を

(geo:45.0,141.0#)

とするか、もしくは、正規表現を次のように変更する(座標入力を“45.0,141.0#”とする場合)。

final String geoPattern = "[\\-]?[0-9]{1,3}\\.[0-9]{1,6}\\,[\\-]?[0-9]{1,3}\\.[0-9]{1,6}\\#";

一応、どちらの方法でも正しく動作することを確認している。

これは推測だが、もっと本格的なアプリケーションをベースに必要のないところを削除してこのサンプルをつくったのではないだろうか。そのためこういった表現が残ってしまったのかも知れない。

関係ないが、色々調べていたら“geo”は“ゲオ”と発音するのではなく“ジーオ”(gee-oh)と発音するらしい、ということが分かった。GeeもOhも感嘆の表現。:-C

読書感想

最後のFindAFrind以外はちゃんと動いていたし、原著作者のコメント以外にも訳者のコメントがしっかりしていたので分かりやすかった(例えば、Google MapのAPI Keyの取得方法とか詳細に書いてあった)。ただ、内容が“概要”に留まっているので、詳細に理解しようとすると物足りなさがある。作者は前書きで「本書はプログラマーズガイドであり、ビギナーズガイドではない」と書いているが、私は逆だと思う。概要を知る入門書としては良く出来ているが、例えば、レイアウトとかIntent、Uriの構造や構成が分かりにくかったり、詳細については隔靴掻痒の感じがある。

この本のあとに「入門 Android 2 プログラミング」を読んだが、こっちの方がプログラマーズガイドに近いと思った。

とは言え、初めて読んだAndroid SDK関係の本としては、大変参考になった。