プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。
【Ruby1.9 は不安定な開発版であり初心者には全く向きません】
【最新安定版の Ruby1.8.6 の使用を強くお勧めします】
関連スレやURLは
>>2-8あたりを見てください。Ruby on Railsの質問はRailsスレへ。
■質問する人へ
質問する前に次の3つをすること。ここで回答を待つよりそのほうが早い。
・モジュール名やエラーメッセージでググる
・マニュアルで引っかかったクラスの記述を探す
http://www.ruby-lang.org/ja/man/ ・FAQを一応読む
http://www.ruby-lang.org/ja/man/?cmd=view;name=Ruby+FAQ 質問には以下を書くこと。へたくそな質問は再提出を要求される。
・詳しい内容(「動きません」「うまくできません」では回答しようがない)
・エラーメッセージ(自力で訳さずなるべくそのままで)
・実行環境(OS名、Rubyのバージョン(ruby -v でわかる))
・最終的にやりたいこと(もっとよい方法がある場合が多いので)
回答してくれた人には「ありがとう」のひとことをいってあげて。
■回答する人へ
相手は初心者、根気よく育てるつもりで。質問がへたくそなのも大目にみてあげる。
それができないならこないこと(だって初心者スレだもん)。
・既出な質問やFAQは「XXXを読め」でいいので、叩かない&怖がらせない。
・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
7 :
デフォルトの名無しさん:2008/06/28(土) 07:40:53
RoRを使わず、CGIを作ろうと思います
高速化するための方法として、
FastCGI,Mongrel,mod_ruby等ありますが、
Mongrelは、RoRと組み合わせる以外の使い方は資料が少なく敷居が高そうだし、
FastCGIは不安定ということを、ネットでよく目にするし、
mod_rubyは、最終更新日が随分前なので不安があります
何がいいのでしょうか?
uniqに関する質問です。
以下のようなTSVファイルがあったとします。
1 A あ
2 B い
3 A う
一列目、三列目は無視して二列目のアルファベットだけを対象にuniqにしたいんです。
例えば、
1 A あ
2 B い
です。どのようにすればよいでしょうか。
宜しくお願いいたします。
uniq_byってないんだっけ
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:2008/06/28(土) 23:17:20
>>11 ありがとうございます!!!
自分の技量で書くと、相当複雑で助長になりそうだったので
綺麗な回答を得られて感謝します。
新しく、hashを覚えられて勉強になりました。
ar.inject({}) {|h, r| h[/\t([^\t]+)\t/.match(r)[1]] ||= r; h}.values
>>11(とほぼ同じ処理)を一行で書くと
>>13ってことかな。凄いwww
まあTAB区切りのカラムがいくつあるかわからない場合は、正規表現部分を
少し変える必要がある、かも?
あと、Hashのvalues()だから、順不同になる可能性もあるのかな?
でも、凄えwww
1.8 だと順序が保証されないね。
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"/>
お手数をおかけしますが、よろしくお願いします。
<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:2008/06/29(日) 03:55:02
>>17 おおお、取得出来ました!
hpricotでもxmlのparseが出来たんですね、知りませんでした...
しかもrexmlより簡単で分かりやすい(汗
本当にありがとうございました!
仰る通りミスです、すみません(汗 < <person id="111"/> <-- ここの / はミスだよね?
>>18 つXPath
p REXML::XPath.match(doc, "//person[@id=#{id}]/entry")
20 :
17:2008/06/29(日) 14:13:04
ぐは、REXMLでも十分簡潔に書けるのね。
21 :
16:2008/06/29(日) 22:01:25
Xpath.matchは知っていたものの、うまく扱う事が出来なくて諦めてました...(汗
>>17,
>>19さん本当にありがとうございます!
「初めてのRuby」いいね。本の厚みからは考えられないほど中身濃い。
Ruby初心者や俺みたいに知識があやふやな人にとっては特にそうだと思う。
Emacsでruby-modeを使っていますが,
ファイルを保存するとき先頭に -*- coding: ほにゃらら -*- がついちゃいます.
これを抑制する方法を教えて下さい
付けとけ
ピュア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で、これを比較して異なっているために例外が投げられています。
漠然としてまともに質問にもなってないんですが、なんとなく推測できる方いましたらお願いします。
27 :
25:2008/06/30(月) 19:26:31
>>26 ありがとうございます!
エラーメッセージでググったらいろいろ情報があったようです。
その都度違うと思っていた1<>3の部分までお決まりのエラーだったとは・・・
自分の場合Railsではないのですが、多分同じだと思うので
参考にして探ってみようと思いますm(_ _)m
28 :
デフォルトの名無しさん:2008/06/30(月) 21:43:45
Rubyスクリプトを実行するときに管理者権限の昇格を行う方法はありませんでしょうか?
XPで動いていたプログラムが、VistaのUACのせいで動かなくて困っています。
多くのシステムファイルを弄るプログラムでは、
管理者権限を得るために昇格ダイアログを出していますが、
これと同じことをRubyで行う方法はどのようなものがありますでしょうか?
manifest置け
Vistaなんてのを使う奴が馬鹿
>>23 1.9以上が普通になったら必要な記述だから、付けたままにして、
意味のあるコード名を書いておくべし。
コード中にASCIIしか使わないっていうなら別だが。
32 :
デフォルトの名無しさん:2008/07/01(火) 02:02:30
>>30 あなたのお使いのOSがサポート切られたら同じことが言えますか?
まあどちらにしてもRubyは関係ないな
Vistaプログラミングの解説でも読むといい
% 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
何故エラーになるのか、判る人いますか?
>>34 i が 1 の時(ループの最初回)、未定義の変数 s の値は nil となる
つまり5行目の s=s+"bbb" は s=nil+"bbb" となり # s = nil.+("bbb")
nil に定義されていないメソッド + が呼び出された為に NoMethodError が発生した
i=1のとき条件分岐はelse節に入って、s=s+"bbb"が評価される
ところが、この時点でsは未定義
たぶんsがString扱いになって、文字列連結されるのを期待していたんだろうけど
未定義のローカル変数はRubyではniになっちゃう
解決策。RubyにsがStringだってことを教えてやれば良い
s=String.newを書いておくとか
いやいや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:2008/07/01(火) 05:33:36
あーダメだもう寝ようw
>>32 状況も含めて導き出される結論に対して、
別の状況を設定して「この状況下でも同じなのか?」とか訊いても無意味。
しかもなんか、状況と共に変わる結論は偽の結論だとでも言いたげだし。馬鹿なの?
質問スレで喧嘩すなw
42 :
25:2008/07/01(火) 07:55:59
その後、解決できました。
このライブラリ(Ruby/MySQL)はもともとMySQL5用で、
MySQL4.1にはパッチで対応されていました。
自宅Winではこのパッチをあてることで動作確認できたため、
そのままアップロードして使おうとしていたのですが、うまくいきませんでいした。
おしえていただいたリンク先の解説やパッチの内容などから、もしやと思い
パッチなしでアップしてみたところ、正常な動作を確認しました。
詳しい理由はあいかわらずわかりませんが、そんなことがあった、ということで一応・・・アセ
>>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が作られている。
>>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"
>>43,45
ありがとうございます。 状況が理解できました。
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
全然不思議じゃないっしょ
Cなんかと一緒で{}内でスコーピングが閉じるだけ。
{
s = "hogehoge
}
このあとでsが参照されたらそりゃnilが返るっしょ
49 :
34:2008/07/01(火) 08:50:15
ふと疑問になったのですが、ブロック内の変数が毎回作られるかどうか
という挙動が、外部要因(ブロック内外で同じ変数名があるか)で変わって
くるとすると、ブロック外の変数をうっかり削除するとバグ要因になってしまう・・・・?
そうだよ
だから「えす」とか「あい」とか「てぃーえむぴー」とか
てきとうなへんすうめいはつかわないほうがいいね
これがわからないならるびーみたいなじょうきゅうしゃようのげんごじゃなくて
ぶいびーとかしょきゅうしゃようのげんごをつかうといいよ
>>49 基本的にブロック内の変数はブロックで閉じ込められると思えばよろし。
外部に同じ名前があったらそちらを参照するだけ。
わりとわかりやすいから問題になることはない。
ただし、ブロック変数が1.8までは外部に出ちゃうのが問題になった。
1.9からはブロック変数もブロックローカルになった。
変数有効区間が壁で区切られてるような2次元的イメージをするとRubyの動作は極悪に感じる
トップレベルという台にイテレータとかの各ブロックが乗っかってるような3次元的イメージをするとよい
>>51,52
ありがとうございます。 なるほど、そう割り切ればすっきりしますね。
実は、ブロック内の変数が毎回作られる、というのはクロージャの作り方と
関係あるんだろうか?と思案していましたので。
> ただし、ブロック変数が1.8までは外部に出ちゃうのが問題になった。
> 1.9からはブロック変数もブロックローカルになった。
以下の結果が1.8と1.9とで違うと解釈しました。
今まで副作用のバグで苦しむことが多かったので、1.9の方が素直に理解出来そうです。
i=100
1.upto(10){|i|
p i
}
p i
というか、スコープを作るためだけに while true をしなくても loop でよくなったって話では
55 :
デフォルトの名無しさん:2008/07/01(火) 20:37:54
Rubyの中から、自分が現在使用しているメモリーの量を知るにはどうしたらいいですか?
特にない
プラットフォーム非依存の方法はないな。
Linuxで File.read("/proc/#{$$}/statm").split.first.to_i とかできそうだし、
他の環境でもなんかあるんじゃない?
え・・・
自プロセスのサイズを知るのにそんな回りくどい方法をしないといけないんですか?
PHPですら、memory_get_usageで簡単に知ることができるのに・・
PHPじゃないから
Perlにもなかったよな
なんでPHPにはあるんだろうね
Pythonだと
resource.getrusage(resource.RUSAGE_SELF) あたりだなぁ。
え、「使用しているメモリ量」って言ったじゃん
PHPで言う所の$foo->$bar($baz)はどうすればいいのでしょうか
eval "foo.#{bar}(baz)"とする以外に方法が思い付かなかったのですが
もっと良い方法はありませんか?
プロセスのサイズとプロセスが使用しているメモリ量っておなじもの?
PHPの文法よーしらんが
$fooが変数、$barがメソッド名、$bazが引数ってことかいな。
foo.__send__(bar, baz)
__send__はsendでもいい
s/変数/オブジェクト/
perlはCPANからProc::ProcessTableをインストールして
(grep { $_->pid == $$ } @{Proc::ProcessTable->new->table})[0]->size
>>65 なるほど、__send__を使うんですね!ありがとう!
>$fooが変数、$barがメソッド名、$bazが引数ってことかいな。
その通りです、舌足らずでごめんなさい><
69 :
デフォルトの名無しさん:2008/07/02(水) 01:11:14
FastCGI+Rubyでwebプログラム作り始めました。
これRubyのプロセスがずっと居座って、foreachで回ってるんですよね。
以前、Rubyはずっと居座っていると使用メモリが肥大化していくということを
どこかで読んだ記憶があるのですが、
こういった問題に対してどのような解決法をとるのが普通なのでしょうか?
定期的にプロセスを再起動するのが手っ取り早い。
Rubyで書いたXMLRPCを話すdaemonとか稼動させてたけど、
別にプロセスは肥大化しなかったな。
プログラムの書き方によるんでない。
71 :
デフォルトの名無しさん:2008/07/02(水) 02:29:28
Rubyでは、クラス記述の冒頭で、インスタンス変数の宣言はしないんですか?
使用しているインスタンス変数がわかりやすいので
あった方がいいのではないかとも思うのですが
本に載ってるサンプルには書いてありません
クラス記述の冒頭にinitializeを置いてそこで初期化せよ、と
教祖の本に書いてある。
確かに、initializeに書いておけばわかりやすいですね
ありがとうございました
>>71 に便乗。
私も使い始めですが、確かに一覧性が無いと思いました。
クラスの記述で、インスタンス変数を初期化する処理は、initialize等のメソッド内に書くしか
無いのでしょうか。
外部に名前を見せても構わない場合は、
attr_reader :size (外部から読み取り専用の場合)
attr_accessor :name(読み書き両方)
のようなクラスメソッドを使うと、@size、@nameなどのインスタンス変数が
使えるようになり、size, name, name=などのメソッドで参照や設定ができる
ようになる。
完全非公開の属性で、name=とか定義する必要がないなら、どこかのインスタ
ンスメソッド(代表的なのがinitialize)で使うことで定義される。
未初期化のインスタンス変数にはnilが入ってるから
@hoge||=1
とかで初期化されてないときだけ初期化することは可能
メソッド名をキャメルケースで書くのは邪道なのでしょうか?
別に邪道って事は無いと思う
でも書いてるうちに違和感を覚えるようになるよ
自分の書いたメソッドだけ浮いて見えるから
型変換ぽいメソッドでときどき見かけるな。
Integer(...)とかPathname(...)とかHpricot(...)とか。
80 :
デフォルトの名無しさん:2008/07/02(水) 13:30:13
ライブラリを読む時、
requireをイテレータの中で読んだらいいと思うのですが
あまりそういうプログラムを見ません
何故でしょうか?
81 :
77:2008/07/02(水) 15:34:18
>>78-79 ありがとうございました
郷に入っては郷に従えなのでruby式でいこうと思います
>>80 #!/usr/local/bin/ruby -Ku
['net/http', 'uri', 'kconv'].each do |lib|
require lib
end
こんな感じ?
まあ、「スクリプト書いててキモチワルイから」だと思う
83 :
デフォルトの名無しさん:2008/07/02(水) 16:01:30
クラスメソッドの中から、クラス定数を参照する時、
self::HOGE
等でアクセスできないのって不自然じゃないですか?
クラス名をリテラル的に書くと、クラス名を変更した時に書きなおさないといけないので
selfと書けた方がいいと思うのですが…
1.9であっさりなくなったmailreadの代替ってなーに?
「1.9使うような人は自力でバースしたりTMailを自力でインストールして富豪的に使ってね」とかそんな感じ?
86 :
83:2008/07/02(水) 17:27:02
こういう書き方するんですね
ありがとうございました
>>86 X クラスメソッドの中から、
O インスタンスメソッドの中から、
前者は普通にself::HOGEできます。念のため。
88 :
デフォルトの名無しさん:2008/07/02(水) 17:45:22
文字列の一斉置換はどう書けばいいでしょうか?
String.subをループさせるだけだと
'a' → 'bbbb'
'b' → 'cccc'
の変換を同時に行いたい時に問題が出ますよね
何をしたいのかわかりやすく
>>88 String#gsubとかいう話じゃなくて?
細かい突っ込み2つ。
subは最初に見つけたとこしか置換しない。多分gsubのがあってる。
でもってString.subだとStringのクラスメソッドだ。通例String#subとか書く。
'ab'を'bbbbcccc'にしたいけど、何回も置換すると、
'ab' -> 'bbbbb' -> 'cccccccccccccccccccc'になって困るって話だったら、
Hashとかで作ったテーブルと組み合わせる。
table = {
'a' => 'bbbb',
'b' => 'cccc',
}
str.gsub(Regexp.union(*table.keys)){|m| table[m] }
>>91 ありがとうございます
知らない機能ばかりなので順を追って見ていきたいと思います
93 :
デフォルトの名無しさん:2008/07/02(水) 22:15:31
module M
X=1
module_function
def m1
・・・
end
end
class C
include M
def c1
m1
p X
end
def self.c2
m1
p X
end
end
C.new.c1 # => OK
C.c2 # => Error
クラスメソッドの中でモジュールのメソッドや定数を使いたいんだけど
モジュール名を指定しなくてもいい方法ない?
95 :
デフォルトの名無しさん:2008/07/02(水) 22:21:17
C:\>gem install twitter4r
Bulk updating Gem source index for:
http://gems.rubyforge.org Building native extensions. This could take a while...
ERROR: Error installing twitter4r:
ERROR: Failed to build gem native extension.
F:/Language/asr_ruby-1.8/bin/ruby.exe extconf.rb install twitter4r
can't find header files for ruby.
Gem files will remain installed in F:/Language/asr_ruby-1.8/lib/ruby/gems/1.8/ge
ms/json-1.1.2 for inspection.
Results logged to F:/Language/asr_ruby-1.8/lib/ruby/gems/1.8/gems/json-1.1.2/ext
/json/ext/parser/gem_make.out
C:\>ruby -v
ruby 1.8.6 (2008-03-03 patchlevel 114) [i386-mswin32]
gem_make.out読めよ
>>95 だからそれがどうした。
言いたいことがあればちゃんと言えこのタコ!
というだけじゃ冷たいので言っておくと、コンパイラ持ってないなら誰かにコンパイルしてもらえ。
>93
extend M
>>93 Moduleいっこincludeするだけなら
ancestors[1].m1
とか。
本題と違うけど引数なしのmodule_functionって非推奨じゃなかったっけ。
なんかリファレンスでみたような。
>>85 1.9.4くらいになる頃にはなんかステキなメール関係ライブラリが標準添付になります
まあ、rubygemが標準につくなら
「RubyでメールいじるならTMailをrubygemでまず入れましょう」
というようになるんじゃないかな
1.8系列がメインな現在は何も考えずにmailread使ってスクリプト書いていていいと思うよ
「1.9では無くなるライブラリなので今から使わないようにしよう」というのはやや大仰だ
というか、mailreadってなんでなくなったの?
メールをファイルからパースするだけのライブラリなんて誰も使わない?
Mailクラスを作る傍若無人さが気に入らないとか?
101 :
デフォルトの名無しさん:2008/07/03(木) 14:57:32
ハッシュには、%w"hoge moge"みたいな簡単な書き方はないのでしょうか?
ねっす
1.9に今移行するやつはバカ
と罵られても大丈夫な神経を持つように。
>>100 MLログ(coreのほう)にはこんなのがあるな。
NAKAMURA, Hiroshi
What libraries to be unbundled at ruby/1.9.1?
Urabe Shyouhei
I'd push mailread. It's nothing but a namespace pollution (holds "::Mail")
グローバルにMailというクラスを定義するほどのシロモノじゃねえよ(意訳)
あと、るびまにこんなの。
>ささだ TMail があれば TMail を使って。無ければ標準添付の mailread.rb。 あれ使ってるの俺しかいないんじゃないかと思うんだけど (笑)
>青木 あれもちょっとひどいよねぇ。 だいたい、なんで mailread.rb っていうライブラリ名で Mail なんて一般的なクラス名を……。 あれ許せないんだけど!
>ささだ あれすごいよね。……で、まぁあれのユーザーなんですけど (笑)
>青木 あれなくして欲しい。
>ささだ いや、でもなくされると私困るんだよ。
>青木 まずライブラリに別名を付けて、それから徐々になくしていく感じでさ。
でも、いきなり消えます、と。
>>101 Hash[*%w(hoge moge)]
で勘弁してくんろ。
106 :
デフォルトの名無しさん:2008/07/04(金) 01:57:29
Rubyにはcontinue文がありませんが
ネストされたeachを一気に抜けるにはどうしたらいいでしょうか?
http://itpro.nikkeibp.co.jp/article/COLUMN/20070606/273878/?ST=oss&P=4 ary.map{|i|[i.to_i,i]}.sort.map{|j|j[-1]}
シュウォーツ変換を用いたソートのコード
ary.map{|i|[i[-1].to_i,i]}
で要素を基に比較の対象となる値(i.to_i)を計算し,
要素そのものと一緒に配列に入れておきます。
最後に元の配列の要素だけ取り出し,ソート結果を得ます。
.map{|j|j[-1]}
--------------------------------------
iだったりi[-1]だったり・・・
-1 がつく意味が分かりません.
というか,コードと解説で -1 があったりなかったり.
[これはひどい]Matzのやっつけ仕事
本当にやっつけ仕事だな
["1", "11", "2", "6"]をシュワルツ変換は
単純化のためとはいえどうかと思う
>>108 a.zip(b)の間違い
>>109 -1が出てくるのはこれでわかるだろうか
irb(main):001:0> ary = ["1", "11", "2", "6"]
=> ["1", "11", "2", "6"]
irb(main):002:0> ary.map{|i|[i.to_i, i]}
=> [[1, "1"], [11, "11"], [2, "2"], [6, "6"]]
irb(main):003:0> ary.map{|i|[i.to_i, i]}.sort
=> [[1, "1"], [2, "2"], [6, "6"], [11, "11"]]
irb(main):004:0> ary.map{|i|[i.to_i, i]}.sort.map{|j|j[-1]}
=> ["1", "2", "6", "11"]
>>111 j[-1] は意味があるが、 i[-1]は意味がない。(ソートの役にたたない)
>>111 解説ありがとうございます.
>>112 そう,それが疑問だったんです.
C/C++/Python/PHP を日ごろ使っているんですが,
Ruby もなかなかよさそうですね.
Mutexってプロセス間同期にも使えますか?
それとも単一プロセス内のマルチスレッド間同期のみですか?
>>106 ネストを一気に抜けるcontinue文って何にあるんだ。
Cのcontinueに相当するのはnextだが。
Javaのラベル付きcontinueじゃなかろうか
PHPとかでの break の事だろうか
PHPは相変わらずてきとーに使うぶんには便利な機能満載だな
breakで全部抜けるのか
>>119 普通は一番内側のループだけ。C言語と同じ > PHPのbreak
ただ、引数?を指定できて、抜ける階数を指定できる。
結局 昔はやったgoto文の是非になるよ。
アマ:gotoは使わないほうがいいですよね。
プロ:そうですね。勧められませんね。
(ぼけ 使ったほうがスッキリしてメンテも楽なんだよ。
ま でもある程度わかってからじゃねーと無理だもんな。)
Rubyのcatch/throwは進むだけで戻ることはできないんだから、
あっちこっちに飛び回るようなコードは書きにくい。乱用はしにくいはず
call/cc に比べれば全然白魔術
むかしは、それcatch/trhowでできるじゃん的なcallccの使い方しか知らなかった。
> call/cc に比べれば全然白魔術
そうだね
Fiber だね
126 :
デフォルトの名無しさん:2008/07/05(土) 02:56:48
Stringクラスにオリジナルのメソッドを追加したいのですがどう書けばいいですか?
class String
def double
self + self
end
end
128 :
デフォルトの名無しさん:2008/07/05(土) 03:02:02
>>126 class ::String
def hello
puts "Hello #{self}!"
end
end
::を書くと、他のmoduleの中にも書けるみたいですね
ありがとうございました
131 :
デフォルトの名無しさん:2008/07/05(土) 05:35:18
132 :
デフォルトの名無しさん:2008/07/06(日) 01:36:11
Fileをブロックで操作した場合、
ロックは気にしなくていいんですか?
複数のプロセスから書き込んだ場合にファイルが壊れたりしませんか
つFile#flock
134 :
デフォルトの名無しさん:2008/07/06(日) 02:24:30
>>133 ありがとうございます
ただロックの仕方が分からないのではなく
File.open(filename){|fh| ...}
というファイルクローズまでお任せの書き方の時、
ファイルロックまでお任せできるのか、どうか?と思ったのです
ファイルロックまでお任せしないほうがいいからね
パフォーマンスや飢餓の問題があるし
openが忘れずクローズしてくれるってところから忘れずアンロックしてくれる
というふうに発想したんだろうけど、それは残念ながらないですね。
File.flock(...) do
File.open(...) do
end
end # unlockされる
という形で使えると便利な気はしますが、とりあえずensureで。
ありがとうございます
ではちゃんとロック・アンロックしなきゃいけないんですね
class File
alias plain_flock flock
def flock(op)
return plain_flock(op) if op == LOCK_UN
return plain_flock(op) unless block_given?
begin
plain_flock(op) && yield(self)
ensure
flock(LOCK_UN)
end
end
こんなとこ?
closeすればロック外れるぞ
少なくともXPとlinuxとmacとFreeBSDでは
140 :
デフォルトの名無しさん:2008/07/06(日) 03:23:58
設定ファイル等の値によって、生成するクラスを変更する場合は
どうするのがいいですか?
PHPだと
$class_name = 'HogeController'
$controller = new $class_name()
のようにしていました。
evalで生成する文自体を動的に組み立てればできますが
evalはかなり遅いようです
いい方法はないでしょうか?
class_name = 'HOgeController'
clazz = Object.const_get(class_name)
あ、
controller = Object.const_get(class_name).new
だな。
143 :
140:2008/07/06(日) 04:21:56
Matzの会社を財務分析してみたんだが。
http://d.hatena.ne.jp/AntiSeptic/20080704/p1 などと思わせぶりな言い方をするものだから覗いてみりゃ、
なんて事無い田舎の零細企業の財務諸表であって、面白くもなーんともなかったわけだ。
それにしても、この程度の収益で2007年度って、
あの会社にとっては多分空前絶後の景気のいい年だったはずだの
Rubyとゆー「鉱脈」があるだの言っているのは何なのだ。
Geekのヨタ話というのは、いつもこんなしょぼいスケールで行われているのか?
あそこの技術者の平均レベルは、他の普通の会社よりはずっと高いと思うって、
これじゃあ、技術なんてIT企業の収益とは何の関係も無いと証明しているようなもんじゃねえか。
そもそも、この会社が何をやっているのかがHPを見た限りではよく分からん。
要は受託開発だろ労働力を人月で売ってるだけだろマーケ屋がこねくりあげた横文字得意げに使ってなに悦に入ってやがんだコラ。
更には製品・サービス部門まであって、なにやら参考価格が書いてあるところを見ると、
多分にパッケージっぽい印象を受けるが、それでいて全体の粗利率が26%程度ではどうしようもないだろ。
あそこに入りたい人は、損益計算書も注意して見ておくといい。まぁこれはどんな会社でも同じだけど、
ここを見るといろんなことが見えて来る。株価指標を計算してみるのもいい(非公開会社でもね)。
零細SIerの営業力と確保できる工数じゃこんなもんだろ。
おいしいところはCTCなりがもってけばいいんじゃないの。
マルチレス君て馬鹿だな、まで読んだ
>>144 これ他のエントリも結構面白いこと書いてあるな
148 :
デフォルトの名無しさん:2008/07/06(日) 13:00:50
149 :
デフォルトの名無しさん:2008/07/06(日) 16:12:45
FastCGI+Rubyで簡単なページを表示するだけのプログラム書いてみました
Rubyが最初から起動するほどの待ちはありませんが、
それでもなんとなくモッサリしています
こんなものなのでしょうか?
>>149 まあそんなもんです
そんな日常的アクセスで遅すぎるほど遅いこともないと思うんだけど
ruby のスクリプトとかに使えるカコイイアイコンください.
*.ico フォーマットになってるとうれしい.
64x64 フルカラーとかいろんなフォーマットでください.
おお,こりゃいいや,ありがとう
そういえばRubyアイコンコンテストってどうなったんだろう
Rubyにロゴなんてありませんよ
>>155 ロゴコンテストじゃなくてアイコンコンテスト
158 :
デフォルトの名無しさん:2008/07/06(日) 19:53:39
Hashを{1=>"a", 2=>"b", 3=>"c"}
という形式の文字列にするにはどうしたらいいですか?
to_sだと全部繋がってしまいます
>>158 irb> h = {1=>"a", 2=>"b", 3=>"c"}
irb> puts h
1a2b3c
irb> puts h.inspect
{1=>"a", 2=>"b", 3=>"c"}
160 :
158:2008/07/06(日) 20:19:26
Rubyのto_sは変な動作に定評がある
>>161 もうちょい早く直るとよかったんだけどねえ
まあ変なのがなくなりつつあるだけでも良しとせねば
163 :
デフォルトの名無しさん:2008/07/06(日) 21:57:00
Ruby on Rails 2.0を今日から使いはじめました。
$ ruby script/generate scaffold user name:string ...
$ rake db:migrate
とやってモデルとDBのテーブルを作成したのですが、
新たに列を追加したくなりました。
モデルを再作成しないで列を追加する方法を教えて下さい。
このWebサイト見ろ!ごるぁでも結構です。
行儀よくやるには
script/generate migration AddXxxToUser
だけど。
未公開の開発途上なら、db:migrate:downしてから CreateUsersマイグ
レーションを書き換えてマイグレーションやり直してもいいよ。
RubyはPHPのように、関数の定義をファイルの末尾にまとめることはできませんか?
def hoge()
end
hoge()
のような順番じゃなくて、
hoge()
def hoge()
end
のように書いてみたいんですが。
Rubyで、遅い部分だけC言語化するみたいなことってできます?
>>166 できる。というか、Rubyの標準ライブラリは
多くがCで書かれている
関数定義も、上から順に「評価(実行)される」ものなので、こんな風に
するくらいしかないかなー。
main = proc { hoge }
def hoge
end
main.call
169 :
163:2008/07/07(月) 00:54:23
170 :
デフォルトの名無しさん:2008/07/07(月) 02:20:25
PHPのArrayのような「順番を持ったハッシュ」がRubyにあれば教えてください。
個々の要素にはキーでアクセスしたいし、
取り出す時は決まった順番で取り出したい、っていう時に欲しいです
ruby1.9をどうぞ
172 :
170:2008/07/07(月) 02:26:33
>>171 ありがとうございます
1.8は自分でなんとか書くしかないんですね
荷が重いですが・・
173 :
170:2008/07/07(月) 02:39:52
Hashにあるメソッド全部実装すること考えたらやっぱ荷が重いです(><)
ActiveSupportをインストールするとActiveSupport::OrderedHashてのがあるな。
1.9でActiveSupportをロードすると、Hashの別名として定義するようになってる(笑)
順番の保存は普段は必要ないことが結構多かったりするんだけどな
順番枚挙機能が欲しいだけならハッシュ登録時に配列にキー入れといて orders.map{|k| h[k]} とかで取得しれ
>>170 gemでhashで検索したら2つくらいあったぞ
>>163 $ ruby script/generate migration add_COLUMN_to_TABLE
$ vi db/migrate/XXX_add_COLUMN_to_TABLE.rb
## db/migrate/XXX_add_COLUMN_to_TABLE.rb の中身
class AddColumnToTable < ActiveRecord::Migration
def self.up
add_column 'table1', 'column1', :string
end
def self.down
remove_column 'table1', 'column1'
end
end
$ rake db:migrate
↓で(2)の場合に(1)と違ってbも変更されるのは何でなんですか?
(1)irb(main):010:0> a=b=0;p a, b;a=1;p a, b
0
0
1
0
=> nil
(2)irb(main):011:0> a=b=Hash.new;p a, b;a["A"]=1;p a, b
{}
{}
{"A"=>1}
{"A"=>1}
=> nil
(3)irb(main):012:0> a=Hash.new;b=Hash.new;p a, b;a["A"]=1;p a, b
{}
{}
{"A"=>1}
{}
=> nil
= と []= は違う
>>180 本当だ。
(4)irb(main):010:0> a=b=Hash.new; p a,b; a={'A'=>1};p a,b
{}
{}
{"A"=>1}
{}
=> nil
これは、仕様ですか?
Rubyのオブジェクトの実際について、解説の本とか入門サイトとか読んでないん?
読んでないならオブジェクトについて勉強することをお勧め
183 :
デフォルトの名無しさん:2008/07/07(月) 20:18:05
WindowsのgemでZenTestが入らないのですが、うまく入れられている人いますか?
gem install ZenTest
としたのですが、コマンドプロンプトが固まってしまいます。
184 :
183:2008/07/07(月) 20:23:46
何回も落としてやり直したらうまくインストールできました。
gem不安定なのかな?
しつもん。
puts 長文入り配列.map{|e| addtag(e).toeuc}
と
puts 長文入り配列.map{|e| addtag(e)}.join("\n").toeuc
では、後者のほうが NKF の使用が1回だけで済んですっきりさんですか?
やっぱ NKF って使用回数が少ないほうが好ましいですよね?
HTTP での '200' とか '404' とかいういわゆるマジックなナンバーを使う代わりに、
標準組み込みライブラリの net/http の定数か何かを流用することはできませんか?
Net::HTTPOK が '200' になるとか、Net::NotFound が '404' になるとか、そんな感じのステキなやつです
Net::HTTPResponse::CODE_TO_OBJ.index(Net::HTTPOK) は確かに '200' ですが、
これなら '200' # HTTPOK と注釈つきで数字を書いたほうがまだわかりやすそうです
それならこんなんではどうか
class Net::HTTPResponse
def self.code
Net::HTTPResponse::CODE_TO_OBJ.index(self)
end
end
p Net::HTTPOK.code # => "200"
case resp
when Net::HTTPOK
puts "OK"
end
WEBrickのことも思い出してあげてください
require 'webrick/httpstatus'
include WEBrick
HTTPStatus::OK.code #=> 200
HTTPStatus::OK.reason_phrase #=> "OK"
HTTPStatus::RC_OK #=> 200
詳しい使い方は、httpstatus.rbのソースコード読めばたぶん分かる
正直
HTTPOK = "200"
でいいような気もする
>>186 上の方は .join("\n") が抜けてるんだよな?そうでないと結果が同じにならないし
メソッド呼び出しを無視すれば変換処理自体はどっちもほとんど同じじゃないかな?
ただし toeuc は元のエンコードを自動識別する(nkf -em と等価、kconv.rb 参照)
一つにまとまってればこれは一回ですむから、後者の方が効率がいいといえる
# 当然だけど配列内のエンコードは統一されていることが前提
気になるんなら自分でベンチマークでもしてみたら?
配列をputsしてるから見た目的にはおおむね同一だろ
ハッシュを配列にした場合[key,value]というような配列になりますよね?
このvalueの値が["aaa","bbb","ccc"]のような形式になっています。
このvalueを","で区切り配列を[key,aaa,bbb,ccc]のようにするにはどうすればよいでしょうか?
spliteを使用しようとするとエラーが出て使用できませんでした。private~というエラーです。
[key, value].flatten ではだめ?
すみませんでした。そこは自己解決できました。
修正中1つ気になったのですがハッシュのkey"a"に対して a << b のようなプログラムを書いた場合
key"a"にvalue"b"が追加されるようですがこれをループ(bの値を変えて連続で)させた場合はkey"a"のvalueはどうなるのでしょうか?
"a" => b, b, b, b のように複数のbがvalueとして配列のように追加されるのか、
"a" => bbbb のようにすべてのbが結合され1つのvalueとなるのでしょうか?
最初に << するとき hash に key "a" に対応する要素はないから
nil.<< b することになってエラーになってるだろ?
そうでないなら初期値はあなたがきめた何か "" や [] であるはずで、
それらに定義された << の動作に従う。
× nil.<< b
○ nil << b
書き忘れてましたがifでaが空ならば a = b としているのでエラーは出ていませんでした。
配列のように追加したければハッシュの宣言部で配列が初期値だとしておけばいいということでしょうか?
何言ってるかわかんないけど試そうとは思わないの?
>>199 あなたはおそらく、訊く前にまず自分で考えるべきだ
あと質問する側の「書き忘れていました」は、回答する側に相当悪い印象を与えるからできる限り止めろ
202 :
デフォルトの名無しさん:2008/07/09(水) 03:30:26
オフラインで見れる、一番詳しいrubyのマニュアルって
rubymanjp.chmくらいですか?
ADSLの切り替えで一時的にネットにつなげないのですが
rubymanjp.chmのerbの資料が少なすぎて泣きました
もっとごっそり入ってる、オフラインで閲覧可能な情報源があれば教えてください
速いかどうかはそれほど問題にしてないと思われる
まあ、「すっきりさん」という表現も曖昧模糊だが
要素内文字を操作したあと一気に文字列にするのと
文字入り配列をjoinして文字列操作するのでは
配列のままを使用する前者のほうがRubyっぽい書き方だと思う
パスカルの三角形
print("Enter n: ")
n = gets.chomp.to_i
if n>30 or n<0
then n = 10 end
C = Array.new(n)
n.times{|i|
C[i]=Array.new(i+1) }
C[0][0] = 1
for i in 1...n
C[i][0] = 1
end
for i in 1...n
C[i][i] = 1
end
for i in 1...n
for j in 2...n
C[i][j] = C[i-1][j-1] + C[i-1][j]
end end
for i in 0...n
for j in 0...(n-i)
printf " %3d", C[i][j]
end print "\n\n" end
ってやってみたんだけど、はじかれちゃう
なんでだ?
>>205 はじかれる?とはどういう意味?
構文解析でエラーになる件なら、
ソースに全角空白が混じっているが
全角はコピったときについ入れてしまった
for i in 1...n
for j in 2...n
C[i][j] = C[i-1][j-1] + C[i-1][j]
ここら辺がうまくいっていないっぽい
208 :
デフォルトの名無しさん:2008/07/10(木) 03:31:05
ハッシュをローカルスコープの変数に展開したいのですが、
evalを使わずにする方法はありませんか?
209 :
207:2008/07/10(木) 03:34:49
そのあたりの行のエラーメッセージが下の感じです
C:/e.rb:27: undefined method `+' for nil:NilClass (NoMethodError)
from C:/e.rb:26:in `each'
from C:/e.rb:26
from C:/e.rb:25:in `each'
from C:/e.rb:25
210 :
デフォルトの名無しさん:2008/07/10(木) 03:56:43
C[0][1] == nil
てか、
>>205みたいなのは、傲慢に過ぎる
何故俺がお前の、ポイントも提示されず、読ませるための工夫も無い
糞ソースを、一から読まなきゃいけないんだ
212 :
202:2008/07/10(木) 04:08:23
213 :
デフォルトの名無しさん:2008/07/10(木) 04:21:05
>>213 そのページの「新しいインターフェイス」は「自動quote」のことじゃないと思う
そこの文章(と実験スクリプト)を良く読んでみ
>>211 > 一から読まなきゃいけないんだ
義務があると思っているなら、あなたはただの馬鹿です。
義務があるなら愚痴を言ったり文句を言ったりする余地はない
どんな結果が欲しいのか書かないとこんな答え方しちゃうぞ
print("Enter n: ")
n = $stdin.gets.chomp.to_i
n = 10 if n < 1 || 30 < n
tri = Array.new(n)
n.times do |i|
tri[i] = Array.new(n-i)
tri[i][0] = 1
tri[0][i] = 1
end
for i in 1...tri.size
for j in 1...tri[i].size
tri[i][j] = tri[i][j-1] + tri[i-1][j]
end
end
tri.size.times do |i|
tri[i].size.times do |j|
printf("%4d",tri[i][j])
end
print "\n\n"
end
定数回ループにfor文を使っている馬鹿がまた現れたか!
CやJavaでは当たり前でした。
220 :
デフォルトの名無しさん:2008/07/10(木) 16:26:52
ソートの条件の書き方を教えてください
配列のソートがうまくいかない。
x[n]<<[ホスト名,日付]
の配列をホスト名ごとに時系列順にソートしたいんです
>>220に書かれていることだけでは問題点がわかりにくいので、
どのようにうまくいっていないかが知りたい。
なにかしらエラーが出てるならエラーメッセージを書いてほしいし、
間違った動作をしているならそれを再現するソースコードがあるといいな。
一応、xには隙間無く要素が詰まっているとするならば
単にx.sortでソートできるはず。
x = [["b", Time.at(2)], ["a", Time.at(3)], ["b", Time.at(1)]]
x.sort
# => [["a", Thu Jan 01 09:00:03 +0900 1970],
# ["b", Thu Jan 01 09:00:01 +0900 1970],
# ["b", Thu Jan 01 09:00:02 +0900 1970]]
もしxの要素にnilがあるならx.compact.sortでnilを取り除いてからsort。
もしx.sortしたあとに「xがソートされていない」と思ったらx.sort!すればよい。
…という感じで、
>>220読んだだけでもいろいろ要因を思いついてしまうので、
(しかも外している可能性大) 詳細を希望します。
まあ、これはかなりの割合でマニュアル側の不備というか不親切だと思うんだ
確かに配列の大小比較の結果上間違ってはいないし
sortのマニュアルにも0より大きいかどうかで並ぶとか書いてあるが、
普通はこれを利用ようとはまず思わない
>>220 まず、その配列xの作り方がRubyとしてかなり変である可能性が大だ
x = Array.new
ホスト名と日付のある行の配列.each do |l|
ホスト名 = lから正規表現とかで抽出
日付 = lから正規表現とかで抽出
x << [ホスト名,日付]
end
こうやって作ってくれ
添字をfor文とかで増分させて配列にデータを入れるというのは普通やらない
で、
x.sort{|e| [e[0], e[1]]}
でよいというかこれは
>>222の言うように単に配列をsortしただけだな
1要素目のホスト名を文字列としてsortした結果の中で2要素目の日付を(たぶん文字列で)sortした結果で並ぶ
もしホスト名をホスト単位でsortしたい(このままだと先頭にwwwがつく別ホストがずらっと並ぶはず)場合は
そのように大小を返すメソッドを作ってe[0]の代わりに hostsort(e[0]) とかしれ
それはsort_by
225 :
デフォルトの名無しさん:2008/07/10(木) 17:17:49
>>221-223 言われたことにちゅういしてやってみます
エラーが何だったかわかったらまたかきます
>>223 疎な配列を作りたかったのかもしれないじゃないか
227 :
デフォルトの名無しさん:2008/07/10(木) 17:59:27
さっきのなおしてやってソートしたら日付が日/月/年って並んでるんですが
06/6/2007
06/6/2007
06/6/2007
06/9/2002
てなるんですがどうすればなおせますか?
229 :
デフォルトの名無しさん:2008/07/10(木) 18:31:38
すいませんでした
230 :
デフォルトの名無しさん:2008/07/10(木) 19:45:56
会員の高野光弘とやらが、非常識な言動をしていることについて、
日本Rubyの会はどう考えているのでしょうか?
コピペか
232 :
デフォルトの名無しさん:2008/07/11(金) 01:22:29
正規表現を使って
[10/May/2008:06:47:07 +0900]
をまとめて文字列として抽出したいのですがどのような記述をすればよいですか?
…またお前か
すこしはsage覚えような
ほんのちょっとデータが変わっただけで全く使えなくなるから
データと正規表現の関わりそのものを覚えたほうがいい
ほぼ確実にマッチするパターンを見つけるんだ
ひとつの正規表現で難しかったら複数のif文と変数使用を躊躇ったらイカン
案外Stringクラスのsplitメソッドで配列にするだけで用が済んだりしないか?とか
234 :
232:2008/07/11(金) 01:46:22
sage推奨スレだと知りませんでした、すみませんでした。
あと自分はこのスレで質問するのは初めてです。
上の方で似た状況の方がソートについて質問されていますが
私は抽出したものをそのまま表示したいだけです。
その文字列にあう正規表現を知りたい?
それとも正規表現を使って複数の一致する文字列を取り出す方法を知りたい?
236 :
232:2008/07/11(金) 01:54:34
"複数の一致する文字列を取り出す"というのがよくわからないので
この文字列にあう正規表現を教えていただきたいです
よろしくおねがいします。
質問でageるのは当然だろう
専門スレをわざわざ上げる意味特にないしな
どこまで書けばいいのかわからないから
/¥[[^¥]]+\¥/ とか
%r!¥[¥d+/[A-Z][a-z]{2}/¥d+:¥d+:¥d+:¥d+ ¥+¥d+¥]! とか
%r!#{Regexp.quote("[10/May/2008:06:47:07 +0900]")}! とか
書いてみる。
メール欄を空にするっていうのはIDのある板の慣習だな
マ板はID無いし最新10スレで見かけたくらいでは誰も答えられないし
スレ住人の多くは専用ブラウザで新着チェックしてるだろうし
あんまり意味ないかもしれん
正規表現使わずに空白で区切って2つの要素書き出すだけで済むと予測
>>232 >正規表現を使って
>[10/May/2008:06:47:07 +0900]
>をまとめて文字列として抽出したいのですがどのような記述をすればよいですか?
こんなんでどうでしょう
str.scan(/¥[¥d+¥/[A-z][a-z]+¥/¥d¥d¥d¥d:¥d¥d:¥d¥d:¥d¥d ¥+¥d¥d¥d¥d]/) do
puts $&
end
243 :
232:2008/07/11(金) 02:13:33
ありがとうございました、無事に目的の動作をしてくれました。
>>243 >>239 >>241 >>242 のどれを参考にしてどのように解決したのかがわからないと、
質問に(エスパーして)回答した人間にも、また後から検索等でこのスレを参照する
人間にも、何一つ残らないんだがな。
これってわざと?
エスパーが必要な初心者がそんなことまで分かるわけ無いだろう
list[13],list[200],list[1340]・・・
のように添字が0から順に入っているのではなく乱数が入っている配列があり
添字の小さい順に中身を表示したいのですがどうすればいいですか?
247 :
デフォルトの名無しさん:2008/07/11(金) 04:14:18
Ruby暦2日です。他の言語の経験はあり。
"2000年01月02日" という文字列をDateクラスに変更する
場合どうやりますか?
もちろん正規表現を使って2000, 01, 02 をy, m, d という
変数に入れてってやればできるのはわかりますが、
Rubyっぽく書くにはどうすればいいでしょう?1行で。
2行で書くやり方はわかりました。
>>246 nilで埋まってると仮定して、
添字が必要ないなら、list.compact
必要なら each_with_index で回して条件式付けるだけじゃない
>>246 ArrayやめてHashを使ってみたらどうだろう
list = Hash.new
list[13] = :a
list[200] = :b
list[1340] = :c
list.keys.sort.each {|key,val| p val }
>>247 その2行で書くやり方ってのは秘密にしなくちゃならないのかね
Date.strptime
>>247 Date.parseは日本語表記には対応してないから、正規表現使うしかないんじゃないかな。
date = (require "date"; Date.new(*/(\d+)年(\d+)月(\d+)日/.match("2000年01月02日").captures.map(&:to_i)))
251 :
249:2008/07/11(金) 04:51:17
まちがえた
×list.keys.sort.each {|key,val| p val }
○list.keys.sort.each {|i| p list[i] }
逆に日本語の部分を - に置き換えればいいんじゃね?
ruby -Ku -rdate -e "p Date.parse('2008年07月11日'.gsub(/[^\d]/u,'-')).to_s"
253 :
247:2008/07/11(金) 05:37:40
>>249 特に秘密にしたわけでもなく、しょぼいコードなんで特に書くまでもないかなぁと思って。
元のコード↓
y, m, d = /(\d+)\D+(\d+)\D+(\d+)\D+/.match(datestr).captures.map {|e| e.to_i}
date = Date::civil(y, m, d)
Date.strptime(datestr, "%Y年%m月%d日")
でokでした。全然Rubyっぽく書かなくてokだったんですね。
>>250 最後の(&:to_i)がよくないみたいなんで、↓のようにしたらokでした。
date = Date.new(*/(\d+)\D+(\d+)\D+(\d+)\D+/.match(datestr).captures.map{|e| e.to_i})
ついでにもうひとつ質問ですが、最初の * ってどういう意味ですか?
254 :
247:2008/07/11(金) 05:38:49
Rubyっぽいっていう意味がわからない
そりゃそれほど意味はなかろう
感覚だもの
制御構造と増分パラメータでデータに順にアクセスする代わりに
データ自体をコレクションにしてeachでぶん回すとか
そういう目に見えてわかりやすい「Rubyらしさ」だけではないからな
ところでRubyって末尾再帰の最適化してくれる?
258 :
247:2008/07/11(金) 08:40:08
>>255-256 おっしゃる通り特に大した意味はないです。
「あー、それであってるしJava(C, PHP, etc)では確かに
そうやるんだけど、Rubyだと普通はこうやるねー。」
みたいなのがあればそう言う方法を知りたいなと思っただけです。
>>257 いや全然
そういう意味でRubyの再帰はオマケ
Rubyの練習で、以下の機能を持った体重日記を作ろうとしています
・1週間の体重の推移がシンプルな折れ線グラフで表示される
・フォームからその日の体重をPostすれば、グラフに反映される
・体重の入力は、携帯から行う
なんとか体重の入力と記録、重複のチェックは作ったのですが、
肝心の「グラフ化」をどうすればよいのかわかりません
以下の一連のレス(Nで前進、Pで後退)も参照したのですが、
携帯で使えるかどうかがわからないもので…
(今ならば、もっと新しい方法があるのでしょうか)
ttp://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/30426 見た目にはこだわりませんので、
初心者でも比較的簡単に実装できるグラフ化の方法がありましたら
どうか教えてください。
なんか微妙にハイレベルな問題だな
えーと、そのRubyスクリプト(たぶんCGI)を動かすためのサーバに
どんなソフトがインストールされてるかに完全に依存する
授業やら演習やらでの話なら、その前の授業とかでグラフや画像の作成の問題が出てるはず
全く出てないなら極悪授業だな
外部プログラム無しのRubyだけで画像を生成するのは至難の技だ
…まあそりゃ画像フォーマットにもよるけどさ
でもXBMとか作っても仕方ないだろ
263 :
260:2008/07/11(金) 14:42:43
>>261 サーバはロリポップを使う予定です。
ttp://lolipop.jp/?mode=manual&state=hp&state2=cgi …何が入っているんでしょうね。
お勧めのものを伺って、使えるかどうかサポートに尋ねることにいたします。
なお、授業や演習の課題ではなく、趣味とダイエットを兼ねた練習です。
>>262 最悪、XBMの白黒グラフでも良いですが、やはりできれば色が欲しいです。
「外部プログラム」の使い方(設置の仕方)を把握していない程度には
初心者ですので、お勧めのものがあれば設置方法も教えてえくださいますと
大変助かります。
(今から自分でも検索してみます。外部プログラムが必要なんですね…)
初心者なのに微妙にハイレベルな問題に足を突っ込んでしまっていますが、
「身の程知らずめ!」と思わず、ぜひお力をお貸しください。
ところでさ、pack と unpack がウンコみたいに書かれたコードを読み解かないといけないんだけどさ
pack とか unpack とかそもそもナンデスカという人向けの勉強になるサイトとか誰かご存知ないですかね
C 言語に習熟していれば素直に理解できたりするのかな?
>>264 Google Chartを使うとは。色々な方法があるものですね
データの渡し方は、いまからシコシコ試してみます
rubygemsの可否は、オペレーターのお姉さんに聞いてみます
ImageMagickのこととかも調べていると、明日になりそう…
でも、おかげさまで助かりました。
とりあえず、いただいた回答&ヒントでがんばってみます
結果はまたご報告します
>>260 PNGでいいならPureImage/Rubyでいいんじゃない?
しかしダイエットのためにプログラミングとは素敵な動機だな
グラフを作るってのは画像を作るってのとは違うからなあ
折れ線描くための計算をするのも手作業だろ
>>268 折れ線グラフなら、計算つったって画像サイズを元にした割合からpx座標の
整数値に落とすだけじゃない?
その程度の計算は、中学生でも多分可能だと。
ruby1.8で、
cattle = "yahoo"
の後に
cattle[2] = ?p
でcattleの参照先が
yapoo
になるのが不思議です。
?pは
1.8では112
1.9では"p"
だから、cattle[2] = ?p
っていう代入が正しく動作するのは1.9だけだと思うのですが、
どうして1.8でも正しく動作するのでしょうか?
>>271 おお!そういうことか!納得。
でもこのマニュアルの探しにくさどうにかならんかなあ・・・。
「配列への部分的な代入について調べたい」っていう目的意識があっても、
俺のようなクソ初心者はマニュアルのトップページからは絶対にここまでたどり着けんぞ。
というか最近のRuby使いはそんな恐ろしいコードを書くのか
文字化けかはぐれ三項演算子かとオモタ
>>273に全力で同意。なにその "?"は。必要なの?
?をつけないと
irb(main):001:0> cattle = "yahoo"
=> "yahoo"
irb(main):002:0> cattle[2] = p
TypeError: can't convert nil into String
from (irb):2:in `[]='
from (irb):2
とか怒られます。
マニュアルの中から必要な箇所にたどり着けるようになれば初心者脱出ってことでOK?
>>277 じゃなくて、cattle[2] = 'p' じゃダメなの?っていうこったね。
その ?リテラルが非常に直感的じゃないっていう。
Cやってる人は、そうやってバイト操作するのが直感的なのかな?
#それでも、1.9でやっとString#ordが実装って、正直どうなんだろうw
いろんな言語からパクってこそのRubyです
>>278 pのアスキーコードを暗記してるruby初心者ならそうやるでしょうね。
>>277 そこでTypeErrorになっているのは、pメソッドの返り値(nil)を代入しようとしているため
>>279 Encodingが無いとちゃんとしたordは無理だろう
?リテラルは潔くエンコード無視だけどね
[1]> (setq cattle "yahoo")
"yahoo"
[2]> cattle
"yahoo"
[3]> (aref cattle 2)
#\h
[4]> (setf (aref cattle 2) #\p)
#\p
[5]> cattle
"yapoo"
文字エンコードとか面倒だからバイト列にしたはずなんじゃなかったの?
実現したい機能をもう1度詳しく書いた方が良いよ。
文字列の要素の置き換えなんて曲芸以外ではほとんど使わない機能だよね
いや、普通に
cattle[2] = 'p'
じゃ駄目なの?この辺はCを意識した作りになってるだけだと思うけどなあ。
イテレータ引数が外部に出ちゃうのも同じ。
292 :
デフォルトの名無しさん:2008/07/12(土) 06:14:48
rubyってawkみたいなテキスト処理ってできるんですか?
awkでのどういうテキスト処理のやり方をしたいかによる
awkでのやり方と完全に同じことができるなら、それは単にawkだ
たいがいのテキスト処理言語でできることはおーむねフォローされてる
記述子が長いとか文句言った人がいたんだが、
スクリプトが短いのがいいって人は素直にedかsedでも使っとけ
295 :
デフォルトの名無しさん:2008/07/12(土) 07:57:19
javaで言うabstructなクラスを書くにはどうしたらいいですか?
>>295 ない。
class Foo
def f
raise NotImplementedError.new("Foo#f(): not implemented yet")
end
end
とするだけ。
297 :
デフォルトの名無しさん:2008/07/12(土) 08:18:25
日本語での文字列の長さを取得したいと考えています
jlengthを使っていたのですが、
マニュアルで
「jcode ライブラリはプロセス全体に影響するため、
中程度以上の規模プログラムで用いることは推奨できません。」
という記述を見つけました。
jcodeを使わずに文字列の長さを取得するにはどうしたらいいのでしょうか?
このへんもマニュアルに書いてあるんだけどなあ
str.split(//e).size
ShiftJISな文字列の場合は正規表現を //s に
もうそろそろ、全部UTF8にしちまう訳にはいかないのかねえ?
今となってはEUCとかSJISとか全部、言って見れば後方互換だろ?
ここでする話では無いのかもしれんけど
>>298 初心者が見つけられる位置になければ、書いてないのとおなじ
301 :
297:2008/07/12(土) 08:50:33
>>299 そうしたのがPython
「いや、どんなエンコーディングもそのまま扱えるようにすべき」
としたのがRuby1.9
時代の流れに逆行してるよね?
きっと壮大な実験なんだと思う。
みんなが使ってる言語で実験しないでください(><)
>>299 文字コードの問題はあと10年は続くと思われ。
>>303 どうだろう。EmacsなんかはCSIだけどね。
後方互換が重要なんだ!って人もいるにはいるだろう
日本でRubyがこれほど普及したのも日本語(EUC, SJIS, JIS)処理が得意だったからだし。
個人的にはUCS2/4とかをサポートする言語があってもいいと思う。
>>304 まだ誰もRuby1.9は使ってない。
307 :
デフォルトの名無しさん:2008/07/12(土) 10:14:46
全角英数字&全角カナを半角に変換したいのですが
NKFのマニュアルページ見てもやり方がわかりません
どうしたらいいのでしょうか?
原理的には {/ア/ => 'ア', /イ/ => 'イ', ...} というHashがあれば用が足りるよな
310 :
デフォルトの名無しさん:2008/07/12(土) 13:39:33
生成後のオブジェクトにモジュールをmixinしたいのですが
どうやれば出来ますか?
>>311 ありがとうございます。
もともとこういう機能があったんですね・・
便利だなぁ
313 :
デフォルトの名無しさん:2008/07/12(土) 17:45:32
Rubyのsetter/getterは、Java等のようなsetHoge,getHoge形式ではなく、
外見上はプロパティーへの直接アクセスに見えるものが普通ですが、
プロパティーが何らかのコレクションの場合は、
そのコレクションの要素へのアクセスを提供するメソッドは
どうしてもset_hoge(key,value)的なものになりますよね?
命名規則が一貫しなくてなんかモヤモヤするのですが、
こういうやり方であってるのでしょうか?
A: お手軽に、コレクション自体に対するgetterだけ定義する。
B: 破壊的メソッド含め、何でも出来てしまうのがよろしくないなら、
必要なインターフェイスだけを定義したオブジェクトを公開して、
内部で実体へdelegateする。
こんなとこ?
そのコレクションのクラスに対して[]=を定義するのがいいんじゃね
obj.params[key]=value ←params のクラスに[]=定義
316 :
デフォルトの名無しさん:2008/07/12(土) 18:20:39
str0 = 'aaaa'
str1 = str0
この後、変数str1を使ってstr0の値を変えたいのですが(PHPのリファレンスのように)
そういうことできますか?
318 :
316:2008/07/12(土) 18:43:32
>>313 315も言ってるように、Rubyでは[ ]や[ ]=をメソッドとして定義できるので
コレクションにそれっぽくアクセスしたいなら、これ使うと便利
replaceは特定の文字列オブジェクトが表現している内容を置き換えるもの
rubyってeclipse起動するのが面倒でちょちょっと書きたいときにしか使うメリット無いよね
って言われたぜヘヘッ!
eclipseを起動するのは何するとき?
Javaか大穴でPHPだろうね
>>319 [] = って左辺値一般を定義できるのかなあ…
array[index] += hoge;
ってやりたいときは [] += とかあるの?それとも + を使って暗黙に定義されるの?
326 :
デフォルトの名無しさん:2008/07/12(土) 23:35:12
↓b.rbにB.newと書かなくても実行スクリプトにする方法とかある?
---- a.rb ----
class A
def initialize(x)
if x%2==0
even
else
odd
end
end
def even
end
def odd
end
end
A.new ARGV.shift.to_i
-------------
---- b.rb ----
require 'a'
class B < A
def even
・・・・
end
def odd
・・・・
end
end
B.new ARGV.shift.to_i
------------
>>326 AのevenとoddをBのもので差し替えたい、のかな?
require 'a'
module B
def even
# ...
end
def odd
# ...
end
end
class A
include B
end
A.new ARGV.shift.to_i
それよりもa.rbの最下行の方が
すごく気になる(requireされた時点で実行される意味で)。
ないと思う。
a.rbの最後の行はa.rbをライブラリとして
requireしたときにも評価(実行のことな)されてしまうから、
削除して、b.rbのほうに
if $0 == __FILE__
B.new ARGV.shift.to_i
end
とするのがよいんじゃなかろうか。
deadline という項目に持たせている時間情報から
何時何分、という情報だけを”○○:○○”という形式で
出力するにはどうしたらよいのでしょうか
どこに持たせてるの?
DB?
>>329 さすがにこれはエスパーできん
あのさ、その質問で相手に通じると思う?
>>321 eclipseってnetbeansの使えない環境でしか使うメリットないよねヘヘッ!
333 :
329:2008/07/13(日) 01:54:22
厨すぎて死にたいです申し訳ない・・
DBに入れてるデータに時間情報もたせています
RoRを使っていて、helperを用いて解決しようとしましたがやり方がわかりません
Time#strftime
335 :
デフォルトの名無しさん:2008/07/13(日) 02:32:07
ActiveScriptRubyを使っているのですが、irbをコマンドラインで立ち上げると
カーソルキーで移動や履歴参照ができません orz
C-P、C-N、C-F、C-Bとかemacsみたいなキー操作は利くのですが、カーソルで操作したいものです。
cygwin版のRubyのirbだとできるんですが、
何か足りないライブラリなどあるのでしょうか?
>>334に答えが書いてるけど、
deadline が Timeオブジェクトだとして
print deadline.strftime('%H:%M')
実際にはapp/helpers/application_helper.rbに
def format_time(t)
t.strftime('%H:%M')
end
みたいなのを定義して、viewで <%= format_time(deadline) %> とする
337 :
デフォルトの名無しさん:2008/07/13(日) 04:10:09
UTF-8の文字列をバイト配列にする方法はどんなものがありますでしょうか?
また、UTF-8を任意バイト長で丸めたいのですがよい方法はありませんでしょうか?
338 :
デフォルトの名無しさん:2008/07/13(日) 04:38:41
>>337 バイト配列にする方法はこれでいけました。
a = "ほげほげ".unpack("C*")
339 :
260:2008/07/13(日) 04:45:39
その節はありがとうございました。
おかげさまで、グラフはいい感じになりました。
>>264 ありがとうございました。Google Chartの説明を読んで初めて
私用のグラフを書いてくださってたことに気付きました。
なお、アルファベットへの変換は諦めて、数字で入れることにしました。
http://www.ajaxtower.jp/googlechart/data/index.html ↑ここの「簡易形式」ではなく「数値形式」
>>267 夏までに!って思っていたら、もう夏です。
クラゲが出るまでには、人様に見せられるBodyになりたい…
でも、なんだか手段が目的になっている気がします。
>>268 >>269 手作業で画像を組成するという方法は、
Google Chartを知った瞬間に頭からベイルアウトされました。
中学生時の記憶など遠い霧の向こうです。
340 :
260:2008/07/13(日) 04:46:50
さて、性懲りも無く次なる試練が訪れましたのでもしお時間があればご指南ください。
日付をDate.todayで書き出し、それを読み込むことによって、今までダイエット記録を付けた日を確認しようとしています。
しかし、読み込んだ日付とDate.todayで呼び出した日付とをIF構文で照合すると、見た目は同じなのに同じでないと判断
されてしまいます。コードは次のようなものなのですが、何がおかしいのでしょうか…
#日付の書き出し(昇順に1ヶ月前まで)
f = open("tesrec.dat" , "w")
n = 0
while n <= 30
f.write Date.today - 30 + n
f.write "\n"
n += 1
end
f.close
#日付の読み込みと照合
require 'date'
datet = Date.today
f = open("tesrec.dat" , "r")
i = f.gets
d = []
n = 0
while i
d << i
i = f.gets
end
f.close
if d[d.length - 1].to_s == datet.to_s
puts "ok"
end
puts d[d.length-1] #これと
puts datet #これは同じに見えるが、違うと判定される
p d[d.length-1]
p datet.to_s
342 :
260:2008/07/13(日) 05:16:29
>>341 ありがとうございます!
p って、こんなときに使えるんですね。勉強になりました。
コピペ君って馬鹿だな、まで読んだ。
すいません。どこで聞いたらいいか分からなかったので、
ここで質問させてください。
Rack + Mongrelでウェブアプリを作ろうとしているのですが、
これをデーモン化する簡単な方法はないんでしょうか?
Mongrelだけなら-dオプションでOKなんですが・・・。
>>338 半端なバイトが出来ないように指定バイト数以下に切り詰めたいということですか?
UTF-8のエンコードの仕組みを調べればいいんじゃないでしょうか。
cygwin版のruby (1.8.7 (2008-06-20 patchlevel 22) [i386-cygwin])
で、以下のコードを実行してもタイムアウトが起こりません。
require 'timeout'
$counter = 0
begin
Timeout::timeout(5) { loop { $counter += 1 } }
rescue Timeout::Error
puts "I can count to #{$counter} in 5 seconds."
end
ほぼ一緒の以下のコードならタイムアウトが起こります。
require 'timeout'
begin
Timeout::timeout(5) { sleep }
rescue Timeout::Error
puts "I woke."
end
なぜでしょうか?
349 :
デフォルトの名無しさん:2008/07/13(日) 15:29:42
>>347 いぇすそういうことです。
サックリできる方法ないかと思ってたんですが、先頭からナメていくしかないのかなあ・・・
350 :
デフォルトの名無しさん:2008/07/13(日) 15:51:36
おいおい博士単位取得退学なんて馬鹿のとる学歴だぞ
修士で就職できなかった人間が博士も終了できないので
早々に大学院から去ったときにとるのが単位取得退学
修士以下の学歴だ
351 :
デフォルトの名無しさん:2008/07/13(日) 15:52:24
おっとスレ間違えた
352 :
デフォルトの名無しさん:2008/07/13(日) 16:51:27
正規表現内で { そのものをマッチングするのってどうやればいいんでしょうか?
s =~ /{/ とか /\{/ とかやってみても動かず・・・
後者で動くと思うよ
"int main(void) {...}" =~ /\{/ #=> 15
>>353 ほんとうだ・・・別なとこで弾かれてたッぽい orz
ありがとうです
単語がタブで区切られているファイルを
タブで切り分けようと思ってsplitを使ったら
「private method `split' called for #<File:sample1> (NoMethodError)」
と言われてしまいました。
splitがいけないのかと思いscanを使っても同様のエラーが出ます。
タブじゃだめなのかと思い区切りを\nにしても同じエラーが出ます。
しかしsplitを使って先日作った別のプログラムは何の問題もなく動作します。
何がいけないのやらさっぱり分かりません。
どなたかご教授お願いします。OSはXP、rubyは1.8.7です。
なんかプログラミングで「弾かれる」って表現違和感あるな
このスレを見ている人はこんなスレも見ています。(ver 0.20)
オールインFXってどうよ?5コピペは勘弁 [ベンチャー]
【三洋薬品】 大日本販売 【社名変更】 [ちくり裏事情]
【肯定/否定】オールインFXってどうよ その21 [ベンチャー]
韓国人と仕事し な ら が 困ったこと@P板★4 [プログラマー]
【鬱病】 壊れたプログラマー 12人目 【爆発】 [プログラマー]
Rubyistのイメージが・・・
>>355 とにかく該当部のコードを貼って
エスパー回答はやりたくない
>>358 array = []
data = open("sample1")
array = data.split(/\t/)
print array
open('hoge.tsv'{|f| f.split("\t") } とかやってるんだろう
文字列を切り分けるんだからsplitはStringに対して呼ばなきゃダメよ
data = open("sample1").read()
362 :
355:2008/07/13(日) 18:09:14
まあ世の中そんなもんだ
・躓かないために原因を探る人
・根性と運で躓きを乗り越えようと考える人
どっちも一定割合で存在する
たぶん大丈夫だろうけど、
>>361の方法だとファイルディスクリプタを
openしっぱなしになるので、長時間メモリに載ったまま動くスクリプト
では注意。
GCは?
IOインスタンスのファイナライザにclose(2)なんてあったっけ??
それはともかくGCに外部リソースの回収は期待しちゃいかんよ。
この手の勘違いは意外と多い
(しかも多くがしたり顔なのでなおさら迷惑)
まあ、原因を追求すると Ruby の IO クラスのメソッドが微妙な使い分けだからなんだが…
・ クラスメソッドの IO.read は内部の ensure で closeされている
・ インスタンスメソッドの io#read は close しない
わかりやすく言うと、引数にファイルパスを取る read は単体使用でOK
引数がない(あるいはバイト数だけの)read は close かブロックの併用推奨
今回の
>>361 の open('sample1').read は close が必要
しかもこの書き方だと IO オブジェクトがどっか行ったままなので close するのが超面倒
明示的にブロック使うのが読み手にとっても妥当だが、単に File.read('sample1') と書いてもよい
ただしその場合は今回のような「これ close してないんじゃね?」というくだらない議論や不意に沸き起こる不安を覚悟すること
俺もこれを覚えてるつもりなんだが、時々忘れて「これ close してないんじゃね?」と悩むことがある
>>367-368 ありがとう。理解があやふやだったんでとても参考になった。
File.read ってあんまり見ない気がするけど
ファイナライザ / ensure で close されることが保証されてるなら
もっと積極的に使うようにするよ。
こういうことがマニュアルに書いてないのは、あまり意識されてないからかな?
File.read(path) の使用をそのへんであまり見ないのには理由がある
可搬性がすこしだけ低いからだ
バイナリモードにしない・できないから、Windowsでテキストファイル以外を読むと危険
これのおかげで、せっかくの close いらずの便利機能なのに
「うっかり使ってしまわない」ように大多数の人間の記憶から取り除かれてる
(ほとんどの場合はテキストファイルとみなせるものしか読み込まないから問題ないんだけど、時々うっかり使うことがありえる)
だから、ファイルの読み込みは file = File.open(path, 'rb'){|f| f.read} という固定イディオムだ
そんなわけで、公開スクリプトや配布スクリプトで File.read(path) を見ないのは意図的なもんだ
てかマニュアルに書いてあるぞ
IOのとこ見ろ
File.read(path)でバイナリモード指定ぐらいはできるようにしてほしい、といつも思う
この辺りにMatzのWindowsへの興味の無さが現れているな
初版でWindowsガン無視なのは別にいいんだよ、代替可能な便利機能にそこまで求めないさ
でも既に Ruby 1.8.7 だぜ
しかも、binmode を追加すると何か困るんか? 普通困らないだろ?
テキストモードのほうが特殊なんじゃないかと思う
359の例は思い切りテキストモードを期待してるわけだが。
378 :
デフォルトの名無しさん:2008/07/14(月) 04:35:06
>>361 今時、data = open("sample1").read()
なんて薦めるなよ
data = IO.read "sample1"
か、
data = open("sample1") {|f| f.read}
だろJK
IO.read(fn) を良く見るけど File.read(fn) の方が直感的に(覚え|読み)やすいと思う
>>378 直後で否定されてるってどんな感じ?
直後で否定されてるってどんな感じ?
新着レスから順に読むとこういうことが起こるよな
多少無理しても最新レスから遡って読むのがベター
読んでる人がどれだけいるかわからんけど、テンプレをアップデートしようぜ
最新安定版は一応 1.8.7 だ
あと、他言語習得者がRubyとしての書き方を学ぶ本として『初めてのRuby』を入れておきたい
質問。
Linuxで自力コンパイルして入れたRuby1.8.6-p0を、パッチレベル最新の1.8.6にしたいです。
どうすればいちばん安全に「上書きアップデート」できますか?
OSはDebianのSargeです。p0をインストールしたときのソースコードディレクトリはそのまま残ってます。
あ、忘れてた。
rubygemが/usr/local/lib/ruby/gems/1.8/以下にわーっとあったりするので、
「なんかRubyっぽいディレクトリ全部消してからmake installすればOKじゃね?」というのは不安です。
ファイルの増減がないんだったらそのまま make install すれば安全に全ファイルが上書きされるんじゃないの
>>382 900越えた辺りでもう一度提案するといいんじゃないかな
>>386 テンプレ案はなるべくスレの最初のほうで提案するのがベター
900過ぎてから書かれてもたまたまその場にいたごく一部の人間しか議論に参加できん
>>387 議論に関してはその通りだろうけど、次スレ立てる人は
その「たまたまその場にいた」人なわけで
どのみち、最後にまとめはいると思うが
「テンプレ」で抽出出来るように、とりあえず無理にでも
「テンプレ」って書いて議論すればいいのか
ブロック引数の中で使えるメソッドを動的に定義する方法はありませんか?
class Foo
def bar(&block)
#ここでlambdaを使ってbaz()を定義
block.call
end
end
foo = Foo.new
foo.bar do
#ここでコールしたい
p baz
end
ちょっと意味がわからない
>>390 説明がわかり辛くてすみません。
例えば、以下のコードで
class Foo
def bar(&block)
baz = lambda {
p 'lambda'
}
block.call(baz)
end
end
foo = Foo.new
foo.bar do |baz|
baz.call
end
呼び出し側の foo.bar do |baz| の部分を foo.bar do に、
baz.call を baz のように表記したいです。
>>383 1.8.6なら、コンパイルしたディレクトリの .installed.list というファイルに、
インストールしたファイルの一覧があるはず。
sudo xargs rm < .installed.list
>>391 class Foo
def bar(&block)
def self.baz
p 'lambda'
end
block.call
end
end
Foo.new.bar do
baz
end
>>393 試してみましたが
undefined local variable or method `baz' for main:Object
とエラーが出ました。
Rubyのバージョンはruby 1.8.6 (2007-06-07 patchlevel 36) [i486-linux]です。
メソッドを動的に定義するというより、文脈じゃないか
class Foo
def bar(&block)
def self.baz
p 'lambda'
end
instance_eval(&block)
class << self
undef_method :baz
end
end
end
Foo.new.bar do
baz
end
>>391 まず、もともとのコードと目的を書いたほうがいい
たぶんそういう風な表記よりも、もっと良い方法がある
debugに関して質問させてください
C言語を書いていたころは
ifdef DEBUG
printf("デバッグ")
end
とか書いて、printfデバッグやってました
rubyだと、デバッグ時にのみ出力したログなどはどのように記述するのが王道でしょうか?
あと、JavaだとeclipseなどのIDEを使いブレイクポイントの指定やステップ実行を行っていました
rubyで同様の機能を持つIDEは存在するのでしょうか?
もし、IDEが存在するならば、コード補完とか可能でしょうか?
rubyの場合、動的型付なので、コード補完は難しいですかね?
よろしくお願いいたします
$DEBUG
RDE
$DEBUG というグローバル変数がある
スクリプトの中の最初に指定することもできるし、
ruby に -d オプションをわたして起動させるとオプションが勝手に指定される
warn 'エラー出力に出力' if $DEBUG
とか
require 'logger'
$LOG = Logger.new('log.txt') if $DEBUG
$LOG.info("data is #{data}") if $LOG
とか使う
ブレークポイントは一応 debug.rb に入ってるがあまり期待しないこと
さっき気づいたんだけど、-dオプションって$DEBUGだけじゃなく$VERBOSEもtrueにしてるよな
この事リファレンスマニュアルに書かれてないんだが、ML等で今までに誰か指摘してる?
(ruby 1.8.7で確認)
>>400 上の例では$DEBUGで判定しなくても、単にwarnだけでいいんじゃないか?
冗長モードが存在するRubyで、わざわざ$DEBUGで判定する意義はあまりないと思う
403 :
402:2008/07/15(火) 09:09:39
訂正
「単にwarnだけでいい」じゃなくて、「if $VERBOSEで判定すればいい」だった
でもまー実際問題として本当に必要なのは自作スクリプトやライブラリのログ出力であり
他の標準ライブラリのログも一緒に出力される $VERBOSE はとても使いづらい
$DEBUG は名前はいいんだがデバッグモードになって動作が変わるのがちとアレだ
というわけで、何かオリジナルのグローバル変数を設定してそれが真ならログを吐く、というスクリプトにならざるを得ない
405 :
398:2008/07/15(火) 20:06:14
>>399>>400>>402>>403>>404 レスありがとうございました
$DEBUGってそのまんまの名前の変数があったんですね、、、
気が付かなかった自分はアフォです
それと、
>というわけで、何かオリジナルのグローバル変数を設定してそれが真ならログを吐く、というスクリプトにならざるを得ない
との指摘を受けましたが、これでも十分対応できそうですね
それか、デバッグ用ログ吐く専用のクラス作って指定したレベルに応じて出力するログの詳細を決定するとかありそうですね
>>406 失礼しました
Log機能なんて、いかにもありそうな機能ですよね(ちゃんと調べてから喋れよ、自分!)
レスありがとうございました。
408 :
デフォルトの名無しさん:2008/07/15(火) 22:45:11
Ruby on Railsを初めたばかりのものです。
Webアプリで使うデータを外部からを取り込むプログラムを
Rubyで書いてます。
1.その際、そのスクリプトはどこに置くべきでしょうか?
RoRのプロジェクトディレクトリ(?)の外?
2.そのスクリプトからデータベースにアクセスする必要があります。
RoRのコードを極力使いたいと思うのですが、生成された
app/models/foo.rb とかを使うと、Ruby:DBIとかそういうのを
使わずに済みますか?
>>408 1.
script/というディレクトリがあるからそこにおけばよいんじゃないでしょうか。
2.
./script/runner [-e ENV] 所望のスクリプト
とすると該当のRails環境ENVで動きます。(デフォルトはdevelopmentね)
Rakeタスクとして書くのもあり。
lib/tasks/mytask.rake みたいな名前でタスク定義を置く。
Railsのコードを使うなら、
task :mytask => :environment do
...
end
とすると環境変数RAILS_ENVの環境(or development)で動く。
410 :
408:2008/07/15(火) 23:04:26
>>409 script ってそういう為にあったんですね。なるほど。
runner で簡単にいけそうですね。ありがとうございます。
rakeタスクも調べてみます。
411 :
デフォルトの名無しさん:2008/07/16(水) 00:13:26
島大付属って島大の教員養成施設と化しているらしいな
やっぱ公立の学校が無難だろ
島根つながり?
FileUtilsのdereference_rootが腐ってない?
cp_rでディレクトリのコピーする時、
中にsymlinkなファイルがある時、cp -rLと違う。
416 :
デフォルトの名無しさん:2008/07/16(水) 13:09:55
ネストしているハッシュを、ネストしているオブジェクトにバインドして、
オブジェクトに加えた変更をハッシュに反映するようにしたいと思います
そのためハッシュツリーの位置を示したポインタが欲しいのですが、
Rubyにはポインタがありません
どうすればポインタ的なことを実現できますか?
いろいろ間違ってる
そういう無意味な返答はいりません
じゃあ__id__で好きなようにやれ
オブジェクト維持するように作ればできなくもない
irb> a = ['one', 'two', 'three']
["one", "two", "three"]
irb> h = {'key1'=>a[0], 'key2'=>a[1], 'key3'=>a[2]}
{"key1"=>"one", "key2"=>"two", "key3"=>"three"}
irb> a[1].replace('2')
irb> h
{"key1"=>"one", "key2"=>"2", "key3"=>"three"}
ただ、
>>417の言うように普通この動作を利用してクラスを作るようなことはしない
とても見苦しくて紛らわしいからだ
プログラミングはパズルではないので複雑であることでは誰も喜ばない
オブジェクト内部のデータをインスタンス変数か何かで保持してアクセサメソッド経由で外部に提供したりすることのほうが多い
>>416の話でいえば「ネストしているハッシュ」というものは存在させずに HogeObject.hogedata でアクセスできるようにするとかなんかそんな感じ
p Time.now().to_i()
とすると秒単位で出るみたいなのですが
ミリ秒マイクロ秒で得たいときはどうするのでしょう?
422 :
デフォルトの名無しさん:2008/07/16(水) 14:03:34
objectのid使っても、読み込みはできますが書き込みはできないですよね
ObjectSpace._id2refでオブジェクトの参照得ても、
代入した時点で違うオブジェクトの参照になってしまうので。
420さんのreplaceは、Stringの値を変えているので、別種のクラスのインスタンスに
置き換えることはできません。
確かに変なやり方ですが、ネストされたハッシュが規定なんです。
具体的にいうと、HTTPのリクエストパラメータを、
フォーム管理オブジェクトにバインドして、
そこで処理した結果を、リクエストパラメータのハッシュにも同時に反映させたいんです
参照をオブジェクトにできないというのはRubyの致命的な欠点ではないでしょうか?
ありがとうございました
>>423 >実行結果が表示されてるとひと目で見てわかりやすいよね
Rubyはこのへん結構手ぇ抜いてるよな
マニュアル書いてる人には自明なんだぜ、きっと
>>422 そりゃ単にあんたがハッシュオブジェクトを自分から破壊して同一性を破棄してるだけだ
オブジェクトについて語るならもうちょっと勉強しとけ
ハッシュや配列は要素の参照や追加でオブジェクトIDが変更されることはない
= でハッシュの変数にハッシュ全体を上書きしてるとかなんじゃね
個人的にはグローバル変数と同じような危険性を感じるので
self 以外の引数のオブジェクト内部をいじるという処理はお勧めしない
単一オブジェクトの使いまわしは最初は「理知的でカッコイイ」んだが、実際にメンテするともう面倒で面倒で
>>422 ハッシュの変更をオブジェクトに反映させる必要はないんだよね。なら
class FormObject
def initialize(request_hash)
@request_hash = request_hasn
end
def param1=(val)
@param1 = @request_hash[:param1] = val
end
attr_reader :param1
…
end
とでもして、@param1 を直接変更しないようにすればいいんと違うか?
なんかみんな難しい話してるけど俺が読み違えてるのかな。
>>428 いや、正しい
そもそもの問題として、ほんとうにハッシュなら「オブジェクトIDが食い違って困る」ことのほうが珍しいんだ
オブジェクトIDが違うハッシュの複製をいじったものを返り値として返されても、ハッシュとしては機能するはずだからね
・メソッドの中でハッシュ全体を複製していじってるか、ハッシュを新規に作って更新データを登録している(これありがち)
・なおかつそのメソッドからの返り値は一切利用しない
・その状況でありながら、元のハッシュオブジェクトの中のデータを変更して欲しい
と言ってるように見える
無茶言うな
ハッシュの複製や新規作成をやめるか、複製や新規に作ったハッシュを返り値にして利用するかにしとけ
クラス変数をprivateにできない?
継承されるのがいやなんだけど
あーそれできないんよ
継承先で別の値入れたい場合はクラス名で場合分けするしかないな
クラスのインスタンス変数にするとかどうよ
アクセサ経由になるのがめんどくせえけど
433 :
デフォルトの名無しさん:2008/07/16(水) 18:33:30
クラスのインスタンス変数にすると可視性はどうなるの?
インスタンスメソッド内から見える?
もしかしたら知らないかもしれないので注釈すると、
変数アクセスをシステム的に禁止することはRubyではそもそもできないよ
定数すら警告だけで2度目の代入が可能な言語だし
「継承したらこれは使わないでください」って赤字でマニュアルに書いておけ
変更どころか削除もできるという・・・・・すげー性善説の言語
>>433 見えない
ただし、そのClassに定義された特異メソッドからは見える
class Foo
@bar = 20
def self.get_bar
return @bar
end
def get_bar
return @bar
end
end
p Foo.get_bar #=> 20
p Foo.new.get_bar #=> nil
rubyって数値計算用のAPIありますか?
>430-436
Pythonも似たようなもんだろ
439 :
408:2008/07/16(水) 20:39:09
以前Ruby on Railsの質問をしたものです。
scriptフォルダ以下に自前のスクリプトを置こうとして気づいたんですが、
何でこのフォルダにあるスクリプトはrbという拡張子がついてなくて、
その他のフォルダにあるファイルには拡張子がついているんですか?
>>437 ぶっちゃけた話、精度や速度には期待しないで
そこだけPerlでPerlのモジュール利用して書くとかにしたほうが正確かもしれない
442 :
439:2008/07/16(水) 20:45:28
すみません。Railsのスレがないみたいなので。。。DAT落ち?
443 :
デフォルトの名無しさん:2008/07/16(水) 20:56:11
def get_bar
return @bar
end
インスタンスメソッド内で見えてるじゃん
ほかの言語をやってた人がRubyの何に困るかは個人的にたいへん興味があるので、もちっと話をききたい。
>>422 >objectのid使っても、読み込みはできますが書き込みはできないですよね
>ObjectSpace._id2refでオブジェクトの参照得ても、
>代入した時点で違うオブジェクトの参照になってしまうので。
これ、どういう意味?
>確かに変なやり方ですが、ネストされたハッシュが規定なんです。
>具体的にいうと、HTTPのリクエストパラメータを、
>フォーム管理オブジェクトにバインドして、
>そこで処理した結果を、リクエストパラメータのハッシュにも同時に反映させたいんです
これも日本語の意味がわからん。コードで書いてくれ。
たとえば x=abc&y=123 があったとして、これが {'x'=>'abc', 'y'=>'123'} になって、そっからどうなるの?
>参照をオブジェクトにできないというのはRubyの致命的な欠点ではないでしょうか?
参照をオブジェクトにするというのはどういうこと? どの言語だったらできるの?
>>440 どういうこと?Rubyって演算関係ぐだぐたなの?
447 :
439:2008/07/16(水) 21:29:10
>>443 見えてないからnilになってるんだぞ?
>>446 え、もしかして「速度が気になるならアセンブラで書け」とか言ったりする極論馬鹿ですか?
微妙に初心者というよりアンチが混ざってるw
>>437 数値演算のAPIというのがよくわからないが
Mathモジュールのことか?
いいえ、加齢臭が原因で窓際に追いやられている、ただのオッサンです。
このスレを見ている人はこんなスレも見ています。(ver 0.20)
【三洋薬品】 大日本販売 【社名変更】 [ちくり裏事情]
【肯定/否定】オールインFXってどうよ その21 [ベンチャー]
さすがスレ参加者の質悪いww
まず、数値計算ていうのが何を念頭に置いた話かはっきりさせたほうがいいと思う。
455 :
デフォルトの名無しさん:2008/07/17(木) 00:01:54
setter,getterが名詞なので、
ローカル変数かメソッド名かわかりにくくなります
特にvalueなんて、プロパティー名としても、ローカル変数としてもよく使います
そういう混同を防ぐためのコツとかありますか?
メソッド呼び出しには必ず () をつけるという記述ルールを使ってる人は一定数いる
俺は引数なしメソッドもローカル変数もこっちから見れば値を返す点で一緒だと思ってるからつけないけどな
名前重要。
>>457 じゃあ get_~~, set~~ ?
self付けりゃいいんじゃねーのか
value なんて名前はどうかと思うってことじゃね?
ローカル変数と区別が付かない=selfなしのアクセサ単独で呼べるコンテキスト
ってことは、インスタンス変数(@valueトカ)を直接読み書きすればいいんじゃないの?
# 確かに、対応するインスタンス変数がないsetter/getterてのもあるが……
valueをどうかと思うってどういう感覚?
valueはvalueだろ
というか、ある程度(「質問」を越えたあたり?)まで発展すれば、
本スレなりアンチスレなりに移動すればいいんじゃないかなと思う
・・・けど、まあそんなに気になる話題でもないからここでやってる
んだろうなw
とりあえず、最初に無駄に広げる奴が自重しろということだと思った
Ruby/Tkについてある程度のレベルまで体系的に学べるサイトはありますか?
あれはTkをRubyから使う技術だから、Tkを知らないと使いこなせないよ
Tcl/Tkの勉強をする野田手っ取り早いかも知れない
466 :
デフォルトの名無しさん:2008/07/17(木) 16:56:24
文字列の配列から正規表現を作るにはどうしたらいいですか?
aa,ab,ac→a[a-c]
みたいな操作をしたいのですが
>>466 むしろそうやって自動で最短の正規表現にまとめられる言語を知りたい
人間の頭で考えて書いたほうが安全確実だぞ
一応、Regexp.unionでまとめることはできるが、
正規表現をまとめる場合はカッコ使ってグルーピングやってると面倒
a = ['aa', 'ab', 'ac']
re = Regexp.union(a) #=> /aa|ab|ac/
# 配列要素が文字列である限りは実際上は同じ
# re = Regexp.union(*a.map{|e| Regexp.new(e)})
p re =~ '0000000aa000000' #=> 7でtrue
p re =~ '000000aaaaaaabb' #=> 6でtrue
diff取ればいいんじゃねーの
>>466 migemoがそういう処理をやってたな。
そういう「正規表現再構成ツール」はいくつか見たが、
どれも未完成で「正規表現パート2」みたいな感じで
頭で考えるの面倒だからツール使う、みたいなもので
動的に使えそうなものではなかった印象がある
471 :
デフォルトの名無しさん:2008/07/17(木) 18:52:50
attr_accessorみたいな指定の仕方をするメソッドを作ろうと思っています
(クラス定義の中で、宣言的に使うメソッド)
親クラスのクラスメソッドとして定義し、
子クラスで呼び出せるようにしたのですが、
このメソッドが実行されるタイミングではインスタンスが出来ていないので
メソッドの中でアクセスできるのはクラス変数だけですよね
で、複数の子クラスからアクセスさせると、親クラスのクラス変数が
共有で使用されてしまうので、動作が希望したとおりになりません
宣言した内容を、子クラスそれぞれに持たせたいんです
どうするのが正しいやり方なのでしょうか?
>>471 正しいかどうかは知らないけど、
クラス変数じゃなくて、子クラスのインスタンス変数を使う、とか。
普通にインスタンス変数を使う
クラス変数はRubyではあまり使わない
使うことになった場合は思考がRubyでないことが多い
設計のミスでクラス変数を使わないと死ぬというような場合は、
クラス変数に self をキーとするハッシュを格納する
class Base
@@val = Hash.new
def self.setval=(v); @@val[self]=v; end
def self.getval; @@val[self]; end
end
class A < Base
end
class B < Base
end
A.setval = 'This is A'
B.setval = 'This is B'
p A.getval
p B.getval
結果:
"This is A"
"This is B"
474 :
471:2008/07/17(木) 20:02:37
>>471-472 ありがとうございます
attr_accessorみたいな、
クラス定義直下のメソッド呼び出しが実行されるのは、
クラスの定義時ですよね?
class Hoge < BaseHoge
hoge_accessor :fuga,:piyo
end
こういう形で呼び出すメソッドを作りたいんです
クラスの定義時にはインスタンスは存在しないので
hoge_accessor内から
インスタンス変数にはアクセスできないですよね。
attr_accessorも
親クラスにハッシュとして持たせて実現しているのでしょうか。
勝手に補足
471と472の言ってるのは、「Classオブジェクトが持つインスタンス変数を使う」ということで
そのクラスから生成したインスタンスの変数を使う、ということではない
つまり、こうすればクラスごとに変数を持てる
class BaseHoge
def self.hoge_accessor(*args)
@accessors ||= []
@accessors += args
end
def self.get_accessors
@accessors
end
end
class Hoge < BaseHoge
hoge_accessor :fuga,:piyo
end
class Hoge2 < BaseHoge
hoge_accessor :test
end
p Hoge.get_accessors #=> [:fuga, :piyo]
p Hoge2.get_accessors #=> [:test]
476 :
471:2008/07/17(木) 20:18:26
>>475 ありがとうございました
クラスオブジェクトのインスタンス変数とか
理解の範囲を超えてきたのであとでゆっくり見てみます
あれは行数指定でevalすることで似たようなことが実現できたはず
とか書いてたら
>>477で書いてた
require 'tk'
a=Array.new(9)
for i in 0..8
a[i]=Array.new(9)
end
for m in 0..8
eval ("r#{m} = TkFrame.new.pack")
for n in 0..8
eval ("a[m][n] = TkButton.new(r#{m}, :height=>2, :width=>4, :text=>'0').pack(:side=>'left')")
a[m][n].command{
a[m][n].text=(a[m][n].text.to_i+1).to_s
}
end
end
Tk.mainloop
各ボタンを押せばそのボタン上の数値が1つ増えるようにしたかったんですが、
どれを押しても81番目のボタンしか変化しません。
どこが不味かったんでしょうか?
all = Array.new
(0..8).each do |i|
row = Array.new
f = TkFrame.new{pack}
(0..8).each do |j|
row << TkButton.new(f, :height=>2, :width=>4, :text=>'0'){|b|
b.command = proc{b.text = b.text.to_i+1}
}.pack(:side=>'left')
end
all.push(row)
end
Tk.mainloop
とりあえず見た目だけ同じにした
配列の存在意義はよくわからんというか現時点では何もしない
データはボタンのtext変数に入ってるので加工は面倒かもしれん
外部配列にデータだけ移動した
あとは知らん
require 'tk'
data = Array.new
(0..8).each do |i|
data << Array.new(9){ 0 }
f = TkFrame.new{pack}
(0..8).each do |j|
TkButton.new(f, :height=>2, :width=>4, :text=> data[i][j] ){|b|
b.command = proc{b.text = b.text.to_i + 1}
}.pack(:side=>'left')
end
end
Tk.mainloop
Tkみたいなのってよくわからない
たとえばさ、どっかが5になったときに
「おめでとうございます! 5です!」
ってウィンドウを出すとかどうするんだ?
loopで無限ループ作って値をチェックし続ければいいの?
>>482 「イベント駆動」「イベントドリブン」でぐぐるんだ
RubyやRuby/Tkでどうやるかは知らない
困ったときに調べることにする
484 :
デフォルトの名無しさん:2008/07/18(金) 03:20:38
Railsを使わずにRubyでウェブサイト構築しようと考えていますが
こういうところに気をつけろとかあったら教えてください
>>484 「生産性」には期待しないようにすること。
ぶっちゃけ、使えるライブラリの選定・評価からWEBサーバでの動作やエラーの
確認その他、Perl等でのCGIとやることはほぼ変わらない上に、その手の書籍が
少ない(Railsに埋もれてるから?)という茨の道です。
むしろ、趣味の道と覚悟してやった方がいいかと思います。
486 :
471:2008/07/18(金) 04:01:12
Classオブジェクトについてなんとなく分かってきました
BaseHogeに定義したインスタンスメソッドから、
それを継承した子クラスのClassオブジェクトのget_accsessorsを呼ぶには
どう書けばいいのでしょうか?
インスタンスの中から自分のClassオブジェクトを取得できれば
できるのではと思うのですが・・
488 :
471:2008/07/18(金) 06:36:14
>>487 ありがとうございました
classでクラス名が分かるのは知っていたのですが返り値をStringと思っていました
これがクラスオブジェクトだったんですね
489 :
デフォルトの名無しさん:2008/07/18(金) 09:16:22
>>484 ちなみにRailsを使わない理由は何?
後、Rails使わない場合でもActiveRecordは使ったほうがいいよ。便利だし。
ActiveRecordと間違えてActiveSupportを使ってしまって吐いた
>>482 Array#[]=に「selfの引数番目の要素が5になるんだったらウィンドウ出す」を追加する
というのを思いついた
492 :
484:2008/07/19(土) 00:20:58
>>485 イバラの道ですか~
生産性の高さというか、書いていてイライラしないのでRubyにしました
それまではPHPを使っていたのですが、基本思想が美しくないので
どうやっても美しくならないというか、
書いていて退屈でイライラしてくるんですよね
rubyはそういう退屈さがないので気に入っています
ただ、そういう感覚が、あまり知らないという新鮮さから来るのか、
Rubyの本質的な設計思想に依るのかは、まだよく分からないのですが
>>489 railsは既に重厚すぎる感じがするのと
自由度が欲しいからです
rails以外のフレームワーク使ってみるとかは?
merbとか・・・
オススメできるほど知ってるわけじゃないけど、
探せばいろいろあるのでは?
rails以外の情報って、あんまりないから、たしかに茨の道だと思いますけど。
494 :
デフォルトの名無しさん:2008/07/19(土) 02:43:38
>>492 あれ、こんなところに俺がいる
CGIスクリプトで自由度と軽さが欲しいなら
Rackや、CGI互換ライブラリ(cgisup/cgialt)を使うのがシンプルでお勧め
今使うならたぶんRackの方が良い。WEBrickやFastCGI等への対応がとても楽だ
webrick/cgi(標準添付)も、一応シンプルさという点では優れているが
情報がきわめて少ないのでお勧めしない
>>495 RackはCGIでは重くない? CGIにはもうちょっと軽いのが欲しいんだけど。
tDiaryやBitchannelのソースを解析するという手もある
>>493-495 ライトなFWも結構ありますね
自作するにしても参考に出来る部分が多そうです
さっそくerubisの存在を知りました
あとcgi.rbはイケてないということとか・・
Rackを使うのも今後主流になりそうですね
cgi.rbは今となっては全く学ぶところのないライブラリ
本来ならもっとずっと早いうち、具体的には1.6時代、に何か他のCGIライブラリに置き換わるべきだったもの
ちょろっと使うぶんには問題なくて、もっと凝ったものや正しい動作をするものをやりたかったら
自力で実装したほうが早いという困った人たちがML近辺には溜まってたので今までずるずる置き換えが延びた
webrick/cgiに自前で継ぎ足して頑張るというのが正しい姿だが、cgi.rbと同じように使うためのマニュアルすらない状況
自分さえ良ければいいっていう人が多いんですね
糞ライブラリはRubyの特徴でもあります
じゃあ、逆に、どんなライブラリが参考にするのにいい
学ぶところの多い、ライブラリなのかな?
ライブラリ読んでみようかって思ってるんで、
これがいい!って奴があったら聞きたいんですが。
できれば、難易度別に
503 :
デフォルトの名無しさん:2008/07/19(土) 12:09:00
R '/' == R('/')
505 :
デフォルトの名無しさん:2008/07/19(土) 12:30:56
クラス名に引数を書くということですか?
どういう意味があるんですか?クラス名は単なる名前でメソッドではないのでは?
継承で < するものは「クラスを表す文字の連なり」である必要はない
Rubyとしてクラスオブジェクトを返せるものなら何でもよい
class Base
CONST='yahoo!'
end
def hoge
return Base
end
class A < hoge
end
p A::CONST
========
"yahoo!"
とここまで書いて、定数をメソッドのように扱うことの話かもしれないと思った
ああ、やっぱり
>>505 require 'time'
begin
puts Time('2008-07-19 12:38:12')
rescue NoMethodError
puts 'Timeメソッドがないよ!'
end
module Kernel
def Time(str)
Time.parse(str)
end
module_function :Time
end
puts Time('2008-07-19 12:38:12')
==============
Timeメソッドがないよ!
Sat Jul 19 12:38:12 +0900 2008
こんな風に作る(もっと適当に書いてもいいが)
「このオブジェクトに変換する」という動作をさせるときに明示的に定義されることがある
組み込みだとIntegerやURI、有名どころだとHpricotなんかもparseメソッドのエイリアスをこの形で定義してる
個人的には.parseくらい書けよって感じであまり好きではないが、ある程度の市民権は得ている書式だ
まあ要は「クラスの名称とたまたま同じ名前の関数的メソッド」だな
クラスオブジェクトに引数をつける用法があるわけじゃない
内部的にはクラス定義とは無関係だ
511 :
デフォルトの名無しさん:2008/07/19(土) 15:12:19
プログラムをスレッドセーフにするために気をつける箇所はどこですか?
またスレッドセーフか否かをチェックする方法はどのようなものでしょうか
puts を使わない
命名規則に関して質問させてください
変数名やメソッド名に関するrubyの一般的な命名規則はどのようなものが存在するのでしょうか?
@が頭についていたらインスタンス変数、@@でクラス変数、などはわかるのですが、それ以外の部分で一般的な命名規則があれば教えて欲しいです
具体的に言えば、Cのハンガリアン記法やJavaのらくだ記法のような、守らなくても動作するけれども、守るのが一般的な規則です
よろしくお願いいたします
マニュアルを見るのは下賎な身分の低い人間がやることだというので、
自分では絶対に見ない人がいるそうだね。
>>514 ぐーぐるさんにきいたほうがはやいとおもいます
>>514 メソッド名と変数名は大文字で区切ったりせずに全部 _ で区切る
これに沿わないメソッドも少なくないが、とりあえず初心者で自分から書くうちは全部 _ で区切っとけ
Rubyの実際におけるクラスとモジュールの意味的関係は最初は結構曖昧なので、
そのクラスがインスタンス作れたら嬉しいかどうかだけでクラスにするかモジュールにするかを決めてもよし
ずーっとあとになれば、モジュールが好ましいかクラスが好ましいかどうかには気づけると思う
自分用適当スクリプト以外でクラスを作って運用する場合、とりあえずモジュールで括ることが多い
てきとーなモジュール::ファイル名と同等な大きいクラス::細かいクラス
という構造になることがほとんどだ
てか、どっかにこういうの書いてなかったっけ
>>514 どこかにまとめて書いてあった気がするが忘れた
リファレンスにあったのかもしれないが、いま読み返しても見つからないぐらいなので
初心者が見つけるのは絶望的かもしれない
基本的には
>>517の規約を参考にすれば、おおよそ問題ないだろうと思う
>>515 マニュアルのどこに書いてあったか教えてほしい
俺では見つけられなかった・・・
メソッド定義か何かで、インスタンスに直接ブロックをつけるようにすることはできない?
添え字アクセスした配列の要素にブロック使いたい
arr[3]{|e| ... }
tap を使えば arr[3].tap{|e| ... } で実現できるんだけど、何もメソッド挟みたくないんだ
e=arr[3]
522 :
デフォルトの名無しさん:2008/07/19(土) 21:37:40
ramazeのソースに以下の部分があります
class Erubis < Template
ENGINES[self] = %w[ rhtml ]
# Allow for swapping in a differnt Erubis engine (it supplies several) and
# passing options to the engine.
trait[:engine] ||= ::Erubis::Eruby
trait[:options] ||= {}
ここでtraitは、定数でもないのに、クラス直下に書かれています
これは何でしょうか?
> 定数でもないのに、クラス直下に書かれています
いやそのりくつはおかしい
未知の特殊な文法かと思ったのですが、これメソッド呼び出しなんですね
Objectにメソッドが追加されていました
RubyTraitsなのかramazeの独自実装なのかはわかりませんが
>>520 >メソッド定義か何かで、インスタンスに直接ブロックをつけるようにすることはできない?
>添え字アクセスした配列の要素にブロック使いたい
>arr[3]{|e| ... }
文法的に無理みたい
a = [1,2,3]
a[0] {|x| p x }
#=>syntax error, unexpected '{', expecting $end
>>523 別に何書いてもいいんだよな
class Ruby
puts "#{self}はうんこ"
end
Rubyはうんこ
def と定数しか書いてはいけないと思う時期は確かにある
>>514 >命名規則に関して質問させてください
>
>変数名やメソッド名に関するrubyの一般的な命名規則はどのようなものが存在するのでしょうか?
>@が頭についていたらインスタンス変数、@@でクラス変数、などはわかるのですが、それ以外の部分で一般的な命名規則があれば教えて欲しいです
>
>具体的に言えば、Cのハンガリアン記法やJavaのらくだ記法のような、守らなくても動作するけれども、守るのが一般的な規則です
いまならRailsをまねするのがいいとおもう
「rails coding standard」でぐぐってみれ
えええええええええええええええええええええええええええええええええええええええええええ
Rails は Ruby ではない
>>530 まあだからこそRuby知らない層が飛びついたとも…
Railsの文法面とか書き方とかは参考にしないほうがいいな
あれは言ってみれば言語内DSLだからRubyに似た別言語と考えたほうがよい
目的志向で割り切って便利に使い倒すのがよろしいかと
>>528 ぐぐってみた
コーディング規約そのものというより、もっと大きなレベルでの取り決めが多いな
とりあえずHAMLを勧めるのはやめて欲しい
>>532はその昔「ここでerb使うとかありえねー。このRailsとかいうヤツ脂肪」と言っていた気がする
ハムッハムハフッ
535 :
デフォルトの名無しさん:2008/07/20(日) 00:27:03
Hash.new{|h,k| h[k] = {}}
って
Hash.new{{}}
と同じですか?
違います。
hash1 = Hash.new{|h,k| h[k] = {} }
hash1['a']['A'] = 'AAAA'
p hash1 #=> {"a"=>{"A"=>"AAA"}}
hash2 = Hash.new{ {} }
hash2['a']['A'] = 'AAAA'
p hash2 #=> {}
後者は元のハッシュに代入しないで単に空のハッシュを返すだけ。
自分で試すと理解が早いぞ
あまり最初だとどう試していいかよくわからないけどな
538 :
536:2008/07/20(日) 02:40:54
ありがとうございました
一次元で実験したら同じ挙動だったので、同じと思い込んでました
ハッシュは素の状態ではネストできないんですね
このようなブロックでは、二次元までしか出来ませんが、
何次元でもネストできるハッシュはないのでしょうか?
hash['a']['b']['c']['d'] = 'A'
といきなり代入できるような
Rubyにはオブジェクトに対するメソッド呼び出ししかない(若干語弊あり)
多次元とかそういう概念はない
arr[3][5][1][0] は 位置(3, 5, 1, 0)に対応する4次元配列ではなく、
「「「arr[3]の返り値の配列」の5要素目の返り値の配列」の1要素目の返り値の配列」の0要素目
もしキーの空間が疎なら
hash[ ['a', 'b', 'c', 'd' ] ] = 'A'
のようにキーの集合となる配列自体をキーにしてしまうとか。
541 :
デフォルトの名無しさん:2008/07/20(日) 05:05:27
>>540 ['a', 'b', 'c', 'd' ]が毎回生成されてHashキーが変わるかと思ったけどそうでもないんだね
>>538 なんとなくそれっぽいものをちろっと書いてみた。
def multi_hash(dimension = 0)
dimension == 1 ? {} : Hash.new { |h,k| h[k] = multi_hash(dimension -1) }
end
h4 = multi_hash 4 # 最大4次元のハッシュ
h4['a']['b']['c']['d'] = "A"
p h4 #=> {"a"=>{"b"=>{"c"=>{"d"=>"A"}}}}
h4['a']['b']['c']['e']['d'] = "A"
#>NoMethodError: undefined method `[]=' for nil:NilClass
hi = multi_hash # 引数が0以下だと無限長
hi['a']['b'] = 2
hi['A']['B']['C'] = 3
p hi #=> {"A"=>{"B"=>{"C"=>3}}, "a"=>{"b"=>2}}
ただしこれは多次元配列ではなく、ハッシュのリストなので、
p hi[1] #=> {} 途中の次元の実体はハッシュ
hi[1] = 1 # もちろん代入可能
hi[1][2] = 2 # hi[1] は 1 になったので
#>NoMethodError: undefined method `[]=' for 1:Fixnum
さらに、存在しないキーを参照しただけでも跡が残る。
h3 = multi_hash 3
p h3['a']['b']['c'] #=> nil
p h3 #=> {"a"=>{"b"=>{}}}
それでも用途によっては使えないこともないが、見た目を気にしなければ
>>540 の方が使いやすいかもね。
参照痕だけでも除去できないか…とおもったがいいかげん眠いのでパス。
あ、上の方ちょっとミスった。
訂正するほどのものでもないけど、まぁ一応。
h4 = multi_hash 4 # 最大4次元のハッシュ
h4['a']['b']['c']['d'] = "4"
p h4 #=> {"a"=>{"b"=>{"c"=>{"d"=>"4"}}}}
h4['A']['B']['C']['D']['E'] = "5"
#>NoMethodError: undefined method `[]=' for nil:NilClass
>>541 即値を書けば配列は毎回生成されることになるけど、
別のオブジェクトでも中身が同じならハッシュ値も同じだね。
p ['a', 'b', 'c', 'd' ].object_id #=> 21388910
p ['a', 'b', 'c', 'd' ].object_id #=> 21377100
p ['a', 'b', 'c', 'd' ].hash #=> 607
p ['a', 'b', 'c', 'd' ].hash #=> 607
p 'abcde'.object_id #=> 21342160
p 'abcde'.object_id #=> 21100590
p 'abcde'.hash #=> 993689702
p 'abcde'.hash #=> 993689702
544 :
541:2008/07/20(日) 08:40:46
>>543 中身同じならhashは同じになるんか 勉強になった
>>536 535とは別人だが参考になった
さんくす
>>543 こうなるのは、配列と文字列と数値だけ?
その他のオブジェクトでは、中身?が同じでもhash値はちがうっぽいんですが
mutableなオブジェクトをキーにするのは気持悪い。
549 :
デフォルトの名無しさん:2008/07/20(日) 12:06:36
>>549 Rubyだけじゃない。PerlやPythonも同じ。
>>548 出たなハッシュキーシンボル教信者め
ハイフン! ハイフン! ハイフン!
>>549 いやいや Perl でも ^ と $ は行頭と行末だから
vim でも ^ 押すとカーソルが論理行先頭に飛ぶだろ
552 :
デフォルトの名無しさん:2008/07/20(日) 12:19:56
まあ、勘違いしてる人は多そう
^ は文字列の先頭としか書いてないサイトとかあるし
553 :
549:2008/07/20(日) 12:24:58
>>550,551
あれ本当ですね
今まで勘違いしてた・・
記事の「Perl などの他の言語の正規表現とは意味が違うので気をつけてください」
っていうのも勘違いかな?
>>543 同値判定やハッシュコードは、使いやすいように再定義してるわけですよ。
556 :
デフォルトの名無しさん:2008/07/20(日) 15:26:48
def multi_hash(dimension = 0)
dimension == 1 ? {} : Hash.new { |h,k| h[k] = multi_hash(dimension -1) }
end
これ0以下の時無限ループしないのはなぜ?
多次元配列の作成などではなくただのHashだから
むしろ、無限ループすると思った理由を知りたい
558 :
542:2008/07/20(日) 16:00:31
>>556 えーと、無限ループですが、何か?
hi = multi_hash
h = hi
10000.times do |i| h = h[i] end
p hi
#=> {0=>{1=>{2=>{3=>{4=> ..中略.. {9999=>{} 【 '}' x 10000 】
無限と言ってもメモリが足りなくなったらたぶん落ちるけど。
>>557 それはたぶん停止判定が dimension == 1 の時だけだから。
オーバーフローしたら1周して戻ってくるC言語のInt型などとは
違って、Rubyの場合多倍長整数だから、永久に戻らない。
無限ループするという彼の言は正しいよ。
Hash.new のブロックの中身が使用される場合というのは決まってる
Hash.new した時点では何もしない
irb> h = Hash.new{|h,k| puts '存在しないキー呼ぶとかなんなの?死ぬの?'}
irb> h['k'] = 'v'
"v"
irb> h['key']
存在しないキー呼ぶとかなんなの?死ぬの?
>>558 それは無限ループとは呼ばないし
>>556のイメージとも違う
>>556はおそらく multi_hash(-1) した時点で無限にループすると思ってる
multi_hash(5) とすると 5回繰り返して多次元ハッシュの型が作られると思ってる
560 :
542:2008/07/20(日) 16:20:21
おっと、続きを書くのに手間取っている間に、親切な人からの突っ込みが。
別に意地悪ではぐらかすつもりではなかったんだが。
無限ループは適切でないとすると、無限リスト構造と呼べばよかったかな?
561 :
sage:2008/07/20(日) 17:21:03
>>558-559 だいたいわかりました どうもありがとう
もう一つ質問があります
この関数を連続して違う引数で呼び出しても大丈夫みたいです
dimensionの値はどこに残ってるのですか
ハッシュオブジェクトの中? それともマルチスレッドなの?
>>553 PerlとRubyではmオプションの効き方が違う。
Perlでは、mオプションが有効なときだけ、^が行頭にマッチする。
Rubyでは、mオプションの有無にかかわらず、^が行頭にマッチする。
>>561 最初に呼び出されたメソッドのローカル変数(引数含む)と、そこから呼び出された
同じメソッドの変数は、別の領域に確保されてるから上書きされない
「再帰呼び出し」でぐぐれ
>>561 >>562も言ってるけど、たぶん聞きたいのはクロージャの方だよね。
詳しい内容はググってもらうとして、
>>556を単純化するとこんな感じ。
def make_hash(x)
Hash.new { x -= 1 } #<-この括弧の中がクロージャ
end
クロージャは生成された瞬間のコンテキストを保持していて、
呼び出されると、生成されたときのコンテキストで実行される
h10 = make_hash 10 #<- 10の値を持つxという変数を持つ
# 無効なキーの参照で先のクロージャが呼び出される
p h10[0] #=> 9
p h10[0] #=> 8
h20 = make_hash 20 #<- 値20の変数xを持つ
p h20[0] #=> 19
p h20[0] #=> 18
# h10 と h20 は個別のコンテキストを持っている
p h10[0] #=> 7
p h20[0] #=> 17
変数x (
>>556ではdimension) はハッシュ生成時に作られたクロージャ
の中にあるので、ハッシュのインスタンスが保持しているのではないし、
もちろんスレッドローカルな領域にあるわけでもない。
最後の一言はひょっとすると正確ではなかったかもしれない。
単にマルチスレッドではないと言いたかっただけなんだ。
マルチスレッドの定義にもよるな。
クロージャはマイクロスレッド(ファイバー)に相当するが、
これを処理するのもマルチスレッドと呼ぶなら
クロージャはマルチスレッドだ。
マルチスレッドはスレッドがマルチかどうかで定義するといいよ(北大理論)
570 :
デフォルトの名無しさん:2008/07/21(月) 07:20:44
1.9は相当速度アップしてるみたいですが
実戦投入はまだできないレベルですか?
意図がよーわからんがはいと答えておく
あなたの意に添うものになる可能性はゼロでしょう
>>570 安定版の1.9.1が出るまでは我慢しなさい
あと、速度アップしてると言ってもベンチマーク上での話なので
実戦投入においてどのくらい差が出るかは怪しい
少なくとも「格段に遅い」ということは無くなるだろうが
まあ、現時点で実行速度を気にしてしまうような人たちのお手元にRubyが行くことは永遠になさそうだな
>>570 「Ruby1.9は速い速い!爆速!」とか言ってるのは、1.9への開発を促進させるための
釣り文句みたいなもん。実際は、スクリプト言語がカバーすべき分野においてRubyは
遅くない。単なる数値計算ならそりゃ遅いけど、rubyがやってる分野で遅さがでることは
めったにないし、もしそうだったらC拡張書けばいいだけの話。
Railsとかが遅い遅いって言われてるのも実際はDBがチューンされてなくて遅いだけ。
ベンチマークが付属してるからやってみればわかるけど、Ruby1.9になって
返って遅くなったところもある。Erbとかな。
ささだ氏は、1.9.1は今年のクリスマスまでに出すとか言ってるが、伸びる可能性もある
それまでに安定したとしても、本格的なチューニングはまだまだだろう
実は、実際使用上の Ruby で一番「遅い」のは gem でインストールされたライブラリの初動の require
次に遅いのが gem でインストールされたライブラリのメソッド動作
gemでインストールされたという理由でメソッド呼び出しが遅くなるの?
自作のライブラリと条件は同じでは?
rubyforge に登録されているライブラリの効率性が動作標準添付ライブラリに比べて低いということでは
前者はインストール時に依存してたライブラリを基本的に全部 require するわけだから遅いのは当然だわな
>rubyforge に登録されているライブラリの効率性が動作標準添付ライブラリに比べて低いということでは
は?
>>575 いや1.9.1はクリスマスに出るだろう。
だが安定版かどうかといえば、きっとそうではない。
また「リリースは無事行われるが、それを手にする人は無事ではない」式
1.9にしたほうがいい という明確な理由がないなら、
熟成するまで待つほうがいいみたいね。
>>580 本質的に、URLエンコードはそういうものなので、既存の%だけは無視するようなものを
自分で作るしかないと思う。
どっかで、1.9は、evalとかリフレクションとかは、
1.8より遅くなるって、載ってたんですけど、
そうすると、その辺を多用してる、railsとかは却って遅くなったりするんですかね・・
>>585 1.9使ってないから実際のところはしらんけど、それはよく言われていること。
>>576 gemとライブラリのメソッド動作に何の関係が
587 :
デフォルトの名無しさん:2008/07/21(月) 20:29:37
ぼけーっとまってりゃいい。
1.9が出たらそれにしなきゃいかん という法律もないべ。
589 :
デフォルトの名無しさん:2008/07/21(月) 22:53:25
Rubyで型チェックするのってif文でis_a?してArgumentError投げるくらいしかない?
世に出てるRubyプログラムは型チェックしないでどうやって整合性保ってるの?
結局は実行時エラーなんよRubyは
Rubyは型をチェックしない
型をチェックする必要がない…というのはちと言いすぎだが、
型のチェックが大事になるようなプログラムというのは実は少数だろ
それ以外の大多数のプログラムを書くためにRubyを使う
ダックタイピングの実現がポリシーのうんたらと言いつつ
結局は is_a 関係をチェックしてるというのはまあ隠しようのない事実ではある
少数ってことはないだろ
文字列が来るべきところに数字が来たらどうするかどんなプログラムでも考える必要がある
文字列が来るべきところに数字が来たらエラーを吐いて死ねばいいと思うよ
結果が予測できるなら暗黙で変換して安全な結果を返してもいいな
def hoge(c)
if c=="b"
・・・・・・
end
end
s="abcd"
hoge s[1]
>>595 そうだね。自分もそうしてる。
例えば、文字列を半角にする関数の例だと自分はこうやってる。
nilの場合は、''にして、それからとりあえずto_sして文字列であることを確保してから
本来の処理をする。
本当にその型じゃないと困るというときは型を比較してるけど、やっぱり頻度は少ない。
def to_hankaku(str)
text = str || ''
text = text.to_s
(処理)
text
end
最初からto_sすればよくね?
まあ全部型チェックしてたら、
記述が冗長で遅い静的言語という酷いものにしかならんなw
>>598 ほう
nil.to_s は 何を返すべきだと思う?
Nilクラスのインスタンスの nil ?
文字列 "nil" ?
空の文字列 "" ?
NoMethodError?
よく言われるのは、 nil.to_s が "" なのに puts nil が nil だってとこだな
irb> puts nil.to_s
irb> puts nil
nil
puts って暗黙的に to_s してるんじゃないんだ
nil と Array と末尾の \n は特殊処理
初心者にとってはこの雑談っぽい流れでも勉強になるんでどんどん雑談に花を咲かせてください
全く知識がないですけど
学生なんで無料と言うところに引かれてきました
自分のような初心者には難しいでしょうか?
将来的にネットワーク関係とか、画像処理とかを見てみたいです
インターネット関連はネット経由でアクセスすることもサーバを作ることも普通にできる
文字列処理も普通に得意だ(詳しい人黙ってるように)
画像処理はわりと苦手(外部プログラムの使い方を学ぶ必要がある)
一般論として、プログラミング初心者にとってはRubyは難しい言語ではない
プログラミングという行為自体に合わない人というのは一定数いるが、そういう人でさえなければ普通に使えるはず
ただ、もし、あなたがWindowsしか持っていなくて、プログラムというものが
たとえばワードやインタネットエクスプローラーのようなものしか思いつかないとしたら、
Rubyはそういうプログラムを作るのには向かないので、他のプログラム言語を使うといい
勘違いも甚だしい
>>607は書いてあることに対して文句言うことしかしないから気にしなくていい
得手不得手があるということか
つってもよく考えると当たり前だよな
>>608 というより、書いてあることに対しても何も言ってない。
目隠ししたまま書ける。
コピペでしょ
$cat test.dat
1
富士の樹海
2
ガダルカナル
3
馬
のようなデータ(ファイル)から
[["1", "富士の樹海"], ["2", "ガダルカナル"], ["3", "馬"]]
のような奇数番目(特定のフォーマットをもったid)と偶数番目(フォーマット不定のデータ)のペアの配列を作る事が目的です
each_with_indexを使うやりかたを試しましたが、
[[],[]].tap{|tmp| open('./test.data').read.split("\n").each_with_index{|e,i| (i&1==0) ? tmp[0]<<e : tmp[1]<<e}}.transpose
とtapを使っても一時変数が邪魔くさいので
open('./test.data').read.split("\n").partition{|e| e=~/\d+/}.transpose
のように奇数番目の正規表現で分けてやってますが、
位置が決まってるんだからもう少し賢いやりかたがあると思うのですが
わかる方お願いします
File.open('test.dat', 'r'){|f| f.read}.scan(/(.+?)\n(.+?)\n/m)
たまたま動くっぽいが m 使わないほうがいいか
まあいいや
あ、しまった、またやっちゃった
万一 test.dat のファイルの最後が改行で終わってない場合、
>>613では最後のペアを取得することができない
File.open('test.dat', 'r'){|f| f.read}.scan(/(.+?)\n(.+?)$/)
これでよろしく
>>613-615 scanなんてものがあるんですね、
入力から一発で変換できるのでコレがベストっぽいです
ありがとうございました
ruby勉強中の俺も今さっきscanに感動したとこだわ
こりゃ便利だなあ
File.open('test.dat') {|f|f.readlines.collect{|s|s.chomp!}.each_slice(2)}
619 :
デフォルトの名無しさん:2008/07/22(火) 22:31:22
Rubyでウェブアプリ開発する時は、
バックエンドにRubyのプロセスを複数立ち上げてリバースプロキシするのが
普通のようですが、
立ち上げるプロセス数ってどうやって決めるのでしょうか?
>>619 勘
いやマジで
何か計算式があるわけじゃないし、何か目安があるわけでもない
そのへんは実際に動かしていろいろ決める他のWebシステムと変わらないな
621 :
デフォルトの名無しさん:2008/07/22(火) 22:48:08
各プロセスの使用率の統計のようなものをとったりしてってことですよね
そういう目的に使うプログラムってありますか?
Apache使ってるならabとかで負荷かけたりして
数値を取ってみるとか。
JMeterでもいいかもしれん。
>>618 また知らない関数が…しかも速い
each_sliceって1.8,6で追加されたもの?
少しくらいは検索くらいして欲しい
require 'enumerator' すれば 1.8.6 でも使える
ファイルが大きい場合は正規表現 (.+?)\n(.+?) が重いから each_slice がよく動く
…というか、enumerator を読み込んでいいのなら each_slice がたぶん一番速い
言ってみれば、配列の要素を先頭から n 個ずつ取って新規配列に入れていくだけのシンプルな処理だから
あと Ruby には関数は存在しない
関数呼ばわりされて黙っておけなくなったら脱初心者ですね。
なにその微妙な指針
昔はLinuxをlinuxと書いただけで叩かれるような文化もあったとか聞く
そこまでやらなくてもとは思うが、ある程度用語はしっかりしたものを使って欲しいとも思う
意外なところでトラブルの元になったりするし
てか、メソッドってそんなに言いにくいもんかね
関数って言葉を使うってことはC系列のプログラミング言語の経験があるってことなんだろうけど
CPU数*2位でいいんじゃね?
伝統的なワーカスレッドの決定方法だけど
トップレベルのメソッドとmodule_function(:hoge)されたメソッドは
関数と呼ばれたりするけどね
関数的メソッドという慎重な名称で呼ばれた記憶しかがない
つか、それは「StringIO は IO クラスと同じ動作をします」と同じくらい胡乱
関数的メソッドとかって言い回しじゃなかったっけ?
そんなことより Enumerable#detect と Enumerable#select ってぱっと見紛らわしいよね
injectとrejectは紛らわしくないと申すかー。
Smalltalkやった人は-ectシリーズ慣れてるんだけどねぇ。
マジレスすると用法と実際の表記が違うから全く紛らわしくない
detect と select のほうは find_all と find だ
636 :
デフォルトの名無しさん:2008/07/23(水) 21:22:15
初めまして
今rubyで
「XPathとDOMが相互変換できるライブラリ」
というものを探しています。
結構調査してるのですが、なかなか見つからず。。
どなたか教えてください。
637 :
デフォルトの名無しさん:2008/07/23(水) 21:42:29
>>635 皮肉にも紛らわしさを裏付ける結果になったな。
>>636 ないと思います
他の言語でそういうのがあれば紹介してください
>>638 ご回答ありがとうございます。
無いですか、そうですか。。。
XPath文書→DOM文書に変換
って片側通行だけのでも良かったのですが。。
>>639 XPath文書とかDOM文書が何を指しているのかわからんけど
REXMLでならXPathでelementを検索できたと思う
642 :
デフォルトの名無しさん:2008/07/23(水) 22:41:36
以下のサイトで Rubyの勉強用のソースコードとして、
BitClust、mailread.rb、WEBrick、BitChannel
ものがあげられています。
Ruby には Perl の Plagger のようなお手本はないの? - gan2 の Ruby 勉強日記
http://d.hatena.ne.jp/gan2/20080721/1216634044 ところでこれらのソースを読み漁るのによいツールはありませんでしょうか?
コードレビューツールというような感じのものです。
DOMはデータ構造とセットになったアクセス方法だが
XPathはアクセス方法だけじゃないか?
変換とはどういう意味だろうか。
XPath文書、DOM文書の意味がわからんことにはどうにも…
どっちもXML的なアレを触る手段で、フォーマットじゃないっしょ。
>>642 地味なところでいうとrdefs。
るびまの添削連載から辿れる。
645 :
642:2008/07/23(水) 22:52:16
すいません。レビューツールというより、コードリーディングとかソースビューアーですね・・・。
>>644 redefいいですね。メソッド列挙できるんだ
ありがとうございます。
>>644 度々のご回答ありがとうございます。
XPath、DOMも調査段階で自分なりに調べた程度だったもので。
やりたいこととしては
DOMを扱って処理するプログラムがあったが、急遽XPathも扱うことになった。
だからXPath→DOMにして、プログラムで処理をしたい・・・。
そんな感じなんだと思います。
「思います」というのは、私に知識が無いのと、作る機能が掴めない状態なもので。
申し訳ないです。。
えーと、あるXPathに対して、そのXPathで引っかかってくる全てのエレメントについて、
DOMを使って触るなら、どういう手順になるか、みたいな
コンパイラのようなものほしいわけ?
>>647 そのコンパイラのようなものの
ご教授をお願い致します。
※手順、処理の流れ等なんでもOKです
単にDOMアクセスもXPath式アクセスも使えるXMLライブラリがあればいいのでは。
>>650 普通に考えるとどっちも使えるライブラリを既に入れてるはずなんだけどな
NIHでもあるのだろう
652 :
642:2008/07/23(水) 23:26:09
ためしに NetBeansのRuby(Rails)プラグインを使ってみたのですが、
ソースの色分け、クラス構造のツリー表示、
定義元へのジャンプ等一通りの機能がついていたので、
これでコードリーディングしてみようと思います。
ありがとうございました。
Rubyを普通に使ってれば、ドキュメントが貧弱で、結局ソースを読むことになる
今やそんなことはないと思うけどなあ。
普通に使ってる分には。
Arrayをインデックスで逆向きになぞりたいんですが、
Array#reverse_each_indexはありません。こういう風に書きたいんです
ary.reverse_each_index do |i|
#・・・・
end
今はこうやっているんですが、ちょっと汚いなあと
もっとうまい方法はありませんか?
ary.reverse.each_index do |index|
i = ary.size - index - 1
#・・・・
end
インデックスだけイテレーションする必要性はよく分からんが
(ary.size-1).downto(0) do|i|
end
とか
なるほど。それで行きます
ありがとうございました
頑張ってサンプルコード書いてます。
日本語文字列を puts で表示したいんですが、普通に puts とだけ書いて文字列を表示させると、
文字エンコードの関係で端末表示がすごいことになる可能性があります。
そこで、 puts result.toeuc とか書きたいんですが、実行者の端末が日本語 EUC だとは限りませんよね。
「puts のとこの toeuc の部分を自分の環境に合わせて適宜書き換えてね」と言ってもいいんですが、
puts が何個もあるとさすがに面倒だろうなと思います。というか、自分なら面倒でやりたくありません。
何かわかりやすくてうまい方法はありませんか?
output に溜めて最後に一括変換一括表示というのは、puts したい文字列の文字エンコードが複数あるのでやりたくないです。
出力用のエンコードを定数に入れて String#kconv
putsを再定義(可能性として)
正規表現で日本語マッチしないと思いきや
何のことはない文字コードを%r{}sとしてShiftJIS指定したら
マッチした。それまでは意味不明なエラーが・・・
しかもnkfライブラリというものが入ってるらしいね
後で入れなきゃいけないと勘違いしてて
それなら(ソースごと配布する時に)めんどくさいから、
利用するのやめとこうと思ってた。
def puts(str)
print "#{str.toeuc}\n"
end
と require の直後に書かれてればわかるかも
>>658 メソッド名は適当に変えれ
class String
def tolocal ; Kconv::kconv(self,Kconv::AUTO) ; end
end
puts '日本語'.tolocal
1.9ではhpricotが使えなくて自力で弄って使っているんですがちょっと怖いです
ruby標準ライブラリにHTMLパーザって無いんでしょうか?
ない。
XMLパーサのREXMLならあるが、HTMLのいい加減さに対しては無理があるな。
つーか、初心者が1.9使ってはいかんよ。
1.9に未対応ライブラリがあるのは仕方ない
仕様がどんどん変わってるんだし(今はもう落ち着いたのかな?)
make test-allなんてやるとrindaが未対応なのを未だに晒してて恥ずかしいけどね。
対応する気がないならはずせばいいのにね。どうせ誰も使ってないんだし
PlaggerがなければPRaggerを読めばいいじゃない
668 :
デフォルトの名無しさん:2008/07/25(金) 10:35:01
Ruby1.8.1の環境でUTF-8からSJISへの文字コード変換でのエラーで悩んでいます。
現時点ではIconvでの変換である程度うまくいってるんですが、
一部の文字が含まれているときにエラーとなります=>Iconv::IllegalSequence(対象の文字が文字集合に含まれないため変換が停止)
1.8.7では問題ないので、バージョンが古いせいだと考えてます。
文字コード関連の標準ライブラリはいずれも1.8.2からUTF-8に対応してるようなのですが、
1.8.1で1.8.2の機能を使う方法ってあるでしょうか?(Pythonの__future__指定のような)
他にに1.8.1のnkfでは無視されてUTF-8のままの出力、
kconvでも同様、あるいはNameError(UTF-8変換の定数などが存在しないため)となっています。
1.6や1.8.1のUTF-8関連はUconv
1.8.1じゃ外部ライブラリ動かなくて大変だろうな
671 :
668:2008/07/25(金) 12:09:58
>>669 ありがとうございます!
レン鯖なのでUconvはあきらめてたのですが、
言われてもう一度調べてたらPureRuby版があったことに気づき、
さっそく試してみたところ、解決できたようです。
よかった・・・
>>670 非公式に(?)Rubyがこっそりインストールされてる鯖で、標準ライブラリしかないんです。
たいしたことやってないので今のところは間に合ってるんですが^^
>>671 何言ってるかわかんね レン鯖なのでUconv・・・のレン鯖って何?
breakとnext間違えてるのを使ったことないデバッガで
何時間もかけてやっと気づいた
いやーデバッガ使えるって便利だねw なかったらどうなってたかわからん
ほんとに助かる
レンタルサーバー、の略
日本語でおk
というか、チラシの裏でおk
場違いかもしれませんがRailsのスレが無いので質問させてください。
railsのform_forのcheck_boxで、デフォルトでチェックされた状態にすることは可能でしょうか?
677 :
デフォルトの名無しさん:2008/07/25(金) 21:10:41
あるオブジェクトのメソッド呼び出しの前に米印が付いてるんですけど、これって何ですか?
val = *row.search("//td/text()")
あと、Ruby のチュートリアルとかでよいのがあれば教えてください。
これをマニュアルのどこで説明するかってのはけっこう重大な問題だったりする
現行のマニュアルでは見つけにくいことこのうえない
>>677 Hpricot の search メソッドだと推定
search は一重の配列しか返さないから、この場合は特に意味はないと思われ
書いた人が search メソッドの動作に自信がないので保険をかけたように見える
以下一般論
これは「メソッド呼び出しの引数展開」と呼ぶ(Ruby では = もメソッドだ)
row.search("//td/text()") の結果の配列を展開して val のクラスの = メソッドに順に渡す
んだが、*arr にはひとつ特別な効果がある
irb> vals = *[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]
irb> vals = *[[1, 2, 3, 4, 5]]
[1, 2, 3, 4, 5]
irb> vals = *[[[1, 2, 3, 4, 5]]]
[[1, 2, 3, 4, 5]]
irb> vals = *[[[[1, 2, 3, 4, 5]]]]
[[[1, 2, 3, 4, 5]]]
irb> vals = *[[1, 2], [3, 4, 5]]
[[1, 2], [3, 4, 5]]
irb> vals = [1, 2, 3, 4, 5][0]
[1, 2, 3, 4, 5]
おそらくはこれの効果を狙ってたんだろう
679 :
677:2008/07/25(金) 21:47:56
>>678 詳しい説明ありがとうございます。
Mechanizeってのを使ってますが、中でHpricotを使ってるみたいなので、
Hpricotのsearchだと思います。
>>677 リファレンスマニュアル>Rubyの文法>演算子式>代入>多重代入
ついでだから
リファレンスマニュアル>Rubyの文法>メソッド呼び出し
も読んどけ
>>675 form_forなら、対象ARの該当属性をtrueにしておけばいいよーな。
683 :
デフォルトの名無しさん:2008/07/26(土) 00:07:06
すみません、The Ruby Wayって本読んでるんですけどそれのレーベンシュタイン距離の
算出プログラムで以下の部分の意味が分かりません。前から順番に読んでいってるのに
いきなり配列っぽい文法が出てきて困っています。この本、初心者が読む本じゃないんでしょうか?
特に2行目の[0]ってなんですか?
#最初の行の値を初期化する
dm[0]=(0..self.length).collect{|i| i * ins}
fill=[0]*[self.length-1]
amazonにあるThe Ruby Wayの説明
>本書は、Rubyの広範囲なプログラミングテクニックについて解説したものである。
>大半が実践的内容となっており、Rubyプログラミング経験者が対象になると考えられる。
>そのため、Ruby初心者には理解が難しいかもしれない。
[0] は [0] だろ
self の 大きさマイナス1のぶんだけ [0, 0, 0, 0, ..., 0] を作るんだ
レーベンシュタイン距離を筆算で出せてRubyで記述できる人じゃないと一発で読み解くの無理だろうな
まああれだ。
irb(main):001:0> [1,2,3]*3
=> [1, 2, 3, 1, 2, 3, 1, 2, 3]
って辺りで納得してくれ。
>>686 えっ、それって[3,6,9]になるんじゃないんだ
>>687 じゃあ [1, 2, 3] + 3 は [4, 5, 6] になっていい?
いいような。ダメ?
その辺をRubyがどう解釈するのか勉強たりないや
690 :
デフォルトの名無しさん:2008/07/26(土) 00:37:22
>>685 配列はまだ分からないのですがこんな感じのことでしょうか?
fill=[]
for i in 0..self.length-1
fill[i]=0
end
>>686 すみません、初心者なのでむしろ分かりませんw
俺なら、それやりたいときは
fill = []
0.upto(self.length-1) { |i|
fill << 0
}
こうやってそうだが、
[0]*[self.length-1]
これでもいいのか
>>689 まあリクツ上はダメじゃないんだが、Rubyがそれを採用しなかったのは写像の考え方を支持したから
>>683にもcollectの形で存在してるが、mapと呼ばれるメソッドだ
「配列の [1, 2, 3] の全要素に 3 をかけて [3, 6, 9] にしたい」という場合は、
「集合 [1, 2, 3] に関数 f(i) = i * 3 を作用させて [3, 6, 9] を取り出す」と考える
irb> p [1, 2, 3].map{|e| e * 3}
[3, 6, 9]
693 :
デフォルトの名無しさん:2008/07/26(土) 00:52:01
レスを見てこの本が初心者むけじゃないことは良く分かりました。
でも高かったのでもう少し頑張ってみます
ところで100ページぐらい読みましたが、幾度となく注釈に
「ruby1.9.0より動作が変わる予定です」とか書いてます。
1.9.0って地雷なんですか?
一旦本棚にしまっておいて、初心者向け書籍やらサイトやらで勉強してから読むといい
その本自体はかなり良い本だ(サンプルの題材が若干変だけど)
あと、Ruby1.9.x は過去のしがらみを捨てて新しく使いやすいRubyを目指したもの
過去との書き方や動作とは全く違うという場面が多いからそういう注釈がついてるのだろう
あのさ
irb> a = [0] * [1]
TypeError: can't convert Array into Integer
動かないんだけど、答えてる人はどんな結果になる?
>>695 [0] *1
なら上手くいった
本の誤植?
俺は横から質問してる方だけど
699 :
デフォルトの名無しさん:2008/07/26(土) 01:05:29
すみません、私の誤植でした。
fill=[0]*(self.length-1)
でした
>>699 わからないことがあったらirbで試すといいよ
irb(main):006:0> a=[0]* 8
=> [0, 0, 0, 0, 0, 0, 0, 0]
irb(main):007:0> a=[0,2]* 8
=> [0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2]
irb(main):008:0>
なんてやれば、どうなるか直ぐ確認できるよ
>>692 Rubyのブロックつき写像はRubyっぽさが出てて素敵だと思う
ちなみにPythonでは map(lambda x: x * 3, [1, 2, 3]) と書く
無名関数を使わなければならない場合はRubyのほうが見やすいね
702 :
デフォルトの名無しさん:2008/07/26(土) 01:21:53
683
皆様ありがとうございました。
本は最後まで読まないと気がすまないほうなので分からないなりに
一回は最後まで目を通したいと思います
また質問するかもしれませんがよろしくお願いします
へえ
使用がよくわからないからif文と正規表現ばっかり使ってるけど
それでいいことがあったのか
>>703 こっちは君が何を指して喋ってるのかわからなくて怖いよ
誤爆じゃないの?
かなり近所のようだが
>>704 多重代入とかメソッド使ってると仕様が変わって動かない・・・
刷新するっていってもそんなに刷新しない? わからないので
言ってること変でサーセン
text == ("abya" || "ahya" || "gugege")
この書き方するとどれかに当てはまっても
falseみたいだね 文字列型の条件式は
注意しないとやはりまずいのか
同じオブジェクトでないと同じとみなされないが、
例外的に二つのオブジェクトを等号でつなぐと
値が同じがどうかが判定されるために
当てはまる条件緩くするとtrueがfalseになる、
という風に見える
あってるかどうか知らないけどこじつけて覚えとこ
("abya" || "ahya" || "gugege")
は常に一番左の true である 'abya' を返す
演算子 || は左辺から順に評価して true を探すだけだ
選択を行いたいなら
text == "abya" || text == "ahya" || text == "gugege"
["abya", "ahya", "gugege"].include?(text)
とかきちんと書いてくれ
× true を探す
○ 真を探して返す
> text == ("abya" || "ahya" || "gugege")
プログラムを習い始めた時、何でこれがダメなのかわからなかったよ
学校の先生も正しくは教えてくれなかった
わかりはじめたのは演算子の優先順位を知ったあたりかな
それはひどい
まあ「駄目なほうはなぜ期待通りに動作しないのか」の説明は面倒だからな
text == "abya" || text == "ahya" || text == "gugege"
が希望通りに動作するというのは一見して理解できるが
text == ("abya" || "ahya" || "gugege")
が駄目な理由というのはちと直感に反する、というか最初は絶対こう書く
注意深く追うと変な動作を期待してるってのはわかるんだがね
>>706の理解は変だが
>>711 > 最初は絶対こう書く
みんな、そんなに始めからフリーダムなの?世界観が変わるわw
普通は、「書いたとおりに動く」っていうのをまずたたき込まれるん
じゃないの?
「変数の内容が ○○ か △△ か ×× のどれかに等しいなら」という条件選択の記述はふつーは「習わない」だろ
このへんになると演算子の動作とかを自分で考えて書き下す頃合のはず
ここで引っかからないのはセンス持ちかコピペ君かどっちかだな
>>713 ??
if( ほげ || ぱげ || もげ ) { ほげほげ }
いや、普通に初歩の初歩ですが。
「教わる」場合、AND・ORの論理演算すら教えてもらえないって
いうのは無いんじゃないかな?
>>713 ↓ これが、多分「習う」書き方。
( str == 'aaa' || str == 'bbb' )
↓ これは、多分(普通には)習わない書き方。
str == ('aaa' || 'bbb')
後者の方をよくわからずに書いちゃう人間は、それこそ
ダメセンス持ちかコピペ君かどっちかじゃね?
そこを問題にするなんて君には常識がないな
他人にもの教えるときには気をつけたほうがいいぞ
このへんは初心者相手に話をしたことがあるかどうかで認識がまったく違うな
自分ひとりしかいない環境で育ってきた人は「間違うなんてありえない」と言うだろう
Rubyのチュートリアル系記事がヘナチョコな理由が垣間見えた
Ruby固有なのか日本人全般の気質なのか意見が分かれるとこだ
言語に関係なく a < b < c とか書いて「動きません」とかいうプログラミング
初心者はいるだろJK
a < b < c で (a < b) && (b < c) になる言語を除く。
しかしこう書く
["aaa","bbb"].include? s
『初めてのRuby』またAmazonで売り切れてる。すごい人気だな。
case-whenで書く
別にruby固有の話じゃないよね
昔は最初の言語としてCをやることが
多かったからCのif文で同じようなことやってる奴はいたわな
最近の学生はrubyでプログラミング始めるの?
恵まれてるのか恵まれてないのか微妙だけど
時の流れを感じるな
>>722 こういうコンピュータ関連の本は入荷を激烈に絞るから、売り切れは人気のバロメータにならない
たとえば、3冊だけ入荷したのが2度売り切れたからといって、大人気とは言えんだろ
まあ、実際には都会の本屋で売り切れって程度にはわりと売れてるわけだが…
Gaucheの本があっさり重刷かかったときもビビったが、なにかあるのかね
>>725 実際に必要なのは変数宣言とバイナリ列とポインタの操作ではなく
データを格納した配列と文字列の操作と正規表現であるということに
やっと皆が気づいたのだよ
いやわりとマジで
ふだん必要とされるのはデータをいじって結果出すことだろ
プログラムを作ることそのものじゃない
ハッシュと正規表現、Perlへようこそ
VERSION => "1.8.7"
%w:foo bar baz:.each(&:require)
なんでできないのん?
>>727 経済とか生物学部の学生ならそれでいいけど
情報系はもちろん数学や物理の学生は計算機の仕組みを
意識させるためにCからやって欲しいね
>>729 その書き方だと
'foo'.require
'bar'.require
の意味になる。
さあString#requireを定義するんだ。
連続 require をなんとかして実行しようとする人って時々見るな
ブロックつきメソッドで require はむしろカッコ悪いと思うんだが
%w(foo bar baz).each{|e| require(e)}
>>730 いらねーよ
Cで書かなければならない(状況に陥った)人だけ勉強しろ
全員に最初から学ばせる理由はもはやゼロだ
>>729 できました
でも細工無しで[].eachなんとかって形でできればもっといいと思いました
>>732 僕はlispで(apply 'load file-list)ってやるみたいで格好いいと思いますけど
ブロック付きメソッドの記法を使うところだけなら同感ですが
require に配列か複数の引数を渡せたら便利なのになあと思うことは年に数回ある
requireよりloadのほうが打ちやすかったなあと思うことは年に数回ある
737 :
デフォルトの名無しさん:2008/07/26(土) 16:16:28
おまえらRuby使えるなんてすごいな 頭良いんだな
>>737 頭のいいやつが楽をするために使ってる場合と
他の言語が使えない頭悪いやつが使ってる場合があるみたいよ
他の言語が使えないのに難しいRubyを使えるわけがない
プログラム言語の習得自体にはいわゆる頭のよさってあんま関係ないよね
素質さえあれば誰でもある程度はできる
素質がないと、指短い人がギターやピアノ弾きにくいのと同程度には辛い
使えるようになるまでがめっちゃ小難しい言語というのは稀にあるが、少なくともRubyはそうじゃない
>>736 効率を度外視して毎回loadで呼べばいいじゃない。(.rb限定)
設計者も言ってるが、Rubyは少なくとも見た目は保守的な普通の言語
例えばCやその子孫と比べて、
何かつまづく要素があるとも思えないが(あえて言うならブロック?)
使えるのと使いこなすのは大分違うからな
>>733 みたいな考えもあるし
ゆとりの流れが加速し続けなければいいが
>>742 ブロックとかに凝らなければ簡単だな
ブロックとかprocとか動的にmethod作ったりruby的な技を
駆使したコードを読むときは、かなり困るというか
いまだによく判らなくて泣きが入るときがある
まともに文書化された言語仕様がない言語でプログラミング教育なんて
いまどきありえない。なに考えてんだ東大。
言語仕様がないと判断できないような微妙な状況には無縁だろうからいいんじゃないの。
jrubyとかIronRubyとか別実装作るのに言語仕様がないと
困ると思うんだが。
どうやってるんだろうね
Rubyはタイプ数が少ないから紙にコードを書いて示すときに素早く書けてよかったなー、なんて思うことはたまに有るような。
>>747 本家MRIが仕様らしい
例えばJRuby1.0.3は、MRI1.8.5を基準にしている
テストは「Railsが動くかどうか」が一つの目安だそうなw
Rubyの幅広い機能を使ってるんで、動作確認にはちょうどいいんだとか
ただ今後実装が増えてくる事を考えるとさすがに不味いってことで、今はテスト策定中
Matz Remote Invocationの略だっけ
Magnetic Resonance Imaging ?
rubyなんだかんだいって難しいからな。初めてのCよりも。。。
そりゃRubyよりCの方が簡単だからね。
「簡素に記述できる」ってことはそれだけに含まれている意味が多いってことだもんで。
755 :
デフォルトの名無しさん:2008/07/26(土) 18:44:43
確かにRubyが使える人なら他の大抵の言語は使えるだろうな。
他の言語を使いたくなくなるかもしれないがな
Rubyが使えるようになれば他の言語は必要ないでしょ。
他の言語はRubyが使えない初心者用に設計されてるし。
lispとか関数型言語も勉強するとよさそうだけどね
prologもやってみたいな
759 :
デフォルトの名無しさん:2008/07/26(土) 18:52:20
関数型には大きな欠点があるから、今以上使われることはないと思う。
761 :
デフォルトの名無しさん:2008/07/26(土) 19:14:18
>>760 だから適材適所って話。
初心者は、C/C++。
中級者は、Java。
上級者は、Ruby。
夏だな…
上級者は言語の好き嫌いはあっても言語を選びません。
このスレに来たRuby初心者の皆さんは、いろんな言語を触ってみましょう。
はーーい
じゃあちょっくらPHP触ってくる
よし俺はBASICとCOBOLを
prolog逝ってきます
統一ライブラリが存在しないこと?
lispは皆好き勝手やってて
車輪の再発明しまくりって聞いたことあるな
処理系すら再発明しまくりだからな
あいつら馬鹿だよ
771 :
デフォルトの名無しさん:2008/07/26(土) 22:01:55
初心者スレにも妙なRuby信者が表れだしたか
さすが夏だな
×信者
○糸
>>770 今のRubyも処理系を再発明しまくりだから
Rubyも馬鹿ばっかりだな
処理系すら作れないやつは黙っとけよ
>>770 それは作るのが簡単だからでしょ。
ホントに本格的なものを作るとなったら商用のCommon Lisp処理系使うよ。
ていうか、そんな「本格的な」状況になったら、今度はRubyの出番が激減する。
"a" << "b" << "c" こういう記述はよくあるような
Lispってあの難しい奴?
こういう記憶ならある
学校の先生「EmacsはELispというものを書いて使ってくださいねー」
生徒「はーい」
俺:geditでプログラミング
エディタなんて何だって良いけど、講義でEmacs使えって言ってんだからEmacsを使うのが筋
こういうのをコミュニケーション能力が低いって言うんだよ。
>>778 使いたいなら使えって言われても・・・
ぼっちなのが悪いんですね、わかります
RubyTkのマニュアルないかな
英語でもいいんだが、さっき見つけたと思ったら
日本語版探してる内に英語版の場所が・・・
ftext.bind "FocusIn" => ftext.configure('width'=>30,'height'=>30)
ごめんマニュアルあるけどわけわからん
ftextはtextウィジェットなんだけど、
これっておかしい? 何でか動かない
Emacsを使うのも授業
別にエディタがそれしか入ってないからじゃない(それもあるが…)
なんか知らんけど出来た スレ汚しスマソ
>>781 補完機能使いたいけど操作が難しくて諦めてる俺
練習すればいいのかな
>>781 体鍛えるのは一緒だからって体育の時間ずっとサッカーやってた奴がいたなあ
私立だったので停学食らったけど
>>779 お前はまずコミュニケーション能力以前に、日本語の能力が欠けている
rubyTkのまともな仕様書ってある?
仕様書で正しいのかな
リファレンスか
>>784 日本語の能力?
日本語を喋る言語能力の事か
日本語を喋る技能が不足してると
日本語の能力とはねw
>>788 特には無いです
inject 使えばなんとかなったけど、本質的に複数行なので却下
irb> [[1,2],[3,4],[5,6]].inject(Hash.new){|h,e| h.store(e[0],e[1]); h}
{5=>6, 1=>2, 3=>4}
ああ、ちょっと用件が違うのか
a.inject(Hash.new){|h,e| h.store(e,f(e)); h}
こうかな
あ~、添え字使わないんだから h[e]=f(e) って書いても見難くないのか
まあいいや、好きなように書いてくれ
このタイプの inject は読みにくい部類に入るから多用は勧めないよ
Hash[*ary.map {|x| [x, f(x)] }.flatten]
とか
TypeError: Array can't be coerced into Fixnum
from (irb):2:in `+'
from (irb):2:in `f'
from (irb):8
from (irb):8:in `map'
前の行で何書いたかが気になる
irb> ary=[1,2,3]; def f(x); x*2; end; Hash[*ary.map {|x| [x, f(x)] }.flatten]
{1=>2, 2=>4, 3=>6}
class Object
def tap!
yield(self)
end
end
[1,2,3].tap!{|ary|p Hash[*ary.map {|x| [x, Proc.new{|x| x*2}.call(x)] }.flatten]}
というtap!とか(難読化に)便利だと思うんですか、無いんですよね
必要なら簡単に書けるからなのかな?
訂正
(1..3).tap!{|ary|Hash[*ary.map{|x|[x,proc{|x|x*2}.call(x)]}.flatten]}
tap の意味を辞書で100回調べろ
あと、オブジェクトAをオブジェクトBに変換する処理をオブジェクトAのメソッドに負わせるのは必ずしも正当ではない
Hash[*(1..3).map{|e| [e, e*2]}.flatten]
RubyではObjectクラスに関数的メソッドとして変換メソッドのエイリアスを定義するのが流行ってるな
字面は便利だけどなんとなく使ったら負けな感じがしててアレだ
組み込みクラスの拡張は最後の武器だ
>オブジェクトAをオブジェクトBに変換する処理をオブジェクトAのメソッドに負わせる
えー
to_aとかあるじゃないっすか
>>798 古くはシェルでcat xxx|awk ...とやるように
今ではC#の拡張メソッドをtemplateと演算子オーバーロード、型推論を使ってC++で使うように
別に邪道でもなんでもないと思うけど
>>797 まー
>>795の論拠になるものではないな
使用して3~4ヶ月目くらいに嬉々として定義して
自分のスクリプト全部で使いそうなメソッドではあるが
本当にまずいものならマクロみたいに最初から使えなくなってる筈
そうなってないという事はじゃんじゃん使ってもおkという事なんだよ!!
「過去の俺はこんな厨二クラスや邪眼メソッドを作った」というのは
るびまとかでアンケート取ると面白いと思う
そういう勘違いスパッゲッティ野郎は一生Javaの世界から出てこないでください
>>803 最優秀賞はRailsに贈られます
審査員特別賞にcgi.rbが選ばれました
受賞者は式典辞退した模様
こういうのはスパゲティーっていわない
N88basicのような本物のスパゲティーを味わってから言ってください
>>805 CGI本体は別にいいんだが、TagMakerのあたりがけっこうモヤモヤする
あれをそもそもHTMLジェネレータとして分けようと思わなかったのは何故なんだろうね
>>806 スパゲッティを名乗るならGOSUBくらい存在して欲しいよな
F-BASIC はスパゲティじゃないのですか?
809 :
788:2008/07/27(日) 16:14:55
最初に例に出されたPerlのコード自体が割とトリッキーだという自覚はあるかい?
Pythonが圧勝だな
dict((k, f(k)) for k in ary)
>>810 どっちかってえと、
「配列のペアをハッシュに一発で変換」
というメソッドの提供を頑なに拒んでるRuby側の問題のようにも思える
>>812 拒んでるんだ
自分でそれ用のmodule作ってincludeでもextendでも
すればいいんでは
拒んでるってえか、Hash[*arr.flatten] で済むから別にいいか、みたいな
ネストしてたりするのを arr.to_h とかでハッシュにできたりすると逆に複雑じゃん?
>>814 irb(main):011:0> Hash[*arr.flatten]
=> {5=>6, 1=>2, 3=>4}
ホントだ。これで十分だな。
といっても*arrしてる意味を理解できてないんだがw
その前に、Hash[] がわかりません;;
*arrしたのを flatten して Hash[] に渡してるのではない
arr を flatten したのを * つき引数で Hash[] に渡してるんだ
Hash[] は引数を キー1, 値1, キー2, 値2, キー3, 値3, ... というハッシュ候補の連なりとみなす
*ってやばいんですね
def foo(a,b)
a+b
end
foo(*[1,2]) # => 3
すごい、けど今回の以外には使いどころが思いつきません
他にどういう使い方があるんでしょうあk?
irb(main):029:0> a,*b = 1,2,3
=> [1, 2, 3]
irb(main):030:0> a
=> 1
irb(main):031:0> b
=> [2, 3]
Record = Struct.new(:x, :y, :z, :u, :t, :s)
records = ARGF.readlines.map{|line|
Record.new *line.split(/\s+/, Record.members.size)
}
821 :
デフォルトの名無しさん:2008/07/29(火) 20:13:59
awkのような列単位での読み込みってどういうふうにできますか?
例えば
3列目 + 5列目
みたいな計算がしたいのですが
rubyでオブジェクト指向の意味とかありがたさを勉強したいのですが、定番の書籍はありますか?
>>821 あ、それRubyではできないんでawk使ってくれ
Rubyでは全部読み込んでから配列へ分割することしかできない
>>821 一応、Perlを踏襲して -a オプションはある。
ruby -ane 'puts $F[2].to_i + $F[4].to_i'
>>823 > Rubyでは全部読み込んでから配列へ分割することしかできない
メモリに全部読み込んでからさらに分割するもんだから、超巨大ファイルの場合は大変なことに…
>>821 #!ruby -n
BEGIN { $count = 0 }
$count += $_.to_i if [3,5].include?($.)
END { puts $count }
あれ、列だろ? 行じゃなく。
829 :
827:2008/07/29(火) 22:37:15
>>822 俺は Ruby は Thomas+Hunt の Pragmatic Programmer's Guide から入った。
これは波長があったんですんなり使い始められた。
日本語訳「達人プログラマーガイド」もあるけど訳の質は知らん。
題は誤訳に近いと思うから不安を感じるが。
「たのしい Ruby」なんかも良さそうだけど。
OOP って何を勉強したいの?OOP と言っても上段に構えるものじゃなくて
プログラミングをしていて、そのうちなるほどってわかるものだと思うけど。
逆に手動かさなきゃわからない。あまり概念にとらわれず coding した方が良いと思う。
せっかくみんなスルーしてたのに
>>822 Rubyはオブジェクト指向の学習には向かない(そう、Javaのように)
オブジェクト指向ってプログラミングの実際とは対極に位置してるよな
プログラム言語を作るときには便利らしいぞ>オブジェクト指向
Rubyで身につくのはRubyプログラミングで有効なテクニックだけだよね
>>822 rubyだとダッグタイピング指向を推奨する人が多いので、
OOP自体の勉強するには向かないかな。
C++か、Javaのほうが、
OOP指向の本が沢山あるはずだから
有り難みを感じられると思う。
835 :
821:2008/07/30(水) 03:55:52
>>824 ありがとうございました。なんとかできそうです
>>834 >rubyだとダッグタイピング指向を推奨する人が多いので、
>OOP自体の勉強するには向かないかな。
なんでや? ダックタイピングこそオブジェクト指向的ではないか。
型にとらわれず、メッセージを送るのが本来のオブジェクト指向的だと思うけど。
>>822 書籍見るよりも、自分でプログラム書いたり
人の書いたソースコードを読んだ方が早いと思う
書籍の中で良さそうなのは、
>>830で挙げられてるものに加えて
「オブジェクト指向スクリプト言語Ruby」もお勧め。ただし値段が高い&内容が古い
>>832 んなこたねーよ
小規模なプログラムだって、オブジェクト指向使うだけでだいぶすっきりすることが多い
少なくとも「実際のプログラムの対極」なんてことはありえない
「自分の環境ではオブジェクト指向なんて使えない」というのであれば、その辺もっと詳しく
オフィスのエアコンが壊れて汗ダックタイピングなんですがどうしたらいいですか?
railsに限らないけどフレームワークの類を使ってると
自分がオブジェクト指向プログラミングを「させられている」事に
気が付かないんだろうね
フレームワークの自動生成したクラスにメソッド記述するだけだから
ユーザー名とパスワード(と必要なデータ1個)を受け取って
Webサイトにログインしてクッキーを返す、みたいなメソッドを作ります
def login(data, param, _pass = nil)
if param.is_a?(Hash) then
username = param[:user]||param[:username]||param['user']||param['username']
password = param[:pass]||param[:password]||param['pass']||param['password']
else
username = param
password = _pass
end
raise 'ユーザー名またはパスワードの指定が不正です' unless username && password
...
と書いたんだけど、処理の書き方がややアホっぽいです
「login(data, {:username => ユーザー名, :password => パスワード}) 以外の形は受け付けませんバーカバーカ」
とマニュアルに書いてもいいんですが、未来の自分があまり信頼できないので、練習も込めてできれば
login(data, {:user => ユーザー名, :pass => パスワード})
login(data, ユーザー名, パスワード)
みたいなよくある形式にも対応してみたいです
どこで覚えたか知らんがそれが妥当だ
そこであまりテクニカルにしても却って読みづらい
多少冗長でもそれくらいにしておいてくれると助かる
しかしキーワード引数風のハッシュって流行ってるなあ
たかがメソッド呼び出しでハッシュオブジェクトが毎回作られるのが気に入らない
そんな内部で頻繁に使用されるメソッドにハッシュ引数なんていらねーだろというのはまあその通りだが(w
良い子のみんなはキーワード引数をできるだけ使わないようにしようね!
いやマジで
Perlではもう常套手段だけどね。メソッド内部の書き方はともかく、APIとしては。
外部提供するメソッドで使われる潮流は止められないだろうな
引数の解説したマニュアルも平均してわかりにくいしな
重いアロケーションはは最初だけで、以降は書きかえだけにするとかC書いてたときはよくつかってた
rubyのこういう例でも同じようにinithialized?とか用意したら
何とかできるんじゃないかな?とか素人の意見ですがどうでしょう?
だめです
C++いきなりなんてのは、コンパイラのエラーとれなくて厳しすぎる。
いや、俺のような老人だと、Fortran=>C=>C++
ときたんだけど、大規模C++でメモリリークとったりするのにかなり苦労した。
いまみたいにリーク検出してくれるアプリなかったしな。sed, awkでDelete漏れないか
しらべまくるくらいだったわ。
どこからの誤爆?www
俺は、CORBAがらみの大規模で地獄みた口だな。舐めるようにソースみてもエラーの原因わかんねええええ
っていう地獄。
C++の暗黒にはもうもどりたくないぜ。。。
++の暗黒面を見たのか
アナキン君
>>844 >良い子のみんなはキーワード引数をできるだけ使わないようにしようね!
>いやマジで
なんで?
キーワード引数が役に立つのって引数が大量にあるようなメソッドでしょ?
そういうのって設計がおかしいのがほとんど
他にDSLを作るのに役に立つけど、そんなの玄人でも自分で作る人は少ない
キーワード引数を使うのはお客さま用総合メソッドなことが多いな
たくさんメソッドを提供しても仕方あんめー、みたいな感じ
そすね。パラメーターが少ない場合でも、
変な意味でユーザーフレンドリーな関数作ろうと思うと名前付き引数使おうとする
使いたてのうちは覚えやすくていいけど、だんだんその冗長さにイライラしてくる
最近名前付き引数がデフォの言語作って、保守する度にその時の自分の設計を呪っている
{:url => login_uri } って、そりゃ変数見りゃ URL だってわかるわぼけー、みたいな感じ
しかも URI オブジェクト使ってるもんだからうっかり {:uri => login_uri } とか書いて動かない
html tagの属性を指定するとかはキーワード引数でないと
メソッド増え過ぎで破綻しない?
ああいう時は、こういう手があるのかと感心したんだが
それも設計がおかしいんだろうか
どうでもいいッス
>>858 そういうときはハッシュで正解だと思う
htmlの属性は、多くの種類の名前(ほぼ無限)をとりうるわけだから
引数の数が限られている通常のキーワード引数とは質が違うし
ハッシュを使わないとどうにもならない
というか、たぶんそれは「キーワード引数」とは呼ばない
Array#size とかあるよね
ああいうのって毎回数えてる?
内部的に
def size
c = 0
self.each{ c +=1 }
return c
end
とかいうような処理だったりする?
さすがにオブジェクトの状態変化に応じてキャッシュはしてると思う
確かめてはいないが、さすがにその実装は無いと思う
ruby1.9のソースをみるとsizeはlengthへのエイリアスで
lengthは内部に保持されてる長さの値を返すだけだった
キャストとかビットシフトぐらいはしてたけど
関数呼び出しはrb_int2inumぐらいかな
まぁ毎回数えるってことはない
どっちがお得か議論ってあまりRubyでは聞かないよね
変数を含まない固定の正規表現は変数に代入するよりそのまま書いてたほうが効率はいいんだっけ?
866 :
864:2008/08/01(金) 11:20:26
Cの上では可変長配列だから長さが変わる処理がされる度に差分が処理されてる
ary<<objの度に+1されて
ary_a+ary_bだとary_bの長さだけ<<が呼ばれるような感じ
で長さが変わる処理の前後で正しい長さを保持するのは保障されてるから
size(length)で参照するときはその保持している値を返すだけでおkと
CAPAとかあったからC++で言ったらvectorみたいなものかな?
よーわからんが
arr.each do |line|
data << line if /hogehogehoge/ =~ line
end
にするか
re = /hogehogehoge/
arr.each do |line|
data << line if re =~ line
end
にするかって話?
>>866 > ary<<objの度に+1
うん、そんな賢い感じのイメージでいいと思う
Cレベルではあまり潔癖なことはしてない印象
>>867 前者のほうがわずかに速いとか聞いた
>>865 アカデミックな興味はあるかも知れんが、そういうレベルの効率を
気にする状況ではあまり Ruby なんて使わないんじゃない?
自分で coding しやすい方を選ぶだけでは。少なくとも俺はそうする。
ものすごく違うとか、ファイルやメモリのアクセス頻度が変わるとかなら興味ある
ハッシュのキーはシンボルにすると速いんだぜ~というレベルの話なら興味ない
ブロック外の変数を参照すると外部のオブジェクトのリストも辿っていく必要があるからじゃないのかな
ブロック内の埋め込みの値ってそのブロック内だけの木辿れば参照できるし
ループ回数が多くなってくるとその差*ループ回数分の差がでてくるのは予想できる
でも大した差はでないでしょう
なーなー、PStore の
・ 存在しないキーを参照したら nil
・ 存在しないファイルを指定しても nil
という変な仕様に文句を言うやつはおらんかったんか?
なぜに?
どの辺が「変な仕様」なのか詳しく
ファイルが存在しないなら ENOENT 投げて欲しいんだろ
21世紀にもなってユーザーレベルで goto 文の変種使って喜んでる奴は臭いから寄るな
まずは
>>872が思う「まっとうな仕様」を聞かせてもらおうか。
ちなみに
>>872の前者はPStore#fetchを使えばいい。
PStoreはHashに合わせているから連想しやすいと思う。
pstoreを使う方が間違い
MatzはCとelispが大好きなオールドハッカーだから、そういう仕様なんだろう。
仕様が文書化されてない永続化形式は使っちゃダメ。
YamlとかXMLとか使っときなさい。それが嫌ならplain textのほうがまだマシ
仕様が文書化されてない!出た!非文書化出た!得意技!仕様の話出た!仕様なし!これ!使用文書化なし出たよ~~!
>>877 話題がズレてるぞ
>>873の言ってるのはあくまで「PStoreの」仕様であって、Marshalの仕様ではない
「emptyではない」という長文の比較条件を読みやすく書く方法ないかなあ
if !hoge.data.hage.pick.result.empty? then ...
みたいに長いとの先頭の ! が微妙に読み下しにくい
if hoge.data.hage.pick.result.empty? == false then ...
と
if !hoge.data.hage.pick.result != [] then ...
はどっちがいいかな
unless hoge.data.hage.pick.result.empty?
それとthenてつける人いるのか・・・
>>881 前者と後者で処理が微妙に違うのが気になる。
また、素直に日本語的な語順で「emptyではない」と書きたいなら
if hoge.data.hage.pick.result.empty? != true then ...
じゃない?どうやればあなたが読みやすいのかは知らないけど
>>882のunlessか、もしくはnotでいいんじゃない?
if not hoge.data.hage.pick.result.empty? then ...
unless だな
elsif のとこに入れられないのが難点か
unlessだな。
俺もthenは書きたい派
英語みたいに読み下せるからね
ActiveSupportのblank? は便利だが逆が欲しいと常々思っていたのだが、
最近は blank? の逆の present? というメソッドも出来たらしい。
すみません、rubydbを使用したいのですが、
=> require 'fileutils'
p "hoge"
なんてソースでnextで
p "hoge"に進みたいのですが、
fileutilsのソースに入ってしまいます。
これって仕方ないのでしょうか?
>>889 fileutilsの中身が表示されるけど、次のnではfileutilsを1行ずつ追わずに
p "hoge"の行に来るんじゃない?
891 :
デフォルトの名無しさん:2008/08/02(土) 03:00:58
CGI::Sessionのことで質問なのですが、通常通りセッションを生成して、
次にsession['hoge']を呼び出したり
session['hoge'] = "xxx"とするとエラーになってしまいます。
内容はメソッド[]がない、メソッド[]=がない、というNoMethodErrorです。
環境が少し古く1.8.1なので、書き方が違うのかと思ったんですが
それらしき情報が見あたりません(1.8.7環境では動作しています)
理由のわかる方いますか?
892 :
891:2008/08/02(土) 03:02:12
追記
session.session_idのようなクラスメソッドは大丈夫です。
893 :
デフォルトの名無しさん:2008/08/02(土) 03:33:55
ていうか、その1.8.1は外部に公開するんじゃないだろうな?
パッチあててなくて、セキュリティホール空きまくりとかだったら、答えるに答えられん
session.rb に [] が定義されてないなら使えないんじゃね
俺も then は意図的に書く
まー確かに若干面倒ではあるんだが
>>875 例外頼りのプログラミングってなんか格好悪いよな
1990年代って感じだ
>>891 書き方が違うはずはない(実際、俺は1.8.1でCGI::Sessionを使ったことがある)
おそらく他の箇所に、何かバージョン非互換の書き方があるのだと思われる
これ以上はソースコード見ないと分からん
>>893 レンタルサーバーなら1.8.1が入ってるとかよくある話だよ
>>854 >キーワード引数が役に立つのって引数が大量にあるようなメソッドでしょ?
>そういうのって設計がおかしいのがほとんど
そうなの?
たとえば Rails では ActiveRecord#find とか、あとは render とかもキーワード引数を使いまくっているけど
これって設計がおかしいのかな。
>>854だったらどう設計しなおすの?
Railsのそういうとこは参考にしたらいかんぞ
いちばん妥当なのはデータ用クラスを作ることだろうな
Net::HTTPの返り値がNet::HTTPResponseであるように
あれが {:header=> {...}, :body=>"....", :code=>xxx, ...} というハッシュで返ってきてたらうざい
Rubyにはキーワード引数がなくて単なるハッシュをそれっぽく見せてる
っていう問題があるからなあ。
なるべくならちゃんとRuby世界で意味のあるメソッドとかにしようぜ
↓ここで満を持してStruct厨が登場!
Structはなにやら便利っぽいが最初の指定が小難しくて憶え切れない
というか、Rubyの世界にやってきたJava概念でーすみたいな雰囲気が気に食わない
キーワード引数という言語機能は、エレガントにデザインするのがとても難しい。
あえて「手を出さない」というのもひとつの正解。
>>899 > Railsのそういうとこは参考にしたらいかんぞ
だから、find や render はどういう設計にすべきだったわけ?
それを示してもらわないと、キーワード引数を使わないようにしたくても
どう設計したらいいかわからない。
>>900 >Net::HTTPの返り値がNet::HTTPResponseであるように
今は引数の話をしているんであって、返り値の話をしているんじゃない。
>>905 何が引っ掛かってるのか分からんが、引数も返り値も同じ話だ
データ用のクラス作ればいいのは変わらない
fluent interfaceとか
外部ライブラリのメソッド定義の30行目くらい(つまり、そのクラスとメソッドを上書きするのは面倒)に、
obj = Hoge.new(param1, param2)
という処理があります。
んで、param1 の内容で
「Hogeを継承して改造したHogeA」「同じくHogeB」「元のHoge」
の3つに分岐させたいです。
obj.class の値を利用することはありません。とにかくクラスの動作を切り替えたいです。
ほんとは
obj = Hoge.hogechanger(param1,param2)
と書き換えて
def Hoge.hogechanger(param1, param2)
case param1
when patternA return HogeA.new(param1,param2)
when patternB return HogeB.new(param1,param2)
else return Hoge.new(param1,param2)
end
end
とかすれば一発なんですが、できればこれはやりたくありません。
909 :
891:2008/08/02(土) 17:15:44
>>893-894 >>897 ありがとうございます。参考に調べていったところ、解決できました。
まずかった箇所は、CGI::Sessionとは直接関係ない部分のミスから
結果的にCGI::Sessionのエラーのように見えていた、といった感じでした(言葉足らずですが・・)
セキュリティホールの情報についてもたいへん参考になりました。
いくつかチェックしたところ、パッチは当たってないようなんですが、
商用や個人情報を扱うようなプログラム(セッション)ではないこともあり
スクリプト側で解決できる部分をできるだけカスタマイズして対応してみようと思います。
ありがとうございました。
>>908 class Hoge
class << self ; alias super_new new ; end
def self.new(p1,p2)
return self.super_new(p1,p2) if self != Hoge
case p1
when patA then return HogeA.new(p1,p2)
when patB then return HogeB.new(p1,p2)
else return Hoge.super_new(p1,p2)
end
end
end
こんなやり方もあるけど最後の手段て感じだな
ライブラリ側でHoge.newが書き換えられてたら動作しないだろうし
そのライブラリを良く読めば、別の場所で何とかできる方法が見付かるかも
>>908 >obj.class の値を利用することはありません。
ならこういうのは?
class Hoge
module HogeA; ~; end
module HogeB; ~; end
def initialize(p1,p2)
case p1
when patA then extend HogeA
when patB then extend HogeB
end
end
end
>>906 >何が引っ掛かってるのか分からんが、引数も返り値も同じ話だ
なんで引数と返り値が一緒なのかわからんから、教えてくれ。
ぐぐってもそんな話はでてこなかった。
返り値にキーワードつけるというのからしてわからん。
あと、いいかげん具体例を示してくれよ。データ用のクラスを作ればいいってだけじゃわかるかよ。
こっちはRailsの設計を参考にすることが多いから、find や render がどうよくなるのかを知りたいんだよほんとうに。
>>912 906じゃないが、Javaやったことないの?
あすこにはデータ用クラスなんて腐る程あると思うぞ
>>912 ・メソッドの引数が、キーワード引数的なHashだと使いづらい
・メソッドの返り値が、キーワード引数的なHashだと使いづらい
という話
「返り値にキーワードをつける」に関しては、
>>900にそのものズバリな具体例があるだろ
データ用クラスの作り方に関しては、webrick関連のマニュアルや記事読め
(とくにWEBrick::Request、WEBrick::Responseの周り)
Railsの設計は知らないから他の人に任せる
わざわざ引数に渡すためだけの専用のクラス作るなんて(Rubyでは)愚の骨頂
Hash使え
Javaがまんど臭くてRuby使ってる俺は、
Hashでいいと思う
クラス作ったら仕様考えるのが面倒
Hashなら適当でいい。
だが、何かを犠牲にしてるような気も
>>915 引数に渡すためだけにHashクラスのインスタンスを作ることについて一言
918 :
916:2008/08/03(日) 00:56:51
俺は気にしないな
性能気にするなら別の言語使うし
>>917 引数に渡すためだけにデータ用のクラスのインスタンスを作ることについて一言
データ用インスタンス作るのもnewメソッド呼ぶわけじゃん
そのときの引数はどうするの
>>919-920 その設問には意味がない
スクリプト中でHashのインスタンスを数十個作るのも自作データクラスのインスタンス数十個作るのも
実コスト的にはほとんど変わらないだろ
自作データクラスを使わないのなら、ハッシュも使わないというのが一貫した態度だと思わない?
引数に渡すためだけにデータ用のクラス定義をコーディングすることについて一言
923 :
916:2008/08/03(日) 01:19:31
面胴
>>920 の言いたいのはパホーマンスの件ではなく
キーワード引数(っぽいハッシュ)の対案としてデータ受け渡し用のクラスを作れって話だが
そもそもそのクラスに変数をどうやってセットするのさ?
という事だと思う
object allocation during garbage collection phaseってどうやって対処すればいいのでしょかね
HogeTable.find :all, :conditions=>"name='foo'", :order=>"created_at", :limit=>100
------
option=FindOption.new
option.conditions="name='foo'"
option.order=>"created_at"
option.limit=100
HogeTable.find :all, option
------
HogeTable.find :all, FindOption.new.conditions("name='foo'").order("created_at").limit(100)
------
どれが分かりやすくて憶えることが少ないかという問題でしょう
ん?
wwwget(:url => '
http://~', :header => ['Accept-Language','ja-jp'], redirect => true)
の代わりに
req = WWWRequest.new
req.url = '
http://~'
req.header = ['Accept-Language','ja-jp']
req.redirect = true
wwwget(req)
とか
wwwget(WWWRequest.new{|r|
r.url = '
http://~'
r.header = ['Accept-Language','ja-jp']
r.redirect = true
}
)
とかしようってことだろ?
ってめんどくさいなオイ
引数にHashを使うと、スペルミスがあっても例外を出してくれないのが困る
>>925 1.9ならrb_during_gc()でどうですか。
1.8ならアルゴリズム見直すしか思いつきません悪しからず。
それはそうだな。
まあRubyでスペルミスで例外出すように書いたことないけど
>>926 ああ、なるほど…。3番目の例は思いつかなかったな。
キーワード引数もどきよりは、使いやすそうですね。
>>927 下のnewにブロックを渡せるデータクラスはgemで時々見るな
blockのはありかな
934 :
デフォルトの名無しさん:2008/08/03(日) 05:27:12
引数用のクラスを作ろうってのはよく、リファクタリング系の書籍なんかにも書いてあるけど、
あれはHashがリテラルでかけない言語用の話だからな。
まあ、とはいえ、スペルミスすんのも痛いから、
>>927の一番したのもおもしろいね。
>>926の最後の例は、C++とかで見たことがあったような気がする(boostあたり?)、
何か使っているライブラリとかってあったけ?
>>911 それ、Hoge.new(patA,p2) をしたあとに Hoge.new(patB,p2) がくると
HogeA と HogeB のメソッドがある Hoge クラスになったりしないかね
例外処理について質問です
begin
#ここでuriを開いてhtml取得
rescue
sleep 10
retry
end
上記のような、あるURLのHTMLを取得するプログラムがあります。
もしデータが取得できなかった場合には例外処理の10秒待ってからretryで再取得しています。
これだと、もし相手のデータが取得できない場合永遠とretryし続けてしまうのですが、こういった場合のループを抜ける方法はあるのでしょうか?
breakは使えないようなので困っています
>>937 retryって条件式指定できたよね
回数チェックでもさせればいいんじゃね
> retryって条件式指定できたよね
初耳ニャ…
>>937 Ruby に retry_once とかあればよかったんだけど
uris.each do |uri|
retried = false
begin
#ここでuriを開いてhtml取得
rescue
sleep 10
(retried = true; retry) if retried
end
end
こんな感じ?
>>940 ごめん。
逆だね。if文の実行側にretryだ
942 :
デフォルトの名無しさん:2008/08/03(日) 22:45:06
breakが使えないのはLocalJumpErrorになるからなので、
begin~end以外のブロックまたはメソッドでくるめばいいと思うな。
loop do
begin
# ...
break
rescue
retry
end
end
とか
ageた上にインデントのこと忘れてたorz
ごめんsage
944 :
デフォルトの名無しさん:2008/08/04(月) 11:17:07
>>940 は if じゃなく unless だと思う
retry ループ用変数作るのが普通だな
あまりきれいに見えるやり方じゃないけど
>>944 「最大何回までリトライ」とかいう一般化は普通だし、
あんまり美しさという点では気にならんかな。
ループ回数はデフォルトで覚えててくれると便利かな~という気はする
begin
web_access
rescue
sleep 5
retry(:max => 3)
end
こんな感じ
retry_once は retry(:max => 1) のエイリアス
繰り返す回数なんて管理したくないじゃん?
>>914 >「返り値にキーワードをつける」に関しては、
>>900にそのものズバリな具体例があるだろ
あーわかった。さんくす。そういうことか。
キーワード引数の話をしているのに、説明もなしに返り値の話をしだした900がバカで混乱のもとだったわけだ。
>データ用クラスの作り方に関しては、webrick関連のマニュアルや記事読め
>(とくにWEBrick::Request、WEBrick::Responseの周り)
ソース読んだけど、これがどう参考になるの? ここで出しているんだから、この2つのクラスはキーワード引数と対比できるんだよね?
でも見たところ、WEBRick::HTTPRequestもWEBRick::HTTPResponseも、ごくごく普通のクラスで、キーワード引数とどう対応するのかわからない。
ほんとにわかんないので、おしえてください。この2つのクラスをキーワード引数を使ったメソッドに変換して、そしてキーワード引数使うと何がどうまずいのか教えてください。
>Railsの設計は知らないから他の人に任せる
そんなのfind()とrender()のマニュアルみれば済む話じゃん・・・「Rails render」でぐぐれば一発。
じゃあ render() を 簡略化して考えてみよう。render()が
render(:template=>"weblog/show", :partial=>"person", :text=>"hello world!")
というメソッドだったとして、これもrender()専用に
class RenderOption
attr_accessor :template, :partial, :text
end
というクラスを定義しろということ? これを、キーワード引数をつかうメソッドごとに専用のクラスを用意しろと?
うおー夏だー
誰もお前なんか覚えちゃいねーっつーの
>>926 この3番目の方法ってよさそうにみえるけど、conditions()やorder()やlimit()がselfを返すってこと?
あと attr_accessor :conditions, :order, :limit とかぶってしまうけど、そのへんはどうするの?
>>927 最後のやつは、こういうのはどうだろう?
wwwget(arg) do |r|
r.url = '
http://...'
r.header = ['Acceptt-Language', 'ja-jp']
r.redirect = true
end
つまり wwwget() のなかで、block_given? が true なら r = WWWRequest.new; yield(r) する。
でもまあ、あんまり利点はないな。
キーワード引数のかわりにクラス定義するなら、
>>926の3番目のやつがよさそうだなあ。
でもこういうのって初めて見たけど、けっこう知られているの? これ使っているライブラリとかある?
>>948 うむ
それには大いに全面的賛同はする
>>926のメソッドチェーンのタイプはどっかのgemで見たんだがどこだったかなあ
>>947 自分に理解できない解説をした人をバカ呼ばわりする初心者に教えることはないので
あとは自分で考えてください
「あるクラスの配列」にメソッドをつけるRubyらしい良い方法ってありませんか?
例えば、数値の配列に対して平均値を求めるメソッドを定義したいとします。
解1
def avr(ary); ary.inject(0){|r,v|r+v}.quo(ary.length); end
って作ってもいいのですが、このメソッドを配置する場所がどこでもよくて格好よくない。
解2
class Array
def avr; self.inject(0){|r,v|r+v}.quo(self.length); end
end
自分がやりたいのはこんな雰囲気ですが、
quoなんてダックタイピングしづらいメソッドを含んでるのであまりやりたくない。
解3
class NumericArray < Array
def avr; self.inject(0){|r,v|r+v}.quo(self.length); end
end
これはないだろ、と思いましたが念のためやってみたら中途半端にいい。
tmp = NumericArray.new.push(1,2,3,4,5,6,7,8,9,10)
p tmp.avr
p tmp[0..4].avr
p tmp.map{|v|v+1}.avr
2つ目まで良かったんですが、最後の行でエラーが出るのでやっぱり挫折。
解4
class Array
def to_numeric_array
def self.avr; self.inject(0){|r,v|r+v}.quo(self.length); end
end
end
tmp = [1,2,3,4,5,6,7,8,9,10]
tmp.to_numeric_array
p tmp.avr
インスタンスを作るごとに一手間めんどいのが難点。
皆さんに、俺ならこうするを聞きたいです。
> 数値の配列に対して平均値を求めるメソッド
Array クラスに「あるべきではない」ので、1が答っすかね
self から平均値を計算して返すというのは気持ち悪い
引数でいいじゃん引数で
「すうじのはいったはいれつ」でないと値が不正になるわけだから、
Array を継承かなにかしたクラスを新設すべきと考える
…が、sum メソッドくらいかなあ
算術平均なら Math クラスにくっつけるかもしれない
あるいは NumericArray クラスの特異メソッドにするかも
「あるクラスの配列」というのがよくわからん
実際は Hoge#data の返り値が配列で、その平均をメソッドチェーンで取得したいとかそんなとこか?
957 :
953:2008/08/04(月) 23:52:01
>>956 わかりやすいため数値にしてますが、
本当は自分で作ったFooオブジェクトの配列なんです。
だからといって
module FooUtil; ... ; end
なんてのもJava臭くて嫌だなあと思うわけです。
言葉を正確に使えない子は没落するぞ
・Arrayを継承したクラスFooである
・クラスFooの属性(インスタンス変数等)にArrayが入ってる
どっちよ
後者ならave_dataメソッドとか作るだけだし、前者じゃね?
Arrayにメソッド追加するのは気分的にありえないなあ
Arrayを継承したデータクラスを作って
class FooData < Array
def sum; self.inject(0){|r,e| r += e} ;end
def ave; sum.to_f/size; end
end
かな
>>958 すいません、日頃からよく言われてますorz
「クラスFooのインスタンスの配列」というものについての話です。
Javaが動的言語だったら ArrayList<Foo> にメソッドをひっつけてやるんだが。という。
> クラスFooのインスタンスの配列
余計わかりにくくなったので寝る
やっとわかった
foo1 = Foo.new
foo2 = Foo.new
foo3 = Foo.new
foo4 = Foo.new
arr = [foo1, foo2, foo3, foo4]
で、arr に対して平均を取りたいと
Foo は関係ないな
どうしても Foo に入れたいなら配列受け取って平均返す特異メソッドにすると思う
Foo の下に Array 継承した Data クラス作るかもしれない
その場合は3だな
俺は1だけど
配列の平均は配列と関係ないと感じる
>>949>>950 sequel とかそんな感じかも。っていうか limit だの order_by だのはそのものがある。
texts = TextItem.order_by(:ctime.desc).limit(n)
とか書ける。適当に雰囲気は察してくれ。
>>952-953 俺なら解2を少しいじってこうするな
class Array
def avr; self.inject{|r,v|r+v} / self.length; end
end
place = []
File.open("place.csv").each{|line|
place << line.split(",")
}
こうしたeach文で読み込んだfileの行数を数えるのにはどうすばいいですか?
後から
p File.read("place.csv").count("\n")
とやると時間がかかりそうなので配列にいれるときに数えたいのですが
place.sizeじゃだめなん?
968 :
966:2008/08/05(火) 08:57:57
>>967 できました!sizeって行にも使えるんですね。
知りませんでした。ありがとうございます。
というか普通に下のようにやれば数えられますね。
すみませんでした。
i=0
place = []
File.open("place.csv").each{|line|
place << line.split(",")
i=i+1
}
969 :
937:2008/08/05(火) 11:50:10
>>937で例外retryについて質問した者です。
以下のようにretry用の変数を使う形で落ち着きました。
皆さんアドバイスありがとうございます!
def get_url
i = 0 #retryループ用の変数
begin
#open_urit処理
i += 1
rescue
sleep 10
retry if i < 4 #3回まではやり直す
end
end
それだと i が加算されるのは open_uri の処理が正常終了して次の行に移ったときだけだぞ
例外が起きたときの回数を憶えていてほしいわけだから、 i の加算は rescue の中に書く
あと open_uri のタイムアウトは引数なし rescue では捕捉できないから rescue Timeout::Error とか明示的に書いとけ
> sizeって行にも使えるんですね
そんなもんはない
単なる配列
ファイルの中の長い1行がびろーんと配列の要素の中に入ってるイメージをしろ
短冊をずらっと吊るすようなもんだ
まあ本当は配列の中には何もモノは入ってないんだけどな
あまりにイディオム過ぎて配列とかには見えないんだろうな
気持ちはよくわかる
973 :
966:2008/08/05(火) 20:49:57
>>971 なるほど。
なんとなくfile.sizeだと列数が返ってくるとおもってましたがファイル全体を見るんですもんね。
>まあ本当は配列の中には何もモノは入ってないんだけどな
というのは?ファイルの中身が入っているのでは?
>>974 あと十回は提示した・されたコードを読んだ方がいいと思った
イメージするのも善し悪しだが、
箱が並んで短冊が入っているというイメージよりは、
箱は並んでいるがそこから短冊がぶら下がっているイメージ。
箱の中には短冊を結んだ糸がくっついてる。
977 :
966:2008/08/05(火) 21:42:31
>>974 そうですね。勘違いしてました。すみません
file.sizeじゃなくて配列.sizeですね。
皆さんご意見ありがとう。
やっぱり無難に解1派が多いんですね。
Rubyだと何か面白い定番な書き方があるんじゃないかと期待してみましたが…。
次点で解3系でしょうか、意味的には自然ですし。
ただ、Enumerableのメソッドを使うにあたっていい書き方がないんですよね。
NumericArray.new(tmp.map{|v|v+1}).avr
みたいに書くしかないんでしょうか?
何かいい案があればお願いします。
>>978 「平均値を求める」ならふつーavgだろ、てのは置いておいて
平均値は同種の複数の値から求めるものだから対象は配列でいいと思うけど
要素によって平均値の求め方は違うからArrayにもEnumerableにも実装できない
個人的見解では解1、2は問題ないが解3、4はありえない
解1は無問題
解2は要素が異なれば例外が発生するので問題なし(これがダックタイピングだろ?)
解3の問題点
3.1 Fooの様なクラスを定義する度にArrayのサブクラスを作るなんて馬鹿げてる
3.2 Arrayを返すメソッドを全て上書き(サブクラスを返す)しないと期待した動作をしない
解4の問題点
4.1 美しくない。avgを実装したモジュールをextendするほうがマシ
4.2 3.2 と同じ問題
そんなおれが実装するなら Foo.avg(arr)
自分しか使わないアプリなら俺の場合こうするかな。
class Array
def avg_by
self.inject(0){|sum,e| sum + yield(e) } / self.length
end
end
p [Foo.new(12), Foo.new(23)].avg_by{|e| e.foo }
他人が使うライブラリだったり吹く数人での開発の場合は
>>959 と同じだな。
>>980 ところで、yield の引数の括弧をなくすとエラーになるのはなんで?
> ruby -v a.rb
ruby 1.8.6 (2007-03-13 patchlevel 0) [i386-mswin32]
a.rb:10: syntax error, unexpected tIDENTIFIER, expecting '}'
self.inject(0){|sum,e| sum + yield e } / self.length
>>982 おk
>>382 でテンプレのアップデートしようぜって話があるんだが、
>>1 で直すべきとこってある?
1.8.7 に更新しようかと思ったけど、[ruby-dev:35440] でメンテナが
「ぜひ試してみてください」レベルとか行ってて初心者スレで進めていいのか
不安になる。
どっちかというと初心者レベルの方が1.8.7は安全だろう。あ、Rails使いは別として。
>>949 > これ使っているライブラリとかある?
ActiveRecord 2.1 の named_scope
>>981 > ところで、yield の引数の括弧をなくすとエラーになるのはなんで?
カッコがない引数は優先順位が低いから、
(sum + yield) e とみなされてしまう。