Ruby初心者スレッド Part 13
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2007/06/29(金) 20:03:54関連スレやURLは>>2-10あたりを見てください。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/07/12(木) 20:37:24というハッシュがあって、valueが最大のkeyを返すメソッドってありますか?
0154デフォルトの名無しさん
2007/07/12(木) 20:45:49=> ["hiroyuki", 80]
0155デフォルトの名無しさん
2007/07/12(木) 21:27:59(0..5).each do |i|
a[i] = {i.to_s => i, (i+1).to_s =>i+1}
a += Array.new
end
こんなんでいいんですかね?
5回まわしてますが、何回まわすかは環境依存なので、最初にArray.new(5)とは
できないです。
もうちょっとスマートなやり方があるような気がするのですが。。。
0156デフォルトの名無しさん
2007/07/12(木) 21:49:005.times {|i| a[i] = {i.to_s => i, (i+1).to_s =>i+1} }
p a
じゃダメ?
0157デフォルトの名無しさん
2007/07/12(木) 21:49:13何をしたいのかよくわからんが
a = Array.new
(0..5).each do |i|
a[i] = {i.to_s => i, (i+1).to_s =>i+1}
end
これで動く
Rubyの配列は追加したぶんだけ勝手に埋まって伸びるから
Array.newにサイズを指定するメリットは通常使用上無い
a= Array.new
a[2] = '3rd'
a[4] = '5th'
p a #=> [nil, nil, '3rd', nil, '5th']
0158デフォルトの名無しさん
2007/07/12(木) 21:54:56サンクス。
そっか、勝手に伸びてくれるのか〜。
a += Array.new がなんか気持ち悪かったんだよね。
0159デフォルトの名無しさん
2007/07/12(木) 22:10:54Rinda が楽だよ
0160デフォルトの名無しさん
2007/07/12(木) 22:36:42知らなかった・・・
ドキュメントでどの辺かに、記述ありますか?
0161デフォルトの名無しさん
2007/07/12(木) 22:37:35> self[nth]=val
> nth 番目の要素を val に設定します。nth が配列の範囲を越える時には
> 配列の長さを自動的に拡張し、拡張した領域を nil で初期化します。
0162デフォルトの名無しさん
2007/07/12(木) 22:51:04/hoge/moge/hage.txt
を
/hoge/moge/hage.xml
みたいに変えたいのですが、
basename 使おうとしたのですが、ファイル名だけしか返ってきません・・・
パスほすい
0163デフォルトの名無しさん
2007/07/12(木) 22:53:44こちらのページに例がありました。
ファイルの拡張子を変更する (山本隆の開発日誌)
http://www.gesource.jp/weblog/archives/2005/07/post_1.html
change_ext("sample.txt", ".html") #=> sample.html
# ファイル名(filename)の拡張子をextに変更する
def change_ext(filename, ext)
return filename.gsub(/\.\w+$/, ext)
end
0164デフォルトの名無しさん
2007/07/12(木) 23:19:43そこでrioですよ。
ario = rio('dirA/dirB/afile.rb')
ario.extname = '.txt' # rio('dirC/bfile.txt')
http://rio.rubyforge.org/classes/RIO/IF/Path.html#M000196
0165デフォルトの名無しさん
2007/07/13(金) 06:19:34いろいろ種類があるようで、これでいいのか迷うのですが、みなさんはなにを使ってますか?
0166デフォルトの名無しさん
2007/07/13(金) 06:57:220167デフォルトの名無しさん
2007/07/13(金) 07:27:310168デフォルトの名無しさん
2007/07/13(金) 08:12:090169デフォルトの名無しさん
2007/07/13(金) 08:23:390170デフォルトの名無しさん
2007/07/13(金) 08:27:540171デフォルトの名無しさん
2007/07/13(金) 08:34:350172デフォルトの名無しさん
2007/07/13(金) 09:32:10勘で適当に答えると「掴む」じゃないかな?
野球のグローブっつーのもあるし。
つか辞書引け。
0173デフォルトの名無しさん
2007/07/13(金) 09:34:10ttp://www.catb.org/~esr/jargon/html/G/glob.html
0174デフォルトの名無しさん
2007/07/13(金) 09:39:550175デフォルトの名無しさん
2007/07/13(金) 11:39:02path = "/hoge/moge/hage.txt"
File.join(File.dirname(path), File.basename(path, ".*")+".xml")
0176デフォルトの名無しさん
2007/07/13(金) 11:42:08max_by と思ったら1.9からだったか。
0177デフォルトの名無しさん
2007/07/13(金) 12:25:35オバカさんが手掛りを掴んだ!(やったね)
0178デフォルトの名無しさん
2007/07/13(金) 19:16:08ruby に perlのFile::MMagic 相等のライブラリってありますか?
0179デフォルトの名無しさん
2007/07/13(金) 20:01:070180デフォルトの名無しさん
2007/07/13(金) 20:28:09どうしたらいいですか?
0181デフォルトの名無しさん
2007/07/13(金) 20:37:16このスレ的には、オープンクラスなので好きにオーバーライドしてアクセスしろ、が答えか。
0182デフォルトの名無しさん
2007/07/13(金) 21:00:040183デフォルトの名無しさん
2007/07/14(土) 01:23:21彼女.instance_eval {} 内で実行すればOK
但し instance_eval はデリケートだから扱いに注意しろよ
0185デフォルトの名無しさん
2007/07/14(土) 01:31:44スレ違い
彼女がオープンソース化されそうです
http://pc11.2ch.net/test/read.cgi/unix/1000484092/
彼女をmountできません
http://pc11.2ch.net/test/read.cgi/unix/1059971117/
彼女にポートスキャンの形跡が!!!
http://pc11.2ch.net/test/read.cgi/unix/1014614044/
彼女をCVSで管理したい
http://pc11.2ch.net/test/read.cgi/unix/999837578/
彼女にloginできません
http://pc11.2ch.net/test/read.cgi/unix/1007136614/
0186デフォルトの名無しさん
2007/07/14(土) 01:36:15ここを忘れてるぞ。
彼女にINSERT権限がありません
http://pc11.2ch.net/test/read.cgi/db/1057289721/
0187デフォルトの名無しさん
2007/07/14(土) 01:48:33http://pc11.2ch.net/test/read.cgi/mysv/1125404013/
0188デフォルトの名無しさん
2007/07/14(土) 01:56:300189デフォルトの名無しさん
2007/07/14(土) 02:02:360190デフォルトの名無しさん
2007/07/14(土) 03:47:530191デフォルトの名無しさん
2007/07/14(土) 07:50:15くだらねぇw
0192デフォルトの名無しさん
2007/07/14(土) 08:39:54たとえばuriライブラリだと
common.rbやganeric.rbなどに分けられているんですが
それぞれどういう意味で分けてるんですか?
0193デフォルトの名無しさん
2007/07/14(土) 09:02:560194デフォルトの名無しさん
2007/07/14(土) 09:51:48Rubyあるいは一般プログラミング作法的に何かポリシーが存在してるわけじゃないんじゃないかな
0195デフォルトの名無しさん
2007/07/14(土) 11:08:07generic.rbはGeneric URIに対応してると思う。
common.rbは文字通りいろんなURIに共通する部分。
URIに関するRFCでも読んでみたら?
0196デフォルトの名無しさん
2007/07/14(土) 17:20:13通常字は、配列全体を返したいのですが、デバッグ時には、最初の一個だけほしいのですが・・・
a = [1, 3, 10, 100]
b = a.map{|i| i * 2}
p b
b = a.map{|i| i * 2; break}
p b
0197デフォルトの名無しさん
2007/07/14(土) 17:21:47欲しいというだけなら
p b.first
じゃ駄目なん?
0198デフォルトの名無しさん
2007/07/14(土) 17:42:05b = a.map{|i| i * 2; break}
p b
だと、nilになってしまう・・・
0199デフォルトの名無しさん
2007/07/14(土) 17:42:42あ、そっか、全部計算してからfirstでもいいか
0200デフォルトの名無しさん
2007/07/14(土) 19:59:15a.map{|i| break i*2}
0201デフォルトの名無しさん
2007/07/14(土) 20:09:07もし違いがないなら proc を使おうと思っているんですが、method にしたほうが速いなら method にしようかなと考えています
0202デフォルトの名無しさん
2007/07/14(土) 21:19:35お、できた!
と思ったら、配列がかえってこないのは仕様かな?
0203デフォルトの名無しさん
2007/07/14(土) 21:23:03a.map{|i| break [i*2]}
0204デフォルトの名無しさん
2007/07/14(土) 21:24:23コード全体の性質や呼び出し回数、Proc生成数、マシン環境など色々な要因で変わる
使用するコードでベンチマーク取れ
参考までに書くと、俺の環境でやった単純なcallベンチマークなら
proc callにはmethod callの2倍ほど時間がかかっている
ただし50万回程度呼び出さないと大きな差は付かない
0205デフォルトの名無しさん
2007/07/14(土) 21:27:00そもそもトリッキーなやり方を使わずに
a.dup
a[0] = a[0] * 2
とするのが一番いいんじゃないのか?
0206デフォルトの名無しさん
2007/07/14(土) 22:12:59さんくすです。
・proc callはmethod callより遅いのは確か
・でも気にするほどのことではない
ということですね。
今回はprocの中身が比較的重い処理であり、呼び出しコストより実行コストの方がずっと大きいと思われるので、
method callにしたところで意味のある差はでないと推測し、取り扱いが楽なprocで行くことにします。
ありがとうございました。
0207デフォルトの名無しさん
2007/07/14(土) 22:29:450208デフォルトの名無しさん
2007/07/14(土) 22:49:09あ、いや、i*2は例でして、実際は、複数行にわたって、いろいろ処理してました。
誤解をあたえてしまってスマソ。
結局、1個目までじゃなくて、10個目まで、処理とかも必要になったので orz
each_with_indexに置き換えてしまいました。
一部の要素に使うときは、mapでは、無理くさいですね
一部返す場合は、selectとか使うんだろうか
0209デフォルトの名無しさん
2007/07/14(土) 23:10:15拾ってきたページをキャッシュするライブラリってないでしょうか?
というか、こういうのって、どうやって探したらよいんだろ?
RAAってのを検索して見つけるものなんでしょうか?
0210デフォルトの名無しさん
2007/07/14(土) 23:29:02ページのキャッシュは見つかりませんでした。
gem search cache --remote
もやってみましたが、同じような結果でした。
0211デフォルトの名無しさん
2007/07/14(土) 23:48:410212デフォルトの名無しさん
2007/07/14(土) 23:53:37普通にディレクトリ掘って保存してネットのLast-Modifiedとローカルのctimeを同期しとけばいいじゃん
完全なWebブラウザとして振舞わなくてもいいなら尚更
0213デフォルトの名無しさん
2007/07/14(土) 23:59:24RAAよりrubyforge探した方がいいかもしれん。
0214デフォルトの名無しさん
2007/07/15(日) 00:22:11ページをオブジェクトにしてキャッシュとか出来ないの?
0215デフォルトの名無しさん
2007/07/15(日) 00:25:26怖いこと言うな
0216デフォルトの名無しさん
2007/07/15(日) 01:04:43こういう話?
ttp://labs.airs.co.jp/2007/6/14/open-uri%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%E3%83%86%E3%82%B9%E3%83%88%E3%81%A7%E5%AF%BE%E8%B1%A1url%E3%82%92%E3%82%AD%E3%83%A3%E3%83%83%E3%82%B7%E3%83%A5%E3%81%99%E3%82%8B
0217デフォルトの名無しさん
2007/07/15(日) 01:13:29rubyforge探したけどない感じ('A`)
>>212
そうっすね。難しくはないと思う
・URLからHash生成
・Last-Modiedのみの取得
・Last-Modiedとローカルctime比較
・キャッシュがないか、日付が新しければ、Hash名でキャッシュを書き込み
・日付が古ければ、キャッシュから読みこみ
・Optionで、ディレクトリ指定
この辺出来たら、できそう
open-uri風味に出来たら最高なんだけど・・・
>>214
('A`)
0218デフォルトの名無しさん
2007/07/15(日) 01:17:06ウホッ!!
まさに、そういう話です。
open-uri対応!?マジ欲しかったものです
試してみます
0219デフォルトの名無しさん
2007/07/15(日) 02:43:52いやいや、オブジェクトの永続化でMarshalとかアレやコレ(ry
でもローカルにバイナリで出力されるからブラウザで直接見れな(ry
0220デフォルトの名無しさん
2007/07/15(日) 03:31:00取得しようとしてたサイトがどうやら動的生成なせいで、
last-modified が、nilで帰ってきて、キャッシュの比較しようがない罠 orz
意味ねえw
更新されないページだけ、キャッシュとるようにします
とりあえず、助言くださったみなさまありがとうございました。
0221デフォルトの名無しさん
2007/07/15(日) 03:38:200222デフォルトの名無しさん
2007/07/15(日) 04:30:40の順にソートしてeachループで使いたいんだけど
ディレクトリだけ処理、ファイルだけ処理とループを
二回回すの以外になんかいい方法ある?
さっき書き捨てスクリプト書いたときには二回回して
しまった。。orz
0223デフォルトの名無しさん
2007/07/15(日) 05:45:45とやってARGVの中調べると
*.txtが展開されちゃうんですが
ARGVが["*.txt", "foo", "bar"]
になるようにするにはどうすればいいですか?
0224デフォルトの名無しさん
2007/07/15(日) 05:58:20展開してるのはrubyじゃなくて、シェルのほうじゃないの?
0225デフォルトの名無しさん
2007/07/15(日) 06:43:00Ruby側では特に展開していないと言うことでしょうか?
0226デフォルトの名無しさん
2007/07/15(日) 07:09:40Windows用のRubyはシェルじゃなくRuby側で展開してるはず。
とりあえず、*.txt を '*.txt' にして展開を抑制するとか。
0227デフォルトの名無しさん
2007/07/15(日) 11:36:40Dir['*'].partition{|e| FileTest.directory? e}.flatten
とか。
0228デフォルトの名無しさん
2007/07/15(日) 11:54:24「よめねぇよちきしょうがー!」って怒られた(´・ω・`)ショボーン
0229デフォルトの名無しさん
2007/07/15(日) 12:12:270230デフォルトの名無しさん
2007/07/15(日) 12:44:300231デフォルトの名無しさん
2007/07/15(日) 12:47:45>ruby hoge.rb foo bar
じゃなくて
>hoge foo bar
と普通のコマンドのように使うようにするにはどうしたらいいんでしょうか?
OSはWindowsXPです
0232デフォルトの名無しさん
2007/07/15(日) 12:50:270233デフォルトの名無しさん
2007/07/15(日) 12:52:130234デフォルトの名無しさん
2007/07/15(日) 12:56:14できました!あがりとうござまいした!
>>233
オブジェクトコードのファイルサイズがでかいのはちょっと遠慮しときます^^;
0235デフォルトの名無しさん
2007/07/15(日) 12:57:24.rbに
c:\ruby\bin\ruby.exe "%1" %*
を
.rbwに
c:\ruby\bin\ruby.exe "%1" %*
を関連付けて
環境変数pathextに
.rb;.rbw
を足す。
これで出来るようになるがパイプつなぐとおかしくなるのがRubyクオリティ
0236デフォルトの名無しさん
2007/07/15(日) 13:15:050237デフォルトの名無しさん
2007/07/15(日) 13:43:25> .rbwに
> c:\ruby\bin\ruby.exe "%1" %*
rubyw.exeにしないのか?
> これで出来るようになるがパイプつなぐとおかしくなるのがRubyクオリティ
これはperlでやっても何でやっても同じ現象だから、Windows(というかたぶん
ShellExecute())の制限。
0238デフォルトの名無しさん
2007/07/15(日) 13:55:46ttp://www.notwork.org/rubyrecipebook/errata.html
> Windows 環境について、「関連付けを使って起動するとリダイレクトや
> パイプが使えなくなります」とありますが、 Windows 2000 SP4 または
> Windows XP SP1 以降においてはレジストリを編集することで解決できます
ttp://support.microsoft.com/default.aspx?scid=kb;en-us;321788
0239デフォルトの名無しさん
2007/07/15(日) 13:59:51> Windows(というかたぶんShellExecute())の制限。
パイプやリダイレクトを繋ぐのはシェルの役目だから
このへんの事情はUNIXも同じ。
0240デフォルトの名無しさん
2007/07/15(日) 15:52:160241デフォルトの名無しさん
2007/07/15(日) 15:59:370242デフォルトの名無しさん
2007/07/15(日) 17:27:11> パイプやリダイレクトを繋ぐのはシェルの役目だから
だからcmd.exeの問題だって。
> このへんの事情はUNIXも同じ。
寡聞にしてそういう環境は聞いたことがない。
0243デフォルトの名無しさん
2007/07/15(日) 21:09:08出されることだってあり得る状況なら、文句言うのはおかしい。
0244sage
2007/07/16(月) 00:08:430245デフォルトの名無しさん
2007/07/16(月) 00:12:30Chasen使ったことはないんだが、ruby chasenでぐぐってみた?
0246デフォルトの名無しさん
2007/07/16(月) 00:58:47最終的にやりたいことは半角文字列と全角文字列の判別です。
0247デフォルトの名無しさん
2007/07/16(月) 01:49:500248デフォルトの名無しさん
2007/07/16(月) 02:07:460249デフォルトの名無しさん
2007/07/16(月) 02:10:540250デフォルトの名無しさん
2007/07/16(月) 03:29:58>>246
16進法にするだけなら、
a = "%x" % 25
a = "%x" % "25" # 文字列でも可
>>247
ww
0251デフォルトの名無しさん
2007/07/16(月) 04:02:050252デフォルトの名無しさん
2007/07/16(月) 07:02:40■ このスレッドは過去ログ倉庫に格納されています