1 名前:デフォルトの名無しさん mailto:sage [2009/08/23(日) 21:07:47 ] オブジェクト指向スクリプト言語Rubyについて扱うスレッドです。 まったりと行きましょう。 Ruby Home Page www.ruby-lang.org/ja/ = 前スレ Rubyについて Part 36 pc12.2ch.net/test/read.cgi/tech/1246174168/ 過去スレ・関連スレは >>2-
357 名前:デフォルトの名無しさん mailto:sage [2009/09/23(水) 12:58:22 ] くだらん煽りはいらないから
358 名前:デフォルトの名無しさん mailto:sage [2009/09/23(水) 13:00:14 ] >>348 からここまで全部俺の自演
359 名前:デフォルトの名無しさん mailto:sage [2009/09/23(水) 19:07:44 ] おつかれー
360 名前:デフォルトの名無しさん mailto:sage [2009/09/24(木) 02:31:22 ] 関数型言語に興味があって、 積ん読してあるソフトウェアデザイン4月号の Haskell の特集を読んでみたが、 ほとんど理解できなかった 関数型言語は難しい。 Ruby などの、 ・クロージャ ・メソッドの引数にブロックを渡せる というのは理解できているつもりなんだけど
361 名前:デフォルトの名無しさん mailto:sage [2009/09/24(木) 04:23:53 ] 俺でも使えるrubyは偉大
362 名前:デフォルトの名無しさん mailto:sage [2009/09/24(木) 09:01:44 ] String#inspect って中身なに? 信頼できない入力を inspect して eval して戻しても安全?
363 名前:デフォルトの名無しさん mailto:sage [2009/09/24(木) 09:13:06 ] inspect した文字列は変換器に通してはいけない まめちしき
364 名前:デフォルトの名無しさん mailto:sage [2009/09/24(木) 09:16:52 ] eval(str.inspect) はコード実行が起こる可能性があるけど eval(str.dump) は何も起こらないことが保証されてるんだっけ? このへんあんま気遣ってないんだっけか、太古どっかでなんか聞いた気がする
365 名前:デフォルトの名無しさん mailto:sage [2009/09/24(木) 17:49:12 ] eval(str.dump) == str は保証されてる eval(obj.inspect) は何がおきるかわからない
366 名前:デフォルトの名無しさん mailto:sage [2009/09/24(木) 17:57:19 ] String は dump をそのまま返してるんじゃねーかとも思う あれわざわざオリジナルなの?
367 名前:デフォルトの名無しさん mailto:sage [2009/09/24(木) 18:02:58 ] Non-ASCIIの扱いが違う
368 名前:デフォルトの名無しさん mailto:sage [2009/09/25(金) 06:21:04 ] >>367 それは1.9のみの話? 1.8ではasciiかどうかなんて意識してなかったと思うけど、どうでしょう?
369 名前:デフォルトの名無しさん mailto:sage [2009/09/25(金) 08:18:01 ] $ /usr/bin/ruby -vKu -e 'puts [ "あ".dump, "あ".inspect ]' ruby 1.8.6 (2008-08-11 patchlevel 287) [universal-darwin9.0] "¥343¥201¥202" "あ" $ /usr/bin/ruby -vKn -e 'puts [ "あ".dump, "あ".inspect ]' ruby 1.8.6 (2008-08-11 patchlevel 287) [universal-darwin9.0] "¥343¥201¥202" "¥343¥201¥202"
370 名前:369 mailto:sage [2009/09/25(金) 08:21:14 ] なんでバックスラッシュがyenに変換されるんだろ……
371 名前:デフォルトの名無しさん mailto:sage [2009/09/25(金) 08:56:00 ] >>370 それは君が Mac を使ってるからだよ
372 名前:デフォルトの名無しさん mailto:sage [2009/09/25(金) 15:13:24 ] 既出かもしれないけど、Ruby1.9で巨大なオブジェクトに対して存在しないメソッドを呼び出そうとするとハングする・・・ エラーメッセージを生成するためにinspect呼び出してるせいみたいだけど、これタイムアウトか何か設けて欲しいわ
373 名前:デフォルトの名無しさん mailto:sage [2009/09/25(金) 15:22:12 ] 巨大な、て インスタンス変数がめっちゃやたらあるとか、 ギガバイトサイズの文字列とか?
374 名前:デフォルトの名無しさん mailto:sage [2009/09/25(金) 15:32:39 ] 巨大っつったけど、実は大したことなかったりする・・・ 頂点をあらわすオブジェクトが50個、辺を表すオブジェクトが200個くらいのグラフなんだけど (辺はそれぞれ長さ1の文字列と頂点一つ、頂点は長さ10〜20の整数と辺の配列をもってる) 普通にプログラミングしてたら作られ得る規模だよね、これ CPUはE8500だし言うほど古くないと思うんだけど、、、
375 名前:デフォルトの名無しさん mailto:sage [2009/09/25(金) 15:37:55 ] そんな巨大プロジェクトにRubyを採用する方が悪い(キリッ
376 名前:デフォルトの名無しさん mailto:sage [2009/09/25(金) 16:00:31 ] PHP使え
377 名前:デフォルトの名無しさん mailto:sage [2009/09/25(金) 16:04:33 ] 再現コードうpれば直るよ
378 名前:デフォルトの名無しさん mailto:sage [2009/09/25(金) 16:06:16 ] >>374 > 頂点をあらわすオブジェクトが50個、辺を表すオブジェクトが200個くらいのグラフなんだけど > (辺はそれぞれ長さ1の文字列と頂点一つ、頂点は長さ10〜20の整数と辺の配列をもってる) 再帰してんのか?
379 名前:デフォルトの名無しさん mailto:sage [2009/09/25(金) 16:14:45 ] そのオブジェクトに自前のinspectメソッドを用意すればいいのでは large_string = '巨大文字列' * 20 # 例えば*10000なんかだと表示が大変なことに p large_string def large_string.inspect "#<巨大文字列 #<object_id:0x#{self.object_id.to_s(16)}> size=#{self.size}>" end large_string.foobar # => undefined method `foobar' for #<巨大文字列 #<object_id:0x156ad40> size=200> (NoMethodError)
380 名前:デフォルトの名無しさん mailto:sage [2009/09/25(金) 16:22:30 ] inspectのオーバーライドはしたけど、 こういうオブジェクト作るたびに、エラーメッセージ対策のためにinspectオーバーライドするのはなんかなぁ・・・と ちなみに、ある程度inspectの結果が巨大になると、かってに#<[クラス名]:16進数文字列>に直してくれるみたいだけど、 それならいっそのこと、inspectに時間がかかるケースも想定して欲しかった、と class A; def inspect;"A"*10 end end A.new.hoge ==> NoMethodError: undefined method `hoge' for AAAAAAAAAA:A class A; def inspect;"A"*10000 end end A.new.hoge ==> NoMethodError: undefined method `hoge' for #<A:0xcc8594>
381 名前:デフォルトの名無しさん mailto:sage [2009/09/25(金) 16:34:21 ] >>374 グラフにループがあるとしたら、何も考えずに頂点と辺の関係をたどってたら無限ループ突入だろ
382 名前:デフォルトの名無しさん mailto:sage [2009/09/25(金) 16:41:34 ] >>381 ビルトインのinspectって循環参照考慮してる筈だよね 380で言った「inspectのオーバーライドはしたけど」っていうのは、ビルトインのinspectのせいで止まるから 仕方なく自前で用意した処理の軽いinspectに置換したってこと
383 名前:デフォルトの名無しさん mailto:sage [2009/09/25(金) 16:53:34 ] Object#inspect はインスタンス変数全部表示しようとするぞ インスタンス変数がアホみたいに莫大だった場合はボトルネックになる
384 名前:デフォルトの名無しさん mailto:sage [2009/09/26(土) 00:32:45 ] pp だと pretty_print_instance_variablesを定義して簡単に回避できるけど、 単なるinspect向けにそういうのはないの?
385 名前:デフォルトの名無しさん mailto:sage [2009/09/26(土) 11:10:14 ] >>384 は悪くないかもな。 あるいは module Inspector def inspect_member(name) ... end end class LargeObject extend Inspector inspect_member :lines end とか
386 名前:デフォルトの名無しさん mailto:sage [2009/09/26(土) 12:51:38 ] タイムアウトも悪くないけど、 速いマシンと遅いマシンとでinspectの結果やら p の出力が変わったりするとそれはそれで地雷かもなあ
387 名前:デフォルトの名無しさん mailto:sage [2009/09/26(土) 20:52:14 ] そういや、Matzにっきってもう更新されないの?
388 名前:デフォルトの名無しさん mailto:sage [2009/09/26(土) 22:45:12 ] >>387 Ruby会議でその話になったときはTwitter見てっていってた。
389 名前:デフォルトの名無しさん mailto:sage [2009/09/26(土) 23:07:24 ] TLをまとめてブログにポストするrubyスクリプトでも書いて それで更新したらいいのに
390 名前:デフォルトの名無しさん mailto:sage [2009/09/26(土) 23:11:54 ] そんなの読みたくない
391 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 09:18:31 ] twilog.org のこと?
392 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 10:02:00 ] Rubyによる並列処理システム 「CloudCrowd 0.1.0」リリース codezine.jp/article/detail/4417
393 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 13:27:33 ] >>388 twitter見てみたけど、便所の落書きみたいなことしか書いてなかった・・・ blogにもどってくれよん
394 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 13:42:49 ] そもそもTwitterは「基本ひとこと」「ログが長期間残らない」という点で blogとは違ったものだしな 「Matzはblogの更新をやめた」と考えた方がいい
395 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 13:48:34 ] ブログを書く手間と時間はTwitterに消えてるんだろうな Twitterってかなり一般的になってきたけど気が散って生産性落ちたりしないのかな
396 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 13:53:02 ] リアル雑談と同じようなご利益があります 同じようなご利益しかないとも言えます 同じような弊害があるとも言えるわけですが
397 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 14:25:25 ] iPhone持ちだし、Twitter興味はあるけどね 手を出すと集中して本読んだりコード書けなくなる自信がある
398 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 19:26:24 ] twitterも読みきれなくなってきた
399 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 19:33:50 ] >>394 >「ログが長期間残らない」 いや、残るけど?
400 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 19:36:22 ] どうせならここでつぶやいてよ
401 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 19:40:00 ] うむ 元祖便所の落書きとしては是非invitationを
402 名前:メカMatz mailto:sage [2009/09/27(日) 19:40:13 ] Matz江なう
403 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 20:08:43 ] >>399 Twitterのログは途中で消えるよ いやサーバに残ってるのかどうかは知らんけど、少なくともWeb上から見えなくなる
404 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 20:16:36 ] loopっていつの日かまっとうな制御構文に格上げされる可能性はないの? loop end でいいやん
405 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 20:18:46 ] forさんよりも利用頻度が高いloop・・・
406 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 20:24:11 ] for や while はオプションがめんどくさいからな お前は黙って無限ループだけしてりゃいいんだよというのを黙々とこなす loop
407 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 20:38:19 ] 1.9だとloop doはwhile trueより格段に遅くて気に入らない 制御構文になったら違ってくるのかもしれないけど
408 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 20:45:42 ] >>403 Web上からも見えるよ 一覧上からたどれなくなるだけで 個別のエントリのURLを控えておけばいつでも参照可能。
409 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 21:29:44 ] >>407 そうなん? ここに書いたらまたlength/sizeのときみたいに笹田さんが直してくれそうだな
410 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 21:31:55 ] 最適化の書き換えの優先度が低いんだろ 放っておいてもいつか速くなると思われる
411 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 21:35:53 ] loopが、というよりyieldが遅いんでは? 最適化が本格化すると、loopをバイトコードレベルで 無限ループに書き換えるくらいはやってくれるだろう
412 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 21:36:01 ] よし、おまえらささださん方面に電波最大出力だ
413 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 21:36:27 ] 「いつか」とか「本格化すると」じゃなくて、今速くして欲しいんだよね
414 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 21:41:53 ] 今すぐ切実に早くしたいならwhile trueに書き変えろよw
415 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 21:42:32 ] >>413 Rubyのソースコード書き変えて再コンパイルしれ たぶんいちばん早い
416 名前:デフォルトの名無しさん [2009/09/27(日) 21:48:40 ] length/sizeって何があったの? 本人降臨したの?
417 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 22:02:53 ] >>414 切実に速くしたかったらCで書くだろJK せっかく超高級言語つかってんだし、loop do endって書くキモチを 大事にしたいんだもん
418 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 22:19:41 ] むしろforが要らない子になってね?
419 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 23:03:27 ] rubyそのものを最適化オプションガリガリ付けてコンパイルすればいいんじゃね
420 名前:デフォルトの名無しさん mailto:sage [2009/09/28(月) 06:44:34 ] if RUBY_VERSION >= '1.9.0' then str.force_encoding(::Encoding::ASCII_8BIT) end について本スレで何かコメントでもあれば
421 名前:デフォルトの名無しさん mailto:sage [2009/09/28(月) 07:01:52 ] 今時thenなんて使わないよね
422 名前:デフォルトの名無しさん mailto:sage [2009/09/28(月) 08:01:53 ] いや全然
423 名前:デフォルトの名無しさん mailto:sage [2009/09/28(月) 08:05:40 ] thenだけにー
424 名前:デフォルトの名無しさん mailto:sage [2009/09/28(月) 08:07:52 ] >>421 てめえちょっと表出ろ
425 名前:デフォルトの名無しさん mailto:sage [2009/09/28(月) 08:10:26 ] ::Encoding::ASCII_8BIT より "ASCII-8BIT" のほうが短くていいな
426 名前:デフォルトの名無しさん mailto:sage [2009/09/28(月) 08:22:33 ] やたら短さだけに拘る人間の80パーセントはちんこ短い
427 名前:デフォルトの名無しさん mailto:sage [2009/09/28(月) 08:25:15 ] で ト ン セ | パ 0 2 り 残 た よかっ
428 名前:デフォルトの名無しさん mailto:sage [2009/09/28(月) 08:34:26 ] respond_to?(:force_encoding) しろとか defined?(::Encoding) 使えとか言われてたな
429 名前:デフォルトの名無しさん mailto:sage [2009/09/28(月) 11:29:54 ] A-Zでカテゴリ選んで A-Zで登録アプリを26^2個呼び出せる CUIなランチャ作ったけど起動が重いな。 Lightspeed Languageの登場が望まれる。
430 名前:デフォルトの名無しさん mailto:sage [2009/09/28(月) 11:50:50 ] >>370 SafariというかWebkitの人が直してくれないから https://bugs.webkit.org/show_bug.cgi?id=24906
431 名前:デフォルトの名無しさん mailto:sage [2009/09/28(月) 11:53:41 ] >>420 RUBY_VERSIONじゃなくて、>>428 の言うとおりforce_encodingかEncoding見てください。 なお、勝手に俺バージョンのforce_encodingやEncodingを1.8で定義しないように。 その辺を見て分岐することが推奨されているので、MRI以外で死にます。
432 名前:デフォルトの名無しさん mailto:sage [2009/09/28(月) 11:55:47 ] >>420 >>425 文字列リテラル使うとオブジェクトが増える。
433 名前:デフォルトの名無しさん mailto:sage [2009/09/28(月) 11:58:19 ] ruby使ってんのに、小せえこと気にすんなよ
434 名前:デフォルトの名無しさん mailto:sage [2009/09/28(月) 12:34:09 ] >>431 > 勝手に俺バージョンのforce_encodingやEncodingを1.8で定義しないように。 Javaでも使っとれ
435 名前:デフォルトの名無しさん mailto:sage [2009/09/28(月) 12:40:57 ] 1.8.7 で警告が出ない以上、>>431 の主張はカス Ruby 1.9 の Encoding が動作してくれないと困るのであるなら、そのように記述するべき 我々は実際には Ruby のメジャーバージョンを考慮しているのである以上、 スクリプトとしての記述もバージョンで分岐させるように書か「なければならない」
436 名前:デフォルトの名無しさん mailto:sage [2009/09/28(月) 12:50:23 ] >>432 どっちかというと文字列から Encoding の特定の定数を決定する処理の負担のほうが嫌気されるのでは 毎回いちいち探させるくらいなら定数として最初から書いておいたほうがプログラム的に親切 .encode('utf8') や encode('sjis') って動作したっけ、encode('EUC-JP-MS') って使えるのか、とか悩む必要もなし 定数だった場合は間違ってれば Ruby が uninitialized constant で教えてくれる
437 名前:デフォルトの名無しさん mailto:sage [2009/09/28(月) 12:52:46 ] 初心者スレのだが、これくらい書けば問題ないのかも if str.respond_to?(:force_encoding) && defined?(::Encoding::ASCII_8BIT) && str.respond_to?(:encode) && str.respond_to?(:encoding) && defined?(::Encoding::UTF_8) && str.class.new.encode(::Encoding::UTF_8).encoding == ::Encoding::UTF_8 && (_ = str.class.new.encode(::Encoding::UTF_8).force_encoding(::Encoding::ASCII_8BIT); _.encoding == ::Encoding::ASCII_8BIT) then str.force_encoding(::Encoding::ASCII_8BIT) end
438 名前:デフォルトの名無しさん mailto:sage [2009/09/28(月) 13:06:30 ] 「添付ライブラリにEncodingがあるなら」とか 「標準のStringがforce_encodingを持ってるなら」とか そういう指定の仕方ができないんだよね それを唯一担保するのがRubyのメジャーバージョンなんだから仕方ないわ
439 名前:デフォルトの名無しさん mailto:sage [2009/09/28(月) 13:10:19 ] >>434 >>435 RailsとかtDiaryとかと混ぜた時に死にたいなら定義してもいいけど。
440 名前:デフォルトの名無しさん mailto:sage [2009/09/28(月) 13:11:34 ] >>438 MRI以外のこと忘れてない?
441 名前:デフォルトの名無しさん mailto:sage [2009/09/28(月) 13:17:37 ] >>440 respond_to? を通っても別のどっかで齟齬の例外が出てそもそも動かないことが逆に期待されるから別にいいじゃん(素 バージョン併用スクリプトの書き方のガイドは特急で作ったほうがいいかも
442 名前:デフォルトの名無しさん mailto:sage [2009/09/28(月) 13:20:58 ] >>438 だからそれが>>428 だろ
443 名前:デフォルトの名無しさん mailto:sage [2009/09/28(月) 13:23:31 ] っ class Encoding; end
444 名前:デフォルトの名無しさん mailto:sage [2009/09/28(月) 13:25:17 ] str.force_encoding(::Encoding::ASCII_8BIT) rescue str よし解決 皆の者我に続け
445 名前:デフォルトの名無しさん mailto:sage [2009/09/28(月) 13:26:17 ] 1.9は文字コード面では完全に失敗だな。 2.0までにPython同様内部文字コードに変換する作りにしといてね。
446 名前:デフォルトの名無しさん mailto:sage [2009/09/28(月) 13:38:28 ] String そのものにエンコーディング機能のメソッドを新たに持たせたのがめんどくささの原因な気もする String のエンコーディング関連は Encode のメソッドからしか操作参照できないようにしておけばあるいは
447 名前:デフォルトの名無しさん mailto:sage [2009/09/28(月) 13:58:21 ] >>445 Pythonのucs2/ucs4絡みとかUnicodeString絡みとか見ておいで
448 名前:デフォルトの名無しさん mailto:sage [2009/09/28(月) 14:13:51 ] >>446 いや、1.8互換ってのが茨の道なんだと思うけど。 > String のエンコーディング関連は Encode のメソッドからしか操作参照できないようにしておけばあるいは 他の言語ならそうしたかもね。
449 名前:デフォルトの名無しさん mailto:sage [2009/09/28(月) 17:09:38 ] だれだよ UTF-8 とか中途半端なの作ったやつ はじめから 32bit ぐらいの幅にして、世の中の全種類の文字を一意に判定、 かつ少しぐらい文字が増えてもいいようなテーブル作っておけばよかったんだ
450 名前:デフォルトの名無しさん mailto:sage [2009/09/28(月) 17:10:03 ] つ UCS-4
451 名前:デフォルトの名無しさん mailto:sage [2009/09/28(月) 17:15:27 ] 中途半端感がひどいのはUTF-8じゃなくてUTF-16だな
452 名前:デフォルトの名無しさん mailto:sage [2009/09/28(月) 17:15:34 ] >>449 UTF-8はUnicodeのエンコーディング方法の1つでしかない。
453 名前:デフォルトの名無しさん mailto:sage [2009/09/28(月) 17:21:34 ] UTF-8はこれでもずいぶんマシなんだよ UTF-8以外のUnicodeや広域文字実装を実質全く見ないのがその証拠 どんなに理想的でも、利用されないと意味がない そういう意味で大変戦略的な「とてもマシ」な代物
454 名前:デフォルトの名無しさん mailto:sage [2009/09/28(月) 17:23:16 ] どこの世界の話ですか
455 名前:デフォルトの名無しさん mailto:sage [2009/09/28(月) 17:23:18 ] >>448 「1.8」なんて存在しないだろ あるのはオブジェクトがrespondするかどうかだろ
456 名前:デフォルトの名無しさん mailto:sage [2009/09/28(月) 17:31:18 ] >>455 まあ、これまでの理屈で言えばそうだな 1.8用や1.9用というバージョン分けの理由はないはず
457 名前:デフォルトの名無しさん mailto:sage [2009/09/28(月) 17:32:48 ] もう1文字4byteのRubyEncodingを策定しようぜ