[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 2chのread.cgiへ]
Update time : 05/09 21:11 / Filesize : 227 KB / Number-of Response : 919
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

Rubyについて Part 36



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








[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<227KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef