bdb、rcov、WWW::Mechanize、ruby1.6
bdb-0.5.8と最近のRuby 1.9の組み合わせがうまくない(rb_frame_this_funcとGetWriteFileがどこかのタイミングでなくなった)ようなのでパッチを送ってみる。と、いつも通り10分程で返事がくる。なんかすごい。
rcov.debがそろそろ欲しいかもなと思ってwnppを見たらすでにあった。よく考えるとapt-cache show rcovしかやってなくてsearchしてなかった。librcov-ruby{1.8,1.9}が提供されているが、ちょっと古いかな。WWW::Mechanizeもdebが欲しいなと思ったんだが…… これはまだなさそうかな。だが、時間切れ。
自分の分のRemoveRuby16対策はだいたい終えたつもり。そろそろ削除依頼が出される時期かな。
関東でもRuby勉強会を
RHG勉強会は今やHaskellなんだそうで、Ruby勉強会が定期的に行われているのは関西なんだそうだ。で、IRCで関東でもやりたいねという会話がなされていた。
Railsに特化しないようなのであれば参加したいかも。Railsも興味はあるけど、人々が集まるならもっと間口が広いほうが面白そうなので。
個人的にはRubyForgeやRAAの新着・更新の追っかけとかRuby 1.9の動向とか、そういう話が聞ける場があるとうれしいかな。RubyForgeやRAAの新着情報くらいは見ているけど、実際に試してみるとか難しいし、まったく知らないものは素通りしてしまうから。あとは短期集中でチュートリアル的なのとか(それこそRailsで◯◯みたいなのとか)。
まあ、開催されたとしても実際に参加できるかどうかっていうのはスケジュールとかでどうなるか分からないのだけど。(だいたい都内は遠いんだよなあ……。)
日本Rubyカンファレンス2006
6月10日〜11日に日本Rubyカンファレンス2006が開催とのこと。参加予定。
ローカル変数
$ ruby -e '
a = 1
b = 2
t = Thread.new(a) {|x| y = a; p [a, x, y]; b = 0; Thread.stop; p [a, x, y]}
sleep 1
p b
a = 2
t.run
t.join'
[1, 1, 1]
0
[2, 1, 1]
$ ruby -e '
i = nil
t = Thread.new {0.upto(10) {|i| Thread.stop}}
t.run; p i
t.run; t.run; p i
t.run; t.run; t.run; p i
5.times {t.run}; p i
t.run'
1
3
6
10
-e:8:in `run': killed thread (ThreadError)
from -e:8
ダメなホスト名のURIを作ってみる 2
require "uri"
BAD_URI = "http://dame_yo.example.jp/atom.xml"
in_uri = BAD_URI
begin
uri = URI.parse(in_uri)
rescue URI::InvalidURIError
begin
tmp_uri = URI.escape(in_uri)
uri = URI.parse(tmp_uri)
rescue URI::InvalidURIError
m = %r{\A(https?://)([^/]+)(.*)}i.match(tmp_uri)
uri = URI.parse(m[1] + "dummy" + m[3])
c = /\Ahttps/ =~ m[1] ? URI::HTTPS : URI::HTTP
uri = c.new(*URI::Generic.component.collect {|x| x == :host ? m[2] : uri.send(x)})
# または: uri.instance_eval {set_host(m[2])}
end
end
p uri #=> #<URI::HTTP:0xfdbe12ef8 URL:http://dame_yo.exmaple.jp/atom.xml>
時々「エラーになっちゃってまいるのよ」というメールをもらう*1。許容する文字を指定できるようにするとか、そういうのが必要なのかなあとも思うのだけど、そうするには少なくともschemeは限定しないとならないし、schemeによってはそううまくいくかどうか……。URI.parse的なものはあきらめてもらって、文字チェックをしないURI::HTTP.buildみたいなものを設けるほうがよいだろか。とかなんとかで、いまいちどうすればいいものだか分からない。
*1 「ブラウザでは見られるだろう?」とかも。でもブラウザとライブラリじゃあ扱いを同じにはできないよなあ。
プログラミングRuby 第2版
むむ! プログラミングRuby 第2版 言語編と同ライブラリ編が出るのか。買わねば。
Rubyist Magazine 13
お、いよいよHotlinksに咳さん登場だ。
雑誌拾い読みメモ: 日経ソフトウェア 2006.03号 1
「Railsアプリケーションを日本語化しよう」という記事の「ステップ1」に以下のような記述があった。
まず、RailsでのRubyの動作モードを、データベースに合わせてUTF-8モードに変更します。(略)environment.rb(略)を開き、先頭に以下のコードを追加してください。
$KCODE = 'u'
$KCODEは、Rubyの処理する文字コードを指定する特別な変数で、uはUTF-8を表します。
この設定によりRubyの動作モードがUTF-8モードになります。
[日経ソフトウェア 2006.03号(68ページ)より引用]
以前も同様の説明を読んで、一般的にそういうものなのかなあと疑問に思ったのだった。というのも$KCODEの指定は正規表現のマッチの仕方を変えてしまうので、副作用が大きすぎるのではないかと思えるので。
で、実際にはRailsでどういう対応がなされているのかとざっくり調べてみたところ、直接的にはactionpack/lib/action_view/helpers/text_helper.rbで定義されているtrancateメソッドで文字列の切りつめのためにString#splitに//を渡して文字に分割した後にArray#joinで必要な長さの部分文字列を得るというのをやっている程度に見える。
その他、検索した中では次のようなのが見つかった。
$KCODE = 'n'だと、xsd:base64になっちゃうみたい。
ActionWebServiceというかSOAP4Rかな。前からこうでしたっけ?
[Journal In Time - ActionWebServiceで日本語を扱うには$KCODE = 'u'が必要より引用]
$KCODEを指定することによりRailsのエラー画面で文字化けしなくなったり、正規表現で.がマルチバイト文字にマッチするようになる。
[UTF-8で運用する :: wiki.rails2u.comより引用]
Railsをいったんおいて、Rubyとしてはどうなのかとソースをgrepしてみたところ、正規表現のマッチが変わるのと、String#inspectでの出力の仕方が変わる程度に見える(出力が自動的に変換されるとかはRubyとしては当然ない)。この正規表現のマッチというのは引用にある「.」の動作やtrancateメソッドで用いられている//の動作のこと。標準添付のライブラリの中には$KCODEを参照しているものもあるし、TMailも一部で参照してはいるが……。
Ruby全体としての影響範囲は限定されている一方で正規表現という点ではけっこう大きな変化がみられるわけで、そう考えると$KCODEによって設定されるのは「Rubyの動作モード」といったものではないし、影響の範囲を知らせずに呪文のように「$KCODE = 'u'」と説明してしまうこの記事のような書き方はいまいちなのではないかなと思える(他方、記事の後に引用した二つのテキストでは限定的に説明されている)。
まあ、そういう記述が必要な場面はあるのだろうと思うのだけど(あるいはアプリケーションを開発するにあたって$KCODE = 'u'を前提にするのはアリだとは思うけど)、それにしても「正規表現の動作が変わるよ」などの注釈があれば、というよりもなぜそうするのについての説明があれば、変に誤解されずにすむと思うのだけどなあ。

