Cygwin版Rubyでトラブルあれこれ
Cygwin用のバイナリは現在1.8.4がFTPに上がっています。
- ftp://ftp.ruby-lang.org/pub/ruby/binaries/cygwin/
- http://www.ruby-lang.org/ja/install.cgi?cmd=view;name=Cygwin+%28%A5%D0%A5%A4%A5%CA%A5%EA%29
じゃあCygwinでは1.8.4までしか動かないのか、というとそういうわけでもないようで、最新のソースは普通にコンパイルが通るし、setup.exeでも1.8.5-2がインストールされてました。FTPに1.8.4までしか上がってないのは、単に忘れられてるせい?
で、Cygwinで1.8.5が動くのを知らなくて1.8.4を使ってたんですが、以下の問題で悩みました。
- ActionWebServiceでDBに日付のカラムを使うとエラーになる。
- iconvに正しくないエンコードの文字列が渡されると、おかしなエラーが発生する。
1つ目のActionWebServiceの日付処理がエラーになる問題は、以下にバグレポートが上がっています。
これは最新のRubyでは解決しているようです。散々悩んでライブラリのプリントデバッグをしたんですが、下のような動作が原因でした。
irb(main):001:0> Time.now => Mon Dec 11 03:01:16 GMT+9:00 2006 irb(main):002:0> Time.now.zone => "GMT+9:00" irb(main):003:0> require 'date' => true irb(main):004:0> Date.parse(Time.now.to_s) ArgumentError: 3 elements of civil date are necessary from /tmp/usr/local/lib/ruby/1.8/date.rb:650:in `new_with_hash' from /tmp/usr/local/lib/ruby/1.8/date.rb:695:in `parse' from (irb):4
タイムゾーンの表記"GMT+9:00"というのが問題。XPと2000で確認しました。
Time#zoneをTZで変えられるという話がいくつか見つかるんですが、うまくいきませんでした。
手元の1.8.5-2は以下のような動作をします。まだzoneの値が"GMT+9:00"のままですが、エラーは出なくなりました。
irb(main):001:0> Time.now => Mon Dec 11 03:15:12 +0900 2006 irb(main):002:0> Time.now.zone => "GMT+9:00" irb(main):003:0> require 'date' => true irb(main):004:0> Date.parse(Time.now.to_s) => #<Date: 4908161/2,0,2299161>
2つ目のiconvの問題は、
に詳しく書きました。
RubyとCygwinのどっちが悪いのかわかりませんけど……。簡単そうに見えて、あちこち落とし穴があいているなあと思いました。