Lion になって困ったことのひとつが /usr/pkg/etc/mk.conf に ABI=64 と書いていると、 ruby-18-base の build に失敗すること。素で build すれば成功するので pkgsrc がやってるなにかが悪いんでしょうけど、 ABI=32 だと build は通るので pkgsrc だけが悪いんじゃなさそう。で、 ABI=32 で作った ruby18-base を入れようとすると
pkg_add: Warning: package `ruby18-base-1.8.7.352' was built for a platform: pkg_add: Darwin/i386 11.2.0 (pkg) vs. Darwin/x86_64 11.2.0 (this host) pkg_add: 1 package addition failed
とか怒られてインストール出来ないので ruby18-base のアップデートが出来ないのです。
ruby19-base なら問題なく build 出来るので、ここは一発 ruby19 に移行すべきなのですが、最早動かないと生きて行けないレベルの textproc/migemo が ruby19 に未対応なので、今まで我慢して Snow Leopard の時に build した ruby18 を使っていたのです。が、なにかの拍子に ruby18 を抜いてしまったので、せっかくだからと ruby19 対応の migemo を探すことにしました。
そしたら ruby19 用の patch を書いている人を発見!! なんだー、と拍子抜けしてこの patch を当てたのですが、何故か俺の Lion では動いてくれない。ということでいろいろ試行錯誤してみたらテキスト処理をしているところに force_encoding(“EUC-JP”) を足してあげれば大丈夫っぽいことが分かったので、俺の環境で動く patch を書いてみました。
前述の patch が当たっていることが前提ですが、こんな感じ。 tests で make check-TESTS すると 1 個だけコケ FAIL しますが、ざっと使った感じでは問題なく検索できてるので多分大丈夫でしょう、俺の環境限定ですが。
diff -ur migemo-0.40-ruby19/genchars.sh migemo-0.40-ruby19-pkgsrc/genchars.sh --- migemo-0.40-ruby19/genchars.sh 2011-11-08 16:36:12.000000000 +0900 +++ migemo-0.40-ruby19-pkgsrc/genchars.sh 2011-11-08 15:51:50.000000000 +0900 @@ -1,6 +1,6 @@ #! /bin/sh -ruby -rromkan -nle 'head = $_.split[0]; if /^\w+$/ =~ head then puts head else roma = head.to_roma; puts roma, roma.to_kunrei end' migemo-dict |uniq> tmp.ascii.words +ruby -rromkan -nle 'head = $_.force_encoding("EUC-JP").split[0]; if /^\w+$/ =~ head then puts head else roma = head.to_roma; puts roma, roma.to_kunrei end' migemo-dict |uniq> tmp.ascii.words # Get the top 500 frequent ngrams. for i in 1 2 3 4 5 6 7 8; do diff -ur migemo-0.40-ruby19/migemo-convert.rb migemo-0.40-ruby19-pkgsrc/migemo-convert.rb --- migemo-0.40-ruby19/migemo-convert.rb 2011-11-08 16:36:12.000000000 +0900 +++ migemo-0.40-ruby19-pkgsrc/migemo-convert.rb 2011-11-08 16:17:44.000000000 +0900 @@ -25,7 +25,7 @@ puts ";;" lines = readlines while line = lines.shift - if /^;/ =~ line + if /^;/ =~ line.force_encoding("EUC-JP") puts line else lastline = line @@ -36,9 +36,9 @@ dict = []; while line = lines.shift - if /^(#{HIRAGANA}+)[a-z]? (.*)/ =~ line || /^(\w+) (.*)/ =~ line + if /^(#{HIRAGANA}+)[a-z]? (.*)/ =~ line.force_encoding("EUC-JP") || /^(\w+) (.*)/ =~ line.force_encoding("EUC-JP") head = $1 - words = $2.split('/').map {|x| + words = $2.force_encoding("EUC-JP").split('/').map {|x| # remove annotations and elisp codes x.sub(/;.*/, "").sub(/^\((\w+)\b.+\)$/, "") }.delete_if {|x| x == ""} diff -ur migemo-0.40-ruby19/migemo-dict.rb migemo-0.40-ruby19-pkgsrc/migemo-dict.rb --- migemo-0.40-ruby19/migemo-dict.rb 2011-11-08 16:36:12.000000000 +0900 +++ migemo-0.40-ruby19-pkgsrc/migemo-dict.rb 2011-11-08 16:26:26.000000000 +0900 @@ -1,3 +1,4 @@ +# -*- encoding:euc-jp -*- # # Ruby/Migemo - a library for Japanese incremental search. # @@ -38,7 +39,7 @@ private def decompose (line) - array = line.chomp.split("\t").delete_if do |x| x == nil end + array = line.force_encoding("EUC-JP").chomp.split("\t").delete_if do |x| x == nil end key = array.shift values = array raise if key == nil @@ -83,7 +84,7 @@ class MigemoUserDict < MigemoDict def initialize (filename) super(filename) - @lines = @dict.readlines.delete_if {|x| /^;/ =~ x}.sort + @lines = @dict.readlines.delete_if {|x| /^;/ =~ x.force_encoding("EUC-JP")}.sort end def lookup (pattern) diff -ur migemo-0.40-ruby19/migemo-index.rb migemo-0.40-ruby19-pkgsrc/migemo-index.rb --- migemo-0.40-ruby19/migemo-index.rb 2011-11-08 16:36:12.000000000 +0900 +++ migemo-0.40-ruby19-pkgsrc/migemo-index.rb 2011-11-08 15:27:49.000000000 +0900 @@ -16,7 +16,7 @@ # offset = 0 while line = gets - unless line =~ /^;/ + unless line.force_encoding("EUC-JP") =~ /^;/ print [offset].pack("N") end offset += line.bytesize
これだけだとつまらない(?)ので、 textproc/migemo に対する patchも作ったので不法投棄。ホントはちゃんと send-pr すべきなんだろうけど、元の patch のライセンスがよくわからないのと、この patch が本当に必要なのかもわかんないのでこんな形で公開してみました。