懸案だった自宅環境のRuby 2.0への移行対応を行った。
本ブログのブログエンジンや自作のスクリプト類をいまのいままでRuby 1.8で運用していたわけだが、さすがに旧バージョンのままで頑張るのも限界があろうと感じていたところにもってきて、ついにFreeBSD(ports)も Ruby 1.8をサポートアウト。待ったなしのプレッシャーのもと、連休を利用して新バージョンへの移行作業を行った。
移行先は1.9を飛ばして2.0。OS X MavericksもRuby 2.0を標準搭載してきたということもあり、わざわざ途中バージョンを経由することもなかろうということで決定。
とりあえずインタープリタやぶらさがるportsをコンパイルしなおし。 /etc/make.conf には DEFAULT_VERSIONS=ruby=2.0 とか書いてみたのだが、本当にこれで良いのかはよく知らない。
修正が必要だった場所は以下のとおり。
TMailが非対応
メール解析ライブリTMail。requireした時点で "RegexpError: /…/n has a non escaped non ASCII character in non ASCII-8BIT script" とかいうエラーを吐く。Ruby のスクリプトデフォルトエンコーディングがUTF-8 になったことと関係がありそうなのだが、ちょっとソースを追ってみて断念。TMailではなくてMailライブラリで必要なことができることがわかったので、そちらを使うように修正。
require構文の仕様変更
スクリプトの中で、同一ディレクトリにあるソースファイルを require 'foo.rb' と記述していたのが2.0ではエラーになった。どうやらrequire './foo.rb'と書かなければならないように変更したらしい。
jcode, KCODEの廃止
Ruby は1.9から文字エンコーディングまわりの仕様が大幅に変わっているので、このあたりをかなりの手間をかけて修正しなければならないのではないかと恐れていたのだが、いまのところ require 'jcode', $KCODE=UTF-8を単純に削除するだけでうまく行っているようにみえる。
あとはLC_ALL=Cな環境でUTF-8文字列を扱おうとするとEILSEQになるようになったのが落とし穴だった。コマンドラインからは動くのにcgiが落ちるので少し悩むことになった。
以上、おぼえがき。