プログラミング言語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を読め」でいいので、叩かない&怖がらせない。
・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
2 :
デフォルトの名無しさん :2008/04/14(月) 00:26:55
プログラミング言語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を読め」でいいので、叩かない&怖がらせない。
・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
乙乙
Otz
これでテンプレ全部。
>>1 と
>>2 が恐ろしいほど瓜二つなのはるびま添削本の呪い。
文字列リテラルの説明で > 空白を間に挟んだ文字列リテラルは、コンパイル時に1つの文字列リテラルと見倣されます。 とあったので C の文字列の要領で print("foo" "bar") とやったら syntax error になってしまいました。 この場合の「空白」には改行などは含まれていないということだと思いますが、 これって何でなんでしょうか? 改行も仲間に入れてあげても別にバチは当たらないと思うのですが。
>>11 それは実装に対する苦言?それとも、どうやったらいいか聞いてる?
前者なら、Rubyの本スレで言ってほしい。
後者なら、
print("foo" +
"bar")
でOK
というか、そもそもの問題としてそれに頼ったコードは書かないで欲しい 明示的に連結しとけ
改行があるなら \ でエスケープするのが常道 print 'foo' \ 'bar' \ 'baz' print 限定で出力フィールドセパレータの $, 依存だが コンマで区切っても単純に連結されたような見掛けで出力される print 'foo', 'bar', 'baz'
>>11 えー、それだと逆にめんどくさいじゃん
def gethoge
@str = 'foo'
'hoge'
end
って書いたら @str も gethoge の返り値も foohoge になるぞ
>>12 >>14 質問が悪くてすみません、 folding して書きたいというのではなくて、
「前者」で経緯というか理由が知りたかったです。
ので改めて本スレで聞いてみます。
>>13 頼ると何かまずいですかね?
>>15 私の print の例の方は、括弧で括ってるのでちょっと違うような気がします。
と思って試してみたら、
def gethoge
@str = ('foo'
'hoge')
end
これだと gethoge の返り値は "hoge" になるんですね。
うーむ。
いや、() の有無なんて関係ない 要望は「改行を挟んだ2つの文字リテラルは連結されて解釈されて欲しい」ということだろ そもそもの前提だって 「空白を挟んだ(あるいは挟まない)2つの文字リテラルは連結されて解釈される」 ということだ irb> 'a' 'b' "ab" irb> 'a''b' "ab" irb> eval("'a'\t'b'") "ab" あと、その gethoge の () は2つの式がグルーピングされてるだけだ 機械的に最後の式の 'hoge' が評価されてるだけに過ぎない def gethoge @str = ('foo'; 'hoge') end と全く同じこと
改行で式が繋がるのは上の方に書いてある通りで、リテラルはその対象じゃないと 括弧の有無だけでは、中の式までは面倒みませんってことかな
いや、コンパイル時にどう扱われるかだけの問題だから… 'a' 'b' 'c' と書いてあったなら、それは 'abc' と書いてあるものとみなされて String オブジェクトになる
20 :
11 :2008/04/14(月) 17:29:05
うーん、どうも私がリファレンスマニュアルを読み違えてるだけな気がしてきました。 「字句構造」のところには > 空白文字とはスペース、タブ、垂直タブ、バックスペース、キャリッジリターン、 > ラインフィード、改ページです。 とありますが、以降の記述では、 「空白」「空白文字」が文脈によって改行を含んだり含まなかったりするんですね。 読解力が無くてすみません。
そのあとに改行についての記述があるだろ Rubyにおける空白文字は改行を「含まない」 空白文字の中でホワイトスペースの代わりに使うと動作が変わるものが入ってなくもない気はするが(LFは怪しい) とりあえず、基本的に「改行は空白文字ではない」
22 :
11 :2008/04/14(月) 17:57:39
なるほど。
どうやら私の誤解はその改行についての記述の中の
「行が明らかに次の行に継続する時」の認識間違いから来ているようです。
print('hoge'
'fuga')
は、私には「行が明らかに次の行に継続」しているように見えていたのですが、
>>17 で指摘いただいたように、括弧には行を継続するような機能は無かったと。
わかりました。
行末にあるものが、文末になりえない演算子とかなら、って意味ですねそれはだいたい
24 :
11 :2008/04/14(月) 18:08:54
25 :
デフォルトの名無しさん :2008/04/14(月) 21:54:40
クラスの中で必要とする他パッケージはどこでrequireするのがいいですか? 使う直前、コンストラクタ内、クラス定義の外など 考えられるかと思いますが
基本は「最初のファイル」の先頭だと思われる #!/usr/bin/ruby -Ku require 'open-uri' require 'kconv' require 'myapplib/config.rb' require 'myapplib/myapp.rb' require 'myapplib/parser.rb' require 'myapplib/rss.rb' MyApp.new.run こんな感じ 「require するだけで大量のファイルが読み込まれて処理が一瞬止まる」とか 「エラーが起きたときのような時しか使わないライブラリ」 のような場合は、メソッドの中で require することはある その場合もソースファイルの先頭のどこかにコメントとして書いておくと親切
なるほど 必要なパッケージを明示するということですね ありがとうございました
autoloadっつー便利なものもあるぜ
autoload は概念は便利だが実際には注意深く使わないといけないので微妙に面倒
指定されたファイルに存在する全てのファイルのクラスとモジュールを精査して 自動で全てを autoload する auto_require というのを作ってみるというのはどうだろう
>>30 requireするファイル名とクラス名に一定のルールを課すならできなくもない。
ActiveSupportにあるね。
32 :
デフォルトの名無しさん :2008/04/14(月) 22:47:17
Rubyには名前付き引数はないみたいですが どう実現するのがスマートでしょうか?
def moge(x, y, options={}) ... end のように最後に省略可能なハッシュを引数にとるようにし、 呼び出すときは moge(100, 200, :foo => 0, :bar => 1) のようにシンボルを使う。 1.9だとこれを foo(100, 200, foo: 0, bar: 1) とも書ける。 fooの定義ではoptions[:foo]などとして参照する。
fooじゃないmogeの定義
>>33 ありがとうございます
わりと自然な形で書けるんですね
言うほど自然でもないようにも思う まあ、RoR以外のRubyではそれほど一般的ではない あまり使わず紛らわしいオプションをユーザーに記述させたいときとかだな
なんか馬鹿ばっかだな ソース読んでる?MLとか見てる?
38 :
デフォルトの名無しさん :2008/04/15(火) 00:03:32
オブジェクトの中から、自分のクラス名を取得するにはどうしたらいいですか?
self.class.to_s
self.class.name
>>36 RoR系統儀とgems系統を引いたら現状のRubyはほとんど残らんと思う
どっちかに依存してると思うぞ
添付ライブラリだけの「ぴゅあ」なRubyでスクリプト作ってる人はそう多くないはず
「blank?が公式に載ってないのでおかしいと思ったらこれActiveSupportなのね」 という内容のブログの投稿が普通にある時代だからなあ
>>32 どちらかといえば、名前付き引数を使わないのが一番スマート
引数が複雑になりそうならこういうやり方もある
Foo.new(x, y) do |foo|
foo.target = './dest/'
foo.index = 10
end
この方法の利点は
Fooに存在しない名前のパラメータを設定しようとしたとき、即座にエラーを出してくれること
>>36 ハッシュで名前付き引数を渡すのは、RoR以前から広まってたぞ
RoRな人たちに多用というか乱用されてる感はなくもないな
47 :
11 :2008/04/15(火) 13:29:46
なんかタイムリーな話題が ruby-dev に出ちゃっているようなのですが、 件の改行の制限は、設計方針的なものというよりも、 yacc (というか LALR(1) ?) の制限によるものなんでしょうかね。 これで私が当初からもやもやしていた疑問が大体解けた気がします。
「それだと正確にパースするのめんどいから」というのに類する問題っぽいのは かなり自明だと思ってたんだがそうでもないんか
拡張モジュールをデバッグするために、-g をつけてコンパイル したんですけど、Ruby 本体も -g をつけてコンパイルしなきゃ いけませんか。 初心者でごめん。
53 :
11 :2008/04/15(火) 17:51:13
>>48 一連のレスの中でそう指摘してくださったのは
>>48 さんが初めてだと思いますので、
自明というわけでもないのではないでしょうか?
当たり前のことは誰も説明しない、というそれだけの話かもしれない。
55 :
11 :2008/04/15(火) 18:20:04
うーん、当り前の話でしたか・・・ まああまりこれ以上引っ張るネタでもなさそうですし、 私も今は、世界のナベアツ Golf の方に興味が行っていますので、このへんで。
56 :
デフォルトの名無しさん :2008/04/15(火) 19:27:40
指定したハッシュのキーがあればその値、 なければ指定した値を取り出すための もっとも短い書き方を教えてください 今は hoge = moge.has_key?(key_name) ? moge[key_name]:default_value と書いていますがmogeとkey_nameが重複していて気になります
hoge = moge[key_name]||default_value とか?値が nil にも対応しないといけないんだとダメだけど。
hoge = moge.fetch(key_name, default_value )
h = Hash.new(default_value) じゃだめかな
>>57-59 ありがとうございました
fetchがそのためのものですね
61 :
デフォルトの名無しさん :2008/04/15(火) 22:09:41
Rubyの流儀ではファイルとクラスの関係はどうですか? 他言語では一ファイル一クラスが多いようですが
>>52 拡張ライブラリだけ-gついてりゃ大丈夫
デバッグ情報付きのrubyがあればあったでいいとは思うけど
64 :
デフォルトの名無しさん :2008/04/15(火) 23:40:04
コンストラクタでsyslogを開いてログを取ってるのですが デストラクタがないためcloseする場所がないです。 どうするのがペターでしょうか?
明示的にcloseを外にさらけ出すとか、 ブロック構文にしてyieldからもどってきたらcloseするとか、 define_finalizerしといて適切にGC.Collectしてねと言い捨てるか。
>>65 ありがとうございます
define_finalizerってやつ使うか…と思っていたのですが
syslogは複数ハンドルオープンできないんですね
コンストラクタで開いて開きっぱなしにする方法がそもそもマズいのでは
と思い直し
書く時だけオープンしてすぐ閉じるようにしました
69 :
デフォルトの名無しさん :2008/04/16(水) 03:16:58
正規表現を使ったディレクトリの再帰コピーってどうしたらいいですか? Dir.globはワイルドカードしか使えないので困ってます
再帰関数作ればいい。
Dir.glob("**/*")の戻り配列をgrepして処理すれば。 あ、再帰じゃねーや(w
>>69 1. FileUtils.cp_r を参考にする
2. Find.find {|path| do_somthing_with(path)}
3. Dir.open {|dir| dir.each {|entry| do_somthig_with(entry)}}
……こんなもん?
0001.gif 0002.gif を 179.gif 180.gif に変換したいのですが。。 ぐぐって参考にしたのですがあってますか? require 'fileutils' $name = ARGV.shift $ext = ".gif" i = 0 ARGV.each do |file| i = i + 179 $newname = $name + sprintf("&03d", i) + $ext print "renaming " + file + " ---> " print $newname + "\n" FileUtils.mv(file, $newname) end
>>73 require 'fileutils'
ARGV.each do |before|
# 0001.gif から拡張子 .gif を取り出す
ext = File.extname(before)
# 0001.gif からディレクトリ名を取り出す(無いので ./)
dirname = File.dirname(before)
# 0001.gif から拡張子抜きファイル名 0001 を取り出す
basename = File.basename(before,ext)
# 0001という文字列を数字にして178を足して0詰め数字3文字に
after_basename = sprintf("%03d", basename.to_i + 178)
# ディレクトリ名+数字3文字+拡張子 というファイル名に合成
after = File.join(dirname, after_basename + ext)
# リネームしまーす
puts "renaming: #{before} -> #{after}"
FileUtils.mv(before, after)
end
# 実行結果
~$ ruby rename.rb 0001.gif 0002.gif
renaming: 0001.gif -> ./179.gif
renaming: 0002.gif -> ./180.gif
で、
# 0001という文字列を数字にして178を足して0詰め数字3文字に
after_basename = sprintf("%03d", basename.to_i + 178)
のとこだけど、178を足してる時点で数字3文字になることはほぼ確定なんで、イマイチよくわからん
もし、0900.gif が 1078.gif にリネームされてもOKなのなら、単に
after_basename = (basename.to_i + 178).to_s
とでもしてくれ
>>74 のままでも4桁動くから使用上は問題ないけどな
あと、フルパスや相対パスを引数にしてもそのディレクトリでリネームされるのでよろしく
ありがとう>< 0001.gifから0200.gifまでとかだと どうするとよいですか!? 0詰めは、100以下のときだけですね^^;
適切なファイル名を200個作って引数を200個渡す 以上 どこにどんなファイルがあるか知らんのでこれ以上はどうにもならん 汎用的な条件つけて頼めばもう一回くらいは誰か作ってくれるかも 引数として指定されたディレクトリのファイルを全てリネームするとか
78 :
デフォルトの名無しさん :2008/04/16(水) 20:46:32
シェル呼び出しの時間を計るにはどうしたらいいですか? Benchmark.measure { `sleep 10` } これだと何故か実行時間が0になってしまうのです
その間自プロセスはwaitしてるだけだから時間が掛かってないってことだよね。 tms = Benchmark.measure { `sleep 10` } tms.real #=> 10.0072751045227 あと、``は結果を文字列で得たいときに使うものだから、system 'sleep 10' のほうが行儀がよいと思う。
ていうか irb> Benchmark.measure { `sleep 10` } #<Benchmark::Tms:0x401fae88 @utime=0.0, @cstime=0.0, @total=0.01, @cutime=0.01, @label="", @stime=0.0, @real=10.0146338939667> これは妥当だと思うんだけど というか user time や system time の違いってわかってもらえてるのかな
「たぶんtotalだけみとけばいいんだな」くらいの理解だと思われる。
>>76 ruby 連番 rename あたりでググると吉。
84 :
デフォルトの名無しさん :2008/04/17(木) 05:28:30
Rubyってタイプヒンティングやインターフェイスがないですが 引数にある型のオブジェクトが欲しい場合、 どうするのが普通ですか?
>>84 お好きなのをどうぞ
* ダックタイピングを実践する
* 自分で引数を解析し例外送出などの処理を記述する
* Sapphireがリリースされるのを待つ
* いつかrubyに実装されるのを待つ
* PHPを使い続ける
86 :
デフォルトの名無しさん :2008/04/17(木) 07:26:32
プログラミングRubyのダックタイピングの項を読み直してみました ダックタイピングというのは 引数リストでフィルタせず、メソッドがあるものと前提して呼び出し、 ないときには発生する例外によってコーディングの間違いを知る といったスタイルですね 基本ダックタイピングで、 厳格にしたいケースではメソッドの有無をたしかめる といったあたりが現実的なところでしょうか・・
87 :
デフォルトの名無しさん :2008/04/17(木) 07:46:22
テンプレートメソッドを 継承でするか、mixinでするかの判断基準は 何でしょうか?
>>83 試してみるといい
まあ、Mechanizeしたいと考えるようなページなんて大体決まってるってことなんだろうな
引っかからない人は全く引っかからないバグだ、これ
>>87 勘
いやマジで
どっちも「使ったから便利明快になる」というものではない
(サンプルコードでは明快だけどな)
継承を試してわけわかめだったらmix-in用に思考を切り替えるのが一般的かもしれん
どんだけ注意深く作る(作らなければならない)かの話だな private を書くかどうかに似た話
privateとか何のためにあんの? 使わないメソッドなんて使わないんじゃね?
>>92 うん、まあ、君の感覚はある意味正しい
ある一定規模未満の素朴なプログラムでは単にめんどくさいだけとも言える
「グローバル変数が危険とか言うけど変数の場所とか名前とか被らないようにしておけば問題なくね?」
という問題と根っこは一緒だ
>>77 *.gifとかならできそうですかね。ありがとうございました!
95 :
デフォルトの名無しさん :2008/04/17(木) 17:18:11
引数を()で囲まない Class.method arg という書き方をした時に、 「この書き方は今後のRubyではサポートしない可能性がある」というような 警告が出る時と出ない時がありますが これはどういう時に出るのですか?
>>96 ありがとうございます
マッツの設計思想はわかりますが
引数が一つの時は()書きたくないですね
この警告抑制したりできるのでしょうか
ruby -W1 hoge.rb もしかしたら W0 でないとダメかもしれん
99 :
デフォルトの名無しさん :2008/04/17(木) 18:54:52
eachのブロックの中からループのカウント数を知る方法があれば教えて下さい。
つ each_with_index
101 :
デフォルトの名無しさん :2008/04/17(木) 19:05:36
数値をゼロパディングする方法は printf("%010",NUM) 以外にないですか?
number.to_s.rjust(width, "0")
>>100 こんな便利なものが
ありがとうございました
104 :
デフォルトの名無しさん :2008/04/17(木) 20:24:07
文法的なエラー、 たとえばendが足りなかったりすると ファイルの最後の行を指示してエラーが出たりします。 変更箇所が多かった場合、どこで間違えたか分かりにくいです。 どこで間違えているかすぐにわかる方法があれば教えて下さい。
ruby/sdlをつかってプログラムを作ろうと思っているのですが 常に最前面に表示し続けることは可能でしょうか?
106 :
デフォルトの名無しさん :2008/04/17(木) 21:02:48
>>104 ブロックの開始と終了の知識を確実にした上で、
ブロックをインデントしてくれるエディタを使う
インデントが大きくなるべきでないところで大きくなってるところがあれば
そこが閉じ忘れ
同様に "" や '' や () の対応を表示してくれる(色分けしてくれる)エディタを使うと
多くの場合「閉じ忘れ」がすぐ見つかるというか閉じ忘れることがない
あと ruby -c ./hoge.rb とすると文法チェックだけをしてくれる
自信ないなら中規模な変更ごとにチェックしてもらうといい
>>107 エディタのインデントは完全ではないから、ちょっと複雑になるとあてにならないよ。
Rubyの文法は複雑だから、エディタごときが完全にパースできるわけではない。
だからエディタに任せてもendの閉じ忘れは検出できないことがよくある
110 :
デフォルトの名無しさん :2008/04/17(木) 22:15:27
>>104 ・classやmoduleの閉じ忘れ
最初に書け。
・defとかその中のifとかの閉じ忘れ
メソッドでけぇ。
対処法にあんまなってないけど考え方としてはこんな感じかなぁ。
>>109 出たな100パーセント厨
口癖は「それは完全ではない」
90パーセントの達成度の価値を認めない人間だ
90パーセントかどうかはともかく、8割くらいはエディタの自動インデントで見つかるよな エディタとして何を使ってるかとRuby編集モードの出来に依存するのが難点か Emacsのruby-modeはわりと優秀
>>113 これよくないですか?
なんで本体に取り込まれないんだろう
parse.yをいじるからじゃないの。 Ruby2.0あたりではyacc捨てたいねえとか言う話もあったんじゃなかったっけ。
>>113 どうでもいいが、ページの上にある「Abount」に吹いた。
117 :
デフォルトの名無しさん :2008/04/18(金) 02:43:58
プログラミングRubyに ブロックの記述は、一行の場合は{} 二行以上の場合はdo〜endを使うのが Rubyコミュニティーのコンセンサスだと書いてありましたが ブロックは複数行になる場合も{}の方が視認性よくないですか? すべてendだと、何を閉じるものなのか、頭を見ないと分かりませんが、 {}だと、閉じカッコを見るだけで 何を閉じているのかがだいたい推測つきますし。 endにする合理的理由ってあるのでしょうか?
主観的な問題
・whileやifとの統一性
・だいたいソースは上から読む>何を閉じるものなのか、頭を見ないと分かりません
・Hashリテラルだって}で閉じるし、%{...}文字列リテラルなんかもある
でも結局は
>>118 か。
end地獄が大嫌いだからdo〜endなんか絶対に使わない
121 :
デフォルトの名無しさん :2008/04/18(金) 06:09:35
ってか、 そもそもなんでendなの? 文と紛らわしいしタイプも面倒くさい。 Rubyの最大の欠点がend。
}地獄が大嫌いだから(複数行で){}なんか絶対に使わない
>>121 主観的な問題
主観で片付けるのはおかしいよ 文と紛らわしいのも、タイプ数が多いのも 定量的な問題じゃん 理性的な判断を下せる範疇にあるはずだよ
end end end end end end
主観的な問題でないのなら なぜ「do〜end超読みやすい! すっきりする」って人と 「do〜end読みにくい上に紛らわしすぎ」って人とに分かれるんだ
だって引数の記述と通常の文との違いを明確にしたいmatzだよ その認識の延長線上には、文と紛らわしいendの否定があるはずなんだよ endをすぐに完全に廃止しろとは言わない 試しに{}も許容するようにしたらいいんだよ コストはそんなに高くないだろう その小さな変化は きっと世界中の開発者に歓迎されると思うよ。
・yaccの能力で、beginとcaseの文法が上手く纏められなかった ・endを使うとruby-mode.elが書けそうだった こんな理由じゃなかったっけ。 ifやwhileのこと? >試しに{}も許容するようにしたらいいんだよ
128 :
デフォルトの名無しさん :2008/04/18(金) 09:04:24
endでいいと思うけど、emacsとかで 対応するclass,def,if,forにジャンプする 機能って無いですよね?
>>128 あるなら俺も使いたい。
{} の方ならこれでジャンプできるけどな。
ttp://www.bookshelf.jp/soft/meadow_42.html#SEC635 ;; By an unknown contributor
(defun match-paren (arg)
"Go to the matching paren if on a paren; otherwise insert %."
(interactive "p")
(cond ((looking-at "\\s\(") (forward-list 1) (backward-char 1))
((looking-at "\\s\)") (forward-char 1) (backward-list 1))
(t (self-insert-command (or arg 1)))))
(global-set-key "%" 'go-to-paren)
M-x ruby-beginning-of-block
あ、
>>130 は「このブロックの最初」にカーソルを移動な
カーソル移動がめどいという場合には妥当な機能
ああ、キー操作あった C-M-p ちなみに {} のブロックでも有効 ただ、厳密には「インデントつける」計算上のブロックの最初に移動する だから、 File.open('hoge.txt'){|f| f.puts data } の場合は { ではなく File の F に移動する File.open('hoge.txt'){|f| f.puts data } の場合は検知できなくて、「ひとつ上」のブロックの最初に移動する
end は予約語だから、Rubyスクリプトを読んでるという頭の中では何かと間違えることはないなあ (むしろ bashスクリプトで doneではなく endと書いて動作不良に首を傾げる) 慣れと主観っちゃそのとおりだがそれはそれで台無しな意見だ(w 素直に着色なエディタを使うというのはどうだろう
134 :
デフォルトの名無しさん :2008/04/18(金) 17:11:08
モジュールの中で、 自分を読み込むクラスに実装を期待するメソッドを定義あるいは明示するには どうしたらいいですか?
まにゅあるに「hogeとhageはつくってね」とかく
え・・ Javaでいうabstractみたいな方法はないのでしょうか
def hoge raise "override me!" end
実行中にメソッドを追加したり削除したりできるRubyではそもそも無理 別途ユニットテストとかでソースコード自体を検査させるべき
結局実行時だけど、自分はこうしてる def foo bar end private def bar raise NotImplementedError end
モルボル教だかのお布施額がアップしたんだろ
def SomeModule.included(klass) raise unless klass.method_defined?(:foo) end とかやればいいんじゃね?
144 :
デフォルトの名無しさん :2008/04/18(金) 19:20:54
実行時にエラーが出るというのは致命的 実際にそのメソッドが使われないと、未定義かどうかのエラーが出ないんだからね それこそ、めったに起きないエラー処理のメソッドだった場合は、 まともに動作して安心してた頃になって致命的なことになる ソフトウェアテストでチェックすることをお勧めするよ
146 :
105 :2008/04/18(金) 19:26:28
>>140 翻訳が変わってるのがすごく気になるな・・
rubyはスペルミスがあってもそのまま動きますから、小さいことは気にしませんw
>>147 同じく
クイープの翻訳は最近アテにならないからなあ
Ruby初心者ですアドバイスよろしくお願いします。 .txtファイルに書かれた半角スペースで区切られた単語郡を それぞれ配列に格納するスマートな方法があればお教えいただけないでしょうか。 汎用性を持たすために、ファイルの読み込みは ruby test.rb < gomi.txt にしたいです。 windowsXP ruby1.8.6
つsplit
a bb ccc dddd eeeee ffffff ggggggg というようなテキストだと仮定 「それぞれ」という言葉から、1行目の配列と2行目の配列は別だと推測 ruby test.rb < hoge.txt でも ruby test.rb hoge.txt でも動作する # 配列を格納する配列 all_arr = Array.new # readlines は 引数のファイル、無ければ標準入力から読み込んで各行を配列にして返す readlines.each do |line| # chomp で line を区切って配列にする # 区切る"文字"は 正規表現の / / にマッチするものつまり半角スペース1個 arr = line.chomp.split(/ /) # push メソッドで arr を all_arr の要素の末尾に追加する # all_arr を「長くする」のではないことに注意 all_arr.push(arr) end # all_arr の中身を表示 p all_arr
153 :
150 :2008/04/19(土) 01:40:27
150です。早々の回答を有難うございました>151,152 二次元配列のような形にしたかったので、152さんのおっしゃるとおりです。 配列の値をActiveRecordでsqlに挿入しようと思っていました。 本当に助かりました、有難うございました。
スキルレベルの微妙なちぐはぐさ加減が怖い
155 :
デフォルトの名無しさん :2008/04/19(土) 06:21:48
emacsをruby-modeで使っています この環境で定義済みクラスやメソッドのリストを見たり、 定義済みのメソッドを自動補完させたりすることは出来ますか?
156 :
デフォルトの名無しさん :2008/04/19(土) 18:18:04
mixinとコンポジットの使いわけがよく分かりません mixinがないほとんどの言語では、mixin的なことはコンポジットで実現しますよね どういう時にmixinを使うんですか?
mixin は mixin 先の実装に依存した実装を追加したい時に使う。
158 :
デフォルトの名無しさん :2008/04/19(土) 19:44:38
ファイルパスから親ディレクトリを取得するにはどうしたらいいですか?
>>158 File.dirname(file_name)
160 :
158 :2008/04/19(土) 20:01:35
DirとかFileUtilsばかり見てました ありがとうございます
161 :
デフォルトの名無しさん :2008/04/19(土) 20:05:51
ライブラリのクラスメソッドを使う場合に それを後に書く方法があれば教えてください たとえば File.dirname 'hogehoge' を 'hogehoge'.(File.dirname) みたいな形で書きたいんです
どっかでそんな後置の言語を見た気がする 仮にRubyで実現するとしても、それを繋ぐのは . ではないだろうな
気持ち悪いと思わないなら class String def dirname File.dirname(self) end end あとはpathnameというライブラリもある。
というか何のためにそうしたいのかによるな
class Object def callback(method, mypos=0, *args) args.insert mypos, self method.call *args end end p Math.sqrt(400) #=> 20.0 p 400.callback Math.method(:sqrt) #=> 20.0 p [1,2,3,4,5,6][2,3] #=> [3, 4, 5] p 3.callback([1,2,3,4,5,6].method(:[]), 1, 2) #=> [3, 4, 5] こんなもんでどうかな
167 :
166 :2008/04/19(土) 21:09:58
>>165 クラスとオブジェクトとメソッドの理解がまだ足りないんだと思う
気持ちはわかるが考え方が不当
欲しいのはいわば pathenize_dirname メソッドと推測
p '/usr/local/bin/ruby'.pathenize_dirname
"/usr/local/bin/"
メソッドの引数形式を「カッコ悪い」と感じる時期に罹るハシカみたいな病気だ
え、
>>161 は見た目が気に入らないというだけ?
機能的な話かと思ったら、どうやら明後日を向いていたようだ。
そういうことであれば
>>166 は
>>161 の美意識には適うまい。
こんなのもありか。 class String def to_path Pathname(self) end end p '/usr/local/bin/ruby'.to_path.dirname
いや、pではto_strは呼ばれないな。putsで。
ERBについて教えてください。 railsのテンプレートでERBが使われてますが、 これは何かのタイミングで一度rubyのクラスに変換されてからHTMLに再び変換されるのでしょうか? 例えばJavaのJSPがJSP→サーブレット→HTMLと変換されるのと同じ流れですか?
>>172 <%%>の中身がそのままRubyコードとして抜き出され、
それ以外は_erbout.print ... という形に変換されてから
Rubyで評価される感じです。
174 :
172 :2008/04/20(日) 16:30:00
>>173 なるほど、jspみたいにrhtmlファイルがクラスに対応するわけではないんですね。
あまり綺麗な仕組みではないですね…。
ありがとうございました。
単純に、ERBの簡単な使い方勉強するとイメージしやすいと思うよ eRubyの仕様じゃなくて、ライブラリの使い方ね
176 :
デフォルトの名無しさん :2008/04/20(日) 17:47:33
mixiの「メッセージ」を送信したくて、
http://d.hatena.ne.jp/emergent/20070321/1174472206を参考にして 、以下のように書いてみました。
基本的にeditの部分だけを変更し
def edit title, content
@id = "12345"#相手のid
@edit_page = @agent.get('
http://mixi.jp/send_message.pl?id= '+@id)
edit_form = @edit_page.forms.name("messageForm").first
edit_form['subject'] = title.toeuc
edit_form['body'] = content.toeuc
confirm_page = @agent.submit(edit_form)
conf_form = confirm_page.forms[0]
p @agent.submit(conf_form)
end
以下を実行しました。
def mixi_message
mdw = MixiMessage.new("
[email protected] ","hogehoge")
mdw.login
mdw.edit "テストタイトル", "テスト本文"
end
177 :
デフォルトの名無しさん :2008/04/20(日) 17:48:07
結果、次のような出力になり、メッセージは送信されていませんでした。
#<WWW::Mechanize::File:0x4b03cdc @response={"connection"=>"close", "date"=>"Sun,
20 Apr 2008 08:11:37 GMT", "x-dealer"=>"034093", "content-type"=>"text/plain; c
harset=euc-jp", "server"=>"Apache", "content-length"=>"0"}, @code="200", @uri=#<
URI::
HTTP:0x2583fc0 URL:
http://mixi.jp/send_message.pl?id=12345 >, @filename="s
end_message.pl", @body="">
送信できていない原因は何でしょうか?
178 :
デフォルトの名無しさん :2008/04/20(日) 17:49:28
結果、次のような出力になり、メッセージは送信されていませんでした。
#<WWW::Mechanize::File:0x4b03cdc @response={"connection"=>"close", "date"=>"Sun,
20 Apr 2008 08:11:37 GMT", "x-dealer"=>"034093", "content-type"=>"text/plain; c
harset=euc-jp", "server"=>"Apache", "content-length"=>"0"}, @code="200", @uri=#<
URI::
HTTP:0x2583fc0 URL:
http://mixi.jp/send_message.pl?id=12345 >, @filename="s
end_message.pl", @body="">
送信できていない原因は何でしょうか?
>>176 WWW::Mechanizeは実際にサーバから送られてきたHTMLから指定された要素を抽出して実行している
素直に読むと
http://mixi.jp/send_message.pl?id=ユーザーIDというページの結果を取得し 、
<form name="messageForm"> というフォームで1番最初にあるフォーム中にある、
<input name="subject"> という、type が text か何かの入力欄に引数titleの内容を日本語EUCで入力
<input name="body"> という、type が text か何かの入力欄に引数contentの内容を日本語EUCで入力
<form name="messageForm"> のsubmit ボタンを「押して」結果のページを取得する
取得した結果の中の最初の <form> の submit ボタンを「押して」結果のページを取得する
という処理なんだけど、mixiのページ構成はきちんとそのようになってるかい?
180 :
デフォルトの名無しさん :2008/04/20(日) 18:55:48
176です。お返事ありがとうございます。 p conf_form としてみたところ、出力に #<WWW::Mechanize::Form::Field:0x4ba0de8 @name="submit", @value="confirm"> があり、これは、 「確認画面」の <input type="hidden" name="submit" value="confirm"> と一致しているので、 おそらく「確認画面」までは到達していると思います。 「確認画面」では formはひとつしかなく、 <form action="send_message.pl?id=1056392" method=post> <input type="hidden" name="submit" value="confirm"> <!--略--> <input name=yes type=submit value=" 送 信 "> <!--略--> <input name=no type=submit value=" 修 正 "> </form> という構成になっており、submitが二つあるのが怪しいかなと思っているのですが、 指定のない場合は、先にある「送信」が押されると思うので、条件は満たしているような気がします。 ほかに問題となりそうな点は何でしょうか?
181 :
デフォルトの名無しさん :2008/04/20(日) 20:37:02
num++ みたいな書き方が他言語とは挙動が異なるみたいなんですが これはどういう動作をしているのでしょうか?
そもそも ++ はないよ
rubyにそんな演算子は存在しない
>>182-183 ありがとうございました
なんでないんでしょうね?
実装も単純そうなのになぁ
ま た か 説明するの面倒なのでぐぐってくれ インクリメントの実装自体は簡単なんだが、Rubyのほうそくが みだれる ので採用されない
かっちょええ説明法があればたぶん普通に採用されると思う さあ頑張って 「自分を破壊し別のオブジェクトを生み出して置き換える」 メソッドの意味を説明して説得するんだ
モルモン教義的に不死がタブーでないのなら Rubyでベニクラゲをモデリングしたいと言ってみる
188 :
デフォルトの名無しさん :2008/04/21(月) 00:23:36
ループが正常に実行した時にのみ、ある処理を実行する というプログラムを美しく書く方法があれば教えてください。 フラグを用意し、ループを抜けてからフラグをチェックするのが 普通だと思いますが、フラグの存在が冗長な気がします 例外を使うのも、何かやりすぎのような気がします
do_this if array.all? {|x| ... } とかじゃなく?
190 :
デフォルトの名無しさん :2008/04/21(月) 03:20:44
どこでもrescueされなかった例外を補足するには どうしたらいいですか?
rescue すればいい
192 :
デフォルトの名無しさん :2008/04/21(月) 03:56:54
全体を囲む大きなbeginブロックを書くということですか? 視認性が悪くなるので、 前もってエラーハンドラみたいなものが登録できたらいいと思うのですが・・
基本的には処理はトップレベルにベタ書きすべきじゃないと思うから (変数はなるべくローカルスコープに入れた方がいいので)、 C などの main 関数みたいに全ての処理を囲んだ関数を作って トップレベルに記述する処理はその関数のみにしておくと良い。 そういう状態であれば、begin で囲むのもそこだけで済む。
ふーむなるほど… ありがとうございました
195 :
デフォルトの名無しさん :2008/04/21(月) 06:16:46
Timeオブジェクトを引き算するとfloatが返ってきます 時間の差をあらわすオブジェクト(間隔オブジェクト?)が 返ってきて欲しいのですがどうしたらいいですか?
>>196 返って来たFloatがその間隔オブジェクト(秒.マイクロ秒)
欲しい単位が分なら (t2 - t1).to_i / 60 すればいい
>>186 代入演算子の一種として実装すればよい
例:a += 1
num++に問題があるというより ++numとnum++の挙動の違いをRubyの中に組み込むのに難があるという感じ?
succはあるんだから、前置++は構文だけの問題だね 後置は……
> succはあるんだから ほほう 君のRubyでは 3.succ として 3が 4になるのか?
馬鹿ばっかだな 演算子で終わることに自体に問題があるんだろ
>>201 ああ、succはsucc!じゃないよね
吊ってきます
で、誰が演算子で終わることを問題にしてるの?
Cだと 1++ で 1 が 2 になるのか。 おもしろいな
演算子で終わることの意味も分からない馬鹿がいるな
演算子で終わる云々なんて、この何回もループした議論の中で出てきたっけ? そりゃ内部仕様は変えなきゃいかんだろうが、「演算子で終わったら駄目」な理由は? というか採用されても、「特殊なメソッド」以上のものにはならんと思うが
RubyでCGI作ってみてるのですが、system(id root)とかのコマンド結果が どうもHTTPヘッダーとして出力されてしまっているようです。 どうにか出力しない方法ってあるんでしょうか。
パイプ使って、標準出力/エラー出力を捨てとけ。
DBIを使ってPostgresSQLと接続しようとしたのですが、上手くいきません。 環境は、 OS CentOS 5.1 64bit Postgres 8.3.1 ruby-1.8.6-p114 ruby-postgres-0.7.1 dbi-0.2.0 です 接続しようとすると`load_driver'エラーが出ます。ruby-postgresだけだと接続出来るのですが、dbiだと駄目です。 ちなみにdbiのインストールオプションはruby setup.rb config --with=dbi,dbd_pgでインストールしました。 $ irb irb(main):001:0> require "postgres" => true irb(main):002:0> PGconn.connect("localhost", 5432, "", "", "testdb","user","wassword") => #<PGconn:0x2aaaaabaceb0> irb(main):003:0> require "dbi" => true irb(main):004:0> DBI.connect("dbi:postgres:testdb:localhost", "user", "wassword") DBI::InterfaceError: Unable to load driver 'postgres' from /usr/local/lib/ruby/site_ruby/1.8/dbi.rb:352:in `load_driver' from /usr/local/lib/ruby/1.8/monitor.rb:242:in `synchronize' from /usr/local/lib/ruby/site_ruby/1.8/dbi.rb:282:in `load_driver' from /usr/local/lib/ruby/site_ruby/1.8/dbi.rb:233:in `_get_full_driver' from /usr/local/lib/ruby/site_ruby/1.8/dbi.rb:219:in `connect' from (irb):4 from (eval):3 よろしくお願いします。
212 :
デフォルトの名無しさん :2008/04/22(火) 02:42:51
広くメソッドというもの自体をオーバーライドすることは出来ますか? メソッドすべてにフックを仕込んで、メッセージのやりとりを ロギングしたり、そういうことがしたいんですが
214 :
212 :2008/04/22(火) 03:04:54
>>213 こんな機能があったんですね
ありがとうございました
215 :
デフォルトの名無しさん :2008/04/22(火) 03:21:12
RubyWay読んでたら、Stringのeachは1.9ではなくなり、 each_lineを使うようになったと書いてありました。 今書いてるスクリプトには、ファイルからの読み込み処理等で eachが結構あります。 これは書き換えないと1.9以降では動かなくなるのでしょうか?
216 :
デフォルトの名無しさん :2008/04/22(火) 06:46:11
ハッシュの存在しないキーを参照してもnilが返ってくるだけでノーエラーですが 多次元配列で存在しないキーを参照すると undefined method `[]' for nil になります 存在しなかったとしてもエラーが出ないように参照する方法を 教えて下さい
def nil.[](i) nil end
ハッシュのデフォルト値を[]にするとか
あ、スマンぼけてた。問題は配列のほうか。
多重ハッシュでも存在しないキー指定したら undefined method `[]' for nil になるじゃん 何をしたいか明確に書けよヴォケ
多次元配列などというものはRubyには存在しません
class TajigenHairetsu << Hash def [](*arg) super(arg) end def []=(*arg) super(arg[1,-1], arg.last) end
rubyのコマンドからファイルの有無を確認する方法は無いでしょうか? 無ければ指定したテキストファイルを作り あれば追記するような仕組みを持ちたいので
225 :
216 :2008/04/22(火) 17:50:19
217さんの方法でしのぐことにしました
ありがとうございました
>>220 ハッシュか配列かではなく
nilに[]が使えないことをどうしようかという話でした
>>224 ファイルのことについてどうこうしたいんだからFileクラスのメソッド探してみれ
だからfetch(i,default)を使えと
問答無用に'a'でopenすればええんとちゃうの?
>>228 のぞんでいたどうさができました
おそらく不具合の原因は参考にしていたサイトがafile=File.new(*****)
とnewを使っていたためのようです
今まで5個ほど言語を学んできましたがrubyほどシンプルで強力な言語は
無いと感じました
本当にありがとうございます!
>>215 動かなくなるよ。
str.each は、str.scan(/^/).each に置き換えよう。
IO#eachは残ってるんじゃなかったっけ?
class String unless method_defined?(:lines) def lines self end end end としておいて、1.8系でもstr.lines.eachと書いておくという手も…
irb > print "test" この結果が ttt => nil と出るんですが、これはどういう意味なんですか? irb => ttt と出力されることを期待したのですが。
tttはtestのつもり? irbの=>の後ろに出るのは、入力した式(print "test")を評価した値。 x= print "test" とすると x = nil になるのといっしょ。 testという文字列が書き出されるのは式の評価(値を求めること)の、まぁ副作用だ。
235 :
233 :2008/04/22(火) 23:38:04
>>234 おぉ丁寧にありがとうございます。
入力コマンドを単純に実行するのではなく評価するだけなんですね。
てか使い道あるんでしょうかね…?
ないよ
irb > print "test" この結果が ttt => nil ^^^~~~~~~ ^:printの出力 ~:irbが返り値のインスペクションを出力 コマンドって…
ttt => String にはならんの?
たぶん出力の意味を勘違いしてるよ。 irbは「=> 返り値」を印字してるだけ。 その前のprintの出力に改行がないからそんな見た目なだけ。 もしそんな出力がされるってことは、printがStringクラスを返してるというイミフなことになるぞ。
240 :
デフォルトの名無しさん :2008/04/23(水) 06:24:22
RubyのIDEでおすすめは何ですか? 今はNetBeansを使っていますが、他のファイルのクラス等が 自動補完できないのでもう少し高機能なのが欲しいと思っています
おすすめは無い あと1年くらいしたら便利なの出てくるぜと3年くらい前から言われてる
rubyらしいな
pythonから移ってきた人向けの入門ページとかないですか?
for文について質問です。 for book in book_array end このように配列を回すfor文の中でインデックスを取得することは出来ないのでしょうか?
Enumerable#each_with_index
>>245 ありがとうございます!できました。
java出身だとfor文でインデックス取れないって変な感じですね。
数値計算関係はpython 日本語処理はruby という使い分けしようと思っててるんですが、うまくミックスする方法はないのでしょうか?
質問が曖昧すぎて意味不明
>>246 for i in (0..book_array.size)
p i, book_array[i]
end
カウンタ変数もなしにインデックスが取れるわけないだろう
上と下ならどっちがrubyらしいですか? if foo == "" end if foo.is_a? String && foo.empty? end
オブジェクトの型をチェックするコードは常用するものではない。
てかRubyの日本語処理ってNKFべっただし PythonからRuby向けを切り出す必要があるとは思えない Pythonで書けるなら全部Pythonで書くのがベスト
rubyで簡単なツールを作ろうと考えております GUIを組むにはruby/tkとか色々種類があるようなのですが、 最もメジャーなのはどれでしょうか? ツールの詳細としては、チェックボックスやリストで設定項目を設定し、 それによるシミュレーション結果をメッセージボックスに文字列で 順次吐き出すだけというものです ※一応Javaも少しかじってます もし「rubyのGUIは終わってるからJavaでやれ」とかならば それはそれで結論として構いません
際だって使われているGUIツールキットはないと思うが、tkは最初から 付いてくるから比較的メジャーと思われる。 自分はマカーなので、必要な場合はOSに付いてくるRubyCocoaを使う ことになると思うけど。 Javaもかじってる人ならJRubyでSwing使うというのもアリかね。
railsでいいじゃん
配布するのか、自分の特定のマシンで使うのかにもよるよな
漏れはRuby/Gtk2 Gnomeだからそれに合わせて。Gladeとかあって使い勝手も悪くない。
262 :
255 :2008/04/24(木) 01:07:39
>>260 一応は仕事で補助的に使うツールです
基本は自分のPCで動けばOKですが
状況によっては周囲に配らないとも言いきれませんので
配布時のパッケージングに優れていると助かりますね
263 :
255 :2008/04/24(木) 01:09:43
あと、OSはWindowsXPです 今更言う事でもありませんが、念の為…
VisualuRubyはダメなのかな? exerbでexe化もできるみたいだし。 てか、ほんと「これだ!」ってのはないと思う。
俺AvtiveRubyとHTA
HTA+ActiveScriptRubyなんて組み合わせ知ったときには これぞ俺が今まで追い求めていたものだと直感した GUIはHTMLで記述、中身の処理はRuby。夢のようだ なのになんで使わなくなったんだっけ俺
インターフェイスはrubyになるけど中身はIEのままじゃねそれ eachとかProcとかないんじゃ
>>255 反則っぽいけどwebrickでアプリケーションサーバを作るとか
guiとかの環境依存性も配布する必要も無い
ついでにdrbで分散処理も追加
>>255 >262,263の条件ならC#かJavaがいいと思う。
UNIX系でも使う可能性があるなら>264かな。
272 :
255 :2008/04/25(金) 02:51:02
色々候補ありましたが、日本語周りに確証が欲しかったので 差し当たりVisualuRuby触ってみる事にします 皆様レス有難うございました しかし決め手が無くて色んな種類があるという状態は 選択肢が広いとは言え、個人的には苦手だ…
273 :
デフォルトの名無しさん :2008/04/25(金) 04:29:00
パスが入ってる文字列のファイルセパレーター(/や\)を, /からwindowsの\に変換するメソッドは有りますか?
>>273 文字の置き換えだろ?
リファレンスマニュアルでStringの項を読みなさい
文字列の50行目から100行目の範囲に対して、正規表現で検索をしたいのですが 今は str.split('\n).each do |line| cnt += 1 line =~ 〜 if(50<=cnt && cnt<=100) end のようにしているのですが、strはかなり長い文字列なので、無駄な処理をしている気がします もっと上手は方法はないでしょうか?
>>275 とりあえず、splitする必要ないでしょ
>>275 ややトリッキーな方法だが
target_lines = str.split($/).slice(50..100)
if target_lines then
target_lines.each do |line|
line =~ 〜
end
end
>>275 str.each_with_index do |line, cnt|
next if cnt < 49
line =~ 〜
break if cnt >= 99
end
1.9なら
str.each_line.with_index
next unless (50..100) === cnt
何を無駄って考えてるかによりそう strが巨大な配列になってるのがヤだっていうならsplitとeachは全滅だな
282 :
デフォルトの名無しさん :2008/04/26(土) 13:58:48
Rubyからコマンドを実行させるには、execとかsystemとかいろいろあると 思うんですけど、出力結果を文字列として取得する場合はどうすればいいんですか? ちなみにRuby1.8.6です。
283 :
282 :2008/04/26(土) 14:01:07
282です。 できればエラーストリームだけとれるのが望ましいです。
わざわざ自分のブログ宣伝して回るなよ
>>282 * Open3 を使う(require 'open3')
* 自分で作る(open3 は簡単だから、読んでみるといい)
* windowsでは動かないかもしれないが↓
command = 'ls /tmp'
stderr = `#{command} 2>&1 > /dev/null`
>>282 $stdout, $stderr を reopen して system
system のいいとこは shell を介さずに実行できるから
コマンドインジェクションを防げる。
単純にpopenじゃあかんの?
ポペン!
あのさ、あるクラス Foo があって、その機能強化版をつくったとき、 クラス名は何にしたらいいと思う? AdvancedFoo とか ExtendedFoo とか考えたけど、あまりいい名前じゃないといわれた。 かといって、雑多な機能をいくつも付け加えたから、これといって名前をつけにくいんだよな。 なんかいい名前ない?
追加する機能をモジュールとして作り、 Fooのインスタンスにextendで機能追加する。 ↑という方法では解決できず、どうしても継承でやる必要があるなら FooWith機能名 とか 機能ableFoo とか。
Fooそれ自体に機能(メソッド)を追加するという方法もある。
あるいはモジュールとして作り、includeする。
Fooのインスタンスはどれでも追加された機能を使える。
class Foo
... # 元の定義
end
# 定義を再オープンして機能追加
class Foo
def 追加機能
end
...
end
>>291 のextendする方法は、Fooクラスのインスタンス全体ではなく、
Fooの特定のインスタンスだけに機能を追加する方法。
クラスに二つ以上の責任があるんじゃないか? できれば分割して名前を明示できるようにした方がいい
>>291 ,292
もとのFooは残す方向なので(ほかに継承で使っている人がいるから)、Foo自体を拡張するわけにはいかないんです
>>293 まあそうなんですけど、Rubyの大クラス主義でやっているので。
大クラス主義はたしかに便利なんだよね。既存の他のクラスのインターフェース変えなくていいし。
>>294 大クラス主義はキッチンシンクじゃないぞ。
>>290 > かといって、雑多な機能をいくつも付け加えたから、これといって名前をつけにくいんだよな。
どうも行き辺りばったりの感じがするんだが。
UtilFooとでもしとけば。
Rmagickで書き込もうとする、もしくは書き込んだ文字列の幅と高さを求めるにはどうすれば用でしょうか?
>>296 ImageMagickのコマンドから推測するといい
298 :
デフォルトの名無しさん :2008/04/28(月) 19:42:33
Rubyの利点って何? Javaプログラマの俺にわかりやすく説明して
状況も設定せずに利点を挙げろつってもなぁ。 まずは自分の疑問をわかりやすく説明しる。
適当な捨てプロ書くのに凄く楽。
気楽に楽しくプログラミングできる
303 :
デフォルトの名無しさん :2008/04/28(月) 20:37:35
>>301 その返し方は誤解を与えるかもな。
ほとんどの人にとって利点はないと答えたかったんだろ?
>>300 それあるなぁ。
ワンライナーも併せて便利
rubyで大枠の処理を書いて、細かいところはJavaを呼び出す
JRubyでうんたらかんたらできる。 初期起動がかなり遅いけど。
Rubyの利点って何って話だけど、 それよりむしろJRubyの利点が知りたい。
JRubyの利点ってJavaのクラスが呼び出せるとかじゃないのかな。 これができると膨大なJavaのライブラリも使えるし。 個人的にはSwingあたりのGUIライブラリが楽に使えるとありがたい。
大量にあるJavaの資産が使えるのがありがたい 標準のライブラリだけで大抵のものが一揃いして、もちろん完成度も高め。Swingもあるし
>>309 >>310 へー、そうなんだ!
JAVA屋さんには便利なのかな
そういえばIronRubyはどうなったんだろう
>>308 (顧客の)サーバにRubyのバイナリを入れるのは(政治的な意味で)非常に大変だが、
Javaはデフォで入ってるので、jarを1個放り込めばよいJRubyは非常にありがたい。
>>312 その発想はなかった!
業務で使ってる人は大変なのね
>>312 これあるよねー
unzipコマンドがない客先のサーバでzipファイルを解凍しなきゃいけなくて
さてどうしようと思ってたら、jarコマンドで解凍できた。
このときはjavaすげーとおもった。
rubyの開発者 凄い人なんだろうけど、あらゆるruby本の監修になって名前貸すだけで稼ぎまくってるあの魂胆が嫌いだ
成果をねたむ足引っ張り合い好きな国民性丸出し トイレ掃除でもしてろ
俺はUSBメモリにruby.exeとmsvcrt-ruby18.dllが入ってるな(他は grep sed)。 これだけでもコマンドプロンプトのお供に使えるところが好き。 Python はライブラリ無いと起動すらしないし、Perl は動くけど glob が使えねえし…。
監修料なんて雀の涙だろ。
ヾヽヽ (,, ・∀・)チュンチュン ミ_ノ ″″
>>318 どっかの年金では図柄変更バージョンごとに1千万とからしいけど。
図柄かえるだけのバージョンが100くらいある。
監修料がわずかって…何を見て言ってんだ? 有名人になると筆者より儲けてるよ
何を見て言ってんだ?
>>317 やあ俺
シェルと好みのエディタ入れれば、簡易開発環境が出来てしまうのが便利だ
>>321 監修するなってこと? なんで? そのメリットは?
「成功者の収入が減ると、貧乏人の俺の胸がすく」という以外のメリットを感じないけど・・・。
釣られんなよ、おまいら……。
まぁ釣りだったことにしたいだろうなぁ、このフルボッコな状況じゃ。
>>320 さすがに公共事業とは事情が全く異なるだろ。
そういうのはまた孫受け曾孫受けで政治家とか○暴とかの
たかり屋に流れるからその分割高だし。
330 :
デフォルトの名無しさん :2008/04/29(火) 13:31:36
ちょっとした質問です。 ・・・忘れた
331 :
デフォルトの名無しさん :2008/04/29(火) 13:34:16
すいません、思いだしました! Rubyで小物でもプログラムを書くときに、 クラス化しますか? 適当に書き下す(とは言っても100行オーバーの大きさ)場合はトップレベル関数ばりばりでも よいと思うのですが、関数作りまくるプログラミングタイプだと、 いちいち関数化時に変数をグローバルにするのが面倒です。 また、配布とかも考えると、クラス化してライブラリとして使えるようにも、と思ってしまいます。 あなたはどうしてますか?
うぜぇw
配布を考える場合は、規模問わずほぼ確実にクラス化(モジュール化)する 配布を考えないなら、そのときどき トップレベル関数(メソッド)から作り始めることもあれば クラスの設計から始めることもある ところで >いちいち関数化時に変数をグローバルにするのが面倒です。 これはどういう意味なんだ
この俺がエスパーしよう! name = gets.chomp hello = 'ぐっもーにん' puts "#{name}さん、#{hello}" をメソッドにすると def say_hello puts "#{$name}さん、#{$hello}" end $name = gets.chomp $hello = 'ぐっもーにん' say_hello と書かなければならなくなって面倒だとか、たぶんそういう話だ!
トップレベルは気持ち悪いからなんでもクラス化
とりあえず関数だけで書いて 複雑になってきたらリファクタリングしてクラス化
100行くらいなら、多分関数のみ
メソッドのことを関数と言ってる奴は同一人物
339 :
デフォルトの名無しさん :2008/04/29(火) 15:12:32
>>333 >>いちいち関数化時に変数をグローバルにするのが面倒です。
>これはどういう意味なんだ
>>334 そのとうりです!!
>>338 トップレベルメソッドというべきでしたか?
確か三年ぐらい前に、初心者だった自分も同じようなことを言われたんだが
グローバル変数の使用はお薦めしない(書き捨ての短いコードだとしても)
エスパー
>>334 の例を借りると
def say_hello(name, hello)
puts "#{name}さん、#{hello}"
end
say_hello(gets.chomp, 'ぐっもーにん')
こんな風に引数として渡したほうがいい
いくらなんでも324はないだろう def init(opt) $_option = opt end def exe(arg) if $_option[:foo] 〜 end init :foo => :bar exe "hoge" とか?
俺の場合は新規作成した場合、自然と指が class って動いちまうなあ。
Pythonと比べるとRubyの方が直感的だと感じてしまうのはRubyに毒されたからなのか。 yieldの書き方とかはRubyの方がいいな。
コルーチンがわかってないんだろ
345 :
デフォルトの名無しさん :2008/04/29(火) 17:35:41
>>342 毎回指で書くなら自動化すればいいじゃない
これがコルーチンか。そう意識してみるとPythonの書き方もこれでもいいかと思えてくる。 でもRubyの方がコルーチンを中断している途中でなんか処理しているってイメージがしやすい気がする。 気のせいか慣れなのかもしれないけど。
347 :
デフォルトの名無しさん :2008/04/29(火) 22:15:27
メソッド・オーバーライトって、具体的に、どんなときに使ったことありますか?
ライブラリのメソッドを上書きしたいとき
349 :
デフォルトの名無しさん :2008/04/29(火) 22:49:20
それはわかるんだけど、具体的にどんなメソッドを上書きしたの?
inspect はしょっちゅうオーバーライドしてるなあ。 あと to_s も。
>>349 OKまずはageだ
・自分で設計したクラスのサブクラスを作ったとき(基本)
・他所から持ってきたライブラリのバグを自分で直すとき
・ライブラリの挙動を少しいじくったり、機能を足したいとき(たいていサブクラスを作って上書きする)
上書きコードがある程度の量になってきたら、自分用のラッパーライブラリを作ることもある
再定義はオーバーライト(overwrite)じゃなくてオーバーライド(override)だな。
そういえば、Object#inspectって循環参照があるオブジェクトに対してもちゃんと動くよね これってどうやって検出してるんだろう。inspectは特に引数を受け取るでもないし
>>353 Thread.current[:__inspect_key__] でobject_idを覚えてる。
>>354 スレッドローカルストレージ使っているのか。なるほど。
353じゃないが参考になった。
これからもあわあわと質問に解凍しやがってください。
javaが呼べるのは便利そうだけど c++(cじゃなくて)の呼び方がまとめてあるサイトないですか?
358 :
デフォルトの名無しさん :2008/04/30(水) 19:38:33
railsでないRubyではDB操作するのに何が一番使われてますか? 素のライブラリ?DBI?ActiveRecord?
O/R MapperならActiveRecordかDataMapper そうでなければDBIかMySQLライブラリ直書き
activerecordだけ使うならrailsでやればいいのに って思う。
「Rails使うならActiveRecord使えばいいのに」なら分かるが その逆はイミフだなぁ。
initializeを勝手に呼び出すのは良くないんでしょうか。 class Foo ... def refresh initialize end end
よくないです っていうか、そういうような処理を initialize に書いたらダメです たとえば、別途セットアップ系のメソッドを作って、initialize と refresh から呼ぶようにするとかしてください
365 :
デフォルトの名無しさん :2008/05/01(木) 19:28:22
>>340 あー、わかります。
でもRubyは参照渡し?できないですよね。
単発なら返却値で返す。
複数の返却値だとタプル?じゃなくて配列で返して、
hoge, mage = gethogemage
でよかったと思うんですが、なれてないと妙に気持ち悪いw
みんなこんなのやってんのかな
>>342 まず体を慣らすのはいいかもですねw
私も一番慣れてる言語だと、ファイル新規作成したら無意識でclass構文が書けます(まあ大抵はスニペット使いますけど)
>365 Rubyはむしろ全て参照渡しと言っても良いくらいなのだが。 ただし代入(=、+=など)は変数の参照先を変えてしまうので 自身を書き換えるメソッドを使わず代入で書き換えようとした場合 変数の参照先が変わり、値渡しみたいに見える。 例えば文字列なら concat は文字列自身を書き換えるが += は新しい文字列を作り変数の参照先を書き換えるので元の変数に影響がない。 FixnumやSymbolなどは、自身を変更するメソッドを持たないので 実質的に値渡しになる。
>>364 べつにいいと思うよ、何度呼ばれてもいいように設計されていれば。
foo = Foo.new(0) # Foo#initialize(0) が呼ばれる
foo.do_something!
foo.initialize(0) # リセットする
foo.do_something!
foo.initialize(0) # リセットする
...
もちろん
>>363 のようにしてもいい。すきにどうぞ。
正規表現でCの文字列リテラルにマッチするようなのって書けないでしょうか? /".*?"/にすると"aaa\"bbb"みたいな場合に"aaa\"で終わってしまいますが全体にマッチして欲しいんです /".*(?<!\\)"/にしようと思ったら1.8では(?<!)が使えませんでした
"([^"]*?\\.)*.*?" とかよく書くけど、どうかな
/"([^"\\]|\\.)+"/ こんな感じ?
>>369 >>370 どちらでもいけました、ありがとうございます!
なんでこれでいいのかまだ良くわからないので頑張って解読します
>>371 /"[^\\"]*(\\.[^\\"]*)*"/
こっちのほうが早いかな。
詳説 正規表現を読むのをオススメするよ
db等の外部リソースを使った時は Rubyの終了時にメモリは自動的に解放されているのでしょうか? 明示的に解放しないとだめですか?
ここでいいのか不明なのですが…もし良ければおしえてください やりたいことは CarbonEmacs上にて起動したirbで require 'rubygems' を行いたい。です。 環境は OSX10.4にてCarbonEmacs2008春版を使用しています。 rubyはMacPortsからインストールしたものを使用し、 rubygemsもMacPortsからインストールしました。
375 :
374 :2008/05/02(金) 03:23:56
以下Terminal.appから実行した結果です /Users/hoge% uname -a Darwin hoge.local 8.11.1 Darwin Kernel Version 8.11.1: Wed Oct 10 18:23:28 PDT 2007; root:xnu-792.25.20~1/RELEASE_I386 i386 i386 /Users/hoge% ruby -v ruby 1.8.6 (2007-09-24 patchlevel 111) [i686-darwin8.11.1] /Users/hoge% which ruby /opt/local/bin/ruby /Users/hoge% gem -v 1.1.1 /Users/hoge% which gem /opt/local/bin/gem /Users/hoge% echo $PATH /opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin /Users/hoge% irb irb(main):001:0> puts $: /opt/local/lib/ruby/site_ruby/1.8 /opt/local/lib/ruby/site_ruby/1.8/i686-darwin8.11.1 /opt/local/lib/ruby/site_ruby /opt/local/lib/ruby/vendor_ruby/1.8 /opt/local/lib/ruby/vendor_ruby/1.8/i686-darwin8.11.1 /opt/local/lib/ruby/vendor_ruby /opt/local/lib/ruby/1.8 /opt/local/lib/ruby/1.8/i686-darwin8.11.1 . => nil irb(main):002:0> require 'rubygems' => false -------- rubygemsをrequireしてもエラーになりません。 (.irbrcにてrequire済なので再読み込みはしませんが)
376 :
374 :2008/05/02(金) 03:25:02
対してCarbonEmacs上のrun-rubyにて起動したirbでの実行結果です irb(main):001:0> puts $: /usr/lib/ruby/site_ruby/1.8 /usr/lib/ruby/site_ruby/1.8/powerpc-darwin8.0 /usr/lib/ruby/site_ruby/1.8/universal-darwin8.0 /usr/lib/ruby/site_ruby /usr/lib/ruby/1.8 /usr/lib/ruby/1.8/powerpc-darwin8.0 /usr/lib/ruby/1.8/universal-darwin8.0 . nil irb(main):002:0> requrie 'rubygems' NoMethodError: undefined method `requrie' for main:Object from (irb):2 -------- 実行時のパスが異なるようです どのようにしたら、この問題を解消できるでしょうか。
うん、そのtypoは俺もよくやるよ
378 :
374 :2008/05/02(金) 03:52:32
>>377 まちがえました…ご指摘ありがとうございます
typoしなくても以下の通りです
irb(main):001:0>
No such file to load -- rubygems
from (irb):1:in `require'
from (irb):1
379 :
デフォルトの名無しさん :2008/05/02(金) 05:40:38
>>366 オブジェクトが参照なのと、引数の参照渡しを一緒にスンナ
何が「すべて参照渡しと言ってもいいくらい」だ
「参照の値渡し」とか「オブジェクト渡し」とか言われる形態だな
>>378 FinderからではなくTerminal上で open -a Emacs とする、
もしくは .emacsに irb の位置をフルパスで指定する、のどちらか。
後者なら、~/.emacsなどに
(setq ruby-program-name "/opt/local/bin/irb")
と書けばいいと思う。たぶん。
382 :
デフォルトの名無しさん :2008/05/02(金) 15:43:21
Emacs から info で Ruby のマニュアルを調べたいと考えているのですが、 現在、配布されているドキュメントは html 形式のみですよね Ruby 1.4 の時に配布されていた info ruby-texi-1.4.tar.gz も、ネット上のどこにも落ちていない…
384 :
374 :2008/05/03(土) 00:25:29
>>378 感謝です。おっしゃるとおりでした。
後者も有効です。
Rubyに抽象メソッドって無いの?
>>385 実行前に実装を強制させる仕組みはない。
定義してなければ呼んだときにmethod_missingが呼ばれる。
あとは
スーパークラスで抽象メソッドにしたいメソッドを定義して
raise NotImplementedError
するとか
inheritedフックを使って、継承した時点でチェックするとか。
>>386 Class#inheritedがよさげです
ありがとうござました
inheritedって class Hoge < Moge の中を実行する前に呼ばれてるような。
どうしてruby使ってるの? pythonでなくてrubyを使う理由って何でしょう? 日本人が作ったのが誇らしいとかですか????
?が2個以上連続しているレスは釣り
>>389 どうして日本語使ってるの?
英語でなく日本語使う理由って何でしょう?
日本人が作ったのが誇らしいからですか????
イエス!ジャパニーズ! ノー!フューチャー!
pythonはopen classじゃないとかいろいろめんどい openclassはちゃんとしたアプリがつくれない、って言われてるけど その通りだと思う。でもスクリプト(笑)言語でちゃんとしたアプリは 作らないから問題ない。
式と文や、メソッドと属性なんかが分かれてるのが気に入らない。
396 :
デフォルトの名無しさん :2008/05/04(日) 11:46:23
クラス内部でしか使わないサブルーチンのようなメソッド定義ってできますか? たとえば、 class Hoge def a(int1, int2) return int1+int2*int2 end def self.b(int) p a(3, int) end end Hoge.b(5) の様には書けないんでしょうか。 classとselfとHogeを外すと正常に動作するんですが。
Pythonは「メソッド=メソッドオブジェクトが入った属性」な感じ? メソッド側に属性を統一するのがRuby流で 属性側にメソッドを統一するのがPythonって思ってる。 俺の場合はlambdaの使い難さで使わないけどな。>>Python 文が書けないし、構文自体が無茶になるから 結局、一時的な関数内関数を書きまくることに。
398 :
デフォルトの名無しさん :2008/05/04(日) 11:58:13
aをselfしてprivateに指定するんでしょうか?
>>396 クラスメソッドとインスタンスメソッドと特異メソッドの勉強が必要
400 :
デフォルトの名無しさん :2008/05/04(日) 12:06:21
観念的なのは10冊くらい読んだのですが、結局、よくわからんのです。 実際の挙動というか、メモリ上の状態を記述しているような 説明がないので。 一応、インスタンスはコピーという感じで良いんでしょうか。 クラスと特異の実際の状態が掴めないのでよく解りません。
>>400 中田育男先生の
コンパイラの構成と最適化 お勧め
つprivate_class_method
>>396 self.bの定義の中ではselfは(挿入されている特異クラスはさておき)
Hogeというクラスそのものなわけだが、このとき(レシーバを
省略した)aの呼び出しでも、当然レシーバはself(=Hogeクラス)
になる。
404 :
デフォルトの名無しさん :2008/05/04(日) 13:04:58
>>400 この辺はじっそうによるからなあ。
コード書いてみて、実験したりして挙動を確かめる方が身につくよ。
本も大事だけどさ
コード書かないで理解は無理だべさ
>>396 まずどういう目的で、何をするためのスクリプトを書いてて詰まったのか
そこを書いた方が回答しやすい
学習目的なら、特異メソッド(Hoge.b)の理解は後回しで良い
それよりも、まずクラスとインスタンスの概念を理解することが先
406 :
デフォルトの名無しさん :2008/05/04(日) 14:10:12
>>405 目的はある処理をするクラスを作っていて、
クラス内部の処理を解りやすくするために、関数で処理を
まとめようとしていました。
色々と処理の分岐があるので、その方が解りやすく書けるからです。
新たにクラスを作るほどは大きくなく、下手に複数のクラスにして
データのやりとりで悩まなくていいし、1ファイルに納めるのに
都合が良いからです。
しかし、メソッドを定義してやると、クラス外からも呼び出せるし、
何か気持ち悪いので良い方法はないのかと思って聞いてみました。
そもそも、クラスの使い方が間違ってるような気もしていたので。
クラスから自身を呼んでインスタンス化するというのも、
自身の、呼び出した部分のコードがメモリに読まれるので、無駄な気がするし。
407 :
デフォルトの名無しさん :2008/05/04(日) 14:57:18
>>401 読んでみます。
>>402 やはりプライベートにして、アクセスを禁止してしまえば良いんでしょうか。
>>403 なるほど。再帰的に呼び出してるわけですよね。
クラスを呼ぶのでクラス指定しないとダメなんですかね。
クラス内だから関数的に呼べるのかなとも思ったんですが。
なんとなくあやふやな感じで理解してましたが。
selfを付けるのと付けないのでどういう違いが
発生するのかいまいちよくわからないのですよね。
selfを付けると、スクリプトの実行時に既に実行可能になってるのか
それとも、クラスが呼ばれたときに実行可能になるのかとか。
>>404 そうですか。あはは。
オブジェクト指向って奥が深いですね。
何か図形的なモデルがあると理解し易いんですが。
きっと複雑な状態遷移があると思うので、
言葉だけではすぐに理解するのは難しいのかなと。
>>407 すごい大雑把に説明すると、
クラスは鯛焼きプレートでインスタンスは鯛焼き。
def self.foo と定義したものはクラスメソッド。
def bar と定義したものはインスタンスメソッド。
インスタンスメソッドはインスタンスがないと (Hoge.new しないと) 実行できない。
クラスメソッドはクラスが定義されていれば実行できる。インスタンスは不要。
インスタンスメソッドからクラスメソッドを呼ぶのは可能。
def bar
self.class.foo
end
クラスメソッドからインスタンスメソッドを呼ぶには new しないとだめ。
あちこちに self が出てきて分からなくなってきたら p self として確認すればいいんじゃね。
GDが使いたいならRuby/GD
412 :
デフォルトの名無しさん :2008/05/05(月) 22:40:56
>>408 プライベートで良いんですね。
ありがとうございます。
>>409 なるほど。
selfで呼べば良い訳ですね。
インスタンスメソッドは関数の型宣言みたいなもので、
クラスメソッドは関数みたいな物ですね。
ありがとうございます。
あ。違いますね。 インスタンスメソッドは実行時に一つ起動しているオブジェクトで、 スコープの範囲で何時でもどこからでも呼べる。 クラスメソッドは宣言してからようやく使えるメソッドですね。 オブジェクトの起動タイミングが違うという理解でしょうか。
>>413 かなり致命的に理解を間違っているようなので
このスレで聞くよりも、身近なプログラマに直接質問してみることを薦める
もしくはGoogleで、オブジェクト指向について基礎から解説してるページを探すとか
>>413 1.私は万年筆が好きだ
2.私はこの万年筆が好きだ
この二つのうち、1は万年筆というもの、2は具体的な品を指してるだろ
オブジェクト指向では1がクラス 2がインスタンス
ここで.色関数を考えると、
(2の意味の万年筆).色 ってのは、具体的な品だからちゃんと色が決まってる
これがインスタンスメソッド
(1の意味の万年筆).色 だと、色が決まらないから、クラスに対してインスタンスメソッドは
呼び出せない
同様に、そのものの種類を返す関数 .kind があったとする
このときは、(1の意味の万年筆).kind で、"万年筆"って文字が返ってくるし
(2の意味の万年筆).kind でも、同じように"万年筆"って返ってくる
これがクラスメソッド
>>415 > (2の意味の万年筆).kind でも、同じように"万年筆"って返ってくる
> これがクラスメソッド
これは違うんじゃ...
比喩でクラスとメソッドの関係を説明しようとするのがそもそも間違いだな
つまり、既に初期化されている(スクリプトを読んだ時点で)のがクラスメソッドで、 インスタンスメソッドはnewなどして、その時点にならないと 初期化されないメソッドという事じゃないんですか?
Rubyではクラスもオブジェクト。 Rubyではオブジェクト毎にメソッドを定義できる。 クラスオブジェクト(Classクラスのインスタンス)にメソッドを定義したのがクラスメソッド。 そのクラスのインスタンスとは直接は関係しないから、クラスメソッドを定義しても、インスタンスメソッドには影響しない。
irb> class C ;def C.clsmtd; p self.object_id; end ;end irb> C.clsmtd 537963320 irb> p C.object_id 537963320 irb> p C.new.object_id 537887540
>>418 どうもインスタンスメソッドに関して、誤解があるように思えるな
foo_instance = Foo.new # オブジェクトの生成
foo_instance.a(1, 2) # foo_instanceのメソッドaを実行し、結果を返す
a(1, 2) # エラー
このスクリプトでなぜエラーが出るのかは理解できる?
では、クラスは何処にあるんですかね? インスタンス化されたクラスは? 場所の定義は無いんですか?
Rubyがどうかは知らんが、よく用いられるモデルで説明してみる class A @a @b @c end instance = A.new は、C言語でいえば、void *instance = malloc(3); この3はAに変数が三つあることに対応してて、このケースならinstance[0] が @a ,instance[2] は@cに対応してる 例えばここにインスタンスメソッドとして def set_a(new_a) @a = new_a end があったとする。 instance.set_a("test")のように呼び出すと、内部ではset_a(instance,"test")と変換される 実際に呼ばれる関数は、C言語で書けば void set_a(instance , new_a) { instance[0] = new_a; } こんな風に、@aなりを使ってると、listのアドレスを確定させなきゃならんから 具体的なインスタンスに対してしか使えない クラスメソッドは、Cでいうところのグローバル変数のみを使ってる関数で イメージ的には int num = 10; int class_num() { return num; } に対応する。 この場合は変数instanceをメソッド内で使ってないので、A.class_method でもいいし instance.class_method でもおk
訂正 >line23 listのアドレスを→instanceのアドレスを >line29 int class_num() ⇒ int class_method()
>>422 定義されたクラスは、定数として存在している
class Foo
(ここにメソッドとかの定義)
end
print Foo.name # "Foo"が出力される
print Foo.class.name # "Class"が出力される
Rubyではクラスもインスタンスもオブジェクトで、実体はオブジェクトスペースに存在してるよ。 それらに名前をつけたのが変数や定数。 変数や定数は実体がオブジェクトスペース内のどこにあるのかの情報を持ってる。
rubyでオブジェクト指向理解しようなんて無理でしょ 遠回りだけどjavaをしっかり勉強した方がいいじゃないの?
Javaのオブジェクト指向はオブジェクト指向なJavaでしかないと思うんだ
オブジェクト指向を理解するという文脈でJavaを第一に持ってくる ってことは理解してないってことだよな。
ていうか Rubyのクラスとインスタンスとメソッドを理解したいのか オブジェクト指向プログラミングのクラスやインスタンスを理解したいのか どっちかにして欲しい 後者ならスレ違いだ
>>430 オブジェクト指向を学ぶ上でJavaより勉強する価値のある言語って何?
批判するだけで自分の考えは何も無いの?
Smalltalkあたりじゃないかな。
smalltalkじゃね?
有名なのはSmalltalkかな
Smalltalkだろ。
Smalltalkだな
smalltalkがjavaより勝ってるものって何?
純粋さ
おっと無能の数はjavaには敵いませんな
2chは知ったかばかり
オブジェクト指向の学習用として考えるなら、だいたいどれも大差ない C++でもRubyでもPythonでもJavaでも (smalltalkは使ったことないから知らないが)
>>438 というかJavaは、意図的に完全なオブジェクト指向にしてない
実用面ではどうかってなるとまた別の話になるんだが、
少なくともオブジェクト指向って観点から見ると美しくない
逆にSmalltalkは文字通り全部がオブジェクト
制御構造すらオブジェクトのメッセージ扱いになる
RubyもSmalltalkからメタクラスとかの概念をもらってるはず
smalltalkがjavaより勝ってるものって何ですか〜?
じゃあどうしてデザインパターンの書籍の多く(専門書も含めて)はJavaを元に書かれてるんだ?
JavaはOO貫徹をあきらめてAlgol系並の実用性を手に入れたようなもんだからな。
>>445 最初のGoFはSmalltalkだったぞ。
のちにJava優勢になったのは普及度の違い。
>>445 オブジェクト指向をよりよく体現してる=言語として人気がある とはならないだろ
どっちにしろJavaで上手い設計してる奴はSmalltalkから来てるよ
Javaスレッドで前にも見たような流れだな 少なくとも実用的な言語を元に学ぶのが良し、という考え方の元ではJavaだろう Smalltalkでオブジェクト指向を学べってのは大げさ過ぎる
>>445 実用を兼ねてるんだろう
Java使ってる人は多いだろうし、JavaはC++やC#とかとも文法が似てる
・・・・・と言いつつ、GoFのデザパタ本はSmalltalkも使ってたような
smalltalkってそんなに完成された言語だったの??
つかなんでいきなりデザインパターンみたいな応用が出てくるんだ もともとの問題を摩り替えないほうがよい
Javaで学べっていっても初心者的には構文覚えて精一杯じゃないか 自分でいい設計してるソース探してきて読むとこまで勉強するよりは Smalltalkのライブラリでも読んでりゃいいとは思う
GoF本は最初のバージョンはSmalltalkとC++でサンプルが書かれてる。 もともとSmalltalkで得られた知見だしな。 新しい版はJavaコードも使ってる。
>もともとの問題を摩り替えないほうがよい Smalltalkに噛み付く奴はスレ逸らしだろうな
OOを覚えるためにはやはりEiffelしかないだろ
Eiffelもやっとくべきだと思いつつまだ入門もしてないだよなー。
なんというか
>>400 読んで、
ちょっと前に本スレにいた京大君を思い出すんだよな(本人だと言うわけではなく)。
んで、実際のところ質問者はCとかでは、コードをすらすら書けるんだが、
「オブジェクト指向」(または、Rubyのモデル)の概念でつまづいてコードが書けないのか。
それとも計算機の理論を一通り座学して、これからコードを書くに当たって、
(Cではなく)楽ちんそうなオブジェクト指向スクリプト言語を選んだのか。
前者と後者で、かなりすべき対応が変わると思うんだが。
Javaは非オブジェクトな型をあえて残した言語だからな OOPLとしては、普及してるが純粋でない。
Smalltalk が Java や Ruby より圧倒的に勝っているところをひとつ挙げるとすれば リフレクションとかに代表されるイントロスペクション機能でしょうね。 分かりやすいところでは、IDE やデバッガなどの機能充実度や、それらの 作りこみやすさに出てくる特徴です。もとは LISP 譲りの機能ですが、Smalltalk での 充実度は LISP をも凌駕しています。これは Smalltalk 処理系が Smalltalk 自身で 記述されている(記述可能…とかではなく、実際にそれで運用されている)ことに 由来します。 Ruby 実装では Rubinius や今度の RailsConf でデモされる予定の MagLev が、 現在の制約を克服して Smalltalk に近づこうと努めているみたいです。 これらは Smalltalk と同じく、Ruby 処理系をできるだけ Ruby で記述しようとする ものたちです。 あと余談ですが Java は、Ruby や Smalltalk などの「メッセージングのOO」という パラダイムに則していないだけで、C++ や Eiffel などの「ユーザー定義型のOO」と いうパラダイム的にはかなり純粋なほうですよ。念のため、後者は“ユーザー定義型”を クラスで実現しようとする考え方で、メッセージのやりとりとかとは無関係です。 裏を返せば、Ruby や Smalltalk は、Java の土俵である「ユーザー定義型のOO」的な 切り口で見たときに、足りないところが多々あるということになり、実際にそうなっています。
Smalltalk まで読んだ
>>458 ぶちゃけた話、オブジェクト指向を完全理解しなくてもRubyのクラスやメソッドは使えるよな
継承や委譲もなんとかなると思う
>>458 オブジェクト指向が分からないのか、
Rubyでのオブジェクト指向を実現する技法が分からないのかでも話が変わってくるのでは
オブジェクト指向って思考法そのものは言語に依存しないと言われているし
関数は (関数 引数 引数) 見たいな記述でもキモいって言われないのに オブジェクトは メソッド(オブジェクト 引数 引数) だとキモいって言われるのはどうして?
どのくらい言われてるかはわからないけど、あるとしたら、多重定義の関係じゃない? 「呼び出し先の決定権を持っている奴」が、端っこではない場所に居て、やや目立ちにくい ・・・という、ビジュアル的な違和感ではないかと思う。 結局のところ、慣れればそれまでって気がするけどね。
第1引数を太字でシンタックスハイライトすれば解決 いやわりとマジ
466 :
デフォルトの名無しさん :2008/05/07(水) 15:18:42
すごく初歩的な質問なんですが、 puts "あなたの名前は?" name = gets.chomp puts "あなたの名前は#{name}です" これを実行しても dan(←入力数値) あなたの名前は? あなたの名前はdanです となって文字列の出力するタイミングが意図したものにならないんです^^; どうすればいいのでしょうか? ちなみに開発環境はRDEを使っています。
$stdout.sync = true puts "あなたの名前は?" name = gets.chomp puts "あなたの名前は#{name}です"
smalltalkerって名前の割によく喋るね
469 :
デフォルトの名無しさん :2008/05/07(水) 15:47:15
>>464 関数に見えるというのが。フラットな名前空間にとっちらかる感じで。
名前空間を導入すると今度は対象がわかってるのに名前空間を書かないといけないのがあれで。
……まあ結局は気分なんだが。CLOS がやっていけてるんだからやっていけるんだろう。
>>463 > オブジェクトは メソッド(オブジェクト 引数 引数) だとキモいって言われるのはどうして?
C言語でオブジェクト指向で書くとそんな感じだから、別にキモいとは思わない。
smalltalkとオブジェクト指向の話面白そうだなぁ 誰かスレッド作ってくれんかなぁ
cgi で画像を並べたいんだけどどんなふうに書けばいいの? つまりはこういうソース吐きたいんだけど <div>1 2 3 4 5</div> <div>6 7 8 9 10</div> or 1 2 3 4 5<br> 6 7 8 9 10<br> or <div>1 6</div> <div>2 7</div> <div>3 8</div> <div>4 9</div> <div>5 10</div> あとオプション1つでテーブルタグも吐けたりするとうれしいな
まあとりあえずは自力で配列内容を表示させる勉強しろ 手を抜くより先に覚えることはたくさんある 「自分で作れるけどもうめんどいから他のことに時間かけるために手を抜く」 というのが正しいプログラミング メソッドを作ることはできるかな できないのなら作り方おぼえるといい
引っかかる点は何だろう 「カウント○ごとに何かをする」という専用の処理が何かあると思うことかな ありそうだけど無いよね each_with_index で回して index + 1 の 剰余5 が 0 のとき何かする、という記述しかない?
each_sliceともちょっと違う?
def group_by hash = {} each do |item| key = yield(item) (hash[key] ||= []) << item end hash.collect {|key, arr| arr } end こんなメソッドって標準になかったっけ?
Enumerable#group_byは1.9と1.8.7だけかな?
もっとも、Hashのままで返すけど。
というか
>>478 のだと、どのグループかわからなくなるんじゃないか?
> hash.collect {|key, arr| arr } hash.values
>>479 ,480
さんくす
そうだよな、Hash#values があるじゃん
なんて間抜けなんだ
rubyを最近習い始めたのですが、 1からキーボードで入力した数までの和をもとめる プログラムの作り方がいまいちわからないのですが 教えていただけませんでしょうか?
すいません、スレ違いでした。 スルーしてください
>>482 def sum(n);n*(n+1)/2;end
>>484 が良い解だと思うけど、Ruby的には
def sum(n); (1..n).inject{|a,b|a+b}; end
という風にできることを知っていると後で役に立つかも。
立たないかも。
似たような演算を多数作るなら、以下のように。 ただし>485の5倍程度の時間がかかる。(毎回evalのため) def fn_maker(fn,lst);lst.inject{|r,i|eval("r"+fn+"i")};end def summerise(x);fn_maker("+",x);end def multiple(x);fn_maker("*",x);end def divide(x);fn_maker("/",x);end def subtract(x);fn_maker("-",x);end def sum_1_to_n(n);summerise(1..n);end p sum_1_to_n(10) a=[3.0,5,2] p summerise(a) p multiple(a) p divide(a) p subtract(a)
send使えよ
つか初心者スレっぽいな
入力をどう扱うかも示さないと回答として片手落ちだしな
というか初心者スレとしては普通に回答するか解説つきで説明すべきなんだがね 自分の知識の結果をただ披露して悦に入ってどうするよ
YARVで、あるベンチマークが * 「100%速くなった」というのは、時間が半分になったということ? * 「200%速くなった」というのは、時間が1/3になったということ? * 「25%速くなった」というのは、時間が20%減ったということ? ( 1 / (1-0.20) = 1.25 ) 教えてえらいひと。
自己嫌悪はそこまでにして、次w
>>482 数値から数値までを足すときはガウスが少年時代に行った
計算方法を利用してプログラムを作った記憶が有るなあ
1~aを計算するとして
aが偶数なら(1+a)*(a/2)
aが奇数なら最初にa+1に対して上と同じ計算をして最後にa+1を引くように
すれば簡単に計算できた記憶が有る
例えば
a=10(偶数)ならば
(1+10)*(10/2)
a=11 (奇数)ならば
i=a+1
(1+i)*(i/2)-i
と場合分けすると式が短くて簡単
>>494 なるほどね。
他の方法で暗算だとa,a+1のうち、偶数になる方を2で割ってから掛け合わせたりする。
例:
1~100の場合、100*101/2 = (100/2)*101
1~123の場合、123*124/2 = (124/2)*123
以上は経験的に「奇数の1/2 * 偶数」よりも「偶数の2/1 * 奇数」の方が
暗算しやすいからだけど、プログラムにも活かせると面白いかも。
例えば、少量データで早い実装、大量データで早い実装のように複数の関数を
用意しておいて、稼働状況に応じて使う関数を自動的に切り替える。
496 :
デフォルトの名無しさん :2008/05/11(日) 11:38:08
str0 = "bar" の時、マニュアルによると p str0[3, 1] #=> nil らしいですが、自分の環境(1.8.6 mswin32)では""が返ってきます 何が悪いのでしょうか
'bar'[2, 1] #=> 'r' 'bar'[3, 1] #=> '' 'bar'[4, 1] #=> nil 本当だ。なんかバグっぽい挙動だな
498 :
デフォルトの名無しさん :2008/05/11(日) 16:47:40
fw(findwordの略)というプログラムを作ろうとしています。 fw -fp '/usr/include/**/*.h' '~/**/*.h' -wp 'define\s+\w+' -pp '%1 %2 %3'という感じで -fp の後ろに複数のファイルパターンを -wp の後ろに複数の単語パターンを -pp の後ろに表示用のフォーマットを指定できるようにしたいのですが、optparseをうまく操れません 上記の実行例だと ["/usr/include/**/*.h", "~/**/*.h"] ["define\\s+\\w+"] と表示されて欲しいのですが、実際は ["/usr/include/**/*.h", "~/**/*.h"] ["define\\s+\\w+", "%1 %2 %3"] と表示されてしまいます printpattern = "%1:%2:%3" # filename:linnum:line print = proc {|filename,linenum,line| STDOUT << (printpattern %filename %linenum %line) << "\n" } filepatterns = [] wordpatterns = [] ARGV.options {|opt| dest = wordpatterns opt.on('-fp' , '--filepattern') { dest = filepatterns } opt.on('-wp' , '--wordpattern') { dest = wordpatterns } opt.on('-pp S' , '--printpattern S' , String) {|s| printpattern = s } opt.order! {|s| dest << s } p filepatterns p wordpatterns }
499 :
デフォルトの名無しさん :2008/05/11(日) 18:00:07
正規表現に完全にはマッチしてないのだけど、あと数文字付け加えてくれたら 完全にマッチするみたいのを検出したいのですが、いい方法はないでしょうか?
>>498 ショートオプションはアルファベット一文字のみ
あと質問にはないが、(printpattern %filename %linenum %line) はRubyでは動かない
>>499 そのあと数文字を付け加えてない状態を正規表現で表せばいいんじゃない?
もっと具体的にやりたいことの例を出してみれ
解決策が出てくるかもしれないよ
502 :
498 :2008/05/11(日) 19:53:16
>>500 ありがとうございます。 一文字にしたらうまくいきました。
フォーマットは"%1$s:%2$s:%3$s" %[filename, linenum, line]でいけました
>>501 499も実は私なのですが、498のプログラムのwordpatternに複数行にも
マッチする正規表現を指定できるようにして、それでいて表示にファイル名と行番号も表示できるようにしたいです
re = /なんか正規表現/
linenum=1
curtext=nil
IO.foreach(path) {|line|
if nil==curtext
curtext=line
else
curtext+="\n"+line
end
if 途中までまっち
linenum+=1
next
else if 完全まっち
print.call(path,linenum,curtext)
else
curtext=nil
end
linenum+=1
}
503 :
498 :2008/05/12(月) 00:17:51
できたー とりあえず動いてるっぽいです #!/usr/bin/env ruby require 'optparse' if $0 == __FILE__ printpattern = "%1$s:%2$s:%3$s" # filename:linnum:line print = proc { |filename,linenum,line| STDOUT << (printpattern %[filename, linenum, line]) << "\n" } filepatterns = wordpatterns = [] ARGV.options { |opt| dest = wordpatterns opt.on('-f' , '--filepattern') { dest = filepatterns } opt.on('-w' , '--wordpattern') { dest = wordpatterns } opt.on('-p S' , '--printpattern S') {|s| printpattern = s } opt.order! { |v| if wordpatterns.__id__ == dest.__id__ v = eval(v) end; dest << v } } wordpatterns << /\n/ re = Regexp.union(*wordpatterns) text = '' filepatterns.each { |filepattern| Dir.glob(filepattern) {|filepath| next if !File.file?(filepath) linenum = 1 text = IO.read(filepath) text.scan(re) {|m| linenum += $~[0].count("\n") print.call(filepath, linenum, m) if "\n" != $~[-1] } } } end
>>503 > filepatterns = wordpatterns = []
> if wordpatterns.__id__ == dest.__id__ v = eval(v) end; dest << v
filepatterns も wordpatterns も同じだろ、これ。
505 :
498 :2008/05/12(月) 07:55:20
filepatterns = []; wordpatterns = [] にしますた
perlの基礎的なスクリプトをたくさん公開しているサイト(KENT WEBみたいな)はいくつかありますが、 rubyのこのようなサイトはないのでしょうか? 今までperlで改造を行っていたのですが、 研究室でrubyを使うことになったので勉強ついでに乗り換えようと思ったんですが…
python使った方がいいと思うよ。
…そーいえば無いな
あれは日本のperl(というかCGI)の黎明期に乗ったサイトだから仕方ないか
PHPにも無いわけだし問題ないかもしれん
>>506 研究室で必要な部分だけ習うだけにしておいたほうがいいぞ
>>506 今まで見た事はないな
そもそも「rubyでCGI」自体がかなりマイナーだから
CGI前提のスクリプトも数えるほどしかない
Web上の解説記事や書籍を頼りに、自力で何とかするのがいいと思うよ
もしくはCGIスクリプトに関してはperlに頼るか
ありがとうございます。やはり無いですかー… CGIに関しては今まで通りperlで作ることにします。
何かの言語でCGIが作れるようになったらあとは言語問わずに作れるはずだけどね。
CGI作るなんてネットワーク技術者か?それともHTTPD製作者かよ?
>>506 本ならたくさんあるよ。Ruby CGIでググれ。
ただ、ほとんどPerlと一緒だから面白みはないけどね。
動いてるruby-webアプリなら、tdiaryとかbitclustのソース読むとかしてみれ。
>>512 tdiaryのソースはおすすめせん。bitclustなら許す。
鯖管としてはRuby CGIは止めて欲しい。
まあRubyに限った話じゃないだろうけどね 自作CGIなんて動かして欲しくはないわな
日本ならtd/hiki動かしてる人はたくさんいるだろう。まあ、railsでtypoをとか 言われたら断りたくなる気持ちはおいらも分かるけど。 その辺はruby1.9/rails3あたりで解決してるといいなあ。
class Object def tac yield(self) end end [[1,2],%w[sys cpu]].tac{|src|src[0].zip(src[1])}.tac{|src|Hash[*src.flatten]} => {1=>"sys", 2=>"cpu"} このtacに相当する標準のメソッドってありますか?教えてください
同じではないがtap Ruby1.9のメソッドだったがプレビュー版1.8.7にも入ってる おそらく次の安定版Rubyでは標準で使えるだろう
配列の配列をハッシュに変換する方法、という意味かもしれない そういえば、なんで標準で「一気にハッシュに変換・登録」ができないの?
521 :
518 :2008/05/13(火) 00:30:14
>>519 一時変数を使わずにlispみたいにゴリゴリ書ける方法は無いかなぁと思って
tapを参考に作ったんですが…
標準には無いってことですか
>>520 キーにまつわる標準的な例外考えるのめんどくさいんだと思う
[[1,'one'], [1,'いち']] が {1 => 'いち'} になったらやっぱ例外出すべきだよな、とか
Hash[*[[1,2],%w[sys cpu]].transpose.flatten]
WxRuby2についての質問です。 RubyGemsを使って、wxruby-1.9.6-x86-mswin32-60をインストールしたのですが 付属のサンプルを実行しようとすると、wxruby2.soの読み込みで 「lib/wxruby2.so: 126: 指定されたモジュールが見つかりません。」 と言われてしまいます。何か他に、インストールが必要なものがあるのでしょうか? (WxWidget2.8.7をインストールしてみても、やはり同じエラーが出ました) OS: Windows XP ruby: 1.8.6 [i386-mswin32]
>>524 > (WxWidget2.8.7をインストールしてみても、やはり同じエラーが出ました)
PATH通してある?
1.9.7が出てるようだから試してみるといいかもしれない ただVC8でコンパイルされてるからまずそうな気もする wxruby-1.9.6-x86-mingw32.gemをダウンロードして入れる方が楽かも
527 :
524 :2008/05/13(火) 17:54:03
mingw版をインストールしたら普通に起動できました(WxWidget無しで)。 助言ありがとうございました! ちなみに1.9.7は、次のようなエラーでgemのインストールすらできませんでした。 rake (RUBYLIB等の位置を指定するオプション) extension rake aborted! Don't know how to build task 'extension'
たった6時間前に登録された質問じゃん。 青木さんのコードとか、Pickaxeのコードとかいくらでもあるでしょ。
真面目に答えようとすると難しそうだな それにしてもRubyに限らず定番回答なんて存在するのか? 知ったか的なのならいくらでも挙がりそうだが
net/pop.rbとかはどうだろう。 POPはプロトコル自体も小さいし。 初心者に800行近いのは無理か・・・ mailread.rbはたしかに短いけど、initializeにいっぱい詰めるのは好きじゃないんだよなあ 完全に漏れの好みの問題なんだけどさ。
コードなんて動けばいいんだよ こういうコードを書くべき、なんてどんだけ 上から目線なんだよ
まったくプログラムできないんだけど、Rubyを始めてみようかと思ってる。 理由は名前がかっこいいのと日本の方が作ったということで分かりやすいのかなぁと思ったことから。 ただ理由がこんな感じだから、勉強しててもただやり方を覚えるだけの作業のような気がしてならない。 何か作りたい物があれば、そのために勉強していけると思うんだが。 みなさんがRuby(プログラム)を始めたきっかけってなんですか?
今から餌撒きかー 頑張れよー
Rubyを止めたきっかけはPythonでいいと思ったから。
>>534 CGI書くときにPerlが嫌で、他の言語を探してたらRubyに当たった
とりあえず、書籍読むなり誰かが書いたコード読むなりして
自分に合いそうだと思ったら始めてみたらいい
目的が欲しいなら、CGIスクリプトか自分用のファイル処理スクリプトでも書いとけ
ゲームが作りたいならそれを目標にしても良い
>>534 プログラムを始めたきっかけ: 情報工学部に入ったから
Rubyを始めたきっかけ: Perlになんとなく嫌気がさしてたときに、研究室の先生にRubyをすすめられたから
Rubyを始めたきっかけ: 昔いた会社の社長が気まぐれでMatz本買ってきてRubyおもろいと言いだした Rubyを使うようになったきっかけ: 256本邪道編読んでOfficeだのをいぢりだしてから
>>519 >>518 を見てそれ tap じゃんて思ったんだけど、
tap って self を返すんだっけか?
selfを返す。 途中に挟んで(ワイヤタップして)、何事もなかったようにメソッドチェーンが進む。
542 :
デフォルトの名無しさん :2008/05/14(水) 01:55:51
>>534 Perlでの「もっと普通にプログラムかかせろ!」という不満から。
ベターPerlから入ったが、今はPerlとは全然違うものと感じている
Rubyだけしか知らないつまらない人間にならないために必要な言語ってなんですかね
>>543 Python
Scheme(かGauche、なんでもいいからLisp処理系)
Haskell
この3つ
あと基礎素養としてのCな
Perl5とPHP5は身近に使う機会があるならそっち憶えてもいいかと
JavaやVisualCやC++や.net関連は仕事で必要なら勉強させられるし
仕事で使わないのなら自分から憶える必要は全くないのでスルーでOK
日本語とか英語とかそういう自然言語のレスがあると予想
SchemeというかGaucheは今ちょっと勉強してる let を元にして let* と fluid-let と letrec というのを作った奴はどうかしてる もう少しわかりやすい説明的名称にするか全く新しい名前を付けるべき
>>543 Rubyをきちんと学んでればそうそう変なことにはならないはず
再帰とか継承とか本当にきちんと理解した?
Rubyで憶えられないのに他の言語に手を出したって無駄だぞ?
C系記法の言語を1個覚えると応用が利く。
漏れもCがいいと思うよ。 拡張も作れるし。
Lisp系は解るがPrologは本気で解らん カットで詰まった俺
CつーのはALGOL系の何かということなのか、 グルーピングに{}を使う言語程度の意味でいいのか。
記法ウンタラ言う人は無視しておk
>>544 > あと基礎素養としてのCな
俺ならLispも基礎素養の方に入れるな。
554 :
デフォルトの名無しさん :2008/05/15(木) 22:38:28
Rails初心者です。 rubyをインストール(c:\ruby)後、gemsにてRailsをインストールしました。 そして、MYSQLをインストールしたが、apacheも必要とわかり、MYSQLをアンインストール後 XAMPPをインストール(c:\xampp)。 ウェブアプリ作成用フォルダをc:\rails\を作成し、 テストをc:\rails\testで制作したがrhtmlが上手く表示されないので、教えて下さい。 コマンドプロントで c:\rails>rails test でフォルダ一式を作成した。 その後、WEBrickにて[localhost:3000/]アクセスすると初期画面は表示されました。 さらに、コマンドプロントで c:\rails\test>ruby script\generate controller main と指示を行い、c:\rails\test\app\controllersにmain_controller.rbがきちんと出来ていました。 main_controller.rbの内容→class MainController < ApplicationController end 次ぎにmain_controller.rbをテキストエディタで「def index」でアクションを追加し、 c:\rails\test\app\views\mainのフォルダの中に「index.rhtml」を作成しました。 index.rhtmlの内容→<html><head><title>あいさつ</title></head><body><h1>こんばんは</h1></body></html> それで、WEBrickにて[localhost:3000/main/index]にアクセスすると MissingSourceFile in MainController#index とエラーが出てしまいます。 どうか解決法を教えて下さい。
Mac で使ってます。
rubygems をインストールしました。
で
gem install proggresbar
を実行したのですが
Bulk updating Gem source index for:
http://gems.rubyforge.org/ /usr/local/lib/ruby/site_ruby/1.8/rubygems/specification.rb:556: [BUG] Segmentation fault
ruby 1.8.6 (2007-09-24) [powerpc-darwin8.11.0]
というのがでてしまいます。
どのようにすればいいのか教えてください。
557 :
デフォルトの名無しさん :2008/05/16(金) 19:05:44
558 :
デフォルトの名無しさん :2008/05/16(金) 21:04:29
生POSTを取得したいのですが、どうにも分かりません。 PHPなら、 $stdin = fopen("php://input", "r"); で開けて、EOFまでぐるぐる回すのでしょうが。 Rubyではどうするのでしょう?? ちなみにフォームから送られてくるのは、XML形式のデータです。 お願いします。
…なまぽすと? require 'cgi' cgi = CGI.new params = cgi.params という記述をした CGI に POST すると、params に適当なハッシュが登録されるから適当なキーで取り出せ 値は1個でも配列になってるから注意な こんなんでどう?
CGIスクリプトで? 標準入力を読めばいいだけじゃないの?
>>555 rubyはどうやってインストールしたやつ?
それとOSのバージョンは?
Mac用バイナリはビルド方法が間違ってるという話だが、直ったのかな。
> /usr/local/lib/ruby/site_ruby/1.8/rubygems/specification.rb:556: [BUG] Segmentation fault
556行目は何?
562 :
デフォルトの名無しさん :2008/05/16(金) 23:06:22
>>559 ありがとうございます。
params=cgi.params
で、paramsにkey => "<?xml version" になって、その後の部分がvalueになりました。
とりあえず、取得はできました。
もうすこし、きれにとれないかしら?
>>560 ありがとうございます。
CGIです。
標準入力って、STDIN.getsとか?でしょうか??
やってみましたが、空っぽでした?何か大きな勘違いかもしれません。
つうかどういうPOSTの仕方してるんだ?
CGI.new した時点で標準入力はカラになってると思うよ CGIモジュール内部でも標準入力を読み込み→パースしてるわけだから
CGi.newしたら内部でinitialize_queryメソッドを使ってPOSTデータは 読み込みきってフォームパラメータ(application/x-form-encoded)や マルチパートとして解析してしまうので、そうでない形式ならCGI.new せずに標準入力を読まなければならない。
>>558 >>562 もしかして、XML文書をリクエストボディに直接入れてPOSTしたいって意味か
フォームとか使わずに
そういう用途であれば、cgi.rbを使っている限り対応は不可能なので
他のライブラリに乗り換える必要がある
標準で済ませるならwebrick/cgi、外部ライブラリに頼るならRack
あと質問するときは「生POST」のように曖昧な書き方ではなく、もっと具体的に
CGI.newする前に標準入力読んで, $stdinにStringIOを突っ込むとかするばできそうな気がしないでもない
舞波ってw くまくまーの人か
570 :
デフォルトの名無しさん :2008/05/17(土) 03:44:46
571 :
デフォルトの名無しさん :2008/05/17(土) 05:01:08
>>568 そうそうたるメンバー?じゃないか
これは買わねば
572 :
デフォルトの名無しさん :2008/05/17(土) 06:42:04
>>570 の続きです
var xml = "<a><b>c</b><b>d</b></a>";
new Ajax.Request(url, {method: 'post', postBody: xml, asynchronous: false, contentType: 'application/xml'});
prototype.jsをつかって上のように非同期でpostデータがきます。
それをRubyで捕まえようとしたのですがうまくいかず質問させていただきました。
573 :
デフォルトの名無しさん :2008/05/17(土) 07:31:01
>> 560
>>564 >>567 ありがとうございます。
結局、CGI.newが先に来ていたので取れなかっただけでした。
a=STDIN.gets
ですんなり行きました。
574 :
554 :2008/05/17(土) 18:42:41
>>556 さん
ありがとうございます。
すべて、一旦アンインストール(Ruby MYSQL Apache)をして、[Railsのアンインストール方法が分からないですが・・・]
InstantRailsをインストールしてみます。
IDEも初めて目にするのですが、いろいろ勉強してみます。
また、壁にぶつかった時は、どうかご教授下さい。
575 :
556 :2008/05/17(土) 21:14:36
576 :
555 :2008/05/17(土) 21:53:36
>>561 お返事ありがとうございます。
ruby は ./configure && make && sudo make install でインストールしまし
た。OS は 10.4.11 をつかってます。
/usr/local/lib/ruby/site_ruby/1.8/rubygems/ の556 は
@@non_nil_attributes.each do |name, default|
value = case default
when Time, Numeric, Symbol, true, false, nil then default
else default.dup
end
の when Time, Numeric, Symbol, true, false, nil then default です
よろしくお願いします。
577 :
デフォルトの名無しさん :2008/05/18(日) 09:39:51
クラスを作っています。 クラス変数の一度の宣言で、 Klass.new do |k| k.high 30 k.width 40 end klass = Klass.new klass.high = 30 klass.width = 40 klass = Klass.new(:high => 30, :width => 40) の全ての記法に対応出来る方法ってあるでしょうか? attr_accessorは知っているのですが、真ん中の記法にしか対応できないですよね。。 どなたかご存じの方宜しくお願いいたします。
そういうメソッドを自分で作る(attr_accessor も実態はただのメソッド)
正直、普段から使うほうとしてはどれかひとつに限定して制限してもらったほうが落ち着く インスタンスへのアクセサでもメソッドへの通常引数(順番重要)でもハッシュ引数でもOK、というのはちとしんどい
580 :
577 :2008/05/18(日) 13:31:45
>>578-579 ありがとうございます。
それを聞きattr_accessorが用意されているのでそれで統一したいと思ったのですが、
klass.high = 30
klass.width = 40
とずらずらオブジェクト変数を書くのが面倒です。
みなさんずらずら書いていらっしゃるんでしょうか。
それとも何かいいやりかたがあるんでしょうか?
> とずらずらオブジェクト変数を書くのが面倒です。
>>577 のは全部ずらずら書いてるように見えるが?
普通にinitializeの引数にすればいいじゃないの
他の2つのが良く見えるのなら、メソッドにブロックかハッシュを渡せるようにするだけ
全部出来るようにするメリットは無いよ
未初期化を許容するインスタンス変数以外はコンストラクタの中で埋めてやらないとまずいと思うな
ずらずらと書く程沢山フィールドが存在する時点で 何かが間違ってるような気もする。
584 :
577 :2008/05/18(日) 14:12:05
>>581-583 ありがとうございます。コロコロ変わって申し訳ないんですが、
未初期化が不味いインスタンス変数がいくつもあるのでコンストラクタでハッシュを取ることにしました。
class BarGraph
def initialize(x)
@high = x[:high] or 300
@width = x[:width] or 200
etc..
こんなもんでいいんでしょうか。。
585 :
577 :2008/05/18(日) 14:13:24
すいません。orは||です。
>>583 それの解消は単に initialize に書かなくなったってだけで、他のメソッドの引数が増えるだけだと思う
処理に必要な外部入力の量っていうのは一定だと思うぜ
>>585 意外と知らない人が多いけど、Rubyではorも使える
>>587 @foo = nil or 2
としたとき、@foo の値は?
本筋からは外れるが high じゃなくて height じゃないか
foo = (nil or 2) puts foo => 2
591 :
587 :2008/05/18(日) 14:28:50
>>588 が危険だから or は使われないんだよな
知らないわけじゃなくて、結合度の関係で意図的に避けられているだけだ
理解してれば普通に使うだけだろう
結合度表が頭に入ってるって人は旧い人を除いて稀だと思う 表を確認するくらいなら () で括るし、面倒になってきた人はあらかじめ || だけ使うだろう 結合度によるバグは見つけるのめんどくさいバグだから or なら期待通りに動作するが || だと動かない、という例があった気がするがどこだったか
俺はテスト用のシェル紛いの簡易インターフェイス書くために while print('>>> ')or gets p eval($_)rescue p $! end なんてよく書いてしまう いやirbでも良いとは思うんだけどねw
結合度の他には || が式を作るのに対して、 orは文を作るってところか?
Rubyに文なんてないよ。
Windowsだけど、 rubyスクリプトをPowerShell上で直接動かすと、 別に、コマンドプロンプトが開いて、そこで実行しちゃうのはなんで? ./hoge.rb で実行すると、コマンドプロンプトが開いてしまう。 ruby hoge.rb だと、ちゃんとPower Shell上で動く。 pythonは ./hoge.py でもちゃんとPower Shell上で動く。 ruby 1.8.6 (2008-03-03 patchlevel 114) [i386-mswin32] と、 ActiveScriptRuby 1.8.6(p114) で確認。
>>599 拡張子の関連付けの問題じゃあなかろうか?
>>599 ASRインスコフォルダの bin に行って、ruby.batをいじってみんさい
603 :
デフォルトの名無しさん :2008/05/19(月) 14:18:14
文字列置換の質問です。 puts "hoge_mage-fuoo1.2.3".sub(/^(.+)-.+$/,$1) というのがirbだとうまくいくのですが、ファイルに書いて実行するとエラーになります。 in `sub': can't convert nil into String (TypeError) これを解決する代替案はどのようなものがありますでしょうか?
604 :
デフォルトの名無しさん :2008/05/19(月) 14:21:37
>>603 ああ、これFAQレベルの質問だ。
自己解決しました。
puts "hoge_mage-fuoo1.2.3".sub(/^(.+)-.+$/,$1)
かブロックで、
puts "hoge_mage-fuoo1.2.3".sub(/^(.+)-.+$/) { $1}
だ。
irbは2回やったから上手くいったんだ。
自分でメモまでしといたのに忘れるとは・・・。
605 :
デフォルトの名無しさん :2008/05/19(月) 14:22:06
>>604 修正
> puts "hoge_mage-fuoo1.2.3".sub(/^(.+)-.+$/,$1)
puts "hoge_mage-fuoo1.2.3".sub(/^(.+)-.+$/,'\1')
本当に本気でどうでもいいんだけど、 カッコとブレースの間って空白置く派が多いのかな? ){ のほうが個人的には気持ちいいんだけど
>>606 空白置く派だな。
標準添付のもほとんどそのはず。
>>576 自前なのか。
修正済のバグかもしれないので、1.8.6-p114とか1.8.7-preview3あたりで確認を。
それでも落ちるようなら、gdbでバックトレースを。
めんどくさいのでできればBTSに。
609 :
599 :2008/05/19(月) 20:07:42
結論を言うと、Rubyのせいじゃなくて、 環境変数 PATHEXTに.rbが登録されてないせいだった。 .pyはpythonをインストールした時に登録されてたらしい。 PATHEXTに登録されてない場合に、 関連付けでコンソールアプリが実行されると、 コマンドプロンプトが開くのがデフォみたい。 でも、いまいち納得できないな。 どちらにしろ、コマンドプロンプトなんか開く必要無いのに。
winの設計思想のなんたるか、だねえ じき滅ぶよ、きっと
人口に膾炙して10年以上も経ってるのにまだそんな口きくかね
んー、既に自滅した気が、なんて言ったっけ、VIS...
コンピュータが始まってまだ60年ぐらいしか立ってないから。 無くなるときは割とあっという間だと思うよ。多分携帯に駆逐される。
PC-98 って何で死んだんだろな
坊やだからさ…
漢字ROMに守られていた文化が 黒船に駆逐されたからでしょ
それまでは「パソコン」がプラットフォームの中心だったのが Windowsに中心が移ったから。
Windowsが本当に駆逐されたら困るなー、と思う反面
代わりにLinuxが台頭するのはちょっと見てみたいとも思う
>>606 俺は空白置かない(くっつける)派
標準ライブラリでは二派に分かれているようだ
(検索したら、空白置いてるファイルが置いてないファイルの二倍ぐらいあった)
WindowsにRuby/GDまたはRuby/GD2を使いたいのですが、どうすればいいですか? cygwinやcoLinuxではなくWindows上で直接動かす方法をご存知の方教えていただけるとうれしいです _ _
コンパイルしろ。
621 :
555 :2008/05/21(水) 23:42:24
>>608 返事が遅くなってすみません。
1.8.6-p114とか1.8.7-preview2 とかをインストールしたのですが
基本的に同じような結果になってしまいます。
>> gdbでバックトレースを。めんどくさいのでできればBTSに。
これはどのようにすればいいのでしょうか?自分なりに調べてみたいのですが
どうすればいいのかよくわかりませんでした。
>619 ちなみにmingw版でコンパイルしたsoはmswin32でもそのまま使える (libの下のso入れるとこに突っ込めばおk)
「みるみるRubygがわかる本」 は、初心者に勧められる入門書ですか? 購入なさった人、情報を持っている方など 感想等お願いします。
>>623 別に気にしなくていいんだけど、
立ち読みは表紙のイメージで記憶してるので書名で言われてもぶっちゃけ覚えてねー
ttp://www.amazon.co.jp/dp/4798019291 で、これな
「何が何でもとにかく『たのしいRuby第2版』との差額900円が惜しい人向け」
だ
900円がないと明日家賃が払えないけど
Rubyの本を何か持ってないと明後日異界に連れ去られてしまうとかそういう人向け
あ、あと、ある一定以上の重量の本を手に持つと骨が折れる人とか
3-*あたりを見るとJavaっぽいね。 RubyではgetEuroなんてまず書かない。 多分、to_euroとか
なんだ秀和か。 あそこの本は、よそで出てないネタを押さえてる本は買う価値があるが、 よそで出てるネタの本は微妙な出来のことが多いな。
>>627 とりあえずcaseのインデントが気持ち悪すぎる
Javaな奴にRubyの本を書かせるな めんどくさいから
>>631 やはりJava・・・・・・・なのか?
入門書ばっかり
しかも売上が微妙なのかレビューがほとんどついてないのばっかりか
Rubyは『たのしいRuby』いっとけで済むからいいよな サポートサイトのエラッタを見ても頭ひとつ抜けてる感じだ 無理やり難点を挙げるなら熱さやユーモアに欠けるぐらいか
本当は色々な入門書やら解説書やらが出ていいのも悪いのも結構ある、というのが理想 『たのしいRuby第2版』 し か な い というのが現実 スレ的には面倒がないが、言語普及的には好ましい状態ではない
Rubyで小金が儲かる、という状態でないとなあ Rubyの書籍は売れないから出しません、というような状況になるのはまずい
638 :
623 :2008/05/23(金) 22:23:55
皆さん情報提供ありがとうございました。 『たのしいRuby第2版』の情報等も参考にさせていただきます。
他言語を知ってるならピッケル本が良いんだが
641 :
デフォルトの名無しさん :2008/05/24(土) 10:10:42
Amazon/AWSのResponseオブジェクトをprintで出力すると 長々と内容まで出力してくれるのですが、ppで出力すると #<Amazon::AWS::AWSObject:0x2f82e04 ...>としか出力されません。 ppで整形した内容まで出力してくれるようにするにはどうしたらいいのでしょうか?
>>641 今こそソース読んでステップアップするとき
pp.rb を読むんだ
Rubyからaccessのmdbファイル内のレコードを操作するにはどうしたらいい?
win32OLEは便利だと思うけど、詳しい解説がどこにあるのかがわからない。 るびまは読んだんだけどなー
WIN32OLEクラスの使い方さえ覚えれば、 あとはWSHの話じゃないか?
WSHというか、あとはそのライブラリ自体のお話ってことだよねぇ。
AccessのVBAでマクロ組んで、Rubyからそのマクロを呼ぶのが一番簡単そう。 Rubyから呼ぶ必要があるかどうかは知らんけど。
実のところRubyはほとんど関係ないんだよな 単純にWindowsプログラミングの話になってしまう
>>649 本質的には system() で外部コマンド呼んでるだけだからねえ…
どんなときにどんなコマンドを呼び出すべきかってのはRuby関係ないわな…
651 :
643 :2008/05/24(土) 20:43:37
>>644 のリンク先の一行レコードを追加するスクリプトサンプルみると
conn = WIN32OLE.new("ADODB.Connection") 以降はvbaと同じっぽいのでなんとかやれそう
open-uri を使って ftp にアクセスしたい。
require 'open-uri'
uri = URI.parse("
ftp://hogehoge.com/bar/ ")
uri.user = 'foo'
uri.password = "fu/ha"
でエラー。uri/generic.rb の USERINFO(Regexp) が
/^(?:[-_.!~*'()a-zA-Z\d;:&=+$,]|%[a-fA-F\d]{2})*$/n
になっているのが原因で パスワードに '/' を含む事が出来ない。
URI.escape(password) をしても '/' はエンコードされず。
何か策はないでしょうか? (パスワードは変更できない)
open(uri) の uri にパスワードを含めれないのか?
net/ftp を使えばログイン出来るのだが、やりたいのは、
Pathname を使って ディレクトリを掘りながら put をしたい。
URI::USERINFO= /^(?:[-_.!~*'()a-zA-Z\d;:&=+$,\/]|%[a-fA-F\d]{2})*$/n とか
まあ基本的には無理だな 自前で書き換えるしかないわ スラッシュって含むことできたっけ?
655 :
652 :2008/05/25(日) 02:44:45
>>653 素敵。
しかし別の新たなエラーが。もう少し調べます。(そもそも
掘って put は出来るのか?)
ありがとうございます。
656 :
652 :2008/05/25(日) 02:57:43
わかった。open-uri は ファイルを扱うものなのか。 ディレクトリは扱えないのか。 失礼しました。
質問です。
#!/usr/local/bin/ruby
print "Content-type: text/html\n\n"
print "<html><body>Hello World</body></html>"
この内容の.cgiファイルを
http://land.to/newshiyou.php このレンタルサーバーにアップしたのですが。
500内部サーバエラーになってしまいます。
なぜなのでしょうか?どうすれば動かせるのでしょうか?
回答よろしくお願いします。
エラーメッセージの意味がわからんです おしえてエロイひと c:/ruby/lib/ruby/1.8/xmlrpc/parser.rb:152:in `fault': wrong fault-structure: {"f aultCode"=>"Client", "faultString"=>"Application failed during request deseriali zation: \nnot well-formed (invalid token) at line 6, column 345, byte 3640 at /h ome/seesaa/cpan/lib/i686-linux-thread-multi/XML/Parser.pm line 187\n"} (RuntimeE rror)
>>659 文字コードの知識もないspamブロガーさんこんにちは
>>660 そう見えるよなあ
投稿スクリプトをサンプルとして提供するのは止めたほうがいいと思うぞ
で、まあ、seesaaはShift_JISだったはずなのでShift_JISで送れ
>>658 CGIファイルのパーミッションを実行可能に変更していないのだと予想
663 :
658 :2008/05/25(日) 16:41:39
解決しました。 ありがとうございました。
【プログラム】 #! ruby -Ks class Ice def sizeIce(size) print(size) end end class IceName < Ice def initialize(name="未設定") @iceName = name end attr_accessor :iceName end class IceSize < Ice def initialize(size="未設定") @iceSize = size end def sizeIce(size) super(size) print("サイズです。\n") end attr_accessor :iceSize end ice = [IceName.new("メロンソーダ"),IceName.new("レモン&ライム"),IceName.new("スイカバー")] ice2 = [IceSize.new("中"),IceSize.new("小"),IceSize.new("大")] for k in 0..ice.size-1 print(k+1,"個目 ",ice[k].iceName,"は",ice2[k].sizeIce(ice2[k].iceSize)) end
665 :
664 :2008/05/25(日) 17:44:59
【表示される結果】 中サイズです。 1個目 メロンソーダはnil小サイズです。 2個目 レモン&ライムはnil大サイズです。 3個目 スイカバーはnil 【表示したい結果】 1個目 メロンソーダは小サイズです。 2個目 レモン&ライムは大サイズです。 3個目 スイカバーは中サイズです。 昨日からrubyの勉強を始めました。 初めてのプログラミングなので、わからないことが多々あり苦戦しております・・・。 上記のプログラムを実行するとエラー等は出ないのですが、表示結果が思い通りになりません。 なぜ一番最初に「中サイズです。」が表示されるのかすら理解できません。 一体どの部分に問題があるのでしょうか? わかりにくいプログラムだとは思いますが、もしよろしければ回答お願いします。 ※このプログラムは、練習目的で作っているのでわざわざ面倒なことをしています。
666 :
664 :2008/05/25(日) 17:46:44
訂正 【表示したい結果】 1個目 メロンソーダは中サイズです。 2個目 レモン&ライムは小サイズです。 3個目 スイカバーは大サイズです。 でした。すいません。
(半分ほど作り変えた時点で悩む) あー、まあいいや print は引数をその場で画面に表示し、返り値として nil を返す 表示部とデータ部を完全に分けて考えるべき 最終的なデータを最後に print で表示するだけ、という考え方な Ice.sizeIce で print を使っているのはよくない
てゆーか、継承の考え方がおーざっぱに間違ってね? 「アイスの価格」が「アイス」というクラスを継承するはずがない 「アイスの名前」や「アイスの価格」は「アイス」というクラスの変数であるべき class Ice def initialize(name=nil, size=nil) @name = name @size = name end attr_accessor :name, :size end data = [ ["メロンソーダ","中"], ["レモン&ライム", "小"], ["スイカバー", "大"] ] products = Array.new data.each do |a| products.push(Ice.new(a[0], a[1])) end products.each_with_index do |ice, i| puts "#{i+1}個目 #{ice.name}は#{ice.size}サイズです" end
抽象的に「アイス」があって、 「価格のあるアイス」とか「サイズのあるアイス」とか「価格とサイズのあるアイス」と 具体化...と考えているのかもしれないが、そういう継承の使い方はあっさり破綻するので やめたほうがよい。 まずは合言葉「継承は最後の武器だ」かと。
>>664 k == 0 の時の出力
中サイズです。
1個目 メロンソーダはnil
k == 1 の時の出力(最初の行は↑の行に続けて出力)
小サイズです。
2個目 レモン&ライムはnil
k == 2 の時の出力(は省略)
「?サイズです。」はice2[k].sizeIce(...)メソッド実行時の出力
「?個目 ***はnil」がループ内のprintの出力
最後のnilはice2[k].sizeIce(...)の返却値 # sizeIce(...)最後のprintの返却値
# k== 0 の時 print(1,"個目 ","メロンソーダ","は",nil) になっている
問題は「経験が足りない」事
もっとたくさんソースを書いて実行してデバッグすれ
マニュアルには「返り値」「戻り値」があるけど「返却値」はないな …なんで2種類あるんだ マニュアルくらいどっちかに統一せえ
672 :
664 :2008/05/25(日) 18:53:18
>>667-670 レスありがとうございます。
どうやら自分の言葉足らずだったようです。
現在こちらのサイトさん(
http://www.rubylife.jp/index.html )のRuby入門というところを一番上から進めています。
現在は「Rubyオブジェクト指向プログラミング」の「クラスの継承」の部分まで読み終えています。
ひとつの項目が終わるごとに、その項目で覚えたメソッド等を使ってプログラムを作る練習をしているのです。
なので今回は「クラスの継承」「オーバーライド」「super(引数)」の3つを使ったものを作ろうとしていました。
・・・と自分で考えたらあんな感じになってしまったのですが、このような使い方はそもそもおかしいようですね。
色々混ぜすぎて自分でも分けがわからなくなってましたし。
次回からはもっと処理を個別に分けてプログラミングするように心がけます。
クラスの継承は結構重要そうな感じだけど、実際はそこまで実用性があるわけじゃないのかな・・・。
一番最初に「中サイズです。」が出てきてしまう理由や、「nil」が表示される問題などは解決しました。
>>668 さんのような配列の書き方は非常にわかりやすい・・・次からはこのように表記したいと思います。
大変わかりやすく解説していただきありがとうございました。
673 :
デフォルトの名無しさん :2008/05/25(日) 20:35:05
すみません、マニュアルみたりしてるんですが、見落としてるのか分からないので、教えてください。 クラスの定義の中にたまに、「:」がでてくるんですが、:の意味を教えてください。 たとえば、 Railsだと、「t.string :title」な表現があったり、 インスタンス変数のアクセサを作るときは、「attr_accessor :x, :y」とかしますよね。 この:の意味が掴めないですorz class CreateArticles < ActiveRecord::Migration def self.up create_table :articles do |t| t.string :title t.text :description t.string :image_url t.decimal :price t.datetime :date t.string :vender t.string :category t.timestamps end end def self.down drop_table :articles end end
それはシンボルというものだ
というか、Symbol クラスのインスタンスだと説明したほうがいいかも Rubyのメソッド名や変数名は内部的に数値で管理されてる (2455番目に登録されたメソッド、とかそんな感じで、オブジェクトIDとは別物) シンボルは、その数値に文字でアクセスすることができる機構だ 結果として、「文字」でメソッド自体を指し示すことができる 普通に foo と書いたら foo メソッドが動いてしまって「foo というメソッド」を指し示すことができない しかし、そのとき「メソッド foo を示す登録番号」という指定の仕方ができるとしたら、「foo というメソッド」という指定の仕方ができる 腹減ってるので自分でも何書いてるかわからなくなってきた 試しに適当な変数作って、それと同じ名前のシンボルに to_i してみ それが内部整数値だ シンボルを id2name するとシンボルに対応する文字列が返る 時々「シンボルを文字列にする」という表現で説明されるがこれは本当は誤り
余計わからなくなるので
>>675 は読まなくてよし
もう遅いかもしれんが
677 :
デフォルトの名無しさん :2008/05/25(日) 21:31:28
>>674 >>675 さきほど、rubyの公式にアクセスできたので、FAQ見てたらシンボルということは分かったところで、余計に理解に苦しんでましたが、、、
>>普通に foo と書いたら foo メソッドが動いてしまって「foo というメソッド」を指し示すことができない
>>しかし、そのとき「メソッド foo を示す登録番号」という指定の仕方ができるとしたら、「foo というメソッド」という指定の仕方ができる
神レスありがとうございました!よく分かりました!!
500とかはいつものことだろ、と思ったが router2.netlab.jp で止まっててアクセス自体ができないな
SymbolとStringの違いは「優しいRailsの育て方」本が一番わかりやすかったな。 あのキモいアイドルAAを我慢できればの話だけど。
Rubyで作成したGUI上で動くちょっとしたソフトウェアを windowsクライアントに配布して利用してもらいたいとき、 クライアントのPCにもRubyをインストールしておかないと 実行できないでしょうか?
Ruby/Tk以外で作らないと駄目だな
>>682 、683
exerbを利用すればいいのですか。
新しいツールは、勉強もかねてRubyで作ることにします。
さっそく、本を買いに行ってきます。
レスありがとうございました。
rubyscript2exeもどうぞ。
おいおい、Rubyで自分以外のためにGUIツールを作るなんてアホのすることだぞ 渡されたほうも迷惑だからそういうことはやるな
じゃあ、何で書くのがいいのさ? C#とか?
うん、あのね、どうやら 「もともとのGUI対応」 「付け足しのGUI対応」 の区別がつかないらしいんだ、初心者の人
そんなにも区別すべきなのか、というのも興味深い問題だと思うぜ まあ、とってつけたGUIシステムで火傷したことがある人ばかりだから不評なんだけどさ
Winで動かす物はMSの道具立てでやった方が、楽だし誤解や面倒ごとも少ないのは確かだしな まあ仕方ないさ
692 :
デフォルトの名無しさん :2008/05/27(火) 15:14:16
一行が長くなって読みにくい場合、改行したくなるのですが、 どうしたらイイですか?
>>692 改行すればいいじゃん?
バックスラッシュ \ を使えば改行を隠すことができる
他にも「区切れのいいところ」で普通に改行することもできるが、
このへんは他の人のスクリプトを読んで参考にするといい
動的メソッドって?
Rubyの奥義のひとつ(いやRuby以外でもできるけど) 動的に定義されて動的に実行されるメソッドの8割は本当は静的でもなんとかなる
実行するまで在るか無いかわからないってこと?
マクロの代わりに使う例も多いと思う。
Railsレシピブックのほうに目が行ってしまった
700 :
デフォルトの名無しさん :2008/05/30(金) 18:24:17
#!/usr/bin/env ruby -Ku とファイルの先頭に書いて実行すると、 env: ruby -Ku: No such file or directory と言われてしまいます。 envで-Kuをつけたいのですが、 言われないようにする方法はどのようなものがありますでしょうか? 環境は FreeBSD 6.1-RELEASE-p23 です。
基本的には小手先では無理 env コマンドは複数の引数をうまく受け取ることを期待できないし、環境によっても動作が違う たとえば、その記述は同じ FreeBSD の 5.x では期待通りに動作する
いやenvがどうこうというよりカーネルが…
あ、どうするかだっけ #!/usr/local/bin/ruby -Ku と書くこと ダウンロードして即実行できないことについて文句言う的外れのアホは無視 実行するスクリプト内容を確認しないような人間をユーザーに引き込むと後々癌になるぞ で、自前で複数環境で使いたい、という場合が問題なんだが
>>700 shebang行(#! で始まる)に渡せる引数は1つ、という実装が多いから無難なのは、
#!/usr/bin/env ruby
$KCODE='u'
ruby -Ku と $KCODE='u' はカレーとウンコくらい違う ちなみに Ruby1.9 ではカレーとウンコが同じになった
>>705 あれ? $KCODEは無視されるんじゃなかったか?
warning: variable $KCODE is no longer effective; 値を参照しても代入しても常に nil という頑なな感じの動作
end end end end ))))
709 :
700 :2008/05/31(土) 04:50:05
調べたらFAQ的な質問みたいですね。
解決法
・フルパスでrubyのパス記述
>>703 ・$KCODEで指定
>>704 パス関係なくするためにenvにしたかったけど、意味ないなあw
ところで、$KCODEで指定する場合は、
ファイルが本当にUTF-8の文字列(例えば日本語)を含んでいても大丈夫なんでしょうか?
大丈夫
712 :
700 :2008/05/31(土) 06:33:23
>>710 ありがとうございます。
では、ちょっとずれてくるのですが、
>>705 の
> ruby -Ku と $KCODE='u' はカレーとウンコくらい違う
というのはどういう違いなのでしょうか?
どこかに簡単な解説などないでしょうか?
713 :
700 :2008/05/31(土) 06:34:05
いえ、気になったというより、変なところでハマりたくないので知っておきたい、 といった理由からです。
問題になることがあるのはShift_JISの場合。 EUC-JPはUTF-8にはそういう性質はない。 -Kを指定してあれば日本語を識別子に使うこともできるが$KCODEでは無理 という違いもあるが、それは正直お薦めしない。 ちなみに-Kは1.9でもきくが、マジックコメントのほうが推奨。 #!/usr/local/bin/ruby # -*- encoding: ut-f8 -*-
#!/usr/local/bin/ruby # -*- coding: utf-8 -*-
HOME['ENV'] って何だよ・・・
今なら下がお勧め
721 :
デフォルトの名無しさん :2008/06/01(日) 01:28:02
mod_rubyを動かしたいんですが以下のようなエラーが出て動きません。 どうすれば動くようになりますか? apache -t apache: Syntax error on line ??? of C:/〜〜/httpd.conf: Cannot load C:/〜〜/modules/mod_ruby.so into server: \x8ew\x92\xe8\x82\xb3\x82\xea\ x82\xbd\x83v\x83\x8d\x83V\x81[\x83W\x83\x83\x82\xaa\x8c\xa9\x82\xc2\x82\xa9\x82\ xe8\x82\xdc\x82\xb9\x82\xf1\x81B 環境 Windows Vista Apache2.2.8
>>721 あなたの頭とOSが腐ってるのが原因ですね。
頭のほうはもう手遅れなので、OSの方をdebianなどに変えてmod_rubyを
apt-get一発でインストールすればどんな馬鹿でも使えるようになります。
>>722 〃∩ ∧_∧
⊂⌒( ・ω・) はいはいわろすわろす
`ヽ_っ⌒/⌒c
⌒ ⌒
文字化けしてるが、Shift_JISで 「指定されたプロシージャが見つかりません。」 と書いてあるようだな。 mod_ruby 指定されたプロシージャが見つかりません。 でぐぐるとわかるかもよ。
現在実行しているRubyファイル自身のpathを取得できる特殊変数(?)というのはありますか? 宜しくお願いします!
事故解決しました __FILE__
Rubyを使いたいのだけれど使う機会が無い。どう転べばRubyを日常使用する変人になれるのか。最初にそれを説かなければ信者は増えないだろうと思う。
>>728 君には必要ないよ
必要のないものに固執する必要はない
楽になるといい
>>728 Project Euler とかお勧め。
>>730 Ruby関係ないというかRubyでやるくらいならSchemeかPythonかC++でやる。
目的を達成するのに一番便利な言語を選べばいいじゃん。 別にこだわりはないな。
rails使えば
まあ、みんながみんなプログラマーになる必要はないわな。 Rubyに早くなれたかったらUnixかLinux使いえばいい。シェル操作が日常に なれば、ごちゃごちゃしたものをスクリプトで一気になにかするのが快感になるはず。
俺は cmd.exe を使うようになってRubyの使用頻度が格段に増えた しょぼいコマンドプロンプトの補助としては優秀
736 :
デフォルトの名無しさん :2008/06/07(土) 13:07:20
俺は、バッチファイルで書くのが嫌になったころからだな。 unixではシェル書くのがいやになったころから
737 :
デフォルトの名無しさん :2008/06/07(土) 13:08:08
シェルじゃねえ、シェルスクリプトだ。すまそ。
rubyの正規表現でhtmlファイルの中から<html>の様に<>で囲まれた 文字列を取り出すにはどのようにすれば良いですか ^<.*>$まではわかったのですが <br>のように直前に文字列が存在するタグはとりだせないのです f = open(ARGV[0].to_s) while line = f.gets if /^<.*>$/ =~ line puts line end end f.close よろしくお願いします。
^や$(行頭と行末の位置にマッチ)を付けない。 さらに、.*だと欲張りマッチ(可能な限り長い対象にマッチ)になるので、 <h1>....</h1>に遭遇したときに全体にマッチしてしまう。 これを避けるためには、?を後ろに付けた .*?(欲張りでないマッチ)を使う。
>>739 ありがとうございます。
しかもアドバイスまで
ありがとうございます
>>739 ああ〜テストしてみた所
a<html>
とかが表示されてしまいました
こうではなくて
a<html>とかの行からも
<htm>だけきりだしたいのですが・・・・
正規表現の中に()を書くと、括弧の内容を後で利用できる。 /(<.*?>)/ でマッチした後、$1というグローバル変数に<html>とか入ってるはず。
実用の上で正しい回答は「自分でコード書かずにhtmlsplit使え」
もちろん学習用としてなら意味はあるけど
>>741 行全体(line)をそのまま表示しようとしているのが原因
マッチした部分($&)だけを表示させるようにするか
もしくは742の言うとおり、括弧と$1を使う必要がある
さらに言うと、そのスクリプトだと一行で一つのhtmlタグしか切り出せない
全てのhtmlタグを切り出すには、もう少し変更が必要
マッチするかどうかを試験する、ということと マッチした部分を取り出す、ということは違う 方法はいくつかあるが、概念的にめんどくさくないのは文字列に対してscanを使うこと "a<html>b".scan(/<.+?>/){|match| p match } 結果: "<html>"
>>743-744 まとめるとどのようになるのでしょうか
最終的には
htmlファイルを指定すると
そのページ内に存在するファイルを
音楽、動画、画像などに仕分けして
そのURLをファイルに書き込んでくれてwgetなどで簡単にダウンロードできるようにしたいんです。
… rubygem の mechanize 使え <a href> で表記されたリンクをすべて抽出してアクセスして適当に保存までしてくれる ネット上にあるページではないローカルにあるHTMLファイルを読み込まなければならない場合若干面倒だが
とりあえず地道にやってみるならリンクされてるAタグでのhref="〜"部分を切り出して リンク咲の拡張子なりで分類するとか
だから目的のものが出るまでscan繰り返せばいいじゃんよ scanのマニュアルとか読んでくれたか? 文字列.scan(/タグ抽出/){|タグ変数1| タグ変数1.scan(/httpで始まる半角文字列/){|URLっぽいもの| 動画URL一覧配列.push(URLっぽいもの) if URLっぽいもの =~ /動画拡張子/ 画像URL一覧配列.push(URLっぽいもの) if URLっぽいもの =~ /画像拡張子/ 音楽URL一覧配列.push(URLっぽいもの) if URLっぽいもの =~ /音楽拡張子/ } } File.open('動画.txt','w'){|f| f.puts 動画URL一覧配列} File.open('画像.txt','w'){|f| f.puts 画像URL一覧配列} File.open('音楽.txt','w'){|f| f.puts 音楽URL一覧配列}
>>746 そういうのが有ったんですね・・・・
なんだか自分が最初のアイデアって今では出せないんじゃないかって
最近思ってるんですよね。
何かアドバイスになる言葉を教えてください。
小学生の頃からプログラミングしていた根っからのプログラミング好きに
慰めの言葉を
hpricotだとこうか。 require 'hpricot' require 'open-uri' doc = Hpricot(open(URL) {|o| o.read}) puts (doc / 'a').map {|a| a['href']}
とりあえずは、初心者スレなので正規表現でscanするのが妥当かねえ なんとなくだが、外部ライブラリを利用するための基礎的知識もまだ危ういように見える 便利ライブラリはもうちょい納得してから使え
初心者スレであんまり「gemのlibhogeを使え」なんていわないほうが いいんじゃにゃいかな。そりゃ業務的には正解だけど、たぶん牛刀割鶏になってるよ。
rubygems に代表される公開ライブラリを流用するのは何故かというと 「自力でゼロからまたアレやるのめっちゃ面倒だ」 という認識があるからなんだよな 「面倒なアレ」という経験が無いうちから使うと後々悲惨な結果に 苦労は初心者のうちにしておくとよいと思う
あほらし
別に両方教えればいいだけじゃん
html = File.read('page.html')
html.scan(/<(.*?)>/) { p $1 }
と
>>750 の両方。
もちろん違う人が教えてもいい。
URI.extractでもつかっとけ
文字出力、正規表現の際に'可能'という文字を使用したいのですがうまくいきません。 試しに以下のスクリプトでテストしてみました。 ファイルをSJIS保存 puts '能' => unterminated string meets end of file ファイルをUTF8保存 puts '能' => '閭ス' となってしまいます。 どうすれば扱えるのでしょうか? どなたか本気でお願いします。
Shift_JISの場合は ruby -Ks hoge.rb で起動 UTF-8 の場合は ruby -Ku hoge.rb で起動
>>757 rubyは基本的に、何も指定しないと日本語を正しく扱えない
詳しくはリファレンスマニュアル(もしくは書籍)を読め
760 :
757 :2008/06/07(土) 21:39:01
ありがとうございます! 無事に出力&正規表現が実行できました。 ファイル毎に記述する癖をつけます!
761 :
デフォルトの名無しさん :2008/06/07(土) 22:46:14
String#split* という関数はどういう挙動なのでしょうか? 文字列がかえるので split().join と同じだと考えていたのですが どうにも違うようですし調べてもでてこないし リファレンス(コードでもいいので)ご存知のかたいたらおねがいします
1while などアンドキュメントな部分などの部分もご存知のかた いたら同様に示唆していただけたらありがたいです ruby 二日目であほなこといっていたらごめんなさい
String#split* なんて関数は見たことない split().join, 1while ともども簡単なコードも付けてくれると答えやすいかも あるいはどこに書いてあったとか
>>761 正直、Ruby の引数展開の * はあまり好きではない
あれは Ruby として明示的なメソッドであるべきだと思う
んで、引数の配列の直後に * をつけると展開して引数に渡される
arr = [1, 2, 3]
hoge(arr*)
は
hoge(1, 2, 3)
と同じ動作だ
文字列を split した結果の配列が展開されて渡されてるということだな
split は引数を省略すると空白で分割して配列を返すから
hoge('1 2 3'.split*)
は
hoge(1, 2, 3)
と同じ
正直、あまり明快な記述とは思えないので、自分から使うのは避けたほうがよい
>>763 , 764 ありがとうです。
>>763 ゴルフコードでよくみたのでこれなんだろーなっていう
shinh さんのとこから
tree = '(Root (Spine (Neck (Head)) (RClavicle (RUpperArm (RLowerArm (RHand)))) (LClavicle (LUpperArm (LLowerArm (LHand))))) (RHip (RUpperLeg (RLowerLeg (RFoot)))) (LHip (LUpperLeg (LLowerLeg (LFoot)))))'
tree.scan(/ \((\w+)/){puts"#$+ . #{a=$`.split*'';1while a.sub!(/\(\w+\)/,'');a[/\w+$/]}"}
ってなかんじで 1while はブロックをともなわない構文なのかなと perl と同じ
と思っていました while gets; end -> 1while gets でできるかんじ?
で split* があるのかなと考えたのは
>> "abcd".split*''
=> "abcd"
>> "abcd".split* ''
=> "abcd"
>> "abcd".split*('')
=> "abcd"
>> "a bcd".split*('')
=> "abcd"
>> "a bc d".split*('')
=> "abcd"
>> "a bc d".split*(',')
=> "a,bc,d"
>> "a bc d".split('')
=> ["a", " ", " ", " ", "b", "c", " ", "d"]
>> "a bc d".split('')
で返り値が array ではなく string なので引数展開ではないのかなーと
考えています
展開の * は前につくんだったと思うんだが hoge(*arr) あと、配列 * s が 配列.join(s) と同じ動作になるのは s が文字列だったときだけだぞ s が整数だったときには単に繰り返される だから、to_s や to_i が乱れ飛ぶ初心者のスクリプトでは紛らわしいから使ったら駄目 というか、そもそも紛らわしいから素直に join 使え
>>765 1whileはrubyの標準にはない。たぶんコードゴルフ用の拡張
ついでに言うと、初心者がコードゴルフを参考にするのは薦められない
あれは一般的に美しくない(分かりにくい)書き方が多いから
>>762 違ってたらごめんね
>> "abcd".split() * ''
=> "abcd"
>> print 1while true
1111111111111
>> while true; print 1; end
1111111111111
>>768 ruby のコードながめていたらおっしゃる通りだと思いました
1while でも 1 while でも同じことで kWHILE のみしかなかったでした orz
1 while() { ...} なども添付コードにあったので変態的な構文解析だなぁと
split() もそうだとおもいます
>> a="a b cd".split()
=> ["a", "b", "cd"]
>> a *''
=> "abcd"
>> a *'abc'
=> "aabcbabccd"
>> a.*'abc'
=> "aabcbabccd"
>> a.*''
=> "abcd"
コメントみなさんありがとうございました
Ruby1.6で書かれたクラスを利用しないとアクセスできないシステムがあります そのシステムはEUC_JPしか受け取れないため、他のエンコードを使用しようとした場合は変換したいと考えています ですがRuby1.6時代のKconvではUTF-8→EUC_JP変換ができません そこで質問なのですが ・Kconvに限ってRuby1.8のクラスファイルを利用する、などといったことは可能ですか? ・指定ファイルはRuby1.6、それ以外はRuby1.8というようにクラス/ファイル別にインタプリタを指定して実行することはできますか? 現在は一時ファイルに実行結果を書きとめておくことで疑似的に実現していますが、よりスマートな方法がありましたらご教示願います
nkf.cだけ差し替えてコンパイルしてみるとか。 よしだむ氏のuconvを使ってみるとか。
1.6のUTF8関連はuconv使ったような記憶がある というか、1.8で動かない上に書き換えも面倒な1.6のスクリプトって重症だなあ マニアさんが書いたようなスクリプトですかね
でっかーいスクリプトだと1.8対応にするのはゼロから作り直すに等しい作業になりそうだな 1.6で完全に動いてるならそのまま使いたいとこだろう Uconv試すのが一番だと思うぜ
UTF対応の外部NKFのラッパーを自前で書くというのはどう Kconvの中の人がやってることは同じだし 一時ファイル使ってる現状とほとんど変わらないような気もするけどな
776 :
771 :2008/06/10(火) 08:29:09
皆さんありがとうございました Uconvの使用が一般的な方法のようですので、まずはこの方法でやってみたいと思います
index.rhtmlからtest.rbをrequireすると エラーは出ないのですが、test.rb内に記述された関数群が利用できずにエラーとなります。 この拡張子でのrequireは無理なのでしょうか? もしそうであれば、どのようにファイル分けをすればよいのでしょうか? よろしくお願いします。
エスパー麻美の出番だな
エスパー…あさみ…?
ビーズで撃たれて死んでしまえ
魔女ステかよ
ダック・タイピングとよく言いますが、 オブジェクトが目的のメソッドを持っているかどうかの責任は、 プログラマにあるということでしょうか?
スクリプト言語でなおかつ動的にクラスもメソッドも追加可能な言語では 「ユーザー」と「プログラマー」の間が曖昧なんだよね
よくわからんが、処理系が実行時まで何もしてくれないことだけは確か。
Rubyのバージョンアップ方法に関してどなたかお力を貸して頂けないでしょうか。 現在CentOS4.5上で下記のパッケージでRubyを動作させております。 ruby-1.8.5-1.el4.centos ruby-docs-1.8.5-1.el4.centos ruby-libs-1.8.5-1.el4.centos ruby-irb-1.8.5-1.el4.centos ruby-devel-1.8.5-1.el4.centos ruby-ri-1.8.5-1.el4.centos ruby-rdoc-1.8.5-1.el4.centos ruby-tcltk-1.8.5-1.el4.centos 今回Rubyのバージョンを1.8.6へあげたいと考えておりますが下記の エラーに遭遇してしまい検索してみた物の./configureが出来ない状 態です。。 【エラー】 checking for C compiler default output file name... configure: error: C compiler cannot create executables See `config.log' for more details. 〜続く〜
787 :
786 :2008/06/11(水) 12:06:09
【config.logを見て該当すると思われる箇所】 gcc version 3.4.6 20060404 (Red Hat 3.4.6-9) configure:2530: $? = 0 configure:2537: gcc -V >&5 gcc: `-V' option must have argument configure:2540: $? = 1 configure:2563: checking for C compiler default output file name configure:2590: gcc conftest.c >&5 /lib/libc.so.6: undefined reference to `_dl_out_of_memory@GLIBC_PRIVATE' collect2: ld returned 1 exit status configure:2593: $? = 1 configure:2631: result: configure: failed program was: | /* confdefs.h. */ | #define PACKAGE_NAME "" | #define PACKAGE_TARNAME "" | #define PACKAGE_VERSION "" | #define PACKAGE_STRING "" | #define PACKAGE_BUGREPORT "" | #define USE_BUILTIN_FRAME_ADDRESS 1 | /* end confdefs.h. */ | | int | main () | { | | ; | return 0; | } configure:2638: error: C compiler cannot create executables See `config.log' for more details.
788 :
786 :2008/06/11(水) 12:08:41
【gcc関連インストールされている物】 compat-libgcc-296-2.96-132.7.2 compat-gcc-32-3.2.3-47.3 gcc-3.4.6-9 gcc-g77-3.4.6-9 gcc4-c++-4.1.2-14.EL4 gcc-objc-3.4.6-9 gcc-gnat-3.4.6-9 compat-gcc-32-c++-3.2.3-47.3 libgcc-3.4.6-9 gcc-java-3.4.6-9 gcc-c++-3.4.6-9 gcc4-4.1.2-14.EL4 gcc4-gfortran-4.1.2-14.EL4 gcc4-java-4.1.2-14.EL4 2日程格闘中ですが、お手上げ状態に近づいて来ました。。。 RPMで1.8.6があればいいのですが該当するものも無いため 今回tarからrpmをcheckinstallで作成しようと考えてお ります。。
>>787 に書いてあるがな。GNU libcの
`_dl_out_of_memory@GLIBC_PRIVATE'
がないんだろ。glibcを入れ直してldconfigしてみろ
790 :
786 :2008/06/11(水) 13:46:57
>>789 さん
助言有り難う御座います。glibc関連を弄るのは初めて
なので依存関係でしくじる気が凄くしますが取り敢えず
調べてやってみます。
oreilly.co.jp -- Online Catalog: 初めてのRuby
ttp://www.oreilly.co.jp/books/9784873113678/ > 本書を最後まで読めば、「Rubyリファレンスマニュアル」を自在に読みこなし多様なRubyライブラリを活用して、
> 自力で高度なRubyプログラミングを習得するだけの基礎知識が手に入るでしょう。
> Ruby1.8及び1.9に対応しています。
( ^ω^)おっおっおっ
夢のような書籍だなw
たった224ページじゃ無理だろと思ったら >他言語でのプログラミング経験を持つ人を対象に なるほど。エッセンス部分だけ凝縮することに成功すれば あるいは・・・・・・
魚を捕る方法を教える感じでなかなか好感が持てる 現状、9割くらいの人はオンラインのリファレンスマニュアル読んでるからな というか、リファレンスマニュアル自体にマニュアルの読み方の解説がないというのが情けない
また安いなw 最近のオライリーはどうなってるんだ,あれこれ安すぎるw
自分の部屋の本棚をオライリーで埋め尽くす・・・ そんな風に考えていた時期が僕にもありました・・・
798 :
デフォルトの名無しさん :2008/06/11(水) 19:58:37
2,310円?200ページとはいえ、オライリーにしてはえらく安いな
Learning Rubyの翻訳かと思ったら別の人が書くのか・・・ 当然のようにFlanagan x Matz本出してくるかと思ってたが マニングのMinimal Perlがオラから出てたりとかなんかカオスだな
801 :
高野光弘問題 :2008/06/11(水) 23:58:28
takano32,TAKANO Mitsuhiroこと高野光弘(日立製作所社員、日本UNIXユーザ会幹事)が、 自身の『32nd diary』で公然と日立の機密を開示し、障害者差別発言をしている問題。 1981年11月12日 千葉県のディズニーランドのそばで誕生 2001年4月1日 千葉大学に入学 2005年4月1日 千葉大学大学院へ進学、日本UNIXユーザ会に入会 2007年4月1日 日立製作所に入社、神奈川県秦野市の寮へ 2007年8月22日 「ついに職場で人が倒れた」と公表 2007年11月13日 「情報漏えい」を言う上司に「死んだほうがいいよ」と暴言 2007年12月28日 「社内システムクソうんこ」と発言し、仕組みも暴露 2008年5月23日 機密漏洩問題について一応の謝罪 2008年5月26日 「給料泥棒とかうんぬん言われた」と謝罪を忘れて告白 2008年5月27日 「心バキバキ川田くん」と前日の発言者の名前を公言 2008年5月31日 「キチガイ」と日立のユーザーに障害者差別発言を連発 2006年10月27日(日立製作所に入社前に忠告されたこと) 「日記やコメントの投稿日時から勤務時間に業務外のことをしていることが判明」は 某社の某親会社が 2ch で祭られたように、NG です。 6月も勤務時間中に更新し続ける高野光弘君の『32nd diary』にツッコミをどうぞ
で、rubyとどう関係あるのか まだ訊いてないんだが?
Ruby信者はあらゆるスレにRubyの話題を持ち込んでいるのだから、 逆にあらゆる話題がRubyスレに持ち込まれても、身から出た錆だな。
RubyってJavaのクラスローダーみたいな仕組みはないのですか?
「Javaのクラスローダーの○○の仕組み」と限定して欲しいとこだな
.jarとか.classとかを実行時に読むのに相当するならrequire、 Classオブジェクトを名前な文字列とかで引っ張ってくるならModule#const_get
ネットワーク上からRubyスクリプトを受け取ってそれに記述されているクラスを動的に定義したいんだけど
たとえば
script = URI("
http://host/matz.rb ").read
p script #=>
# class Matz
# def hige
# print "じょりじょり"
# end
# end
eval(script)
Matz.new.hige
こんな感じで実現できるんだけど
もっとスマートな方法は用意されてないの?
ファイルには書き出したくない。
Ruby で、現在のプロセス名を得ることはできますか。 やりたいのは、現在のコマンドが /usr/bin/ruby なのか /usr/local/bin/ruby なのか /usr/local/ruby1.9/bin/ruby なのかを知ることです。
ローカルファイルシステム上にないファイルをスクリプトとして読み込みたいとかいう需要に対してスマートも糞もねーよ(w require の中身は eval だからそれで正しい動作だ 我慢しとけ
>>810 > require の中身は eval
それは知らなんだ・・・
Rubyで、 メタ・プログラミングやコード・ジェネレーションを学びたいのですが、 その辺を詳しく扱っている書籍やサイトはないのでしょうか? ピッケル本とか読みましたけど、なでる程度しか載っていないので・・
>>812 今は懐かしい256シリーズの無道編でRaccをフィーチャー(というか宣伝)してる。
でも無知な俺は、Raccを本当に活用した例ってRDtoolしか知らない。
Rubyでメタプログラミングなら、強力なevalとmethod_missingで対応するDSLが主流だね。
ActiveRecordなんか、その最たるもの。
Rubyist Magazine -あなたのコードを添削します-
http://jp.rubyist.net/magazine/?0011-CodeReview DSLについて、一部参考になるかも。
815 :
デフォルトの名無しさん :2008/06/14(土) 18:53:09
プロパティを定義したいのですが、セッターがうまく働きません orz 以下のようにすると、2と表示してほしいのですが、5と表示されてしまいます。 どこが間違っているのでしょうか? #ruby -Ku class Calculator def initialize @unit = 5 end def unit=(value) @unit = value end def run unit = 2 puts @unit end end Calculator.new.run
self.unit = 2
self.unit = 2
818 :
デフォルトの名無しさん :2008/06/14(土) 18:56:17
self.unit = 2 だとうまくいきました 何だこの違い・・・ ほかの言語のプロパティみたいに使っちゃだめなのか
わかるまでは attr_accessor :unit とだけ書け。
820 :
デフォルトの名無しさん :2008/06/14(土) 19:02:42
この挙動はどういうことなんでしょうか?
ドキュメントのどこかに記載などありますでしょうか?
しかし、エラーなどでずに実行されるもんで子一時間悩んでしまいました
>>819 セッターを拡張したいときには使えません
あれは最小限のコードで実際のコードでは、最大値のチェックなどしています。
821 :
デフォルトの名無しさん :2008/06/14(土) 19:04:05
>>819 試しに attr_writerを使ってみましたが、やはりselfがいりますね・・・。
822 :
デフォルトの名無しさん :2008/06/14(土) 19:08:52
ああああ、わかた。 宣言が要らない言語だから、セッターのインスタンス省略すると ローカル変数への新規代入になるのか orz
>>822 Ruby以外はどんな言語を使ってるのか教えてくれまいか
ちょっと興味があるんだ
これは筋のよさそうな自称初心者
825 :
デフォルトの名無しさん :2008/06/14(土) 19:33:13
>>823 他にはDelphiを長年つこーてました。
Delphiだと属性でなくてプロパティなんですが、
上記コードのような形で問題なく、
selfなしでクラス内でプロパティに代入できます。
静的な言語のせいもあり、変数は宣言しないと使えないです。
なるほど、丁寧にありがとう 今度Delphiのコード見かけたら そこらへんちょっと気にして読んでみるよ
やさしいやりとりだな。いい感じ。
これは珍しく建設的なやりとり。
初心者側に「ピンと来る力」があれば、話は俄然充実するんだよ。
831 :
815 :2008/06/15(日) 06:40:18
>>830 おお、こんなところに記述が
やはりFAQなのですね。
わざわざありがとうございます。
attr_系の説明やサンプルは大概クラス外部からのアクセスのみかかれてますね。
a = [1,1] a.each{|i|a << a[-1] + a[-2] if a[-1] < 10000} p a
833 :
デフォルトの名無しさん :2008/06/15(日) 15:21:02
Rubyの入門サイト、書籍などを読んでいると 破壊的なメソッド、非破壊的な〜、みたいな表現をよく目にします。 Ruby以前の言語でも同じ概念は存在すると思うのですが、 Rubyにおいて敢えて強調されているのは何故なんでしょうか。 例えば、何か他の言語とは異なった考え方が必要になってくるのでしょうか。
>>822 NetBeans使ってると、unitは未使用ということでエディタ上に印が付きますね。
>>833 強調するのは、そりゃ、「2種類」あるからだよ
self を変更するかどうかって重要じゃん
puts させただけでそのオブジェクトがそれ以降文字列になったら悲惨じゃん
>>835 だから、その2種類の違いを他の言語より強調するのは何故か、という質問だろ。
他の言語がどの言語で、本当にそれよりRubyのほうが強調されているのかは俺はわからんが、
ともあれ比較の質問なら、Rubyの意志を比較で回答しないと納得はできんだろう。
例えば、javaでは メソッドへパラメータを渡すとき 配列とオブジェクトは参照渡し(rubyでいう、非破壊的・・の概念にあたる) プリミティブ型は値渡し(破壊的・・の概念にあたる) になってる。 ソースを見たとき、 Rubyのように明確になっているとは、ちょっといえないかもね。 Cだと、ポインタかどうかで判断する。 どうしてRubyはその辺を強調してるかだけど、 自由度が高いからじゃないかな? 上のJavaの例でいうと、参照渡しした元のオブジェクトを呼び出し先から 操作することは、Javaでは出来ない。 Rubyではその辺を任意にできる操作できるようにしたかったから、 出来る場合と出来ない場合を明確に表記して、わかりやすくしたかったのではないかと 推察します。
すみません。 >上のJavaの例でいうと、参照渡しした元のオブジェクトを呼び出し先から >操作することは、Javaでは出来ない。 上のJavaの例でいうと、値渡しした元のプリミティブ型を呼び出し先から 操作することは、Javaでは出来ない。 の間違い。 失礼しました。 参照渡し>>元のオブジェクトのリファレンス(アドレス、ポインタ)を渡す。(破壊的) 値渡し>>元のデータのコピーを渡す。(非破壊的) です。 混乱させるような、書き込みをしてすみません。
>>837 破壊的なのに!とか述語に?をつけるのはschemeからのいただきだろうな。
ただ、単なる慣用だから守ってないライブラリもいっぱいあるし深い意味はないんじゃね?
強いて言えば、識別子に!とか?が使えるってのを強調したかったとか。
C/perl/pythonは出来ないはずだし。
>>833 Rubyだから特別強調しているというわけではない。
Rubyに限らず、手続き(Rubyの場合メソッドかProcオブジェクト)を実行すると
きに、その手続きを実行する前から存在していたすべてのオブジェクトについ
て
実行後、状態が変化する可能性がある(から注意して使え)のが「破壊的」
実行後、状態が変わらないことを保証するのが「非破壊的」
うまく説明できないけどこんな感じだ。状態が変わらないというのは「同じ」
ということなんだけど、じゃあ「同じ」とは何かというのがなかなか微妙。
だけどこの話を始めるとなが〜くなるから、この辺でやめとくぞ。
>>838 ,839 はなんか間違って理解してるみたいだぞ
>>833 rubyの場合、他言語に比べてメソッドチェインの色合いが強いからじゃなか
他言語では戻り値がvoidになるようなものでも、rubyだとself返したりしてるし
でも述語に?を使われると、三項演算子がちょっと見にくくなるよね a = (isTrue?) ? 12 : 47
>>839 とりあえずJavaに参照渡しはない
プリミティブはもちろん値渡しだが
オブジェクトだって値渡し(参照の値渡し、あるいはcall by share)だ
とかいっても
>>839 は信じてくれないって俺は知ってるんだ
(´・ω・`) = (!isTrue?) ? !a.foo? : !b.foo?
hamlet = (to?) ? be : !be
>>833 単にメソッド名に!が付けられることを自慢したかっただけ。
848 :
デフォルトの名無しさん :2008/06/15(日) 19:15:36
>>833 オブジェクト使い捨てることによって生まれたメソッドチェーン主体の手法と、
従来のインスタンスへの変更を区別するためだろう
か
>>847 確かに、そんな気もしなくは無いですね…
850 :
デフォルトの名無しさん :2008/06/15(日) 22:04:22
rubyで日本語の分かち書きがやりたいよん
たとえば mecabを直に叩くか mecabのrubyライブラリを使うか mecabのデータだけを使わせてもらって自分でがんばるか
852 :
デフォルトの名無しさん :2008/06/15(日) 23:09:39
形態素解析だっけ yahooにもそんあ機能あったな
tiny segmenter なら辞書要らずでお手軽
matchdata = /[0-9]+/.match("foo=123;qoo=456;zoo=789") p matchdata.to_a # => ["123"] ["123", "456", "789"]を期待したんですが["123"]でした。 どうしたら["123", "456", "789"]を得られますか?
"foo=123;qoo=456;zoo=789".scan(/\d+/)
正規表現は「1回だけ」マッチするのが基本
m = /.+=(\d+);.+=(\d+);.+=(\d+)/.match("foo=123;qoo=456;zoo=789")
puts m[1],m[2],m[3]
結果:
123
456
789
文字列に対して繰り返した結果の配列が欲しい場合は
>>856 のようにString#scanを使う
scanにブロックを渡した場合は適当に部分マッチ結果が渡る
"foo=123;qoo=456;zoo=789".scan(/\d+/){|m|
puts m
}
結果:
123
456
789
マニュアルのStringとArrayとHashとEnumerableの4つだけは読んでおくといいぞ
Ruby1.8.6でメール送信フォームを作っています。 次のような流れで、送信する前に確認画面を設けたいのですが― フォーム送信(Html) ↓ 確認用CGI(Ruby)で処理 ↓ 確認画面の表示・フォーム送信(Html) ↓ 送信用CGI(Ruby)で処理 名前やメールアドレスといった文字列データは、 確認画面を経由させるのに問題ありませんが、 ファイルを添付させた場合、tempfileオブジェクトをどのように経由させればよいかわかりません。 今考えているのは、ファイル名だけを経由させ、 送信用ファイルでそのファイルを処理すればよいかと考えていますが、 FireFoxではtempfileのoriginal_files要素を取得してもフルパスを取得することができません。 フルパスを取得する方法、もしくはフォーム送信時の常套句的な方法があれば教えてください。
>送信用ファイルでそのファイルを処理すればよいかと考えていますが、 送信用CGIの間違いです。よろしくお願いします。
>>859 「確認CGIではファイル名取得だけ行い、送信画面でそのファイル名のファイルを実際に送信する」ということはできない
Webブラウザでは、<input type='file'> を POST する場合にしか、ファイル選択ダイアログとファイル送信はできない実装になっている
だから、入力画面のsubmitを受けたときにファイルは必ず受け取らないといけない(だから、あまり確認の意味がない)
受け取ったファイルをサーバで保持して、確認画面のsubmitが来たらファイルを実際に使用する、という手順にするしかないな
問題のひとつは確認画面でキャンセルされたときのサーバ側に残ったファイルの扱いなんだが、これは適当に消せ
あと、確認画面で戻る押されて別のファイルをアップロードされたときの扱いとかも面倒だな
どちらにしても、Rubyの話ではないので適当なCGI関連のスレで研究してくれ
>>861 どうもありがとうございます。
>どちらにしても、Rubyの話ではないので適当なCGI関連のスレで研究してくれ
そういうことでしたら、Perl等、他の言語で書かれたCGIも参考にしてみたいと思います。
助かりました。
863 :
デフォルトの名無しさん :2008/06/17(火) 11:40:57
質問させてください。 現在Ruby on Railsの勉強をしています。 しかし根本的な部分で躓いてしまいました。 練習してみようとtsukaeru.netのシルバープランというVPSサーバーをレンタルいたしました。 しかし、まったくこの上でrubyを用いたホームページを公開する方法がわかりません。 ruby on railsははいっていますか?との質問にサポートは入っています。との解答でした。それ以上のサポートはできないとのことなので 失礼ながらこちらで質問させていただきます。 勉強をしている本は基礎Ruby on RailsというものなのですがこちらはWindowsで導入する方法でしかもローカルで動く方法のみ書いてあったのでそれを一般に 公開するという点では参考になりません。 サーバ構築なども全く初体験なのです。 rubyのプログラムは普通のHPのようにpublic_html直下にindex.htmlをおけば動くといったものではないのですか? 公開するまでの具体的な方法をおしえてください。よろしくおねがいします。 OSはLinux CentOS5(final)のようです。
windowsで導入してローカルで動かせばいいじゃないか
うむ
>>863 まず、その程度の知識でVPSに手を出すのが無謀
組織の命令でやらざるを得ないのなら同情する
ちなみに
% ruby script/server
を実行すれば、適当なポートでHTTPサーバが立ち上がるので
あとは
http://localhost: (ポート番号)/ にアクセスすれば、サンプルページは見えるはず
よく分からないなら素直にWindows使って練習した方がいい。VPSはその後で
867 :
デフォルトの名無しさん :2008/06/17(火) 15:19:46
まじすか そんなにハードル高いものだとは・・・orz Windowsでやるということは、それを公開するには自鯖を立てるしかないのでしょうかね? 自鯖は少し理由があって立てられないのです。 レンタルしているVPSサーバー上でruby script/serverとすると ruby: No such file or directory -- script/server (LoadError) と出てしまいます。ruby -vなどとすると正しくバージョンが出ますのでインストールされていることは確かなはずです。 VPS以外で、もっとも簡単にRuby on Railsを公開するにはどうすればよいでしょう。。。 もとからRubyが使えますよ〜っと書いてあるレンタルサーバーでもどのようにしてつかえばいいのかさっぱりです。 本でも読んで勉強もしますのでよろしければはじめの一歩でも教えてください。
つか、なんで知識無い奴がRoRやってんの? CGIとHTTPとDBの知識無い奴がRoRなんか触ったって意味ないのに
>>867 Rails環境の構築は初心者には難しい
お薦めの手順としては
1.WindowsにRails環境を作って、そこでRailsの基礎を勉強する
基礎Ruby on RailsにもRails環境入りのCDがあるけれど、ここは「InstantRails」を使うべき
2.ある程度Railsアプリケーションをローカル(つまりWin)で作れるようになったらVPSでの公開を検討する
遠回りかもしれないがまずはローカルでRailsを動かしてみよう
学生さんですか?
ここはRubyスレで微妙にスレ違いの話になるので、捨てアドでも晒してくれたら色々と教える事は可能
>>867 >ruby script/server
script/serverは、最初にrails generateで作ったディレクトリの中にある
あとは分かるな?
>VPS以外で
自鯖が立てられないならほぼ不可能
CGIスクリプトとして動かす手段もあるにはあるが、たぶん遅すぎて使い物にならない
それでもやりたいなら「dispatch.cgi rails」でググれ
>>868 そんな事は無いだろう
DBは必須だがCGIとHTTPの知識が無いRailsエンジニアなんてゾロゾロいるぞ
もちろん誰かが作ってくれた環境上でアプリを作るだけしかできないが
>>870 いや、実はRails自体入ってないんじゃないかとオレは思ってるw
867にはrails -vしてみて欲しいところだな
>>868 まあ、Railsはどこをどう見ても
「わかってる人間が手早く作るための強力フレームワーク(※ 引き換えにパワー上限あり)」
なんだが、Javaソリューションビジネスで負けた奴らが次点を求めてRoRにツバつけようと群がったもんだから
「あなたにもRoRが簡単にできます」ビジネスの被害者が続出してる
そういう被害者の人たちのフォローをするのも初心者スレの役目だとは思うぜ
>>873 Railsはシンプルでわかりやすいけど、それは「ある程度わかっている人」限定の話なんだよなぁ
プログラミング未経験者ならRailsよりもPHPの方が簡単に入れるだろうとは思う
Rubyの知識はあるのかなあ 無いんだったら、俺ならダッシュで本屋行ってPHPに鞍替えするね
皆様ご回答ありがとうございます。 現在の、ローカルのWindows環境では本にしたがい、localhost:3000で動くことはできました。 それを一般に公開するなんて簡単だろうperlのcgiとおなじだろ〜っと考えていたらみごとに躓きました。 ご指摘のとおりrails -vしてみたところRails 1.2.2と返ってきたので入ってはいるみたいです。 そしてRoRのソースやらが入っているディレクトリまでcdで移動して再度script/serverを打ってみると create File exists - script/server と帰ってきました。どうやらサーバーがたったようではなさそうな感じですが・・・ あと一歩なんでしょうかorz ちなみに言語経験はC#とVBを少々でございます。 捨てアドさらせば教えていただけるというとても親切な方がいらっしゃいましたのでアドレスを書いて見ます。 よろしくお願いします。
初心者か
>>878 まあ、初心者スレだからな
来るのはRubyの初心者だけにして欲しかったもんだが
2ch初心者とかネット初心者とかコミュニケーション初心者とかは正直勘弁
lololol
>>880 ほいほいメールアドレス晒したり
Windows以外で動作させるための文献検索すらできてなかったりするのは
どうにも擁護できんぞ
「知らない分野」とかそういうレベルではない
>>880 は「お前には無理だからやめろ」とはっきり言ったほうがいいと仰っておられるのですよ
RoR使うのやめろというレスを全部スルーしてるからな
>>882 自分のメールアドレス晒すのは、別に擁護する必要無いだろう。
RoR以外の手段を使えというアドバイスですが、一応RoRについての文献をすでに購入してしまったことと
また、RoRを勉強してみたいという意欲のもと始めましたので、別の言語は考えていません。
LinuxにRuby と Railsを入れる方法についてはいろいろと調べまわったつもりなのですが具体的に公開手順を示されているサイトが
みつかりません。メールアドレスを晒したのは
>>869 さんが親切にあのようにおっしゃってくれたからです。
微妙にすれ違いとの事ですので、失礼しました。
そのシリーズはなかなか良質 抽象データのあたりとか、 よくまあ説明が複雑になりがちな概念をここまで平易に
タイトルで吹いたw
直伝噴いた
ここまで言うならぜひ言語を作って欲しい物だ
891 :
デフォルトの名無しさん :2008/06/18(水) 02:07:50
最近読んだ『ハッカーと画家』でrubyの評価が結構高かった。 著者曰くLispに最も漸近しているスクリプト言語とのこと。
お前が読んだのは最近かもしれんが、書かれたのは何年も前だぞ
原語のほうは公開されてなかったっけ
Lispに最も漸近しているって褒め言葉になってないぞw
>>891 それ、
『今大人気の言語RubyはLispに一番近い言語なんだよ(知ってた?)
でもさ、だったらLispそのものを使ったほうがいいよね?』
っていうプロパガンダだよ。PGの文章は今から見ると宣伝とか
自己啓発系のものが多いから、半分眉唾で読んだほうがいいよ。
リアルタイムで読んだら興奮するんだけどね。
MSが絡むと途端に理性を失うよねこの人
ここは初心者が質問するスレじゃなくて性格のねじれた中級者の雑談でよろしいでしょうか?それならば私も混ぜてください
>>896 評価するところは評価していたかと
キャッチコピーが技術者のことをよく分かってるって
>>897 そういうのは基本的にはアンチ専用スレで
Ruby CGIで質問です。 Print文で処理中をあらわす文字列を表示し、 処理が完了したら、次にそのことを知らせる文字列を表示したいのですが、 最初に表示した処理中をあらわす文字列を消すにはどうすればいいのでしょうか?
CGIで逐次表示とか考えるな
>>900 それは、ボタンをポチッと押すと
「ただいま処理中です」
とかいうメッセージの表示されたhtmlを表示して、
サーバ側の処理が終わったら*自動的*に
「終了しました」
とか書かれたhtmlを表示したいということでしょうか?
あぼーん
>>901 少なくとも標準あるいは標準の応用でなんとかできるものではないな
RubyやRubyライブラリとしてのサポートはないと思われる
自前でJavaScript書くしかないねえ
907 :
デフォルトの名無しさん :2008/06/20(金) 17:31:54
爆撃荒らしうぜえ
JRubyの質問ってここでいいのでしょうか・・・? JRuby-1.1.2.zipを dist.codehaus.org から落としてきて JDK-1.4.2_10の入っているPCに入れてみたけど、 noclassdeffounderror : java/lang/enum と出てjrubyもjirbも 立ち上がりません。 enum型ってJDK-5.0 からのサポートらしいけど、 JRuby-1.1.2ってJDK-5.0でしか動かないのでしょうか? 宜しくお願いします。
>>909 READMEに、JRubyのコンパイルにJDK1.5以上が必要って書いてあるからそうなんだろ
911 :
909 :2008/06/22(日) 09:47:53
>>910 ネットの記事では1.4.2でも動作するって書いてあったのですが
実際はJDK5.0でないとだめなようですね。
返答ありがとうございました。
912 :
デフォルトの名無しさん :2008/06/22(日) 12:26:13
あるHTMLファイル(何でもいいんですが一般的なWebページの)からリンクしているURLを 取り出そうとしています。ぐぐったらscrapiとかいうので簡単にできたんですがかなり 処理速度が遅いのです。 高速に取り出そうとしたらやはり正規表現で取り出すしかないのでしょうか? hpricotというのも見つけたのですがいまいちよくわかってません。 robustかつ高速に取得する方法はないものでしょうか?
利用者のIT製品に対する基本姿勢は、Microsoftを相手にするときのそれが最も健全であって、 ブーブー言いながら使うのが一番だと思うが、最近は企業ブランド崇拝みたいのができあがっていて、 Apple教団はご愛嬌と思っていたが、何だかこれも同じような感じで、嫌な雰囲気だ。Googleしかり。 特にヘビーユーザーがそういう信者というか、エヴァンジェリストになって 教義に染まない利用者の不満をさえぎる壁になると異様。 そういうのって普及前のファンダムの色が残っているから、と楽観視していたのに。 これだけシェアを拡大しても、いっこうにあらたまらないな。
('a')がAAに見えた
916 :
912 :2008/06/22(日) 13:27:20
>>914 ありがとうございます。
scrapiよりは速そうです。scrapiが今使ってるマシンだと動かない(64bitに対応していない?)みたいなので
直接比較はできませんが。でも、robustという意味ではyoutubeのURL入れるとだめっぽいですね
ex :
ttp://jp.youtube.com/watch?v=T08oWYjwlSY サイト固有の正規表現を記述するのは一番確実でしょうが一番汚いやり方だと思うので
スマートかつある程度速くできないものかなぁと試行錯誤中です。
917 :
デフォルトの名無しさん :2008/06/22(日) 13:47:32
918 :
デフォルトの名無しさん :2008/06/22(日) 13:51:42
>>863 遅レスでもうみてないかもしれないけど。
Railsはともかく・・・
もし、あなたがVPSの管理もする(専用の管理者があなただけ)のなら、VPSを今すぐ解約しよう。
そのうちクラックされて他人に迷惑をかけるだけですよ。
まずは、ローカルで試す(Windowsでもできる)か、ローカルネットワークで外に公開しないサーバーを建てるなどをして知識を十分にしてからでも遅くはないよ。
VPSの場合、RubyとかRailsとかやる前にサーバーの管理の方法も一通り学んでおく必要がある。
919 :
デフォルトの名無しさん :2008/06/22(日) 13:53:02
>>916 それは、httpじゃなくて、ttpだからでは?
920 :
912 :2008/06/22(日) 14:14:22
>>919 単純に貼るときに抜いただけです。httpでやってhpricotで例外吐きます。
921 :
デフォルトの名無しさん :2008/06/22(日) 15:34:31
初めまして、
今回ruby on railsを勉強したいと思って、インストールしようとしとして
$ gem install rails --include-dependenciesを実行したんですが、うまくいきません。
だれか、情報があったら教えてください。
C:\ruby>gem install rails --include-dependencies
INFO: `gem install -y` is now default and will be removed
INFO: use --ignore-dependencies to install only the gems you
Bulk updating Gem source index for:
http://gems.rubyforge.org/ Bulk updating Gem source index for:
http://gems.rubyforge.org/ ↑の状態で一時間ぐらい止まってます。別にPCは動くので、フリーズとかでもないです。
http://www.rubylife.jp/index.htmlのサイトの手順通りにやったんですが …
ちなみに、ruby及びRubyGemsもちゃんとインストールしてあります。
どなたか情報お願いします。
OS: Windows Vista です。
>>921 マシンスペックにもよるが、Rails 新規インストール時に数時間返答がないのは普通
1日以上待った例もあるからそのまま放っておけ
めんどくさいなあ
>>916 どうして例外が起こったかはわかる?
残念だけど、Web のスクレイピングは文字通り例外との戦いだぞ
サイトごとに調整しなければならないと思ってくれていい
HTML や HTTP の知識はあるかな?
たとえば以下の方法だと 142 のリンクが抽出されてるけど、本当に必要なのは数個だろ?
require 'rubygems'
require 'hpricot'
require 'open-uri'
uri = URI.parse('
http://www.ruby-lang.org/ja/ ')
doc = Hpricot.parse(uri.read)
puts doc.search('a').map{|e| e['href']}.compact.map{|e| uri + e}.find_all{|e| e.scheme =~ /\Ahttp/}.uniq
uri が前のままだった
本質的には puts doc.search('a').map{|e| e['href']} だけでいい
でも、それだと相対 URL で書かれているリンクがわけわからなくなるのでわざわざ uri に join してる
http:// と
https:// 以外を取得しても意味がないことが多いからわざわざ
http:// と
https:// 以外を除いてる
で、Youtube では「onclick で JavaScript 起動しかさせないリンク」という href 自体がない <a> タグがあるのでわざわざ href が nil な場合を compact で除いてる
他のサイトでは「欲しいリンクだと思ったら実は画像貼り付けのボタンでPOST」とかにも対処しなければならないかもしれない
require 'rubygems'
require 'hpricot'
require 'open-uri'
uri = URI.parse('
http://jp.youtube.com/watch?v=T08oWYjwlSY ')
doc = Hpricot.parse(uri.read)
puts doc.search('a').map{|e| e['href']}.compact.map{|e| uri + e}.find_all{|e| e.scheme =~ /\Ahttp/}.uniq
HTML の知識はないとダメだよね 後出しで youtube 出してきたけど、欲しいのは動画ファイルのURLや各種一覧にあるURLだろうし これからまた絞らないといけないだろうな(おそらくはCSSセレクタとかXPathとかあのへんの知識が要る)
リンクされてるURLを抜き出すライブラリを作ってるというならともかく、 無駄にあれこれ悩むよりさっさと正規表現使って抜き出せばいいと漏れは思う。
そういう意味では
>>914 の1行目の時点で回答は出てるんだよな
うっかり汎用性を求めてしまうのはRubyスクリプトの悪い癖 初期ではそのノリで標準ライブラリになってしまったりしたが
931 :
930 :2008/06/22(日) 17:38:48
gem 1.2.0 にしたら、gem が笑っちゃうぐらい高速になったよ。
932 :
デフォルトの名無しさん :2008/06/22(日) 18:19:17
933 :
デフォルトの名無しさん :2008/06/22(日) 18:24:58
>>931 メチャメチャ速くなってる気がするwwww
gem updateがさっくりオワタww
>>932 お、今年はうpが早いな。
あとで見る。
標準の関数的メソッド以外で引数のカッコ省略するのやめようぜ
936 :
912 :2008/06/22(日) 21:47:13
>>924-925 遅くなりましたがありがとうございました。
やはり例外との戦いなんですね。参考にします。
>>926 youtubeはたまたまブラウザで開いてるURL全部入れて試しただけです。
youtubeから抜き出したいというわけではなかったのです。
938 :
日立バキバキ高野くん祭り :2008/06/23(月) 20:00:05
1.日立製作所社員の高野くん(高野光弘)が会社を誹謗中傷して機密も漏洩
2.日立のユーザーにも「キチガイ」との障害者差別発言
3.日立製作所の企業イメージをバキバキにする
4.自身のサイトの『32nd diary』に掲載
5.日立製作所に通報される
6.あせって似顔絵削除
7.火に油を注ぐだけで所属する日本UNIXユーザ会にも通報祭り勃発
8.「給料泥棒」と説教される
9.「殺します」と殺人予告をして警察に事情を聞かれる←イマココ
高野光弘の行動
現在は、過去の記事を閲覧できなくして、「本日の日記はツッコミ数の制限を越えています」としています。
まずは、不愉快な思いをされた方々に謝罪するべきなのではないでしょうか。
高野光弘の発言
「まぁ、どこの団体もそんなにヤワじゃないので、平気なんですけども。
日本UNIXユーザ会が一番対応に慣れてる感じ。」
日本UNIXユーザ会が対応に慣れているか、みなさん確認してみてください。
連絡先
http://www.net.intap.or.jp/oiia/cont2/p0402.html%7B0recid=10168.html
939 :
デフォルトの名無しさん :2008/06/24(火) 00:00:05
postgresql にdbiを使って接続しようとしたんですが、うまく行きません。 /usr/local/lib/ruby/site_ruby/1.8/dbi.rb:368:in `load_driver': Could not load driver (no such file to load -- /usr/local/lib/ruby/site_ruby/1.8/dbd/Pg) (DBI::InterfaceError) というエラーがでてきます。 $ echo 'export PATH=/usr/local/psql/lib:$PATH' >> ~/.bash_profile でライブラリへのパスは通っていると思うんですが、 解決策をお教えいただければと思います。
>>939 /usr/local/lib/ruby/site_ruby/1.8/dbd/Pg.rb
は存在するの?
UNIXにおいては、ライブラリパス(というか、soの在処)は LD_LIBRARY_PATH あたりで設定すると記憶しているが。
linuxではldconfig とかも使う。
Solarisならcrleとかね
ldd でlib全部リンクできてるか確認するとかね
Macならotool -L だな。
939です
皆さんご丁寧にありがとうございます。
>>940 /usr/local/lib/ruby/site_ruby/1.8/dbd/Pg.rb は存在しなくて、
/usr/local/lib/ruby/site_ruby/1.8/dbd/Pg/Pg.rb があります。
PATHやLD_LIBRARY_PATHはOKな筈なんですが、うまく行かないです。
こちらの環境は、macなのでotool -L などでもう少し格闘してみます。
>>946 ruby-pg はインストールしてる?
ruby -rpg -e0
を実行して何も出なければ入っているって事なんだが。
それにしても分かりにくいエラーメッセージだな>dbi
真の原因を隠すなよ。
Rubyでシューティングゲームつくってるんですけど
ごめ 途中でカキコしちゃった Rubyでシューティングゲームつくってるんですけど 弾が当たってゲームオーバーになった時に画面全体を赤っぽくしたいんですけど なにかいい方法ありませんか? 一応予定としては 画面全体を赤で塗る 透過する って考えているんですけどがんばっていろいろ探ってみてもやり方がわかりませんorz どうかよろしくおねがいします。
>>949 手順
1.Rubyをアンインストール
2.HSPをインストール
3.「シューティングゲームビルダー」でぐぐる。
4.HSPをアンインストール
わざわざRubyで作る意味がわからない
ん十年前の質問を思い出すなぁ C言語でゲームを作りたいんですがどうすればいいですか? しるかーぼけー
952 :
デフォルトの名無しさん :2008/06/25(水) 07:11:46
Rubyかんけえねえw
953 :
デフォルトの名無しさん :2008/06/25(水) 07:12:54
少し質問があるのですが、数値的なシミュレーションをして 結果を分布図(正規分布の図みたいなの)として出力したいのですが、 適したグラフライブラリはどんなものがありますでしょうか?
Excelとかw
数値だけ出力して、グラフはgnuplotに任せるとかはダメかな?
957 :
デフォルトの名無しさん :2008/06/25(水) 09:04:23
958 :
デフォルトの名無しさん :2008/06/25(水) 09:07:44
>>949 どんなライブラリを使ってるのかが分からないと、助言のしようがない
960 :
デフォルトの名無しさん :2008/06/25(水) 09:56:07
ArgumentErrorエラーメッセージのことで質問させてください。 wrong number of arguments(1 for 0) このとき「引数の数が間違えてる」のは文字通りわかるのですが、 (1 for 0)はどう読んだらいいんでしょうか? 引数なし(0)のところに1つ(余計に?)渡してる、みたいなニュアンスでしょうか? 今、あるライブラリを使っていてこのエラーが出ているのですが 引数の数は間違えておらず(関数側にもデフォルト値も設定されている) 原因を探しているところです。
Rubyの入門書はエラーメッセージに 2〜3節割くべきだと思う
>>960 1 for 0 は「0 個の代わりに 1個得た」と読む
日本人にはまだわかりにくいな
(got 1, required 0) とでも書いてくれればわかりやすいんだが
引数総数しか問題にしてない記述で、引数 0個のメソッドなのに引数が 1個渡されてるというエラーだ
このメソッドに引数を渡してはいけないってことだな
irb> 'abc'.downcase('param')
ArgumentError: wrong number of arguments (1 for 0)
963 :
960 :2008/06/25(水) 11:03:15
>>962 ありがとうございます。
直接呼び出しているメソッド内から呼ばれていたメソッドで
引っかかっていたようでした。
構文が古いのか(?)マニュアル見て書き直してみたらうまくいきましたm(_ _)m
>>950 一応Rubyの書き方覚えつつ作ろうかなぁと思ってちまちまつくってます。
ライブラリはSDLとfpstimerはいってます。
966 :
デフォルトの名無しさん :2008/06/25(水) 12:55:07
>>966 普通の乱数ジェネレータのオブジェクト化ね。
多分やってない、やる気がないだけだと思うけど。
確か、過去の議論で、うまい名前とうまいAPIがあれば、みたいな
話になってたかな。
969 :
958 :2008/06/25(水) 13:20:17
Ruby会議でakrさんが「抱き合わせはダメ」の例で出してたな、それ
3dゲームエンジンogrerbのサンプルをexerbでexeにしたんですが エラーがでて実行されません。 普通のrubyコマンドでは正常に動きます。 レシピ作成は下記のコマンドで作成 >ruby -r exerb/mkexy main.rb でてきたmain.exeを実行すると下記のエラーがでます。 ----- NoMethodError importenv.rb:10 private method `sub' called for nil:NilClass ------ メソッドがないってエラーなのはわかるんですが、exe化したらでるってのが よくわからないんですが、 ruby 1.8.6 (2007-09-24 patchlevel 111) [i386-mswin32] Exerb 4.2.0
>>971 技術的な話をすると長くなるので省略するが、標準添付ライブラリimportenv.rbの10行目を削除すれば解決する。
迷惑なことやるもんだ
誤爆です
大量のデータを適当に長々と処理するスクリプトがあります 未処理だよ変数からデータ1個取り出す→何かする→終わったよ変数に1個格納 こんな感じで処理自体はデータごとに独立です で、「外部からのアクションで一時停止」「停止中のスクリプトを再開」ってできませんか?
976 :
971 :2008/06/25(水) 20:54:03
>>975 1ループごとに「○○番目のデータまで処理完了」ってファイルに書き込んでおく
停止したいときはスクリプトを強制終了させる
スクリプト起動時に中間ファイルの存在をチェックし、中間ファイルがあった場合は中身を読んでその番号から再開
これなら小難しいこと考えずに中断と再開ができるぞ
「1ループごとにHDDに書き込みするなんて畏れ多い!」とか考えたらダメだぞ
>>975 外部ってのが何かによる
別スレッドでもソケットでもファイルでもいいから、そこから停止指示が出ていないか
処理1回ごとにポーリングするとか
単純にはこんなんでいいんじゃね? trap(:int){gets} loop{p :foo; sleep 1}
動かしっぱなしでいいならdrbでqueueとか。
あ、そうか、奥付的にはもう売ってるはずだよな 近刊の欄には「予定」がついたままだから、もしかしたらちょっと遅れるのかも
Ruby会議の会場で先行販売してたんだよなあ、著者のサインつきで。
984 :
デフォルトの名無しさん :2008/06/26(木) 00:41:56
rails 2.0.2をインストールしたんですが、 2.0.2バージョンで掲示板やチャットの作り方を載せてるサイトありませんか? もしくは、2.0.2版の解説ページみたいなところでも よろしくお願いします
985 :
デフォルトの名無しさん :2008/06/26(木) 10:56:12
>>984 初心者でかつ英語が読めないのであれば、まず日本語で解説したページや書籍を手に入れ、
そこで使われているバージョンをインストールして勉強すべし。
バージョンをあげるのは勉強したあとにしたほうがいい。
初心者でも英語が読めるのであれば、英語での解説ページはぐぐれば出てくるからそれを読めばいい。
初心者は本を買うことを強くおすすめする。3千円ケチったせいで実はすごく損をしていることに気づくべし。
987 :
デフォルトの名無しさん :2008/06/26(木) 12:18:49
RubyにはTempfileっていうクラスがありますが,これは クローズすると自動的に削除されますよね. テンポラリファイルに書き出して書き終わったら正式なファイル名にrenameするという イディオムはRubyではどう書けばいいんでしょうか. テンポラリファイルの名前はThreadユニークなものにしたいです.
Tempfileを使わない
989 :
デフォルトの名無しさん :2008/06/26(木) 13:35:36
「今このコードが動いているスレッド」を得る方法があったら教えて下さい.
Thread.current
Tempfile に書き出すんじゃなくて、ファイル名だけtemporaryなものにすればいいんじゃないかな
993 :
デフォルトの名無しさん :2008/06/26(木) 16:24:06
class Hoge def print() print "a" print "b" end end hoge = Hoge.new hoge.print こんなことすると print がループになってしまいますが、 Hoge じゃない元の print を呼ぶにはどうしたらいいでしょうか?
>>993 オリジナルのprintをaliasしておいてそれを呼ぶ
Kernel.print でいいんじゃね?
>>994 >>995 ありがとうございます。
alias するなら Hoge の print の名前を変えるので
Kernel を使うことにします。
Rubyでビット演算の符号無し右シフトをするにはどうしたら良いのでしょうか?
>>997 rubyは整数のビット幅に限界がないので、負数を2の補数で扱う場合、最上位ビットというものが存在しない。
故に、符号なし右シフトは定義できない。
XMLの一部を抜き出すスクリプトを書いています。 読み込んだXMLに対して、 再帰処理で子エレメントを検索していってるんですが 結果をファイル出力したい場合ってどういう風にしたらいいんでしょうか? 再帰の関数のなかでREXML::Document.new()を書くとそれぞれで作られてしまう 一番最初の呼び出しをするときにREXML::Document.new()で作ったインスタンスを 引数として持たせ続ける案が浮かびました なんかスマートな感じがしないんですが、他にどういった方法が考えられますか?
1000 :
神本 ◆wWwwWwWwWw :2008/06/27(金) 00:00:33
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。