Sunday, December 19, 2010

my first impression of using capybara + akephalos

thoughtbot and the Holy Grail - GIANT ROBOTS SMASHING INTO OTHER GIANT ROBOTS
を見て、 capybara + akephalos を試してみた。

結論から言うと、 jquery-ujs ajax リクエストのテストができたんですけど、補足事項がいくつかあります。

1. javascript_driver でなく default_driver を変更する必要があった
2. selenium でテストするときのように、サーバープロセスを起動してアクセスするので transactional_fixtures = false にしてテスト毎に DBの cleanup が必要

具体的には
# spec/spec_helper.rb
require 'akephalos'
#Capybara.javascript_driver = :akephalos
Capybara.default_driver = :akephalos


あと DB の cleanup は database_cleanupが便利でした。以下の例は transactional_fixtures を無効にして、全ての example が実行される前に一度 cleanup して、あとは example が終わると cleanup します。(truncate なので DatabaseCleaner.start はたぶん何もしないんですけど、 transaction strategy に変えたときには意味があるのでお約束です)

# spec/spec_helper.rb
RSpec.configure do |config|
config.use_transactional_fixtures = false
config.before(:suite) do
#DatabaseCleaner.strategy = :transaction
DatabaseCleaner.strategy = :truncation
DatabaseCleaner.clean_with(:truncation)
end

config.before(:each) do
DatabaseCleaner.start
end

config.after(:each) do
DatabaseCleaner.clean
end
end


元記事のコメントには「selenium より遅い」という意見があります。たしかに最初の akephalos サーバーの起動には時間かかるので、rspec コマンドで単体の example もしくは example group を実行しているときにはオーバーヘッドが大きいですね。しかし、 rake spec などで全部実行するときには akephalos サーバーの起動は一度で済むので、リクエスト自体は意外とサクサクと動いて僕の selenium のツライ経験からすると全然いいですね。

その他の注意事項としては、
1. 現状の akephalos (0.2.4) では capybara 0.4.0 に対応できてないので 0.3.9 を使うのですが、
within "#item_1"
はダメで、
within :css, "#item_1"
のように書く必要あり
2. webrat -> capybara 移行に際して、 capybara は rails の integration test のしくみを使ってないので、
get "/"
response.should contain("hoge")
が使えないので各、
visit "/"
,
page.should have_content("hoge")
などに書き換えが必要

Thursday, September 23, 2010

Yet Another Offline Google Maps for iOS

Android Mapというプロジェクトの紹介記事から知ったのですが、 Mobile Atlas Creator という Google Maps などのソースからオフラインで利用できる地図データを作成するツールがあります。

作成した地図を iPod Touch から利用できると便利なので探してみると、 Galileo Offline Maps というのがありました。この app 本体は無料で CloudMade と OpenStreetMap のデータが利用できます。これらの Crowdsourcing マップは日本だとデータが少なくて役に立たないからなのか、否定的なレビューばかりで残念なのですが、 230円のアドインを購入すると Mobile Atlas Creator などで作成したデータをインポートできるようになります。(表示が 230 $ で焦りますが、まあ、アメリカンクオリティなのはよくあることですね。)

オンライン地図のインポートの方法の詳細は Galileo Offline Maps のGuide - How to Import Offline Maps を参照してください。

ちなみに、Google Maps のデータの利用に関してはグレーな感じがするのですが、 MapFolder のように app 本体がダウンロードするわけではないので抹殺されないことを願います。

Sunday, August 15, 2010

a way to specify a ruby with rvm for new windows of a screen session

$ rvm use --default ruby-1.9.2

の状態で
$ rvm use system

で利用する ruby を切り替えても screen の window の環境は新規のシェルセッションになるので ruby-1.9.2 に戻ってしまう。
screen が新規 window を作成するときに利用する shell のスタートアップスクリプトが実行され初期化されてしまうので当たり前といえば当たり前。

そこで、シェルスクリプトの source rvm の直後に以下のおまじないを書いて、
if [[ -n "$rvm_use" ]] ; then
rvm use $rvm_use
fi


環境変数 rvm_use を与えて screen を起動すると、
rvm_use=system screen

screen の新規 window が作成されるたびに rvm use system が実行されるようになります。

もっといい方法があるかと思うので、知ってる人は教えてください。
RVM inside Screen に描いてあることは、 screen の新規 window で script/rvm が読み込まれるようにするだけだったので残念。

Saturday, July 24, 2010

Synchronizing files in GoodReader with Unison

2010-10-28: 現状、iOS4 なら Dropbox から pdf を GoodReader で開くと GoodReader にコピーされるので、「あとで読む」ものを一度 GoodReader で開いておくほうがいいかもしれない
2010-08-05: -fastcheck true について追記
2010-08-19: unison コマンドのスペルミスを修正

GoodReaderWebDAVサーバー をマウントして、 Unison という対話的双方向 rsync みたいなツールで双方向の同期をとる方法。Mac 限定で説明しますが、 Windows でも Unison 使えるはずだし、 WebDAV マウント (ネットワークドライブ?) できるはずなので応用してみてください。

