1 名前:デフォルトの名無しさん mailto:sage [2009/07/03(金) 12:55:05 ] プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。 【Ruby1.9.1 は従来版とは異なる部分も多く、書籍や解説やライブラリのサポートがまだありません】 【自力で解決できない壁で悩むことのない最新安定版の Ruby1.8.7 での学習をお勧めします】 ※1.8.7 は 1.8 系と 1.9 系の橋渡しをするためのリリースで、1.9 系 の便利新機能の一部が利用可能です 関連スレやURLは>>2-5 あたりを見てください。Ruby on Rails の質問は Webプログラミング板の Rails スレへ。 ■質問する人へ 質問する前に次の3つをすること。ここで回答を待つよりそのほうが早い。 ・モジュール名やエラーメッセージでググる ・マニュアルで引っかかったクラスの記述を探す www.ruby-lang.org/ja/man/ ・FAQを一応読む www.ruby-lang.org/ja/man/?cmd=view;name=Ruby+FAQ 質問には以下を書くこと。へたくそな質問は再提出を要求される。 ・詳しい内容(「動きません」「うまくできません」では回答しようがない) ・エラーメッセージ(自力で訳さずなるべくそのままで) ・実行環境(OS名、Rubyのバージョン(ruby -v でわかる)) ・最終的にやりたいこと(もっとよい方法がある場合が多いので) 回答してくれた人には「ありがとう」のひとことをいってあげて。 ■回答する人へ 相手は初心者、根気よく育てるつもりで。質問がへたくそなのも大目にみてあげる。 それができないならこないこと(だって初心者スレだもん)。 ・既出な質問やFAQは「XXXを読め」でいいので、叩かない&怖がらせない。 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
104 名前:デフォルトの名無しさん mailto:sage [2009/07/06(月) 15:37:50 ] /usr/local/lib/ruby1.9/1.9.1/minitest/unit.rb:359:in `puke': incompatible character encodings: UTF-8 and ASCII-8BIT (Encoding::CompatibilityError) イライラ
105 名前:デフォルトの名無しさん mailto:sage [2009/07/06(月) 15:54:27 ] rrseをUTF8で使うにはどうすればいいですか?
106 名前:デフォルトの名無しさん mailto:sage [2009/07/06(月) 15:56:26 ] >>104 Ruby1.9向けテストで「なんかどっか書き間違ってる」時に出るやつだな 具体的にどのへんの行で詰まってるとかヒントぜんぜんなし かろうじて -v でテストのメソッド名が出るくらい
107 名前:デフォルトの名無しさん mailto:sage [2009/07/06(月) 15:58:00 ] >>105 rdoc のファイルと同じエンコーディングを -K とかで指定すればいいんじゃね
108 名前:デフォルトの名無しさん mailto:sage [2009/07/06(月) 16:09:03 ] >89 詳細な解説ありがとうございます。 ためになりました。 >88 >普通はIO.read(foo)とするな IOオブジェクトを簡単に読み取るにはこの方法を使えばいいんですね。 しかしopen-uriで拡張されたopenには同等のメソッドがありませんね。 URI.parse(foo)がIO.read(foo)と同等のことができますが、 URI.parseはHTTPリクエストのオプションをつけて動かすことができないんですよね。 URI.parse(uri, 'hogehoge' => 'foobar')のように。 アドバイスをいただき>84での問題は解決したのですが次の問題が発生してしまいました。。
109 名前:デフォルトの名無しさん mailto:sage [2009/07/06(月) 16:09:48 ] 下記のスクリプトがエラーを吐きます。 エラー文: `initialize': buffer error (Zlib::BufError) 困ったことに、通ったり通らなかったりします。 原因はたぶんですが2chのサーバが出力しているgzip圧縮したsubject.txtのほうだと思います。 板内のスレいずれかにカキコミがあればsubject.txtは書き換わるため、通る場合と通らない場合があるのだと予想しています。 しかしエラー文の意味がよく分からず、どのように回避すればよいのかが分かりません。 ちなみに拾ってきたgzip化subject.txtファイルをHDDに書き込んでアーカイバで開くと正しく読み取れています。 ============= ここから ============ require 'open-uri' require 'zlib' header = {'accept-encoding' => 'gzip'} url = 'gimpo.2ch.net/bakery/subject.txt ' # errorが一度も起きていない url2 = 'gimpo.2ch.net/kagu/subject.txt ' # errorが起きたり起こらなかったりする open(url, header) do |io| Zlib::GzipReader.wrap(io) do |gz| puts gz.read # urlの中身が出力されたあとにerrorが起きる end end ============= ここまで ============
110 名前:デフォルトの名無しさん mailto:sage [2009/07/06(月) 16:19:50 ] >>109 原因は一発でわかったが、そろそろあんま話したくない HTTPの知識のない状態でなに作る気なん?
111 名前:デフォルトの名無しさん mailto:sage [2009/07/06(月) 16:23:31 ] 別にいいじゃん。初心者スレなんだし。 答えるのいやなら他行けば?
112 名前:デフォルトの名無しさん mailto:sage [2009/07/06(月) 16:25:29 ] libwww-perlの轍踏む気にはならんね
113 名前:デフォルトの名無しさん mailto:sage [2009/07/06(月) 16:29:29 ] まあサイトや回線にどんだけ負荷かけて裁判起こされようが知ったこっちゃないが、 このへんがわかんないのはそもそも辛いと思うんだがどう open-uri で open してテキストを read する以外の事をしようと思うなら、別途勉強がいると思う
114 名前:デフォルトの名無しさん mailto:sage [2009/07/06(月) 16:36:36 ] 2chにアクセスするアプリケーションは自力で調べて作ってもらうというのが一応不文律だったりする
115 名前:デフォルトの名無しさん mailto:sage [2009/07/06(月) 16:43:06 ] >>109 open-uriは便利に見えるけどハマると厄介、net/httpの使い方をおぼえろ res = Net::HTTP.get_response(URI(url)) txt = res.body if res['content-encoding'] =~ /gzip/ txt = Zlib::GzipReader.wrap(StringIO.new(txt)) {|gz| gz.read } end puts txt >>110 原因を教えてもらえないだろうか? うちの環境では例外が発生しないので問題がわからない
116 名前:デフォルトの名無しさん mailto:sage [2009/07/06(月) 16:43:45 ] content-encoding見てないのはマズいと思うけど >>109 はHTTPレベルの問題じゃないような
117 名前:デフォルトの名無しさん mailto:sage [2009/07/06(月) 16:45:14 ] 付け加えておくとgzじゃないものを食わせた時は Zlib::GzipFile::Error: not in gzip format
118 名前:デフォルトの名無しさん mailto:sage [2009/07/06(月) 16:47:52 ] もなじら名乗ってない時点で問題外
119 名前:デフォルトの名無しさん mailto:sage [2009/07/06(月) 16:49:01 ] >109のスクリプトを書き間違えていました。 ============= ここから ============ require 'open-uri' require 'zlib' header = {'accept-encoding' => 'gzip'} url = 'gimpo.2ch.net/bakery/subject.txt ' # errorが一度も起きていない url2 = 'gimpo.2ch.net/kagu/subject.txt ' # errorが起きたり起こらなかったりする open(url, header) do |io| Zlib::GzipReader.wrap(io) do |gz| puts gz.read # urlの中身が出力されたあとにerrorが起きる gz.finish #<= 書き忘れ end end ============= ここまで ============ >110 2chのスレのdatを収集するプログラムです。 たまに気がつくとスレが1001になってdat落ちしてしまって、最後に開いた地点までしか読めなくなるのが悲しいので、 過去に開いたことがあるスレを定期的に拾いなおしてくれるプログラムを作りたいと思いまして。 プログラム自体は完成していて意図した通りに動くのですが、 転送量を少しでも削減したくてdatだけではなくsubject.txtを拾うときにgzip化しようと欲を出したらうまくいかなくなりました。
120 名前:デフォルトの名無しさん mailto:sage [2009/07/06(月) 16:54:41 ] スレ更新をせず書き込んでしまいました。 >113 一応、DLする度にsleep 1.0 を入れています。 これでは不十分でしょうか? >114 それは大変失礼しました。 今後は自力解決したいと思います。 >115 datの取得ではnet/httpを使っています。 一つのdomainから複数のファイルを拾うときにはnet/http, 1つのファイルを拾うだけならopen-uriというふうに使い分けていました。
121 名前:115 mailto:sage [2009/07/06(月) 17:17:01 ] header渡してなかった txt = URI(url).read(header) if txt.content_encoding.include?('gzip') :