From: Ryunosuke Ohshima Date: 2000-04-28T17:06:06+09:00 Subject: [ruby-list:22188] Web Robot of Ruby 大島@北陸先端科学技術大学院大学です。 現在、Web用のrobotをrubyで書いています。以前一度書こうとして挫折した ことがあるのですが、Ruby Application Archiveのnet、uriなどのライブラ リの充実のおかげで、今回は何とか作り上げられそうです。 そのなかで、いくつかの不具合が出てきたので、報告・質問いたします。 1. rubyの正規表現について robots.txtのコメントを取り除く処理で line.sub!(/\s*\#.*/, "") としている部分でSegmentation faultが起きたので気づいたのですが、 以下のように非常に長い行で、正規表現がらみの処理をしようとすると、 Segmentation faultが起きてしまいます。 % ruby -ve '("#" * 245760).sub(/.*/, "")' ruby 1.4.3 (1999-12-08) [sparc-solaris2.7] Segmentation fault ruby自身のソースは読めていないので、とりあえず報告のみです。 2. Ruby Application ArchiveのLibraryであるuri(version 3.41)について a. 以下のようにカレント・ディレクトリ(".")が連続したURLでは、カレン ト・ディレクトリが残ってしまいます。 % ruby -ruri -e 'puts URIModule::URI.create("http://a/b/././c")' http://a/b/./c % ruby -ruri -e 'puts URIModule::URI.create("http://a/b/././../c")' http://a/b/c b. 以下のようにサイトのルートディレクトリ(?)で、カレント・ディレクト リを明示的に指定した相対パスがあると、スラッシュ("/")が挿入されてし まいます。(実害はあまりなさそうですが。) % ruby -ruri -e 'puts URIModule::URI.create("http://a/", "./g")' http://a/.//g bの問題は、RFC2396に出てくる例に対応して、「URI.create("http://a/", "/./g") => "http://a/./g"」とする処理のせいです。ところがRFC2396の意 図は、そもそもスラッシュで始まる相対パス(および絶対パス)の場合は、パ スの解釈はしない(パスを一意に解決しない)ことだと思われます。したがっ て、現在の対応方法は誤っていると思われるので、この部分は削除した方が 良いと思われます。(スラッシュで始まる相対パスおよび絶対パスを一意に 解決するかどうかは、また別問題ですが。) 以上、a、bの2点を修正したパッチが、以下のものです。 __patch for uri.rb__ diff -u1 uri_old.rb uri.rb --- uri_old.rb Fri Apr 28 15:13:11 2000 +++ uri.rb Fri Apr 28 15:42:33 2000 @@ -345,7 +345,4 @@ # remove current directories - apath.gsub!(%r|/\./|, sLASH) + apath.gsub!(%r|/(\./)+|, sLASH) apath.sub!(%r|/\.\z|, sLASH) - if path[0..2] == sLASH_DOT_SLASH - apath = sLASH_DOT_SLASH + apath - end __END of patch for uri.rb__ 3. html-parser(version 19990912)について HTMLファイルの解析に、昔のアーカイブには存在したhtml-parserを利用さ せていただいています。しかし、現在のRubyApplication Archiveには見当 たりません。便利だと思われるのですが、もうサポートがされていないので しょうか?それとも、他にhtmlに使えるパーサがあったりするのでしょうか? ちなみに2つほどバグと思われる部分を見つけたので、以下にパッチを添え ておきます。 __patch for sgml-parser.rb__ --- sgml-parser_old.rb Fri Apr 28 16:55:29 2000 +++ sgml-parser.rb Fri Apr 28 16:55:37 2000 @@ -53,3 +53,3 @@ def setliteral(*args) - self.literal = true + @literal = true end __END of patch for sgml-parser.rb__ __patch for html-parser.rb__ --- html-parser_old.rb Fri Apr 28 16:51:40 2000 +++ html-parser.rb Fri Apr 28 16:54:20 2000 @@ -249,3 +249,3 @@ if a == 'type' - if len(v) == 1 + if v.length == 1 v = v + '.' __END of patch for html-parser.rb__ 以上です。 大島 龍之介 ryu@jaist.ac.jp