Ruby初心者スレッド Part 11
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2007/03/23(金) 08:54:39関連スレやURLは2以降。Ruby on Railsの質問はWebProg板のRailsスレで。
■質問する人へ
質問する前に次の3つをすること。ここで回答を待つよりそのほうが早い。
・ぐぐる
・マニュアルで探す http://www.ruby-lang.org/ja/man/
・FAQを読む http://ruby-lang.org/ja/man/?cmd=view;name=Ruby+FAQ
質問には以下を書くこと。へたくそな質問は再提出を要求される。
・詳しい内容(「動きません」「うまくできません」では回答しようがない)
・エラーメッセージ(なるべくそのままで)
・実行環境(OS名、Rubyのバージョン(ruby -v でわかる))
・最終的にやりたいこと(もっとよい方法がある場合が多いので)
回答してくれた人には「ありがとう」のひとことをいってあげて。
■回答する人へ
相手は初心者、根気よく育てるつもりで。質問がへたくそなのも大目にみてあげる。
それができないならこないこと(だって初心者スレだもん)。
・既出な質問やFAQは「XXXを読め」でいいので、叩かない&怖がらせない。
・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
宗教的な話題は禁止します。
0153デフォルトの名無しさん
2007/03/30(金) 16:50:30・ちょっとした小物(shellスクリプトでやるようなのも全部Rubyで)
・HTMLから、RSS生成したり
・他小物CGI
0154デフォルトの名無しさん
2007/03/30(金) 17:22:06聞いてどうするんだという気はせんでもないが
0155デフォルトの名無しさん
2007/03/30(金) 17:23:16いまんとこレイルズくらい?
0156デフォルトの名無しさん
2007/03/30(金) 17:23:38う〜ん、やっぱり用途が似てますね…
自分の場合、大きな物作らないから
いつまで経っても、Rubyはスキルアップしないですねえ…
言語仕様も色々と機能が豊富みたいなんですけど
作るスクリプトが小物なんで、使うまでもない物が殆どなんですよ。
0157デフォルトの名無しさん
2007/03/30(金) 17:25:360158デフォルトの名無しさん
2007/03/30(金) 17:27:54手元に置いて、便利に使える道具的な使い方が多いですよね。
みんな一番大きなのでどの位の規模の作ったのあります?
自分はせいぜい、2000ステップくらいのCGIですね…
0159デフォルトの名無しさん
2007/03/30(金) 17:27:58それは可能ですか?
0160デフォルトの名無しさん
2007/03/30(金) 17:30:36Winなら、Exerbとかruby2exeとかで
バイナリにする方法もあるよ。
0161デフォルトの名無しさん
2007/03/30(金) 17:34:33しかしメソッドチェーンやワンライナ多用だから指標になるのだろうか…
0162デフォルトの名無しさん
2007/03/30(金) 17:36:310163158
2007/03/30(金) 17:39:15自分は、空白、コメント等もすべて入れてです。
HTMLもコード中に埋め込んでる様な汚い物なんで
純粋なRubyのコードだけでいうと半分くらいしかないと思いますけど。
0164159
2007/03/30(金) 17:41:18素早い回答ありがとうございます
えっと バイナリにするのではなく
ruby環境を持ち運んで 別PCで開発&実行ということは可能でしょうか
0165デフォルトの名無しさん
2007/03/30(金) 17:42:530166デフォルトの名無しさん
2007/03/30(金) 17:43:16ERbLightとかでhtmlを外部ファイルにするとかなり楽になるよ
0167デフォルトの名無しさん
2007/03/30(金) 17:43:16あと、
・でかいプロジェクトのRakefile
素のmake使えなさすぎ
>>159
USBストレージにいれて動かしている。とりあえず、パスさえ通せば使えるはず。
rubyスクリプトを動かしたいだけなら、ruby2exeとか、exerbで。
0168デフォルトの名無しさん
2007/03/30(金) 17:50:100169デフォルトの名無しさん
2007/03/30(金) 17:52:37確かにHTMLは外部にしなきゃダメだとつくづく思います…
そうしないと、もうRubyのコードとは思えない程汚いです。
0170デフォルトの名無しさん
2007/03/30(金) 17:53:06つシュワルツ変換
0171デフォルトの名無しさん
2007/03/30(金) 17:54:49メソッド数がある程度目安になると思う
適宜メソッドに分けることのできる人はそれなりにそれなりだから
読み込んで処理して整形して吐き出すCGIなのにメソッド3個とか眩暈がする
0172デフォルトの名無しさん
2007/03/30(金) 17:56:37これこそsort_byを使うべきところじゃね?
a = ['f2f', 'f10f', 'f1f', 'f0f', 'f3f']
p a.sort_by {|s| s[/¥d+/].to_i} #=> ["f0f", "f1f", "f2f", "f3f", "f10f"]
135のやり方だと効率云々よりも a[/¥d+/] と b[/¥d+/] と同じことを2回書いてるから美しくない。
0173デフォルトの名無しさん
2007/03/30(金) 18:01:380174デフォルトの名無しさん
2007/03/30(金) 18:05:10まあ小物ばっかりなんで
0175デフォルトの名無しさん
2007/03/30(金) 18:07:23お前か
引数5個で中身6行のメソッドとか平気で作ってるの
0176デフォルトの名無しさん
2007/03/30(金) 18:11:13削除処理だからそれをメソッド
表示処理だからそれをメソッド
まぁあまり一つのメソッドに詰め込みすぎるのはよくないよね。
0177デフォルトの名無しさん
2007/03/30(金) 18:25:150178デフォルトの名無しさん
2007/03/30(金) 18:27:440179デフォルトの名無しさん
2007/03/30(金) 18:28:230180デフォルトの名無しさん
2007/03/30(金) 18:28:31>>144
0181デフォルトの名無しさん
2007/03/30(金) 18:41:540182デフォルトの名無しさん
2007/03/30(金) 18:43:04別人だけど、なんで?メモリ?
0183デフォルトの名無しさん
2007/03/30(金) 20:23:41Javaなんかはセミコロン打つまでいくらでも改行できるんだが
Rubyではどうやんの?
if visible==1 and visit_count==10 and ( s_member_id==1 or s_member_id==5 or s_member_id==9 )
disable = 1
end
みたいな場合。
下らん質問で申し訳ない。調べたけど案外見つけられなくて聞いてみる。
まだ探し回ってるから時々見に来ますんでよろしくです。。。
0184デフォルトの名無しさん
2007/03/30(金) 20:27:41自由に改行可能。
そうでない箇所で改行する場合は改行前に ¥ を入れておく。
0185デフォルトの名無しさん
2007/03/30(金) 20:41:01�d。できますた。
and / or 前置き派なのでハマっていたのでした。
あるいは\ね。メモメモ
0186デフォルトの名無しさん
2007/03/30(金) 21:02:19へえ
0187デフォルトの名無しさん
2007/03/30(金) 22:14:11catch(:hoge) do
throw(:hoge) unless visible == 1
throw(:hoge) unless visit_count == 10
throw(:hoge) unless [1,5,9].include?(s_member_id)
disable = 1
end
0188デフォルトの名無しさん
2007/03/30(金) 22:28:31破壊的メソッドじゃないから効率が悪い。破壊的メソッドの sort! を使え。
0189デフォルトの名無しさん
2007/03/30(金) 23:21:230190デフォルトの名無しさん
2007/03/30(金) 23:32:22http://ja.wikipedia.org/wiki/ROT13#memfrob.28.29.E9.96.A2.E6.95.B0
を行うコード書いたんですが、こんなヘボしか思いつきません。誰か助けて。
require "enumerator"
class String
def frob
self.enum_for(:each_byte).inject("") { |s, c| s << (c ^ 42) }
end
end
0191デフォルトの名無しさん
2007/03/31(土) 00:01:460192デフォルトの名無しさん
2007/03/31(土) 00:09:46最近WindowsのGUIフレームワークを書き始めたんだけど、イベントリスナをブロック
で登録できるようにしてるんだが、ブロックから値を戻すときに、returnと書くと、
LongJumpErrorとか出るんだけど。
ブロックをreturnで戻ることはできないのかなぁ。
0193デフォルトの名無しさん
2007/03/31(土) 00:13:33こんな書き方はじめてみた。
すごいのかわかりにくいのかなぞだ
0194デフォルトの名無しさん
2007/03/31(土) 00:52:51さんくすこ。メモリは数倍食うけどこっちの方が速いみたいっすね。
0195デフォルトの名無しさん
2007/03/31(土) 00:54:05>破壊的メソッドじゃないから効率が悪い。破壊的メソッドの sort! を使え。
あははは!sortとsort_byでベンチマークとって、自分でたしかめな。
0196デフォルトの名無しさん
2007/03/31(土) 04:22:150197デフォルトの名無しさん
2007/03/31(土) 05:50:40scanってのがあるんですね。
参考になりました。
>>177
俺もその感じ。
コメントつけるところで、むしろメソッド化
でも、Rubyだと、小物多いから、ずらって、書いちゃうことも多い
0198187
2007/03/31(土) 06:05:37def hoge
return unless @visible == 1
return unless @visit_count == 10
return unless [1
5
9].include?(@s_member_id)
@disable = 1
end
begin
break unless visible == 1
break unless visit_count == 10
break unless [1
5
9].include?(s_member_id)
disable = 1
end while(false)
0199デフォルトの名無しさん
2007/03/31(土) 07:42:01メソッドの戻り値はreturnをつかうけど、ブロックの戻り値はreturnを使わない。後者は挙動が違うし。
メソッドとブロックを同じにしなきゃいけないという理由はない。
0200デフォルトの名無しさん
2007/03/31(土) 11:46:49あははは!お前こそベンチマークとって、自分でたしかめな。
% time ruby -e '1000000.times { [1, 2, 3].sort! { |a, b| a <=> b } }'
ruby -e '1000000.times { [1, 2, 3].sort! { |a, b| a <=> b } }' 11.40s user 0.01s system 99% cpu 11.520 total
% time ruby -e '1000000.times { [1, 2, 3].sort_by { |a| a } }'
ruby -e '1000000.times { [1, 2, 3].sort_by { |a| a } }' 15.58s user 0.00s system 97% cpu 15.922 total
0201デフォルトの名無しさん
2007/03/31(土) 12:24:12しかも、ソート列をまたソートさせるのも・・・。
$ time ruby -e '10.times{x=Array.new(10000){rand(5000)};x.sort!{|a,b|a<=>b}}'
real 0m0.950s
user 0m0.942s
sys 0m0.007s
$ time ruby -e '10.times{x=Array.new(10000){rand(5000)};x.sort_by{|a|a}}'
real 0m0.208s
user 0m0.201s
sys 0m0.007s
0202デフォルトの名無しさん
2007/03/31(土) 12:25:56require 'benchmark'
include Benchmark
a = (1..10000).map {rand(10000)}
bm(10) do |b|
b.report("Sort") { a.sort {|x,y| x<=>y} }
b.report("Sort!") { a.sort! {|x,y| x<=>y} }
b.report("Sort by") { a.sort_by {|x| x} }
end
user system total real
Sort 1.021000 0.000000 1.021000 ( 1.142000)
Sort! 1.052000 0.000000 1.052000 ( 1.091000)
Sort by 0.070000 0.000000 0.070000 ( 0.080000)
破壊的メソッド「だから」動作が速いという理屈にはならない
単純にどれかが最強というようには決められないのがsort
0203デフォルトの名無しさん
2007/03/31(土) 12:54:37ごく僅かだが。
0204デフォルトの名無しさん
2007/03/31(土) 12:56:31sort と sort! を比較するなら a は毎回初期化すべきじゃない?
0205デフォルトの名無しさん
2007/03/31(土) 13:02:33real 0m19.140s
user 0m19.055s
sys 0m0.060s
$ time ruby -e '200.times{x=Array.new(10000){rand(5000)};x.sort!{|a,b|a<=>b}}'
real 0m19.130s
user 0m19.063s
sys 0m0.049s
ほとんど変わんないね。
0206デフォルトの名無しさん
2007/03/31(土) 13:13:34ruby -e '1000000.times { [1].sort { |a, b| a <=> b } }' 4.12s user 0.01s system 98% cpu 4.171 total
% time ruby -e '1000000.times { [1].sort! { |a, b| a <=> b } }'
ruby -e '1000000.times { [1].sort! { |a, b| a <=> b } }' 2.70s user 0.01s system 99% cpu 2.715 total
このくらいにすると変わってくるか。
0207デフォルトの名無しさん
2007/03/31(土) 13:14:29user system total real
Sort 1.201000 0.010000 1.211000 ( 1.312000)
user system total real
Sort! 1.051000 0.020000 1.071000 ( 1.221000)
user system total real
Sort by 0.221000 0.000000 0.221000 ( 0.311000)
少なくともsort_byは使うの素人言われるほど常に遅いわけではないな
0208デフォルトの名無しさん
2007/03/31(土) 13:50:310209192
2007/03/31(土) 14:04:53レスありがとう。普通はそうだよね。
でも俺は、returnは戻り値を明確にする意味で使っているので、ちょっと困った。
俺の癖として、最初は結構適当に書いて、ある程度動き出したらリファクタリング
するんだけど、returnがかけないと、修正したときにうっかり戻り値部分のシーケンス
をかえちゃって、気がつかないうちに戻り値が変わってバグっちゃうってことが頻繁に
あるんだよね。この手のバグは後から見つけるのが大変で。
注意して修正すればいいだけの話かもしれないが……
0210デフォルトの名無しさん
2007/03/31(土) 14:08:440211デフォルトの名無しさん
2007/03/31(土) 14:47:49.rbファイルの下のほうにHTMLだけ集めて沈めておけばおk。
0212デフォルトの名無しさん
2007/03/31(土) 14:58:49自分も前作ったCGIでは、必要なHTML部分を
パーツごとに変数に保存して置いて
必要な時に、使用出来る様にしてましたけど。
ズラズラHTMLが並ばずにソースの見通しもよくなるし。
HTMLの一部分を後で置き換えしたい場合なんかは
その部分に特殊な文字を設定したりしてましたけど。
<a href="_URL_">_STR_</a> とか。
0213デフォルトの名無しさん
2007/03/31(土) 15:26:12でっかいHTMLデータをsubでスキャンして置換
でっかいHTMLデータをsubでスキャンして置換
ディスクにアクセスしてHTMLデータを読み込む
ディスクにアクセスしてHTMLデータを読み込む
でっかいHTMLデータをsubでスキャンして置換
でっかいHTMLデータをsubでスキャンして置換
ディスクにアクセスしてHTMLデータを読み込む
でっかいHTMLデータをsubでスキャンして置換
ということを連続してやらせてるのが非常に心苦しいのでソースに直に書く
Rubyソースに一緒に書いておけばディスクアクセスは1回で済むし
0214デフォルトの名無しさん
2007/03/31(土) 16:36:37で1時間以上詰まった
0215デフォルトの名無しさん
2007/03/31(土) 16:37:30要は ? の位置
0216デフォルトの名無しさん
2007/03/31(土) 16:45:24そんな事しないしw
初心者は質問するだけにしようなw
0217デフォルトの名無しさん
2007/03/31(土) 17:12:44特別なフレームワークとか利用せずに、よい管理方法はなにかな?
0218デフォルトの名無しさん
2007/03/31(土) 17:13:540219デフォルトの名無しさん
2007/03/31(土) 17:27:59今の所はHTMLをソースに埋め込むスタイルでいいや。
0220デフォルトの名無しさん
2007/03/31(土) 17:36:45>>213の言うところの置換の塊だな
0221デフォルトの名無しさん
2007/03/31(土) 19:51:26eruby
0222デフォルトの名無しさん
2007/03/31(土) 19:58:270223デフォルトの名無しさん
2007/03/31(土) 21:28:54ごく簡単なのをでっち上げるときはerbを使う。
あとコードと同じファイルの__END__以降にHTMLを書いて、
そいつを読み込んでる。ファイル一個で済むから楽でいい。
0224デフォルトの名無しさん
2007/03/31(土) 21:52:250225MoonWolf ◆MoonWdLnkQ
2007/03/31(土) 22:32:18eRubyというのがHTMLおよびテキストファイルにRubyスクリプトを埋め込む
テンプレート言語の仕様。
erubyというのが最初の実装だったかな。
あとでpure RubyのERBが出てきた。
erbscanはERBのスキャナ部を高速化するだけで単体では動作しない。
eRuby実装としては他にもerubisというのがあった。
とりあえず標準添付ライブラリのERB使っておけばいいと思う。
0226デフォルトの名無しさん
2007/03/31(土) 23:03:02ブロックってbreakで値を返せるんじゃなかったっけ?
yieldした所に値を返す場合はnextで。
0227デフォルトの名無しさん
2007/04/01(日) 15:11:22そもそもの発端である>>135では
> a = ['f2f', 'f10f', 'f1f', 'f0f', 'f3f']
> sa = a.sort{|a,b| a[/¥d+/].to_i <=> b[/¥d+/].to_i }
と書いてあるから、これにそってベンチすべきじゃね?
require 'benchmark'
data = (1..10000).collect { "f#{rand(10000)}f" }
Benchmark.bm(10) do |bench|
bench.report("sort_by") { data.sort_by {|a| a[/¥d+/].to_i } }
bench.report("sort") { data.sort {|a,b| a[/¥d+/].to_i <=> b[/¥d+/].to_i } }
bench.report("sort!") { data.sort! {|a,b| a[/¥d+/].to_i <=> b[/¥d+/].to_i } }
end
結果:
user system total real
sort_by 0.090000 0.000000 0.090000 ( 0.118594)
sort 1.030000 0.010000 1.040000 ( 1.154424)
sort! 1.030000 0.020000 1.050000 ( 1.348342)
もう明らかにsort_byが速い。sortとsort!の差は誤差。しかもsort!のほうが悪い数値。
>>208
今回がまさにそのケースだな
>>200
これはひどい
0228デフォルトの名無しさん
2007/04/01(日) 15:33:16> しかもsort!のほうが悪い数値。
>>204
0229デフォルトの名無しさん
2007/04/01(日) 15:38:340230デフォルトの名無しさん
2007/04/01(日) 16:23:59すまん。かんちがい。
0231デフォルトの名無しさん
2007/04/01(日) 16:54:33ああいう「文書作れるよシステム」ってのは
何か物凄いカッコイイことして生成してるんだと思ってた俺
ただの全文置換と知ったときはなんとなく失望した
0232デフォルトの名無しさん
2007/04/01(日) 16:57:32ソース公開しちゃうと穴突かれてレン鯖が過負荷攻撃とかされたりしそうで二の足踏んでるんだけど
0233デフォルトの名無しさん
2007/04/01(日) 21:12:05あと一日待っていれば「エイプリルフールネタでした」とごまかせたものを
今年はruby-lang.orgで何もやんないの?
0234デフォルトの名無しさん
2007/04/01(日) 22:20:19>今年はruby-lang.orgで何もやんないの?
やってるよー。よく見てみな。
0235デフォルトの名無しさん
2007/04/01(日) 23:29:13わからん・・・どこにネタが?
0236デフォルトの名無しさん
2007/04/02(月) 00:17:470237デフォルトの名無しさん
2007/04/02(月) 00:40:03どうしたら直りますか?
#!/usr/bin/ruby -Ku
require "yaml"
$Kcode = "UTF8"
obj3 = {"テスト"=>"250400", "テスト2"=>"25500"}
p obj3.to_yaml(:BestWidth=>10000)
の表示結果が激しく化けます。
"--- \n\"\\xE3\\x83\\x86\\xE3\\x82\\xB9\\xE3\\x83\\x882\": \"25500\"\n? !binary \"44OG44K544OI\\n\"\n: \"250400\"\n\n"
な感じです。
環境はruby 1.8.5 (2006-12-04 patchlevel 2) [i386-linux]です。
分かる方いらっしゃったら解決方法お願いします。
0238デフォルトの名無しさん
2007/04/02(月) 00:56:220239デフォルトの名無しさん
2007/04/02(月) 01:09:14そこ見てたんだが何だかうまいこと出来なかった。
んでもう一回今やったら出来ました。
ありがとです
0240デフォルトの名無しさん
2007/04/02(月) 10:59:45だまされた Σ(´д`)
0241デフォルトの名無しさん
2007/04/02(月) 11:05:280242デフォルトの名無しさん
2007/04/02(月) 11:16:220243デフォルトの名無しさん
2007/04/02(月) 11:26:160244デフォルトの名無しさん
2007/04/02(月) 11:53:26みんなが知ってるやつ
0245デフォルトの名無しさん
2007/04/02(月) 12:00:38で、ソレがあったとして、あるいはなかったとして>>241はどうするのかという話
使われなくなって廃れるのが怖いなら不滅のC使え
0246デフォルトの名無しさん
2007/04/02(月) 12:08:15なかったら幻滅する
0247デフォルトの名無しさん
2007/04/02(月) 12:18:44たとえば書名と著者と出版社をキーとするハッシュがあってそれが配列に入ってます。
[
{ 書名 => 本その1, 著者 => ○○, 出版社 => ■■出版 },
{ 書名 => 本その2, 著者 => ●●, 出版社 => □□出版 },
{ 書名 => 本その3, 著者 => ★★, 出版社 => ◆◆出版 },
{ 書名 => 本その4, 著者 => ★★, 出版社 => □□出版 },
{ 書名 => 本その5, 著者 => ○○, 出版社 => □□出版 },
{ 書名 => 本その6, 著者 => ●●, 出版社 => ■■出版 },
{ 書名 => 本その7, 著者 => ○○, 出版社 => □□出版 },
]
これを、出版社でソートしたあと著者でもソートしたいです。
[
{ 書名 => 本その5, 著者 => ○○, 出版社 => □□出版 },
{ 書名 => 本その7, 著者 => ○○, 出版社 => □□出版 },
{ 書名 => 本その2, 著者 => ●●, 出版社 => □□出版 },
{ 書名 => 本その4, 著者 => ★★, 出版社 => □□出版 },
{ 書名 => 本その1, 著者 => ○○, 出版社 => ■■出版 },
{ 書名 => 本その6, 著者 => ●●, 出版社 => ■■出版 },
{ 書名 => 本その3, 著者 => ★★, 出版社 => ◆◆出版 },
]
どのように書くのがマトモですか?
0248デフォルトの名無しさん
2007/04/02(月) 12:48:480249248
2007/04/02(月) 12:53:480250デフォルトの名無しさん
2007/04/02(月) 13:01:38class Book
def initialize(書名, 著者, 出版社)
@書名 = 書名
@著者 = 著者
@出版社 = 出版社
・
・
end
attr_reader :書名, :著者, :出版社
end
んな感じにするけどな
そうすりゃ
list = Array.new
list.push Book.new("エロ本","エロイ人","エロイ出版社")
list.push Book.new("空手入門","マス大山","ピヨピヨ空手連盟")
でソートや検索も楽になるし
0251デフォルトの名無しさん
2007/04/02(月) 13:10:34…それソート楽か?
0252デフォルトの名無しさん
2007/04/02(月) 15:02:59うおおおおおれにはなにやってんだかさっぱりです(w
ありがとうです勉強します
■ このスレッドは過去ログ倉庫に格納されています