1 名前:デフォルトの名無しさん [2009/06/28(日) 16:29:28 ] オブジェクト指向スクリプト言語Rubyについて扱うスレッドです。 前スレに変なのが沸いて流れてしまいましたが、まったりと行きましょう。 Ruby Home Page www.ruby-lang.org/ja/ = 前スレ Rubyについて Part 35 pc12.2ch.net/test/read.cgi/tech/1238194350/ 過去スレ・関連スレは >>2-
192 名前:デフォルトの名無しさん mailto:sage [2009/07/09(木) 16:30:29 ] phpunit なら PHPDoc をある程度自動生成するのにね yardoc を生成するのを作ったら
193 名前:デフォルトの名無しさん mailto:sage [2009/07/09(木) 16:51:54 ] いや、その、なんていうかだな、yard の @params のクラス名称の8割くらいの用途は、 実は引数の名称で用が済むんだよ 引数の名称に data とか e とか使いまくってるならまだしも、 普通は相当の意味のある引数名になってるだろ def hoge(str, params) って書いてあったら、str はよっぽどでなけりゃ String だし、 params は意表をつく攻撃をする意図がなければたいてい Hash だろ それ以上の情報は @params のクラス名称でもわからんわけだしな
194 名前:デフォルトの名無しさん mailto:sage [2009/07/09(木) 17:02:31 ] それゆえに真面目にyardを書いても大してうれしくないという話になり、 今のまんまでいいじゃん、でここまで来たのが現状だからなあ
195 名前:デフォルトの名無しさん mailto:sage [2009/07/09(木) 17:12:54 ] 変数名に「str」ってハンガリアン記法の問題そのままだなw
196 名前:デフォルトの名無しさん mailto:sage [2009/07/09(木) 17:18:59 ] yardoc の一番よくないところは、必死でクラスを書いても現時点で特にメリットがないということ このクラスを利用して補完がうまく動くぜーということも特になく、マニュアルの行が1個増えるだけ マニュアルを読むときの話なのなら説明文やそれこそ引数名を直接読んでもらえれば クラス名なんて不完全な情報だけどころか意図まで全部わかるわけだ
197 名前:デフォルトの名無しさん mailto:sage [2009/07/09(木) 17:23:55 ] >>195 title_string_or_empry_when_tag_contains_nothing_or_nil_when_tag_itself_doesnt_exist_called_by_HTMLParser_ParsedData_title とか そういう一発で内容がわかるほうがいっすか
198 名前:デフォルトの名無しさん mailto:sage [2009/07/09(木) 17:30:40 ] >>196 まあrdocの代表的な実装が、メソッド名クリックとかで 該当部分のソースを見れるようになってるのが その辺の現実を如実に示してるよね。 >>197 責務を分割しろとかパッケージ化して共通の修飾部を外せとか言われるんじゃね つうかstrが文字列だとわかると嬉しいのかどうかってのがよしあしの分岐点だよな
199 名前:デフォルトの名無しさん mailto:sage [2009/07/09(木) 17:39:45 ] // i に 100 を代入する i = 100; のような「見ればわかることまでいちいち書かんでええ」系のツッコミの適用範囲が Ruby ではえらい広いから どこまでコメント書くべきなのか書かなくてもいいもんかちょっと迷う
200 名前:デフォルトの名無しさん mailto:sage [2009/07/09(木) 18:02:25 ] >>197 意味分からない。 ハンガリアン記法と同じ問題を抱えてると具体的に書いたのだが、 なんでそんなに見当違いのレスがくるんだ?
201 名前:デフォルトの名無しさん mailto:sage [2009/07/09(木) 18:13:01 ] CやJavaのような強く型付けされた言語と違って、引数の型情報のないLLでは 引数の名前に型名情報を加えたほうが使いやすい場合も多いだろう。 Smalltalkだと、aString, anEvent, aRectangle, xNumber, yNumberみたいに書いたもんだ。 この場合は、変数の役割よりも型名のほうが偉い。
202 名前:デフォルトの名無しさん mailto:sage [2009/07/09(木) 18:58:07 ] 引数にstrをとるメソッドが文字列処理のヘルパークラスみたいに strの内容が文字列でさえあれば問題なくなにがしか処理できるのなら 引数名はstrで必要にして充分だよな。 逆に引数の内容が何らかの意味のある文字列であって、 想定外の内容だったときにはエラーを返さなきゃいけないような処理なんであれば、 その「想定している何か」の情報を引数名に込めてやりたいところ。
203 名前:デフォルトの名無しさん mailto:sage [2009/07/09(木) 18:59:23 ] まああと Smalltalk の場合はクラス名の部分を選択してクラスの説明読んだり クラスブラウザ立ち上げてブラウズしたりって意味もあるけどねって話はいいとして、 名前をつけるので迷いがちなら、ケント・ベック読んでおけばとりあえず指針は得られる。 www.amazon.co.jp/dp/4894717549
204 名前:デフォルトの名無しさん mailto:sage [2009/07/09(木) 19:10:01 ] ケントベック本というと、読んだ後に引数名を aTarget とかにしまくってしまうような偏見がある
205 名前:デフォルトの名無しさん mailto:sage [2009/07/09(木) 21:12:14 ] Smalltalk の場合は、引数の名前の他にキーワードセレクタも引数の使い方を表す情報として使用できる。 この使い方は、Rubyのメソッドが引数をハッシュでとる場合に近い。 ハッシュのキーに意味を持たせれば、値の名前は要らない。
206 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 01:10:26 ] 「その、まあ」なやつは前RAIDスレにいなかったか?今もいるかもしれんが
207 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 08:48:47 ] ttp://github.com/tenderlove/mechanize/commit/fa8d725fabcabd2c1dbaf9e9c9700890fafba81f うへえ、90KBのソースファイル全部から一番外側のモジュール定義を物理的に引っこ抜いて、 一番最後に空のモジュール作って再代入しよった っていうかこんなんgithubでやるな、追随や衝突解決がめんどくさいから どうせ「スペースがもったいない」「インデントが深いから」とかいうアホな理由だろこれ module WWW class Mechanize def … class Page def … end end end ↓ class Mechanize def … class Page def … end end module WWW; end WWW::Mechanize = ::Mechanize
208 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 09:00:33 ] 「いっちゃん外側の纏め用モジュールの扱い」ってのは難儀なとこではある ここにはメソッドも定数も定義されず、クラスをまとめるモジュール空間の提供としてのみ存在するもの インデント深くなるから外に出しちゃえってのはそれはそれでいいんじゃないの WWW::Mechanize と Mechanize の2つが存在することになるから WWW モジュール作った意味なさそうだけどさ てんだらーが nokogiri 疲れでトチ狂ったのかと思ったら別の人の直接コミットなのね
209 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 09:11:47 ] この場合は ::Mechanize でアクセスできなくすればいいんだろ …方法思いつかんが なんかある?
210 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 10:19:37 ] これずううううううっと思ってたんだけどさ、オフィシャルページの HTML のタイトルさ、 「ダウンロード」とか「ニュース」とか単語になってるのなんとかなんね? 「Ruby ダウンロード」とか「ニュース - オブジェクト指向スクリプト言語Ruby」とか 他のサイトと区別できるタイトルつけようぜ
211 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 10:22:55 ] Object.send(:remove_const, 'Mechanize') とか
212 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 10:51:30 ] それは WWW::Mechanize ごとアクセスできなくなるんでは… class Mechanize; end module WWW; end WWW::Mechanize = ::Mechanize Object.__send__(:remove_const, 'Mechanize') p Mechanize.new rescue "Mechanize.new.failed" p WWW::Mechanize.new rescue "WWW::Mechanize.new.failed" "Mechanize.new.failed" #<Mechanize:0xb7cfaec4> んぬう
213 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 11:08:50 ] クラス名は単なる定数で、参照先がたまたまクラスオブジェクトだってことさ。
214 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 11:14:11 ] >>210 チラシの裏に提案を書いてもどうにもならないことは自覚してる?
215 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 11:14:32 ] class Hoge end と書いたとして、これがいつ class クラスのオブジェクトとして存在し始めるかというのは意識しにくいかもね
216 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 11:25:48 ] __send__でprivate呼べなくなったんじゃなかったっけ >>215 class 〜 endがself返せばirbとかでわかりやすいんだろうけど ってこれも他のブロックのように最後の返値を返すのか class Foo; end #=> nil class Bar; self; end #=> Bar
217 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 11:59:30 ] WWW::Mechanize = ::Mechanize これさ、あたりまえだけど WWW::Mechanize.name の返値は "Mechanize" のままなんだな。 素直に module WWW; class Mechanize; end; end した場合は "WWW::Mechanize"
218 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 12:23:37 ] Structといい、一応ファーストクラスオブジェクトなのに そのへんの仕様で足引っ張ってる感じだw
219 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 12:45:52 ] とりあえず、この変更にはユーザーデメリットしかないと思う 俺としてはMechanizeが下手打ってくれて有難いが
220 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 12:50:29 ] うっさいよhttpclient
221 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 12:55:00 ] 今は Anemone かも あれはASCII 文字使い以外には機能が不足しまくりで、基本機能揃えて実際の現実フォローを行うと 単に Mechanize になるだけなんじゃねともっぱらの評判
222 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 16:23:46 ] >>214 それを「気にして」いるのは君だけだよ
223 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 16:36:05 ] エスパー参上
224 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 18:22:16 ] >>209 module WWW; end class WWW::Mechanize end
225 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 19:40:18 ] >>220 HTTPのクライアントなんだけどさ、 @HTTP/HTTPSが使えて AGET/POSTその他メソッドのレスポンスを サーバからクライアントへの全文の受信を待たずに ある程度の大きさの塊で順次受け取れて BWindows(mswin32)で動く ライブラリってなんかあるかな? @、AまでならlibcurlのRubyバインディングのcurbがあるんだけど、 curbはドキュメントでLinux以外想定してないと明記されてるわ mingwでgem installしてみたら案の定拡張ライブラリのコンパイルで 引っかかるわで、 今泣きながらDL経由でlibcurl叩こうとしてるんだけど。
226 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 19:50:15 ] >>225 つまり net/http を使わないってことね
227 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 20:04:26 ] >>226 うん。net/httpだとAが出来ないと思う。 意図としては、サーバ側から取得してくるリソースが 典型的なHTMLみたいに数KB〜数100KB程度のサイズの場合は 内容を全部取得してからまとめて処理してもいいんだけど、 動画みたいな数MB〜数100MB程度のサイズの場合は 頭から数10KBとか数100KB程度の大きさでいいから順次取得して 逐次処理したいんだ。
228 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 22:04:04 ] >>227 >動画みたいな数MB〜数100MB程度のサイズの場合は >頭から数10KBとか数100KB程度の大きさでいいから順次取得して >逐次処理したいんだ。 動画じゃないけど、おなじようなことをしたいです。 これってRubyでやるときは、どんな設計にするのがいいの?
229 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 22:06:37 ] 不用意にnet/httpを使わない サーバが対応してるなら、こっから100キロバイトぶんだけくれというHTTPヘッダを送りつけ続ける
230 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 22:13:31 ] net/http は逐次処理させるの自体はできた気がする ただ、どう小細工しても「取得完了時にメモリを数百MB占有」というのは回避できない
231 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 22:18:25 ] そういえばopen-uriなんかでもコールバック設定できたよね ダウンロード状況の進捗とか示すのに使うやつ 逐次処理だけできればいいのならそれで足りそうな気が
232 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 22:21:33 ] >>227 230も言ってるけど、逐次処理できるよ HTTP#getにブロックを渡せばいい (HTTP.getではできないので注意)
233 名前:225,227 mailto:sage [2009/07/10(金) 22:24:01 ] >>229 ご存じの通り、Rangeヘッダでの取得だとサーバ側がパーシャルで返してくれなかったときに寒いことに。 で、net/httpを一部いじったりしてレスポンスのボディをある程度逐次に取れるようにしても、 単純な実装だとkeepaliveとかpipelineとかが絡んできたときにcontent-lengthやらchunkやらの取り扱いで面倒なことに。 >>228 Linuxで動けばいいのならcurbのon_bodyがそのまんま。 あらかじめコールバックハンドラ用のprocを登録しておくと、 目的のURLにアクセスしてレスポンスのbodyをある程度受け取ったタイミングで 受け取ったデータを引数にしてprocを呼んでくれる。 eventmachine使うとクライアント的な動作についてもイベントドリブンな感じで 実装できるっぽいけど、一から作るのもな、という。 実際目的が同じかはともかくほぼ一から作ろうとしてる人もいるみたいだけど。 ttp://blog.masuidrive.jp/index.php/2008/08/07/how-to-write-spider-using-eventmachine/
234 名前:225,227 mailto:sage [2009/07/10(金) 22:30:51 ] >>232 おお。もっかい確認してみます。 結局作りたいモノって大した物じゃなくて、 手元にあるmouseHoleもどきのHTTPプロキシに ttp://www.artonx.org/diary/20090301.html みたいな仕掛けを仕込みたいってだけなんですが。
235 名前:デフォルトの名無しさん mailto:sage [2009/07/11(土) 21:11:56 ] いよいよAndroidの国内端末(HT-03A)出たね これでRuby動かしてみた人居る?
236 名前:デフォルトの名無しさん mailto:sage [2009/07/13(月) 10:45:37 ] ruby/tkのビルドで自動でライブラリさがしてくれるようになったね>nagaiさん乙でした でも、makeにすっごく時間がかかるようにもなってしまった。
237 名前:デフォルトの名無しさん mailto:sage [2009/07/16(木) 04:57:23 ] p Time.at(100).strftime("%H:%M:%S") => "01:01:40" これで "00:01:40"を返して欲しいんですが 時間は常に +1 されて帰ってくるんでしょうか?
238 名前:デフォルトの名無しさん mailto:sage [2009/07/16(木) 05:33:56 ] TZ=UTC0 ruby -e'p Time.at(100).strftime("%H:%M:%S")' "00:01:40" 時差+1ってことはフランスかどっかにお住まいですか。Merci
239 名前:デフォルトの名無しさん mailto:sage [2009/07/16(木) 05:43:31 ] >>238 ああっ 標準時刻とのずれか! 9時間なら気づけたのに! 場所はドイツからです。 Danke schön!!
240 名前:デフォルトの名無しさん mailto:sage [2009/07/17(金) 20:43:15 ] Ruby 会議、初日行ってきたお 通訳しているレオさん(?) かっこよすぎる 声もイカす ・自分はずーっと大講堂だったが、高井さんのエンタープライズRailsがおもしろかった ヨドバシに並ぶようになったらポイントで買おう ・外人さんがけっこう見かけた
241 名前:デフォルトの名無しさん mailto:sage [2009/07/17(金) 22:04:15 ] >>240 オレはずっと1Fだったが、ささだ研がブラック研究室ということが分かったよかったw
242 名前:デフォルトの名無しさん mailto:sage [2009/07/17(金) 23:09:01 ] 懇親会でアーロンがおよげたいやきくん歌ってた。
243 名前:デフォルトの名無しさん mailto:sage [2009/07/17(金) 23:38:33 ] わざわざ日本に着てまで喋るだけあるな……
244 名前:240 mailto:sage [2009/07/18(土) 01:32:36 ] 終わったあと、新宿でエヴァ破をひとりで見てから帰ってきた。 >>241 笹田さんって Ruby 1.9 の YARV を作っている方だよね? そのセッションも聞きたかったのだが、Rails 3 のほうを聞いていたので聞けなかった。 ブラックだったのか..... 明日も早起きしないと。
245 名前:デフォルトの名無しさん mailto:sage [2009/07/18(土) 09:24:17 ] >>242 ひげの山男さんマジぱねえっす(日本に馴染んでる的な意味で)
246 名前:デフォルトの名無しさん mailto:sage [2009/07/18(土) 14:04:03 ] >>244 昨日午前中見てきた
247 名前:デフォルトの名無しさん mailto:sage [2009/07/18(土) 14:04:50 ] > ブラックだったのか..... あれはまぁ自虐ネタだから
248 名前:デフォルトの名無しさん mailto:sage [2009/07/19(日) 00:36:45 ] レオさんは俺の嫁 今日の1Fの最後のコマ(GC)にいたんだけど、 Ruby 本体のメンテナ(コミッタ)は、ほぼ日本人ばかりなの? 外人さんもいるの? あるいは Linux Kernel みたいにパッチは世界中から受け付けるけど、 コミッタは日本人だけなのかな?
249 名前:デフォルトの名無しさん mailto:sage [2009/07/19(日) 01:38:29 ] >>248 ttp://yugui.jp/articles/833 日本人が多いけど、外人さんもいる様子 有名な人だと、Dave ThomasとかDavid Flanaganとか
250 名前:デフォルトの名無しさん [2009/07/19(日) 16:35:21 ] 実際に誰が動いているかとかはコミットログやChangeLogみるとか、 「Ruby のコミット数ランキング」を見るとか。 dame.dyndns.org/misc/ruby-commit-ranking/ まぁ、Rubyってあんまりパッチ来ないかなぁ、受け付けてはいるんだけどね。 Ruby内部のコードを読んで、いろいろつっこみをしてくる外人さんって、 Ruby本を書いているから細かいところまで見ているってイメージがある。 あと、パッチが外から来づらい理由として、継続して送ってくる人には コミット権をあげちゃうからってのもあるかな。
251 名前:デフォルトの名無しさん mailto:sage [2009/07/19(日) 23:01:55 ] ブラック研究室に入ったんだがどうやら俺は限界らしい www.ci.i.u-tokyo.ac.jp/~sasada/ 映画化決定
252 名前:デフォルトの名無しさん mailto:sage [2009/07/19(日) 23:04:02 ] 日本Rubyの会 公式Wiki - 日本Ruby会議2009 アンケート jp.rubyist.net/?Enquete2009 アンケートを書くまでがRuby会議です。
253 名前:デフォルトの名無しさん mailto:sage [2009/07/20(月) 17:09:14 ] プレゼンはustreamのrecordedでもうほとんど見れるんだな、すげー時代だ kwatchのいうテンプレートとAOPってのがamritaとどこが違うのかわからんかった スレでtenjinのアピールしてたのっていつごろだったっけ
254 名前:デフォルトの名無しさん mailto:sage [2009/07/20(月) 18:45:13 ] AOPはJavaでは比較的知られているけど、たしかにHTMLテンプレートと絡ませると面白いかも。
255 名前:デフォルトの名無しさん mailto:sage [2009/07/20(月) 18:50:16 ] AOPってなに? アスペクト指向とかいう現状バズワードまがいの代物ですか?
256 名前:デフォルトの名無しさん mailto:sage [2009/07/20(月) 18:56:43 ] バズワードだってw 使ってみたかったんだねw
257 名前:デフォルトの名無しさん mailto:sage [2009/07/20(月) 19:58:59 ] そういえば、matzが言ってたnloopパッチって 結局何で適用されないんだろう 高速化は正直どうでもいいけど、 多重ループが圧縮できるのは嬉しいと思うんだけどなあ ネストが浅くなるし、行数も減るし
258 名前:デフォルトの名無しさん mailto:sage [2009/07/20(月) 23:22:08 ] 名前とか? nloopでは分かりづらくね
259 名前:デフォルトの名無しさん mailto:sage [2009/07/22(水) 00:57:45 ] 今時は、なんでもeco。 名前にecoを付ければ、政府援助が付いて、双方ウマウマ。 なわけで、 ecoloop おいらは、実態を知らんが、高速になるならecoに違いない。
260 名前:デフォルトの名無しさん mailto:sage [2009/07/22(水) 06:58:47 ] >>255 >アスペクト指向とかいう現状バズワードまがいの代物ですか? アスペクト指向は、Javaではけっこう使われているちゃんとした技術だよ。 DIコンテナでは標準的な技術。
261 名前:デフォルトの名無しさん mailto:sage [2009/07/23(木) 02:44:03 ] 実現方法は別としてLISPとかでも普通にやってることだしね。 > AOP 昔ながらのやり方に新しい名前が付いただけで「バズワード(笑)」になっちゃうわけもなく。
262 名前:デフォルトの名無しさん mailto:sage [2009/07/23(木) 02:57:50 ] NokogiriがWindows-31Jエンコーディングをサポートしていない気がする。 正確にはNokogiriが使っているlibxml2が呼んでいるiconvかもしれないけど。 >irb -Ks -rrubygems -rnokogiri #Shift_JISの範囲外の文字を含んだWindows-31J(=CP932)エンコーディングの文字列 irb(main):001:0> s="<html><HEAD><TITLE>11@11@</TITLE></HEAD><body></body></html>" => "<html><HEAD><TITLE>11@11@</TITLE></HEAD><body></body></html>" #エンコーディング指定なしでHTMLパース。当然失敗。 irb(main):002:0> Nokogiri::HTML.parse(s) encoding error : output conversion failed due to conv error, bytes 0x82 0x50 0xC 2 0x87 I/O error : encoder error => #Windows-31JエンコーディングでHTMLパース。失敗。 irb(main):003:0> Nokogiri::HTML.parse(s,nil,'Windows-31J') encoding error : output conversion failed due to conv error, bytes 0x82 0x50 0xC 2 0x87 I/O error : encoder error =>
263 名前:デフォルトの名無しさん mailto:sage [2009/07/23(木) 03:00:30 ] #CP932エンコーディングでHTMLパース。成功。 irb(main):004:0> Nokogiri::HTML.parse(s,nil,'CP932') => <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "www.w3. org/TR/REC-html40/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=CP932"> <title>11@11@</title> </head> <body></body> </html> #Shift_JISエンコーディングでHTMLパース。Shift_JISの範囲内のところまで中途半端にパース。想定通り。 irb(main):005:0> Nokogiri::HTML.parse(s,nil,'Shift_JIS') => <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "www.w3. org/TR/REC-html40/loose.dtd"> <html><head> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <title>11</title> </head></html> ちなみに環境はこんな感じ。現在入手できる最新のActiveScriptRubyとNokogiri。 >ruby -v ruby 1.8.7 (2009-06-12 patchlevel 174) [i386-mswin32] >gem list nokogiri I:\home\a_i\script>gem list nokogiri *** LOCAL GEMS *** nokogiri (1.3.2)
264 名前:デフォルトの名無しさん mailto:sage [2009/07/23(木) 03:18:51 ] さくっとパッチ書いて配布しないの? wktk
265 名前:デフォルトの名無しさん mailto:sage [2009/07/23(木) 03:36:14 ] Nokogiri::HTML.parse(s,nil,'Windows-31J') のときに実際には Nokogiri::HTML.parse(s,nil,'CP932') とやるようなのはすぐに出来るだろうけど、 変換結果とかエンコーディング情報はCP932になっちゃうから、 パース時に明示的に指定したエンコーディングと、 パース後に取得できるエンコーディングの内容が同一と仮定してるような プログラム、具体的にはMechanizeとかが困ったことになる悪寒。
266 名前:デフォルトの名無しさん mailto:sage [2009/07/23(木) 06:46:26 ] 個々人の環境でインストールされている iconv が実際にどんだけの範囲をサポートしているかは iconv 利用ライブラリ側ではもうどうしようもない 「自動でやりたいなら WINDOWS-31J をサポートしてる iconv を自分でインストールしろ」で終了 そんなこと言ったらそもそも x-sjis なんかも読めないわけだし ちなみに手元の Ubuntu では普通に動作する irb> s = Iconv.conv('WINDOWS-31J', 'UTF-8', "<html><HEAD><TITLE>11@11@</TITLE></HEAD><body></body></html)" irb> Nokogiri::HTML.parse(s,nil,'Windows-31J') <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "www.w3.org/TR/REC-html40/loose.dtd "> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=Windows-31J"> <title>1?P?@1?P?@</title> </head> <body></body> </html>
267 名前:デフォルトの名無しさん mailto:sage [2009/07/23(木) 07:39:51 ] 1.8もiconvも捨てて、1.9/transcode使おうぜ!
268 名前:デフォルトの名無しさん mailto:sage [2009/07/23(木) 07:41:36 ] Ruby って不幸なんですね 日本語得意っていうのが嘘に聞こえる
269 名前:デフォルトの名無しさん mailto:sage [2009/07/23(木) 07:50:24 ] iconv と小文字で書いてるのが読めんようだが、 まあ Encode.pm を再発明しなかったのが罪だというならそれはそれで
270 名前:デフォルトの名無しさん mailto:sage [2009/07/23(木) 07:51:48 ] Rubyが日本語が得意だと言ってるユーザーはぶっちゃけいないと思う
271 名前:デフォルトの名無しさん mailto:sage [2009/07/23(木) 07:57:22 ] 比較スレとかで「日本語処理が得意」とか書かれてるのは時々見る つまりRubyを使ってない人にはそう見えるんだろう
272 名前:デフォルトの名無しさん mailto:sage [2009/07/23(木) 08:26:58 ] つまりRubyを使ってない人が 比較スレとかで「日本語処理が得意」とか書いてるのか
273 名前:デフォルトの名無しさん mailto:sage [2009/07/23(木) 08:35:47 ] ・文字列処理は得意 ・日本語の取り扱いもできる →日本語処理も得意なはず! こういう図式が成立してそうなイメージが 嘘じゃあないが、他のスクリプト系言語と比べて とりたてて得意かと言われると微妙な所
274 名前:デフォルトの名無しさん mailto:sage [2009/07/23(木) 08:46:08 ] 日本語版Windowsの標準エンコーディングがUTF-8になれば UTF-8以外を使う人間はごく短期間で絶滅寸前になるような気もするので、 これから本当にそれほどまでの対応が必要なのかという疑問がいつもある。
275 名前:デフォルトの名無しさん mailto:sage [2009/07/23(木) 09:05:08 ] そもそも「日本語処理が得意」って言い方からして曖昧すぎる どうすれば得意だと言えるんだ? たとえばruby1.8のように、あまり難しいこと考えずにエンコーディングを扱えるのが良いのか? ruby1.9のように、各文字列のエンコーディングを厳密に扱えるのが良いのか? それとも他言語のように、すべてUTF-8で統一されてるのが良いのか? やっぱりRuby使ったことない人が書いてるだけなんじゃないか、と疑いたくもなる
276 名前:デフォルトの名無しさん mailto:sage [2009/07/23(木) 09:05:44 ] 朝から活発だな
277 名前:デフォルトの名無しさん mailto:sage [2009/07/23(木) 09:16:21 ] >日本語版Windowsの標準エンコーディングがUTF-8になれば I agree, but there are many SJIS records on HDD.
278 名前:デフォルトの名無しさん mailto:sage [2009/07/23(木) 09:18:13 ] >>275 各文字列のエンコーディングを厳密に扱えるのが良い
279 名前:デフォルトの名無しさん mailto:sage [2009/07/23(木) 11:11:31 ] ShiftJIS というか CP932(相当)で作ったファイルがもれなく UTF-8(と共通で決まったもの) で表現できるなら そりゃ移行はもうあっさり済むと思うんだが 実際はそうではないわけで
280 名前:デフォルトの名無しさん mailto:sage [2009/07/23(木) 11:14:23 ] Summer holidays has come.
281 名前:デフォルトの名無しさん mailto:sage [2009/07/23(木) 11:47:25 ] >>279 漏れなくは無理でも、実際に数えてみたら無視出来る程度の数だったりしてな。 大体、それこそMSお得意の「コードページの切り替え(バグ込み込み)」で 対応できるんじゃねーのとか。
282 名前:デフォルトの名無しさん mailto:sage [2009/07/23(木) 12:04:12 ] ファイルそのものにファイルのエンコーディング情報を含めなかったのが間違いの元 Macと違って
283 名前:デフォルトの名無しさん mailto:sage [2009/07/23(木) 12:38:14 ] >>281 >漏れなくは無理でも、実際に数えてみたら無視出来る程度の数だったりしてな。 この手の問題は、数が少ないからといって無視できるものではない。 というより、データ変換については間違いがあってはならないのが前提であり、 すこしでも間違いがあれば大きな問題。 1文字でもうまくいかないのがあれば、移行しない人が大勢いても不思議ではない。
284 名前:デフォルトの名無しさん mailto:sage [2009/07/23(木) 13:13:38 ] cp932はもれなくユニコードで表現できるでしょ? じゃなきゃW系APIとかどうすんのかと
285 名前:デフォルトの名無しさん mailto:sage [2009/07/23(木) 13:16:48 ] マクはいろいろ問題が。
286 名前:デフォルトの名無しさん mailto:sage [2009/07/23(木) 13:31:41 ] UTF-8だと日本語が1文字3バイトになるから嫌だと言って譲らない人が稀にいるけど、 そういう人に限って、コンピューターが高速になってるからインタープリタ言語でも問題ないとか言うんだよね。
287 名前:デフォルトの名無しさん mailto:sage [2009/07/23(木) 13:34:12 ] Perlがまだjcode.pl全盛期でUnicodeなんか誰も使ってなかった頃、 Rubyは既に日本語(EUC-JP, SJIS)に対応していた。 というだけで今となっては別に日本語処理がとりわけ得意なわけではない。 1.9はノウハウがたまってくれば良いかも。
288 名前:262 mailto:sage [2009/07/23(木) 13:53:35 ] >>266 >「自動でやりたいなら WINDOWS-31J をサポートしてる iconv を自分でインストールしろ」で終了 >ちなみに手元の Ubuntu では普通に動作する ああ、やっぱりそんなところですよね。 で、今回問題となってるiconvですが、 Nokogiriの公式のWindows向けgemパッケージに同梱されてるiconv.dllなんですよね。 つまりWindowsでgem install nokogiriしたときに標準で使われるものがこの状態という。 一番丸く収まる対処としては公式にお願いして同梱するiconvを変えてもらうとかそんなところでしょうか。 さすがにIANAに登録されてる分ぐらいはエイリアスが効かないとHTML/XMLの処理という 趣旨から困るはずなので。 現状、Mechanize経由で使ったりする分には、 コンテンツ取得後にレスポンスボディをNKFでUTF-8に変換して差し替えて レスポンスのコンテントタイプのキャラクターセットもUTF-8に差し替えてしまえば 実用上はほとんど問題なさそうです。 もちろんWindows-31J->UTF8->Windows-31Jと変換したときに 変換前と後とでバイナリが一致しなくて困るケースとか、 サーバから取得した時点でのエンコーディングを意識しておく必要があるケースとかは マズいんですが、まあそう多くはないだろう、という。
289 名前:デフォルトの名無しさん mailto:sage [2009/07/23(木) 14:13:03 ] 文字コード変換はJavaとかPerlとかがまあ道を切り開いてはくれてるけど Javaの文字コード周りの大変さとか、 Perlが4から5へ上がったときに配布サイズが膨れ上がった原因の大半が 文字コード変換テーブルのせいだった、とか考えると Rubyでやるべきかどうか、ってのは悩ましいな。 特にRubyはCSIで頑張るつもりなわけで、より大変な道だし。
290 名前:デフォルトの名無しさん mailto:sage [2009/07/23(木) 14:23:46 ] >>284 もういちど>>279 を読もうぜ >>279 >ShiftJIS というか CP932(相当)で作ったファイルがもれなく UTF-8(と共通で決まったもの) で表現できるなら >そりゃ移行はもうあっさり済むと思うんだが >実際はそうではないわけで
291 名前:デフォルトの名無しさん mailto:sage [2009/07/23(木) 14:25:39 ] >>288 Mechanize::Page#encoding= 使え 引数を Nokogiri::HTML.parse の第3引数に渡して page の HTML を再パースしてくれる agent.get(windows_31j_uri) agent.page.encoding = 'CP932' 今の iconv の CP932 は WINDOWS-31J と全く同じだから (つまり、WINDOWS-31J 以前の CP932 には非対応)、 WINDOWS-31J の代わりに CP932 を渡しても構わない あと、Ubuntu にインストールされている iconv は非公式パッチが入ったものだ オフィシャルな iconv は ttp://www.gnu.org/software/libiconv/ > Japanese > EUC-JP, SHIFT_JIS, CP932, ISO-2022-JP, ISO-2022-JP-2, ISO-2022-JP-1 > EUC-JISX0213, Shift_JISX0213, ISO-2022-JP-3 (--enable-extra-encodings 有効時) これ以外をサポートしないし、サポートする義理もない
292 名前:デフォルトの名無しさん mailto:sage [2009/07/23(木) 15:08:47 ] >>291 事前にコードが仮定できればそれでOKというかベストですね。 ちなみに当初ハマっていたシナリオだと とあるページをパースすると途中で内容が途切れたようなパース結果が帰ってくる ->元データを確認したらWindows-31J相当の内容のページに設定されたmetaタグの内容がShift_JIS ->encodingにWindows-31J指定->内部的には未知のエンコーディングでエラー。なかったことに。 ->再パースされるもmetaタグのエンコーディングでパース ->外観的には何度encodingを再設定してもencodingがShift_JISのまま ->大☆混☆乱 とかまあそんな感じでしたw