まずは unison のインストール。
$ sudo port install unison


GoodReader の WebDAVサーバーを起動

unison を実行 (もちろん実行前にバックアップしてください)。
$ unison -perms 0o0 -fastcheck true ~/Dropbox/pdf /Volumes/iPodTouch.local


-perms 0o0 は双方向でパーミッションの同期をしないというオプション。

-fastcheck true オプションを付けると同期するかどうかの確認が速くなります。

unison は対話的なコマンドなので最初に実行するとすべて未知のファイルとしてどうするかいちいち聞いてくるのですが、落ち着いて対応すれば難しくないはずです。

  • すでに双方にあるファイルが同じなら ">" (left to right) のローカルから iPhone へ (実際には転送されないと思う)

  • .DS_Store とかは、 "N" (permanently ignore paths ending with this name)

  • 同じ内容だけど名前の違うフォルダやファイルはとりあえず skip して名前を調整してから次回の unison 実行で同期



unison の実行が終わったら、 iPhone 側の "WiFi-transfer" を "stop" する前にマウントを先に解除したほうがいいですね。たぶん。

以上。

Tuesday, April 20, 2010

Exclusively require and load tasks for rake with bundler

Rails アプリケーションで Bundler の Gemfile を使う場合、
group :test do
gem :rspec-rails
end

のように Rails.env に応じたグルーピングができます。

rake でしか使わない gem とそのタスクをこの仕組でできないかなと思って、bundler の issue トラッカーでヒントを貰ってなんとかできました。

Gemfile では
group :tasks do
gem 'ar_fixtures'
gem 'yaml_waml'
end


Rakefile では
Bundler.require(:tasks)
def load_task(task_file)
load Dir[Bundler.bundle_path + "gems/*/{tasks,rails/tasks,lib/tasks}/#{task_file}.rake"].first
end
load_task "ar_fixtures"


これで、
$ rake -T db:fixtures:dump
...
rake db:fixtures:dump # Dump data to the test/fixtures/ directory.

Saturday, April 17, 2010

a rvm tips - install rubies as root, use them as a user

2010-07-30: 現状では Installing RVM System Wide に従ったほうがいいですね。たぶん。

rvm (Ruby Version Manager)を使う場合、ユーザーホーム以下に rubies から gems までインストールして使う方法が一般的なようですが、 rails のデプロイ先のサーバーや複数ユーザーで共有しているホストなど、それだと気持ち悪い。
root で ruby をインストールしてユーザーからそれ使いたいのですが、いまいち方法がよくわからなかったので試行錯誤して、とりあえず動くようになったので書いておきます。

まずは rvm gem をインストール
sudo gem install rvm

(rvm 自体はシェルスクリプトの集まりなので ruby がない状態からインストールできるようですが、やったことありません。Installing RVM を見てください。)

次に root に /usr/local/rvm ディレクトリを作成
sudo rvm-install


ユーザーの設定ファイル ~/.rvmrc に rubies と gems は /usr/local/rvm を見るように設定:
rvm_rubies_path=/usr/local/rvm/rubies
rvm_gems_path=/usr/local/rvm/gems


それからユーザーの ~/.rvm ディレクトリを作成
rvm-install

rvm-install の仰せの通りに source $HOME/.rvm/srcipt/rvm を設定、
いちどログインシェルを抜けてから、

いよいよ欲しい ruby をインストール。
rvmsudo rvm install ruby-head

通常の sudo だと sudoers に "Defaults setenv" を書いて -E しても PATH は渡されなかったりしていろいろ面倒なんですが、 rvmsudo を使うと PATH や GEM_HOME とかのruby関連の環境変数を引き渡せるので便利です。 rvm 以外にも gem, bundler などで root 権限が必要なときも rvmsudo が使えます。

先程 ~/.rvmrc ファイルに /usr/local/rvm を参照する設定を書きましたが、現状では ruby をインストールするごとに ~/.rvm/bin にシンボリックリンクを作成する必要があるようです。
(cd ~/.rvm/bin && ln -s /usr/local/rvm/bin/ruby-head ruby-head)


これで、ユーザーから通常通り
rvm ruby-head

とすれば switch できるようになりました。

もっといい方法がないか rvm google group にポストしたところ "it may never work" とは言われなかったので個人的にはこんな感じで使おうかと思ってます。

(ちなみに上記は rvm 0.1.27 で試しました)

Sunday, January 10, 2010

MacRuby now supports non-ASCII string in regular expressions

MacRuby には僕ら日本人にとって信じがたい、日本語(というかASCII以外)を含む文字列に対して正規表現が使えないという問題がありましたが、先日、修正されたようです。まだ試してませんが。

0.4 のコードベースのときに、日本人としてなんとかしないとと思い、修正しようとして挫折しましたが、r3189 changeset を見ると意外と差分が少ないですね。

MacRuby が Mac OS X 10.7 のシステムの一部として利用できるようになれば、重たい MacRuby.framework をアプリケーションに含めずにリリースできるようになることを期待しています。

最近、ブログ書くのが億劫になってましたが、 ソフトウェアの i18n に関心がある身としてちょっと嬉しかったので...。