トップページ⇒tech
1001コメント350KB

Ruby初心者スレッド Part 13

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2007/06/29(金) 20:03:54
プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。
関連スレや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
score = {"hiroyuki"=>80, "boon"=>50, "yaruo"=>25}
というハッシュがあって、valueが最大のkeyを返すメソッドってありますか?
0154デフォルトの名無しさん2007/07/12(木) 20:45:49
irb> score.max{|a,b| a[1] <=> b[1]}
=> ["hiroyuki", 80]
0155デフォルトの名無しさん2007/07/12(木) 21:27:59
a = Array.new

(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:00
a = []
5.times {|i| a[i] = {i.to_s => i, (i+1).to_s =>i+1} }
p a

じゃダメ?
0157デフォルトの名無しさん2007/07/12(木) 21:49:13
>>155
何をしたいのかよくわからんが

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
>>156-157
サンクス。
そっか、勝手に伸びてくれるのか〜。
a += Array.new がなんか気持ち悪かったんだよね。
0159デフォルトの名無しさん2007/07/12(木) 22:10:54
>>152
Rinda が楽だよ
0160デフォルトの名無しさん2007/07/12(木) 22:36:42
> Rubyの配列は追加したぶんだけ勝手に埋まって伸びるから
知らなかった・・・
ドキュメントでどの辺かに、記述ありますか?
0161デフォルトの名無しさん2007/07/12(木) 22:37:35
Arrayに思いっきり書いてありました。

> 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
>>162
こちらのページに例がありました。

ファイルの拡張子を変更する (山本隆の開発日誌)
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
>>162
そこで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
まったくの初心者ですが、XPなのでmingwin32をいれました。
いろいろ種類があるようで、これでいいのか迷うのですが、みなさんはなにを使ってますか?
0166デフォルトの名無しさん2007/07/13(金) 06:57:22
俺はスク水派かなぁ
0167デフォルトの名無しさん2007/07/13(金) 07:27:31
WScriptから呼べるからActiveScriptRuby使ってるな。
0168デフォルトの名無しさん2007/07/13(金) 08:12:09
globってどういう意味なん?
0169デフォルトの名無しさん2007/07/13(金) 08:23:39
ttp://www.linux.or.jp/JM/html/LDP_man-pages/man7/glob.7.html
0170デフォルトの名無しさん2007/07/13(金) 08:27:54
で、globってどういう意味なん?
0171デフォルトの名無しさん2007/07/13(金) 08:34:35
語源はglobalの略と聞いたことがある。

0172デフォルトの名無しさん2007/07/13(金) 09:32:10
>>170
勘で適当に答えると「掴む」じゃないかな?
野球のグローブっつーのもあるし。

つか辞書引け。
0173デフォルトの名無しさん2007/07/13(金) 09:34:10
わからない単語はまず Jargon を引け、と教わりませんでしたか?
ttp://www.catb.org/~esr/jargon/html/G/glob.html
0174デフォルトの名無しさん2007/07/13(金) 09:39:55
You stupid glob of glue!
0175デフォルトの名無しさん2007/07/13(金) 11:39:02
>>162
path = "/hoge/moge/hage.txt"
File.join(File.dirname(path), File.basename(path, ".*")+".xml")
0176デフォルトの名無しさん2007/07/13(金) 11:42:08
>>154
max_by と思ったら1.9からだったか。
0177デフォルトの名無しさん2007/07/13(金) 12:25:35
>>174
オバカさんが手掛りを掴んだ!(やったね)
0178デフォルトの名無しさん2007/07/13(金) 19:16:08
取得したデータの判別をしたいのですけど
ruby に perlのFile::MMagic 相等のライブラリってありますか?
0179デフォルトの名無しさん2007/07/13(金) 20:01:07
http://mahoro.rubyforge.org/
0180デフォルトの名無しさん2007/07/13(金) 20:28:09
彼女のメソッドがすべてプライベートになってしまってアクセスできなくなりました
どうしたらいいですか?
0181デフォルトの名無しさん2007/07/13(金) 20:37:16
>>180
このスレ的には、オープンクラスなので好きにオーバーライドしてアクセスしろ、が答えか。
0182デフォルトの名無しさん2007/07/13(金) 21:00:04
関数型はOKなはずです
0183デフォルトの名無しさん2007/07/14(土) 01:23:21
>180
彼女.instance_eval {} 内で実行すればOK
但し instance_eval はデリケートだから扱いに注意しろよ
01841782007/07/14(土) 01:31:04
>>179
お礼が遅れました。ありがとうございました。
0185デフォルトの名無しさん2007/07/14(土) 01:31:44
>>180
スレ違い

彼女がオープンソース化されそうです
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
>185
ここを忘れてるぞ。

彼女にINSERT権限がありません
http://pc11.2ch.net/test/read.cgi/db/1057289721/
0187デフォルトの名無しさん2007/07/14(土) 01:48:33
彼女をchmodできません
http://pc11.2ch.net/test/read.cgi/mysv/1125404013/
0188デフォルトの名無しさん2007/07/14(土) 01:56:30
rubyでgnutellaとかのp2pアプリ作りたいんですけどなんかライブラリないですか?
0189デフォルトの名無しさん2007/07/14(土) 02:02:36
ライブラリありきでで作るようなもんじゃねーだろう
0190デフォルトの名無しさん2007/07/14(土) 03:47:53
rubytellaってすでにあるが
0191デフォルトの名無しさん2007/07/14(土) 07:50:15
>>185-187
くだらねぇw
0192デフォルトの名無しさん2007/07/14(土) 08:39:54
Rubyの添付ライブラリのソースを見ていると
たとえばuriライブラリだと
common.rbやganeric.rbなどに分けられているんですが
それぞれどういう意味で分けてるんですか?
0193デフォルトの名無しさん2007/07/14(土) 09:02:56
おまえにはまだ早い!
0194デフォルトの名無しさん2007/07/14(土) 09:51:48
趣味だと思う
Rubyあるいは一般プログラミング作法的に何かポリシーが存在してるわけじゃないんじゃないかな
0195デフォルトの名無しさん2007/07/14(土) 11:08:07
>>192
generic.rbはGeneric URIに対応してると思う。
common.rbは文字通りいろんなURIに共通する部分。
URIに関するRFCでも読んでみたら?
0196デフォルトの名無しさん2007/07/14(土) 17:20:13
mapを最初の一個だけに適用するってことはできませんか?
通常字は、配列全体を返したいのですが、デバッグ時には、最初の一個だけほしいのですが・・・

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:05
途中で送信してもた orz


b = a.map{|i| i * 2; break}
p b

だと、nilになってしまう・・・
0199デフォルトの名無しさん2007/07/14(土) 17:42:42
>>197
あ、そっか、全部計算してからfirstでもいいか
0200デフォルトの名無しさん2007/07/14(土) 19:59:15
>>198
a.map{|i| break i*2}
0201デフォルトの名無しさん2007/07/14(土) 20:09:07
method call と proc call (or yield) で速度の違いってありますか
もし違いがないなら proc を使おうと思っているんですが、method にしたほうが速いなら method にしようかなと考えています
0202デフォルトの名無しさん2007/07/14(土) 21:19:35
>>200
お、できた!
と思ったら、配列がかえってこないのは仕様かな?
0203デフォルトの名無しさん2007/07/14(土) 21:23:03
まあ、わかっているなら、Arrayにすりゃいいか・・・
a.map{|i| break [i*2]}
0204デフォルトの名無しさん2007/07/14(土) 21:24:23
>>201
コード全体の性質や呼び出し回数、Proc生成数、マシン環境など色々な要因で変わる
使用するコードでベンチマーク取れ

参考までに書くと、俺の環境でやった単純なcallベンチマークなら
proc callにはmethod callの2倍ほど時間がかかっている
ただし50万回程度呼び出さないと大きな差は付かない
0205デフォルトの名無しさん2007/07/14(土) 21:27:00
>>202-203
そもそもトリッキーなやり方を使わずに

a.dup
a[0] = a[0] * 2

とするのが一番いいんじゃないのか?
0206デフォルトの名無しさん2007/07/14(土) 22:12:59
>>204
さんくすです。
・proc callはmethod callより遅いのは確か
・でも気にするほどのことではない
ということですね。
今回はprocの中身が比較的重い処理であり、呼び出しコストより実行コストの方がずっと大きいと思われるので、
method callにしたところで意味のある差はでないと推測し、取り扱いが楽なprocで行くことにします。
ありがとうございました。
0207デフォルトの名無しさん2007/07/14(土) 22:29:45
rdocってpdfに出力できないですか?
0208デフォルトの名無しさん2007/07/14(土) 22:49:09
>>205
あ、いや、i*2は例でして、実際は、複数行にわたって、いろいろ処理してました。
誤解をあたえてしまってスマソ。

結局、1個目までじゃなくて、10個目まで、処理とかも必要になったので orz
each_with_indexに置き換えてしまいました。

一部の要素に使うときは、mapでは、無理くさいですね
一部返す場合は、selectとか使うんだろうか
0209デフォルトの名無しさん2007/07/14(土) 23:10:15
rubyで、エロサイトのスクレイパーを作ってるんですが、
拾ってきたページをキャッシュするライブラリってないでしょうか?

というか、こういうのって、どうやって探したらよいんだろ?
RAAってのを検索して見つけるものなんでしょうか?
0210デフォルトの名無しさん2007/07/14(土) 23:29:02
RSSで、cacheで検索してみましたが、オブジェクトのキャッシュライブラリみたいのばかりで、
ページのキャッシュは見つかりませんでした。

gem search cache --remote
もやってみましたが、同じような結果でした。

0211デフォルトの名無しさん2007/07/14(土) 23:48:41
数行のrubyなのに、ものすごいプログラムありませんか?
0212デフォルトの名無しさん2007/07/14(土) 23:53:37
>>209
普通にディレクトリ掘って保存してネットのLast-Modifiedとローカルのctimeを同期しとけばいいじゃん
完全なWebブラウザとして振舞わなくてもいいなら尚更
0213デフォルトの名無しさん2007/07/14(土) 23:59:24
>>209
RAAよりrubyforge探した方がいいかもしれん。
0214デフォルトの名無しさん2007/07/15(日) 00:22:11
>>210
ページをオブジェクトにしてキャッシュとか出来ないの?
0215デフォルトの名無しさん2007/07/15(日) 00:25:26
>>214
怖いこと言うな
0216デフォルトの名無しさん2007/07/15(日) 01:04:43
>>209
こういう話?
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:29
>>213
rubyforge探したけどない感じ('A`)

>>212
そうっすね。難しくはないと思う

・URLからHash生成
・Last-Modiedのみの取得
・Last-Modiedとローカルctime比較
・キャッシュがないか、日付が新しければ、Hash名でキャッシュを書き込み
・日付が古ければ、キャッシュから読みこみ
・Optionで、ディレクトリ指定
この辺出来たら、できそう

open-uri風味に出来たら最高なんだけど・・・

>>214
('A`)
0218デフォルトの名無しさん2007/07/15(日) 01:17:06
>>216
ウホッ!!
まさに、そういう話です。
open-uri対応!?マジ欲しかったものです
試してみます
0219デフォルトの名無しさん2007/07/15(日) 02:43:52
>>215
いやいや、オブジェクトの永続化でMarshalとかアレやコレ(ry
でもローカルにバイナリで出力されるからブラウザで直接見れな(ry
0220デフォルトの名無しさん2007/07/15(日) 03:31:00
>>216 を last-modified対応に書き換えようとしたのですが、
取得しようとしてたサイトがどうやら動的生成なせいで、
last-modified が、nilで帰ってきて、キャッシュの比較しようがない罠 orz

意味ねえw
更新されないページだけ、キャッシュとるようにします

とりあえず、助言くださったみなさまありがとうございました。

0221デフォルトの名無しさん2007/07/15(日) 03:38:20
文字列にしてしまってその違いを比較すれば
0222デフォルトの名無しさん2007/07/15(日) 04:30:40
Dir内のエントリをディレクトリ→通常ファイル
の順にソートしてeachループで使いたいんだけど

ディレクトリだけ処理、ファイルだけ処理とループを
二回回すの以外になんかいい方法ある?

さっき書き捨てスクリプト書いたときには二回回して
しまった。。orz
0223デフォルトの名無しさん2007/07/15(日) 05:45:45
myscript *.txt foo bar
とやってARGVの中調べると
*.txtが展開されちゃうんですが
ARGVが["*.txt", "foo", "bar"]
になるようにするにはどうすればいいですか?
0224デフォルトの名無しさん2007/07/15(日) 05:58:20
>>223
展開してるのはrubyじゃなくて、シェルのほうじゃないの?
0225デフォルトの名無しさん2007/07/15(日) 06:43:00
cmd.exeなんですがそれはないと思いますが・・・
Ruby側では特に展開していないと言うことでしょうか?
0226デフォルトの名無しさん2007/07/15(日) 07:09:40
>>223
Windows用のRubyはシェルじゃなくRuby側で展開してるはず。
とりあえず、*.txt を '*.txt' にして展開を抑制するとか。
0227デフォルトの名無しさん2007/07/15(日) 11:36:40
>>>222

Dir['*'].partition{|e| FileTest.directory? e}.flatten
とか。
0228デフォルトの名無しさん2007/07/15(日) 11:54:24
Ruby使ったことがない教授にRubyでプログラム書いて渡したら
「よめねぇよちきしょうがー!」って怒られた(´・ω・`)ショボーン
0229デフォルトの名無しさん2007/07/15(日) 12:12:27
お前はラテン語で問題出されても文句言わないんだな
0230デフォルトの名無しさん2007/07/15(日) 12:44:30
DEMONSTRA THEOREMAM ULTIMAM FERMATIANO
0231デフォルトの名無しさん2007/07/15(日) 12:47:45
自分で書いたRubyのソースコードを
>ruby hoge.rb foo bar
じゃなくて
>hoge foo bar
と普通のコマンドのように使うようにするにはどうしたらいいんでしょうか?
OSはWindowsXPです
0232デフォルトの名無しさん2007/07/15(日) 12:50:27
system32にぶち込む
0233デフォルトの名無しさん2007/07/15(日) 12:52:13
exerbでexe化する
0234デフォルトの名無しさん2007/07/15(日) 12:56:14
>>232
できました!あがりとうござまいした!
>>233
オブジェクトコードのファイルサイズがでかいのはちょっと遠慮しときます^^;
0235デフォルトの名無しさん2007/07/15(日) 12:57:24
Explorerの[ツール|フォルダオプション]関連付けで
.rbに
c:\ruby\bin\ruby.exe "%1" %*
を
.rbwに
c:\ruby\bin\ruby.exe "%1" %*
を関連付けて
環境変数pathextに
.rb;.rbw
を足す。
これで出来るようになるがパイプつなぐとおかしくなるのがRubyクオリティ
0236デフォルトの名無しさん2007/07/15(日) 13:15:05
俺はいつもバッチファイル作ってる。
0237デフォルトの名無しさん2007/07/15(日) 13:43:25
>>235
> .rbwに
> c:\ruby\bin\ruby.exe "%1" %*
rubyw.exeにしないのか?

> これで出来るようになるがパイプつなぐとおかしくなるのがRubyクオリティ
これはperlでやっても何でやっても同じ現象だから、Windows(というかたぶん
ShellExecute())の制限。
0238デフォルトの名無しさん2007/07/15(日) 13:55:46
自分では試したこと無いけど、

ttp://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
>>237
> Windows(というかたぶんShellExecute())の制限。
パイプやリダイレクトを繋ぐのはシェルの役目だから
このへんの事情はUNIXも同じ。
0240デフォルトの名無しさん2007/07/15(日) 15:52:16
何でこういう情報いつまでたってもまとまんないの?
0241デフォルトの名無しさん2007/07/15(日) 15:59:37
まとめる人が居ないからさ
0242デフォルトの名無しさん2007/07/15(日) 17:27:11
>>239
> パイプやリダイレクトを繋ぐのはシェルの役目だから
だからcmd.exeの問題だって。

> このへんの事情はUNIXも同じ。
寡聞にしてそういう環境は聞いたことがない。
0243デフォルトの名無しさん2007/07/15(日) 21:09:08
>>229
出されることだってあり得る状況なら、文句言うのはおかしい。
0244sage2007/07/16(月) 00:08:43
rubyから茶筅を使う方法を教えてください。
0245デフォルトの名無しさん2007/07/16(月) 00:12:30
>244
Chasen使ったことはないんだが、ruby chasenでぐぐってみた?
0246デフォルトの名無しさん2007/07/16(月) 00:58:47
文字列を16進数表現に変換する方法はありますか?

最終的にやりたいことは半角文字列と全角文字列の判別です。
0247デフォルトの名無しさん2007/07/16(月) 01:49:50
あります
0248デフォルトの名無しさん2007/07/16(月) 02:07:46
p "a"[0]
0249デフォルトの名無しさん2007/07/16(月) 02:10:54
"hogahdsfajeo"[i]
0250デフォルトの名無しさん2007/07/16(月) 03:29:58
丁度おれもしらべてた。

>>246
16進法にするだけなら、
a = "%x" % 25
a = "%x" % "25" # 文字列でも可


>>247
ww
0251デフォルトの名無しさん2007/07/16(月) 04:02:05
25.to_s(16)
0252デフォルトの名無しさん2007/07/16(月) 07:02:40
str.split(//).each do |c| false if c<0x80 end
■ このスレッドは過去ログ倉庫に格納されています