Rubyについて Part 23

このエントリーをはてなブックマークに追加
618デフォルトの名無しさん
↓ということなので,本スレに投げてみます

586 :デフォルトの名無しさん :sage :2006/09/05(火) 10:34:49
環境:ruby 1.8.4 (2005-12-24) [i386-mswin32]
WEBrick使ってるんですけど、特定のホストで例外が起きます。
調べてみると、ホスト名の認識がまずいようで、

URI::parse('(p)http://shacho_soft.at.infoseek.co.jp/diablo_calc/calc.html')

上記のホストで、ホスト名にアンダースコアが含まれてるために host ではなくて registry が設定されてしまい
InvalidURIErro例外が発生します。WEBrick的には HTTPStatus::BadRequest です。

uri/common.rb の↓の部分でアンダースコアが含まれてないから、上手くいかないんだと思うんですけど

DOMLABEL = "(?:[#{ALNUM}](?:[-#{ALNUM}]*[#{ALNUM}])?)"
TOPLABEL = "(?:[#{ALPHA}](?:[-#{ALNUM}]*[#{ALNUM}])?)"
HOSTNAME = "(?:#{DOMLABEL}\\.)*#{TOPLABEL}\\.?"

こういうのって、きっちりRFCにしたがってるんだと思いますが
どうにかして上手く回避する方法はないでしょうか?

たぶん、アンダースコアを含めれば上手くいくんでしょうけど、
この手の問題って、過去に問題になってる気がするので、賢い方法があったら教えてください

588 :デフォルトの名無しさん :sage :2006/09/05(火) 12:58:45
>>586
俺もいつも困ってるんだが、なんかうまい方法ないかねえ。

589 :デフォルトの名無しさん :sage :2006/09/05(火) 13:10:33
>>588
本スレにぶん投げるといいことあるかも
619デフォルトの名無しさん:2006/09/18(月) 19:57:59
死ね
こっちは慈善事業でやってんじゃねえんだ
620デフォルトの名無しさん:2006/09/18(月) 20:15:23
Matz is nice, so we are nice.
621デフォルトの名無しさん:2006/09/18(月) 20:30:19
>>618
WebrickはRFCに沿ったURIしか対応していないのでムリ
622デフォルトの名無しさん:2006/09/18(月) 21:27:29
URIってアンダースコアだめなんか!?
623デフォルトの名無しさん:2006/09/18(月) 21:29:17
だめだお。ハイフン使おう。
624デフォルトの名無しさん:2006/09/18(月) 21:36:32
URIじゃなくてホスト名じゃなかったっけ?
625デフォルトの名無しさん:2006/09/18(月) 21:59:27
すみません、初心者です。
ほんとに初歩の部分やってます。
WINDOWSのメモ帳にプログラムを記述して、
ruby.rbってファイル名で保存すると、
ruby.rb.txtっていう、テキスト型ファイルになってしまうんですが・・・
どうしたらよいのでしょうか?
626デフォルトの名無しさん:2006/09/18(月) 22:00:55
死ね
こっちは慈善事業でやってんじゃねえんだ
627デフォルトの名無しさん:2006/09/18(月) 22:01:51
>>626
じゃあどんな事業でなさってるんですか?
628デフォルトの名無しさん:2006/09/18(月) 22:04:12
メモ帳捨てろ
629デフォルトの名無しさん:2006/09/18(月) 22:04:56
>>628
何で命令形なんですか?
630デフォルトの名無しさん:2006/09/18(月) 22:05:46
>>625
Windowsの基礎知識。

Windowsは初期設定で

「登録されているファイルの拡張子は表示しない」

という設定がオンになってるのでオフにしる

どこで設定を変えるかはWindowsのバージョン込みでググれ
631デフォルトの名無しさん:2006/09/18(月) 22:05:58
>>629
口答えするな。

口から糞を垂れる前と後にsirと言え!
632デフォルトの名無しさん:2006/09/18(月) 22:07:22
>>631
口答えじゃなくて質問なんですが?
633デフォルトの名無しさん:2006/09/18(月) 22:07:24
解りにくいか。追記:例えばWin2000なら

「Windows2000 登録されているファイルの拡張子は表示しない」な
634デフォルトの名無しさん:2006/09/18(月) 22:09:34
>>630
できました。親切なご回答ありがとうございました。

>>633
ありがとうございます。
635デフォルトの名無しさん:2006/09/18(月) 22:46:59
>>631
sirrah
636デフォルトの名無しさん:2006/09/18(月) 22:48:03
Windowsユーザーは軽視されてるよね
次のバージョンからJAVAで開発してくれない?
637デフォルトの名無しさん:2006/09/18(月) 22:53:24
>636
JRubyが〜あるじゃないか〜♪
638デフォルトの名無しさん:2006/09/18(月) 23:02:28
>>618
require 'uri.rb'

