Cygwin版Rubyでトラブルあれこれ

Cygwin用のバイナリは現在1.8.4がFTPに上がっています。

じゃあ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の問題は、

に詳しく書きました。


RubyCygwinのどっちが悪いのかわかりませんけど……。簡単そうに見えて、あちこち落とし穴があいているなあと思いました。