トップ 追記 RSS feed

ただのにっき


2009-01-07(水) [長年日記]

tDiary: ruby 1.9.1対応でdefault_externalを使うのは適切か?

tDiaryのtrunkで、ruby 1.9.1対応のためにdefault_externalを設定している件に関して、ZnZさんからツッコミがあった:

default_externalの影響範囲がよくわからないけど、tdiaryのここで使うのは適切なのだろうか?

ツッコミ欄に書くには長くなるので、こっちで書いてみる。ホントは書きたくなかったんだけど、なぜかというとるびまに書くネタがなくなっちゃうから!(ぉ もっとも、ruby 1.9のエンコードに関してちゃんと理解しているとは言いがたいし、ここでツッコミ受けたほうがいいでしょう。

実行中のruby 1.9全域に影響するエンコーディングには3種類ある(たぶん):

  • scriptエンコーディング
  • default_internal
  • default_external

scriptエンコーディングは、*.rbファイルそのもののエンコーディングで、これはマジックコメントを入れれば対応できる。もしくはevalなどする場合には、その文字列のエンコーディングを適切に設定してやれば良い。これはOK。tDiary trunkの*.rbにはすべて以下の1行が挿入済みだ:

# -*- coding: utf-8; -*-

default_internalはrubyの内部処理(?)におけるデフォルトで、あんまり考える必要はないと思ってる。だから今のところスルー。

default_externalは、プログラムの「外界」でどんなエンコーディングが使われているかの標準値で、基本的にはインタープリターがlocaleなどを参考に起動時に決定するし、-Kなどのパラメタでも制御できる。tDiaryで問題になるのはコレ。

tDiaryが使われる状況は「ふつーのレンタルサーバ」を想定している。「外界」の環境設定はレンサバ屋さんが自分たちの都合で設定していて、ユーザには変更できないことが多い。また、tDiary設置者のリテラシを考慮すると、shebangに適切なオプションが指定されることも期待できない(そういう縛りを増やすとサポートの手間が増えて開発が滞るのである)。

また「とりあえずrubyだけ入っていれば動く」というのを最低限の環境として想定していて、それもできる限り古いrubyもサポートしたい。実際、1.8.7が入っているサーバはまだまだ少なくて、(セキュリティ的に好ましくないとはいえ)1.8.2~1.8.6がゴロゴロしているのが実態だ。この上にruby 1.9対応を付け加えるのがtDiary 2.3系開発のミッション。

default_externalに依存せずに「外界」のエンコーディングを制御する方法としては、例えばファイル等の読み出し時に下記のようにに指定する方法があるわけだが:

open( 'hoge', 'r:utf-8' )

ちょっと古いruby 1.8系だとこんなオプションは受け入れられない。そもそも、tDiaryはしばらく(EUC-JPな)2.2系と(UTF-8な)2.3系が並存するし、rubyも1.8系と1.9系が長く並存するだろう。tDiary用のプラグインを書く人には、これらの組み合わせにできるだけ対応して欲しいし(tDiary 2.2とruby 1.9の組み合わせはないけど)、そのためのハードルは低く保ちたい。

となると、以下のように書くだけで、読み込んだファイルは(ruby 1.9では)UTF-8だと認識して欲しいわけだ:

open( 'hoge' )

現在のtrunkのコードには(試行錯誤の結果として)「'r:utf-8'」が入っているが、default_externalが期待通りのデフォルト値を設定してくれることがわかれば、これは元に戻してしまいたい。

逆に言えば、利用者やプラグイン開発者の負担になることなく外界のエンコーディングをUTF-8に設定できるなら、default_externalなど使わずに済ませたい。

というのも、CGI以外のプラットフォームで他のアプリケーションと同じインタープリタ上でtDiaryを動かすような場合、default_externalを勝手に変更するのはまずいからだ。もっとも、default_externalの値に何かを期待するアプリを同じインタープリタ上で動作させるのはそもそも無茶だとは思うけど。

というわけで、利用者やプラグイン開発者に「外界」のことを意識させずにUTF-8で統一されたエンコーディングを使わせたいので、external_encodingを設定している、というのが現在の状況。

Tags: tDiary ruby
本日のツッコミ(全2件) [ツッコミを入れる]

# なかだ [せめてRUBY_VERSIONで分岐はやめてください。 evalはBinding渡しても無理ですか?]

# ただただし [RUBY_VERSION分岐は暫定措置なので、たぶんなんとかします(^^; 後半の意味がよくわかりません。eval..]


2009-01-05(月) [長年日記]

FirefoxにいくつかAdd-onsを入れた

先月移行した時は「PCが非力なのでアドオンは最小限に」とか言ってたわりには、いつの間にか増えているのがFirefoxの怖いところだよなぁ。これ以上入れないように自重しなくては……。

あれから追加したのはこんな感じ*1:

FireGestures

マウスだけでだらだらブラウズしたい時のために、マウスジェスチャをサポートさせた。Sleipnirでも標準搭載で、けっこう使ってたし。

IE Tab

とある社内システムがIEオンリーだったので泣く泣く入れた。この強烈な敗北感はなんだ。

Tombloo

Tumblrユーザ必須。まぁ、これがあるとないのとでは、スピードが10倍くらい違うしね……。

keyconfig

キーボードショートカットを変更するもの。マウスに持ち変えるのが大嫌いなおれには必須装備。というか、体になじんだSleipnir互換キーアサインを実現するために。Mozillaの公式サイトに置いてなくて、こんな掲示板にひっそり置いてあるとは思いもせず、モノを探して右往左往してしまった。

これでいくつかのブックマークレットをキーボードから呼び出せるようにしたので、かなり快適になった。

Greasemonkey: LDR SHIFT+CTRL key is invalidated

LDRのキーボードショートカットは大変便利なのだが、Ctrl+Shiftでフィードを移動してしまうアサインだけはひどすぎるので、今まではそれを殺すブックマークレットを使っていた。上のkeyconfigでそのまま引き継ごうと思ったんだが、そもそもonLoadで自動実行できるべきだよな。

ということで探したらあったのだった。これは助かる。


1/7追記: 舌の根も乾かぬうちに以下を追加。際限ないな……。

RefControl

「fc2ブログの画像がLDRで表示されなくて不便」と愚痴ったら教えてもらった。ようするにrefererが自サイトでない場合に画像を表示させない(セコい)サイトを騙すアドオン。Yahoo!ブログなんかでも有効だ。

しっかし、こういうのが一般化するのは、アクセス解析屋の悪夢だのぅ。

FaviconizeTab

指定したタブにタイトルを表示させない(faviconだけ表示する)ようにするアドオン。faviconだけ見れば判断できるいくつかのサイトでこれを有効にして、タブバーをすっきり。

Tags: firefox

*1 パワーに余裕がある)自宅機だけに入れてるアドオンは他にもいくつかあるけど割愛。


2009-01-04(日) [長年日記]

tDiary: ruby 1.9.1RC1対応

やっと少し時間がとれたので、ruby 1.9.1対応をしている。

「shebangにエンコード指定を期待しない」という方針のため、あちこちに手を入れることになってしまったが、それでも地雷がなくならないので、RC1から入ったEncode::default_external=を使ってしまった(禁断の技?)。

もっともそれでもエンコード問題が消えず、泣きそうになりながら延々と悩んだのだが、なんてことはない、元になったパッチでNKF::nkfにあててあったワークアラウンドが悪さをしていたというオチだった。最新のrubyでは不要なパッチだったという。とほほ。ひょっとするとEncode::default_external=いらないかも。

これでcoreはそれっぽく動くようになったと思う。わかっている問題は:

  • migration周りがまだ動いていないので2.2からの直接移行はできない
  • ruby 1.8系での動作が未確認
  • evalの仕様変更の余波でsecureモードがまったく動かなくなっている

特に最後のは頭を抱えている。eval内でローカル変数が定義できないのは相当痛い。

とりあえず次はpluginをいじろう。

Tags: tDiary

トップ 追記 RSS feed