リンク: [ホーム] [自己紹介] [リンク集] [アルバム] [ソフトウェア] [発表文献] [その他]

まさおのChangeLogメモ / 2006-05-12

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31

2006-05-12 Fri

* 失意體前屈

http://zh.wikipedia.org/wiki/Orz
中国語でこう書くとは知らなかった…。。。

漢字で書いた方が雰囲気がでてる。

というか、
さっきMixiの英語系コミュニティで「orzってよく見るんですけど、どう
いう意味なんですか?」ってトピックが立っていたので、おもわず爆笑…。

* Perl (URI)

相対URLの展開の問題でちょっとはまったのでメモ。

use URI;
$url1 = URI->new("http://www.example.com/");
$url2 = URI->new("../")->abs($url1);
print "$url1\n";
print "$url2\n";

上記のプログラムの出力は以下のようになる:

http://www.example.com/
http://www.example.com/../

これはあまりうれしくない。というか、手元のFireFox等のブラウザの挙
動だと、普通こういう記述のURL表記では同一の出力を返す。

しかも、ちょっと調べてみたところでは、仕様の記述からは、これは同一
のURLに展開されることが期待できるように読める:

5.2. Resolving Relative References to Absolute Form

      g) If the resulting buffer string still begins with one or more
         complete path segments of "..", then the reference is
         considered to be in error. Implementations may handle this
         error by retaining these components in the resolved path (i.e.,
         treating them as part of the final URI), by removing them from
         the resolved path (i.e., discarding relative levels above the
         root), or by avoiding traversal of the reference.
http://www.ietf.org/rfc/rfc2396.txt

しょうがないなあと思って、URIモジュールの中身を読んでいたら、
$URI::ABS_REMOTE_LEADING_DOTS という変数が用意されていて、こいつ
に TRUE を返すような値を入れると、ここで期待した結果(上記の例が同
一の出力)となる模様。

PerlのURIモジュールはなぜに、こっちの方式がデフォルトではないのだろうか??
この現象にはまる人はそこそこいそうに思えるんだけど…。
歴史的事情かしらん。




ちょっと検索してみると、モジュール作者自身が議論しているメールがあっ
た: http://www.mail-archive.com/libwww@perl.org/msg03762.html
根拠は上記RFCのAppendixにあったらしい。

しかし、さらに検索してみると、上記RFC自体の改訂が進み、現在は
RFC3986として公開されている模様:
http://www.gbiv.com/protocols/uri/rev-2002/issues.html
http://www.ietf.org/rfc/rfc3986.txt

上記の内容はあきらかに精密な擬似コードを使った説明に書き直されてお
り、該当の相対パス処理についても実装依存にならないような仕様になっ
た:

5.4.2. Abnormal Examples

   Although the following abnormal examples are unlikely to occur in
   normal practice, all URI parsers should be capable of resolving them
   consistently. Each example uses the same base as that above.

   Parsers must be careful in handling cases where there are more ".."
   segments in a relative-path reference than there are hierarchical
   levels in the base URI's path. Note that the ".." syntax cannot be
   used to change the authority component of a URI.

      "../../../g" = "http://a/g"
      "../../../../g" = "http://a/g"

というわけで、時間があったらバグ報告してあげるとよさげ。

(2006-05-22追記) バグ報告しといた:

Ruby: http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/42215
Perl: http://www.nntp.perl.org/group/perl.libwww/6719