module URI
 def self.parse(uri)
  scheme, userinfo, host, port,
   registry, path, opaque, query, fragment = self.split(uri)

  if scheme && @@schemes.include?(scheme.upcase)
   @@schemes[scheme.upcase].new(scheme, userinfo, [host, registry].join(), port,
                  nil, path, opaque, query,
                  fragment)
  else
   Generic.new(scheme, userinfo, [host, registry].join(), port,
         nil, path, opaque, query,
         fragment)
  end
 end
end

u = URI::parse('http://shacho_soft.at.infoseek.co.jp/diablo_calc/calc.html')

puts u.host

これでいいのかは知らん。
639デフォルトの名無しさん:2006/09/18(月) 23:29:59
>>638
ダメっぽい
URI::parse("http://foo_bar.example.jp:80/") # => URI::InvalidURIError
640デフォルトの名無しさん:2006/09/19(火) 00:10:31
デスヨネ。

やはり定数を弄るしかないか。
641デフォルトの名無しさん:2006/09/19(火) 00:38:24
↓はどう?定数の優先度で無理矢理回避してるんだけど…

require 'uri'

module URI
  ABS_URI = Regexp.new(REGEXP::ABS_URI.to_s.gsub(/-a-zA-Z\\d/, '-_a-zA-Z\d'))
  REL_URI = Regexp.new(REGEXP::REL_URI.to_s.gsub(/-a-zA-Z\\d/, '-_a-zA-Z\d'))
end

u = URI::parse('http://shacho_soft.at.infoseek.co.jp/diablo_calc/calc.html')
puts u.host
642デフォルトの名無しさん:2006/09/19(火) 03:14:23
そして二ヵ月越しでakrを無視するmatz
643デフォルトの名無しさん:2006/09/19(火) 09:18:31
今から帰るからそしたらガウスなんとかで円周率やってみる。
644デフォルトの名無しさん:2006/09/19(火) 14:22:58
>>641
_ だけならうまくいきそう

同じように mimetex 使ってるページでもはまってるんですが
http://www.forkosh.dreamhost.com/cgi-bin/mimetex.cgi?\normalsize\displaystyle%20%20%20%20%20%20%20%20%20%20%20\sum_{n=0}^\infty\frac{x^n}{n!}
これも同様に回避できますか?
645デフォルトの名無しさん:2006/09/19(火) 18:02:40
2ch のクラスライブラリでおすすめってありますか?
646641:2006/09/19(火) 18:18:39
>>644
http://www.forkosh.com/mimetex.html
とりあえず↑のページを表示して、Bad URLにならないよう直したのが↓のコード

require 'uri'
module URI
  DOMLABEL = "(?:[#{PATTERN::ALNUM}](?:[-_#{PATTERN::ALNUM}]*[#{PATTERN::ALNUM}])?)"
  PCHAR = "(?:[#{PATTERN::UNRESERVED}:@&=+$,\\[\\]\\{\\}`]|#{PATTERN::ESCAPED})"
  URIC = "(?:[#{PATTERN::UNRESERVED}#{PATTERN::RESERVED}\\^\\{\\}\\\\\\]|#{PATTERN::ESCAPED})"
  X_ABS_URI = PATTERN::X_ABS_URI.gsub(PATTERN::DOMLABEL, DOMLABEL).gsub(PATTERN::URIC, URIC).gsub(PATTERN::PCHAR, PCHAR)
  X_REL_URI = PATTERN::X_REL_URI.gsub(PATTERN::DOMLABEL, DOMLABEL).gsub(PATTERN::URIC, URIC).gsub(PATTERN::PCHAR, PCHAR)
  ABS_URI = Regexp.new('^' + X_ABS_URI + '$', Regexp::EXTENDED, 'N')
  REL_URI = Regexp.new('^' + X_REL_URI + '$', Regexp::EXTENDED, 'N')
end


DOMLABEL はホスト名の部分。オリジナルに _ を追加
PCHAR はパス名の部分。MSNの画像で Bad URL になるんで []{}` を追加
URIC はクエリーの部分。mimetexで Bad URL になるんで ^{}\ を追加

ほかにエラーになる文字があったら自分で追加してくれ
それと3連続 gsub がカッコ悪いんで、スマートな書き方あったら誰かよろしく

っつか、>>618で元の質問したの俺なんだよなぁ
コピペ張られて自分で答えるという、一人やらないかウホッな気分
647644:2006/09/19(火) 18:50:32
>>646
おおお
うまくいきました
サンクス
648デフォルトの名無しさん:2006/09/19(火) 19:23:28
649デフォルトの名無しさん:2006/09/20(水) 00:32:45
標準ライブラリの問題点も自分ですぐに直せるのがちょっと良いところかも

逆にいえば、自分で直さないといけないのが辛いところ