Ruby 2.0 になって、Ruby を使っているアプリケーションが動かなくなった。困った。 そんなアプリケーションと格闘しているバカ(である私)がつけた備忘録である。
ftpup は前田修吾さんによる Ruby アプリケーションで、 ローカルのファイルを ftp でリモートにアップロードする機能をもつ。 さて、手元の Windows の Ruby を 2.0 にすると、こんな警告が出るようになった。
C:/home/bin/homepage.ftpup:3:in `
Ruby で Namazu 検索語変換プログラムを作っていたがこれが動かなくなった。
/usr/local/lib/ruby/site_ruby/2.0/rubygems/core_ext/kernel_require.rb:51:in `require': cannot load such file -- iconv (Load Error), referer: http://www.ne.jp/asahi/music/marinkyo/prezento/sercxilo.html.ja from /usr/local/lib/ruby/site_ruby/2.0/rubygems/core_ext/kernel_require.rb:51:in `require', referer: http://www.ne.jp/asahi/music/marinkyo/prezento/sercxilo.html.ja from namazu.cgi:4:in `<main>',referer: http://www.ne.jp/asahi/music/marinkyo/prezento/sercxilo.html.ja Premature end of script headers:namazu.cgi, referer: http://www.ne.jp/asahi/music/marinkyo/prezento/sercxilo.html.ja
これは、iconv がなくなったから、という理由である。 http://magazine.rubyist.net/?0041-200Special-note から引用する。
拡張ライブラリ iconv が削除されました。[#6322] 今後は String#encode や Encoding::Converter、あるいはどうしても iconv が必要な場合は iconv.gem を用いてください
実際の変換にはhttp://d.hatena.ne.jp/takehikom/20130224/1361711345を参考にした。 私の場合、Ruby 1.8 は非互換でよい。
Ruby 1.9/2.0対応で良ければ:
「require "iconv"」は,取り除きます.
「Iconv.new("sjis", "utf-8").iconv(str)」は,「str.encode("sjis")」に置き換えます.
「Iconv.new("iso-2022-jp", "utf-8").iconv(str)」は,「str.encode("iso-2022-jp")」に置き換えます.("jis"では失敗しました.)
「Iconv.new("euc-jp", "utf-8").iconv(str)」は,「str.encode("euc-jp")」に置き換えます.("euc"では失敗しました."eucjp"はOKでした.)
私が作ったスクリプトの場合、下記の箇所を直して正常に起動するようになった。
修正前
query_str += key + "=" + CGI.escape(Iconv.conv("eucJP", "UTF-8", a_value)) + ";"
修正後
query_str += key + "=" + CGI.escape(a_value.encode("euc-jp")) + ";"
Ruby で Google じゃんけんプログラムを作っていたがこれが動かなくなった。
rps.cgi:3: warning:
variable $KCODE is no longer effective; ignored, referer:
http://www.ne.jp/asahi/music/marinkyo/js/papero-tondilo-sxtono.html.ja
/usr/local/lib/ruby/site_ruby/2.0/rubygems/core_ext/kernel_require.rb:51:in
`require': cannot load such file -- iconv (LoadError), referer:
http://www.ne.jp/asahi/music/marinkyo/js/papero-tondilo-sxtono.html.ja
\tfrom /usr/local/lib/ruby/site_ruby/2.0/rubygems/core_ext/kernel_require.rb:51:in `require',
referer: http://www.ne.jp/asahi/music/marinkyo/js/papero-tondilo-sxtono.html.ja
\tfrom rps.cgi:7:in
`
Premature end of script headers: rps.cgi, referer:
http://www.ne.jp/asahi/music/marinkyo/js/papero-tondilo-sxtono.html.ja
さて、私のプログラムでは require 'iconv' の行はあったが、Iconv メソッドは使っていなかった。 いったいどうしたらいいのかわからず上記行をコメントアウトしただけで走らせると、 次のエラーログが記録された。
/usr/local/lib/ruby/2.0/cgi/util.rb:36:in `escapeHTML': undefined method `gsub' for nil:NilClass (No MethodError)
結局、最初の2行を次のようにしただけで解決した
#!/usr/local/bin/ruby -w
# -*- coding: utf-8 -*-
まりんきょ学問所 > Ruby の浮き輪 > Ruby 2.0 で動かなくなったスクリプト