08/06/27 01:35:19
プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。
【Ruby1.9 は不安定な開発版であり初心者には全く向きません】
【最新安定版の Ruby1.8.6 の使用を強くお勧めします】
関連スレやURLは>>2-8あたりを見てください。Ruby on Railsの質問はRailsスレへ。
■質問する人へ
質問する前に次の3つをすること。ここで回答を待つよりそのほうが早い。
・モジュール名やエラーメッセージでググる
・マニュアルで引っかかったクラスの記述を探す URLリンク(www.ruby-lang.org)
・FAQを一応読む URLリンク(www.ruby-lang.org)
質問には以下を書くこと。へたくそな質問は再提出を要求される。
・詳しい内容(「動きません」「うまくできません」では回答しようがない)
・エラーメッセージ(自力で訳さずなるべくそのままで)
・実行環境(OS名、Rubyのバージョン(ruby -v でわかる))
・最終的にやりたいこと(もっとよい方法がある場合が多いので)
回答してくれた人には「ありがとう」のひとことをいってあげて。
■回答する人へ
相手は初心者、根気よく育てるつもりで。質問がへたくそなのも大目にみてあげる。
それができないならこないこと(だって初心者スレだもん)。
・既出な質問やFAQは「XXXを読め」でいいので、叩かない&怖がらせない。
・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
2:デフォルトの名無しさん
08/06/27 01:35:55
【よくあるしつもん】
Q:
いちからRubyを始める初心者向けのRuby入門書は何がおすすめでしょうか?
A:
プログラム作成の初心者だったら
「たのしいRuby 第2版 Rubyではじめる気軽なプログラミング」
URLリンク(www.amazon.co.jp)
他の言語経験があるんだったら
「プログラミングRuby 第2版 言語編」
URLリンク(www.amazon.co.jp)
3:デフォルトの名無しさん
08/06/27 01:36:42
■前スレ
Ruby 初心者スレッド Part 19
スレリンク(tech板)
■関連スレ
Rubyについて Part 31
スレリンク(tech板)
Rubyの宿題教えてください。
スレリンク(tech板)
スレリンク(tech板)
【ActiveScript】RubyをWindowsで使うスレ【GUI】
スレリンク(tech板)
Ruby on Rails
スレリンク(tech板)
Rubyについて(アンチ専用) Part003
スレリンク(tech板)
4:デフォルトの名無しさん
08/06/27 01:37:14
■公式/非公式関連リンク
Ruby Home Page
URLリンク(www.ruby-lang.org)
Rubyリファレンス(よくサーバーエラーになります)
URLリンク(www.ruby-lang.org)
URLリンク(www.ruby-doc.org) (英語)
リファレンスのHTMLヘルプ版配布
URLリンク(elbereth-hp.hp.infoseek.co.jp)
# Windowsで便利
Ruby FAQ
URLリンク(ruby-lang.org)
Programming Ruby - The Pragmatic Programmer's Guide
URLリンク(www.ruby-doc.org)
# 好評書籍をWebで公開中、ただし英語
逆引きRuby
URLリンク(www.namaraii.com)
5:デフォルトの名無しさん
08/06/27 01:38:10
RAA - Ruby Application Archive
URLリンク(raa.ruby-lang.org)
RubyForge
URLリンク(www.rubyforge.org)
# Rubyのアプリやライブラリが検索できる
日本Rubyの会 公式Wiki
URLリンク(jp.rubyist.net)
# メニューに表示されていない埋もれた情報ページ多数
Rubyist Magazine - るびま
URLリンク(jp.rubyist.net)
# コードレビューが好評
Ruby hotlinks 五月雨版(日記やblogのアンテナ)
URLリンク(www.rubyist.net)
Rubyの本一覧
URLリンク(www.ruby-lang.org)
<rubyXML/>
URLリンク(www.rubyxml.com)
Matzにっき(Ruby作者の日記)
URLリンク(www.rubyist.net)
6:デフォルトの名無しさん
08/06/27 01:38:56
■最近できたWiki
Ruby 初心者スレッド Hiki
URLリンク(starlet.s145.xrea.com)
Ruby Portal
URLリンク(ruby.morphball.net)
7:デフォルトの名無しさん
08/06/28 07:40:53
RoRを使わず、CGIを作ろうと思います
高速化するための方法として、
FastCGI,Mongrel,mod_ruby等ありますが、
Mongrelは、RoRと組み合わせる以外の使い方は資料が少なく敷居が高そうだし、
FastCGIは不安定ということを、ネットでよく目にするし、
mod_rubyは、最終更新日が随分前なので不安があります
何がいいのでしょうか?
8:デフォルトの名無しさん
08/06/28 08:02:16
>>7
Rack + Mongrel とか。
9:デフォルトの名無しさん
08/06/28 22:04:18
uniqに関する質問です。
以下のようなTSVファイルがあったとします。
1 A あ
2 B い
3 A う
一列目、三列目は無視して二列目のアルファベットだけを対象にuniqにしたいんです。
例えば、
1 A あ
2 B い
です。どのようにすればよいでしょうか。
宜しくお願いいたします。
10:デフォルトの名無しさん
08/06/28 22:18:01
uniq_byってないんだっけ
11:デフォルトの名無しさん
08/06/28 22:56:43
mapもcollectもinjectも使いにくそうwクロージャってのがあればいいのかな?
まあメソッド書けばいいんじゃね?だれか採点よろしく
def second_column_uniq(ar)
hash = {}
result = []
ar.each do |row|
t = row.split(/\t/)[1]
puts t
next if hash.has_key?(t)
hash[t] = 1
result.push(row)
end
result
end
ar = ["1\tA\tあ", "2\tB\tい", "3\tA\tう"]
p second_column_uniq(ar)
12:9
08/06/28 23:17:20
>>11
ありがとうございます!!!
自分の技量で書くと、相当複雑で助長になりそうだったので
綺麗な回答を得られて感謝します。
新しく、hashを覚えられて勉強になりました。
13:デフォルトの名無しさん
08/06/28 23:23:46
ar.inject({}) {|h, r| h[/\t([^\t]+)\t/.match(r)[1]] ||= r; h}.values
14:デフォルトの名無しさん
08/06/28 23:34:38
>>11(とほぼ同じ処理)を一行で書くと>>13ってことかな。凄いwww
まあTAB区切りのカラムがいくつあるかわからない場合は、正規表現部分を
少し変える必要がある、かも?
あと、Hashのvalues()だから、順不同になる可能性もあるのかな?
でも、凄えwww
15:デフォルトの名無しさん
08/06/28 23:41:33
1.8 だと順序が保証されないね。
16:デフォルトの名無しさん
08/06/29 02:48:49
rexmlについて質問です。
以下のようなxmlにおいて、personのidにマッチしたentryだけを取得したいと考えています。
<root>
<person id="111"/>
<name>hoge</name>
<entry join="2008-01-01 9:00" leave="2008-01-01 21:00"/>
<entry join="2008-01-02 7:00"/>
</person>
<person id="222"/>
<name>foo</name>
<entry join="2008-02-01 10:00" leave="2008-02-01 17:00"/>
<entry join="2008-02-02 10:30" leave="2008-02-02 18:00"/>
<entry join="2008-02-03 09:45"/>
</person>
...
</root>
例えば、111(id)と入力があった場合,以下の値を取得したいです。
<entry join="2008-01-01 9:00" leave="2008-01-01 21:00"/>
<entry join="2008-01-02 7:00"/>
お手数をおかけしますが、よろしくお願いします。
17:デフォルトの名無しさん
08/06/29 03:14:44
<person id="111"/> <-- ここの / はミスだよね?
doc = REXML::Document.new(...)
id = 111
path = %q|/root/person[@id='%d']|
doc.elements[path % id].each do |node|
next unless node.is_a? REXML::Element
next unless node.name == 'entry'
puts node
end
もっと簡単に書けそうだが。
Hpricotだとこんな感じか。
doc = Hpricot.XML(...)
id = 111
puts (doc / :person).find {|psn| psn[:id] == id.to_s } / :entry
18:16
08/06/29 03:55:02
>>17
おおお、取得出来ました!
hpricotでもxmlのparseが出来たんですね、知りませんでした...
しかもrexmlより簡単で分かりやすい(汗
本当にありがとうございました!
仰る通りミスです、すみません(汗 < <person id="111"/> <-- ここの / はミスだよね?
19:デフォルトの名無しさん
08/06/29 14:07:34
>>18
つXPath
p REXML::XPath.match(doc, "//person[@id=#{id}]/entry")
20:17
08/06/29 14:13:04
ぐは、REXMLでも十分簡潔に書けるのね。
21:16
08/06/29 22:01:25
Xpath.matchは知っていたものの、うまく扱う事が出来なくて諦めてました...(汗
>>17,>>19さん本当にありがとうございます!
22:デフォルトの名無しさん
08/06/30 14:37:39
「初めてのRuby」いいね。本の厚みからは考えられないほど中身濃い。
Ruby初心者や俺みたいに知識があやふやな人にとっては特にそうだと思う。
23:デフォルトの名無しさん
08/06/30 15:23:50
Emacsでruby-modeを使っていますが,
ファイルを保存するとき先頭に -*- coding: ほにゃらら -*- がついちゃいます.
これを抑制する方法を教えて下さい
24:デフォルトの名無しさん
08/06/30 15:35:25
付けとけ
25:デフォルトの名無しさん
08/06/30 18:17:42
ピュアRubyのRuby/MySQLを使いたいと思ってます。
自宅Windowsでは正常動作確認できたんですが、レン鯖にアップするとうまく行きません。
MySQLが4.1系なのでパッチを当てて使っています。
エラーメッセージはライブラリ中で投げられたRuntimeErrorで
「Packets out of order: 1<>3」というものです。
Windowsではクエリを発行するたびにこの値が0<>0や1<>1のようにすべて対応していますが
レン鯖では上記エラーのとおりです。
なんとかソースを読んでるのですが、ソケットやパケットのことはからきしで手に負えません・・。
上記1、3の値はソケットから読み込んだ値で、
ライブラリ内では、WinではTCPSocket、UnixではUNIXSocketを使用しています。
また、この数字の変数名はpkt_nrとなっていて、pktはパケットの略だと思うんですが、
nrはパケットの何の略なんでしょうか。。。
正確には2つの数字は@pkt_nrとpkt_nrで、これを比較して異なっているために例外が投げられています。
漠然としてまともに質問にもなってないんですが、なんとなく推測できる方いましたらお願いします。
26:デフォルトの名無しさん
08/06/30 18:40:36
ググった?
URLリンク(wiki.rubyonrails.org)
27:25
08/06/30 19:26:31
>>26
ありがとうございます!
エラーメッセージでググったらいろいろ情報があったようです。
その都度違うと思っていた1<>3の部分までお決まりのエラーだったとは・・・
自分の場合Railsではないのですが、多分同じだと思うので
参考にして探ってみようと思いますm(_ _)m
28:デフォルトの名無しさん
08/06/30 21:43:45
Rubyスクリプトを実行するときに管理者権限の昇格を行う方法はありませんでしょうか?
XPで動いていたプログラムが、VistaのUACのせいで動かなくて困っています。
多くのシステムファイルを弄るプログラムでは、
管理者権限を得るために昇格ダイアログを出していますが、
これと同じことをRubyで行う方法はどのようなものがありますでしょうか?
29:デフォルトの名無しさん
08/06/30 21:59:42
manifest置け
30:デフォルトの名無しさん
08/06/30 22:46:42
Vistaなんてのを使う奴が馬鹿
31:デフォルトの名無しさん
08/06/30 23:53:02
>>23
1.9以上が普通になったら必要な記述だから、付けたままにして、
意味のあるコード名を書いておくべし。
コード中にASCIIしか使わないっていうなら別だが。
32:デフォルトの名無しさん
08/07/01 02:02:30
>>30
あなたのお使いのOSがサポート切られたら同じことが言えますか?
33:デフォルトの名無しさん
08/07/01 02:13:27
まあどちらにしてもRubyは関係ないな
Vistaプログラミングの解説でも読むといい
34:デフォルトの名無しさん
08/07/01 04:31:21
% ruby -v
ruby 1.8.6 (2007-09-24 patchlevel 111) [i486-linux]
% cat a.rb
1.upto(10){|i|
if i%2==1
s="aaa"
else
s=s+"bbb"
end
}
% ruby a.rb
a.rb:5: undefined method `+' for nil:NilClass (NoMethodError)
from a.rb:1:in `upto'
from a.rb:1
何故エラーになるのか、判る人いますか?
35:デフォルトの名無しさん
08/07/01 05:18:34
>>34
i が 1 の時(ループの最初回)、未定義の変数 s の値は nil となる
つまり5行目の s=s+"bbb" は s=nil+"bbb" となり # s = nil.+("bbb")
nil に定義されていないメソッド + が呼び出された為に NoMethodError が発生した
36:デフォルトの名無しさん
08/07/01 05:21:41
i=1のとき条件分岐はelse節に入って、s=s+"bbb"が評価される
ところが、この時点でsは未定義
たぶんsがString扱いになって、文字列連結されるのを期待していたんだろうけど
未定義のローカル変数はRubyではniになっちゃう
解決策。RubyにsがStringだってことを教えてやれば良い
s=String.newを書いておくとか
37:デフォルトの名無しさん
08/07/01 05:31:02
いやいやw、i==1でifの条件は満たされるだろう。
1.upto(10){|i|
p i
if i%2==1
s="aaa"
p s
else
s=s+"bbb"
p s
end
}
で、とりあえず動きを見てみれ。
このコード全体の前に
s=""
と書いとけば、おそらく望みの挙動をする。
38:36
08/07/01 05:33:36
あーダメだもう寝ようw
39:デフォルトの名無しさん
08/07/01 06:04:37
>>32
状況も含めて導き出される結論に対して、
別の状況を設定して「この状況下でも同じなのか?」とか訊いても無意味。
しかもなんか、状況と共に変わる結論は偽の結論だとでも言いたげだし。馬鹿なの?
40:デフォルトの名無しさん
08/07/01 06:18:08
質問スレで喧嘩すなw
41:デフォルトの名無しさん
08/07/01 06:41:38
ちょっと前に本スレでも同じようなやりとりがあったよ
スレリンク(tech板:482番)
まずRubyはソースコードをパースしてパースツリーを得る
パースツリーを解釈していく段階で代入文が見つかったら
それをRubyは変数の宣言なり定義と解釈する
>>34のコードでは、変数の宣言は代入文で静的に行われている
しかし(実行時に行われる動的な)初期化が行われていないのでsの値はnilになる
ということだろうと思うんだけど間違ってたら指摘してね
42:25
08/07/01 07:55:59
その後、解決できました。
このライブラリ(Ruby/MySQL)はもともとMySQL5用で、
MySQL4.1にはパッチで対応されていました。
自宅Winではこのパッチをあてることで動作確認できたため、
そのままアップロードして使おうとしていたのですが、うまくいきませんでいした。
おしえていただいたリンク先の解説やパッチの内容などから、もしやと思い
パッチなしでアップしてみたところ、正常な動作を確認しました。
詳しい理由はあいかわらずわかりませんが、そんなことがあった、ということで一応・・・アセ
43:デフォルトの名無しさん
08/07/01 08:16:02
>>34
% cat a.rb
1.upto(10) {|i|
if i % 2 == 1
s = i
else
p s
end
}
% ruby a.rb
nil
nil
nil
nil
nil
sがブロックの外側で定義されていないので、
sのスコープもエクステントもブロックの内側のみになる。
要するにブロックが実行されるごとに新しいsが作られている。
44:デフォルトの名無しさん
08/07/01 08:27:29
>>37
先頭に s="" を入れたらエラーがなくなりました。
それにしても、i=1でs="aaa"としているのに、次の
i=2でsがnilになってしまう理由が判りません。
pythonで同様の実行するとOKなのでますます不可解。
for i in range(1,10):
if i%2 == 1:
s="aaa"
else:
s=s+"bbb"
45:デフォルトの名無しさん
08/07/01 08:37:04
>>44
>>43
46:デフォルトの名無しさん
08/07/01 08:37:53
>>43,45
ありがとうございます。 状況が理解できました。
47:デフォルトの名無しさん
08/07/01 08:41:04
for を使うとスコープが変わるのが不思議なところ
% cat a.rb
for i in 1..10
if i % 2 == 1
s = i
else
p s
end
end
% ruby a.rb
1
3
5
7
9
48:デフォルトの名無しさん
08/07/01 08:42:50
全然不思議じゃないっしょ
Cなんかと一緒で{}内でスコーピングが閉じるだけ。
{
s = "hogehoge
}
このあとでsが参照されたらそりゃnilが返るっしょ
49:34
08/07/01 08:50:15
ふと疑問になったのですが、ブロック内の変数が毎回作られるかどうか
という挙動が、外部要因(ブロック内外で同じ変数名があるか)で変わって
くるとすると、ブロック外の変数をうっかり削除するとバグ要因になってしまう・・・・?
50:デフォルトの名無しさん
08/07/01 09:02:54
そうだよ
だから「えす」とか「あい」とか「てぃーえむぴー」とか
てきとうなへんすうめいはつかわないほうがいいね
これがわからないならるびーみたいなじょうきゅうしゃようのげんごじゃなくて
ぶいびーとかしょきゅうしゃようのげんごをつかうといいよ
51:デフォルトの名無しさん
08/07/01 09:16:49
>>49
基本的にブロック内の変数はブロックで閉じ込められると思えばよろし。
外部に同じ名前があったらそちらを参照するだけ。
わりとわかりやすいから問題になることはない。
ただし、ブロック変数が1.8までは外部に出ちゃうのが問題になった。
1.9からはブロック変数もブロックローカルになった。
52:デフォルトの名無しさん
08/07/01 09:26:47
変数有効区間が壁で区切られてるような2次元的イメージをするとRubyの動作は極悪に感じる
トップレベルという台にイテレータとかの各ブロックが乗っかってるような3次元的イメージをするとよい
53:デフォルトの名無しさん
08/07/01 09:30:02
>>51,52
ありがとうございます。 なるほど、そう割り切ればすっきりしますね。
実は、ブロック内の変数が毎回作られる、というのはクロージャの作り方と
関係あるんだろうか?と思案していましたので。
> ただし、ブロック変数が1.8までは外部に出ちゃうのが問題になった。
> 1.9からはブロック変数もブロックローカルになった。
以下の結果が1.8と1.9とで違うと解釈しました。
今まで副作用のバグで苦しむことが多かったので、1.9の方が素直に理解出来そうです。
i=100
1.upto(10){|i|
p i
}
p i
54:デフォルトの名無しさん
08/07/01 09:47:07
というか、スコープを作るためだけに while true をしなくても loop でよくなったって話では
55:デフォルトの名無しさん
08/07/01 20:37:54
Rubyの中から、自分が現在使用しているメモリーの量を知るにはどうしたらいいですか?
56:デフォルトの名無しさん
08/07/01 21:22:32
特にない
57:デフォルトの名無しさん
08/07/01 22:09:37
プラットフォーム非依存の方法はないな。
Linuxで File.read("/proc/#{$$}/statm").split.first.to_i とかできそうだし、
他の環境でもなんかあるんじゃない?
58:デフォルトの名無しさん
08/07/01 23:20:49
え・・・
自プロセスのサイズを知るのにそんな回りくどい方法をしないといけないんですか?
PHPですら、memory_get_usageで簡単に知ることができるのに・・
59:デフォルトの名無しさん
08/07/01 23:23:12
PHPじゃないから
60:デフォルトの名無しさん
08/07/01 23:37:18
Perlにもなかったよな
なんでPHPにはあるんだろうね
61:デフォルトの名無しさん
08/07/01 23:40:35
Pythonだと
resource.getrusage(resource.RUSAGE_SELF) あたりだなぁ。
62:デフォルトの名無しさん
08/07/01 23:41:24
え、「使用しているメモリ量」って言ったじゃん
63:デフォルトの名無しさん
08/07/01 23:41:42
PHPで言う所の$foo->$bar($baz)はどうすればいいのでしょうか
eval "foo.#{bar}(baz)"とする以外に方法が思い付かなかったのですが
もっと良い方法はありませんか?
64:デフォルトの名無しさん
08/07/01 23:49:24
プロセスのサイズとプロセスが使用しているメモリ量っておなじもの?
65:デフォルトの名無しさん
08/07/01 23:50:56
PHPの文法よーしらんが
$fooが変数、$barがメソッド名、$bazが引数ってことかいな。
foo.__send__(bar, baz)
__send__はsendでもいい
66:デフォルトの名無しさん
08/07/01 23:51:20
s/変数/オブジェクト/
67:デフォルトの名無しさん
08/07/02 00:01:05
perlはCPANからProc::ProcessTableをインストールして
(grep { $_->pid == $$ } @{Proc::ProcessTable->new->table})[0]->size
68:デフォルトの名無しさん
08/07/02 00:11:38
>>65
なるほど、__send__を使うんですね!ありがとう!
>$fooが変数、$barがメソッド名、$bazが引数ってことかいな。
その通りです、舌足らずでごめんなさい><
69:デフォルトの名無しさん
08/07/02 01:11:14
FastCGI+Rubyでwebプログラム作り始めました。
これRubyのプロセスがずっと居座って、foreachで回ってるんですよね。
以前、Rubyはずっと居座っていると使用メモリが肥大化していくということを
どこかで読んだ記憶があるのですが、
こういった問題に対してどのような解決法をとるのが普通なのでしょうか?
70:デフォルトの名無しさん
08/07/02 01:34:15
定期的にプロセスを再起動するのが手っ取り早い。
Rubyで書いたXMLRPCを話すdaemonとか稼動させてたけど、
別にプロセスは肥大化しなかったな。
プログラムの書き方によるんでない。
71:デフォルトの名無しさん
08/07/02 02:29:28
Rubyでは、クラス記述の冒頭で、インスタンス変数の宣言はしないんですか?
使用しているインスタンス変数がわかりやすいので
あった方がいいのではないかとも思うのですが
本に載ってるサンプルには書いてありません
72:デフォルトの名無しさん
08/07/02 02:31:25
クラス記述の冒頭にinitializeを置いてそこで初期化せよ、と
教祖の本に書いてある。
73:デフォルトの名無しさん
08/07/02 02:36:07
確かに、initializeに書いておけばわかりやすいですね
ありがとうございました
74:デフォルトの名無しさん
08/07/02 02:44:12
>>71 に便乗。
私も使い始めですが、確かに一覧性が無いと思いました。
クラスの記述で、インスタンス変数を初期化する処理は、initialize等のメソッド内に書くしか
無いのでしょうか。
75:デフォルトの名無しさん
08/07/02 02:50:30
外部に名前を見せても構わない場合は、
attr_reader :size (外部から読み取り専用の場合)
attr_accessor :name(読み書き両方)
のようなクラスメソッドを使うと、@size、@nameなどのインスタンス変数が
使えるようになり、size, name, name=などのメソッドで参照や設定ができる
ようになる。
完全非公開の属性で、name=とか定義する必要がないなら、どこかのインスタ
ンスメソッド(代表的なのがinitialize)で使うことで定義される。
76:デフォルトの名無しさん
08/07/02 02:55:27
未初期化のインスタンス変数にはnilが入ってるから
@hoge||=1
とかで初期化されてないときだけ初期化することは可能