Walkrr

walkrr.jpg

いくつかある趣味の中で一番楽しみの強度が大きいのは、コンピュータ、というよりコンピュータで何かを作ることかもしれない。先々週と先週の連休は、それぞれ別の(といっても関連はしている)ものづくりに励んでいた。一応エンジニアとしてのお勉強というお題目はあるが、作っているのは散歩関係のソフトウェアなので、100%趣味の世界だ。

先々週は、Adobe Airで散歩の径路を入力するソフトを作ろうとしていた。Google Maps APIは登録時に設定した公開URL以外では使えないかと思っていたが、file://...http://localhost...はOKなようなので、フォーラム - Flex User Groupを参考にして、成功したのはよかったが、結局AirのHTMLコンポーネントの不具合(まだベータ版なので仕方ない)で、地図のクリックが多重にカウントされたりずれた位置になってしまったりしたので、プロジェクトを放棄した。

代わりに先週手をつけたのが、自作自演の散歩コースを記録、検索するソフトWalkDBをRuby on Railsで実装し直なおすことだ。ドラクエと同じようにWalkDBはそのときもっともホットなプラットフォームで作ることにしているので、これまで素のJava Servlet→Struts→DWRと基本的にJavaベースで推移してきたが、ここで一気にRubyに乗り換えることにした。ついでに仕様を変えてGoogle Mapsと融合させることにした。データの入力も、表示も同じ画面の中のGoogle Mapsでおこなう。名付けてWalkrrだ。

かなり長丁場になることを覚悟していたのだけど、さすが話題のRuby on Rails。思ったよりずっと簡単にできてしまった。しかも何だか楽しくて寝食忘れそうになるくらい夢中になった。レシピは以下の通り(なお、環境はWindowsだ)。細かい手順は書かないが、だいたい何をどうしたか想像できると思う。

  • Ruby - 当初ActiveScriptRubyを使っていたが、mongrelのservice化に失敗したので、One-Click Ruby Installerに変更。いずれにせよRubyGemまで一緒に入る。
  • RadRails - 開発環境は何といってもこれ。
  • PostgreSQLとPostGIS - 基本的に従来通りだがRailsの規約にあわせてスキーマを変える。
  • rails, postgres-pr, GeoRuby, mongrel(WWWサーバ、Webrickより本格的),mongrel_service(mongrelをWindows Service化) - gemでinstallする。
  • Spatial Adapter for Rails - Railsのプラグイン。svnで公開されているので、何らかの手段で入手して、vender/pluginsの下におく。

あとはTIPSをいくつか。

  • Ajaxで取得したデータをpaginationするやり方は→someedaの日記 - [Ruby on Rails]Ajax pagination(ページネーション)
  • exportというアクション名をつけたら正常に動作しなかった。Railsの予約語?
  • XMLを生成するときはrxmlテンプレートを利用
  • 同じnameのデータを複数渡して、サーバに配列として受け取らせる場合には、nameをfoo[]などとすればよい。
  • ActionRecord.destroyにIDの配列を渡したときは、戻り値はIDの配列。仕様の整合性では、削除したレコードの中身の配列が正しそうなのだが。仕方ないので、params[:id].map{|id| ActionRecord.destroy(id)}とした。
  • 地理型カラムを含むActionRecordをparams丸ごと渡してnewしても、地理型カラムはnullのまま。GeoRubyの機能でGeometryインスタンスを別途作成して、それを含め1カラムずつ指定してnewする。
  • select_tagに配列データをoptionとして指定する方法→第2引数にoptions_for_select()[[...],...]と指定
  • 任意のSQLを実行するときは、ActiveRecord::Base#connection.execute
  • 不可解な動作をするときや引数の指定の仕方がわからないときはソース。Ruby on Rails Manualが御用達。

最後に参考にした本を挙げておく。順を追って書かれていてわかりやすかった。