Ruby 初心者スレッド Part 19

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
プログラミング言語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を読め」でいいので、叩かない&怖がらせない。
 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
3デフォルトの名無しさん:2008/04/14(月) 00:27:09
【よくあるしつもん】
Q:
いちからRubyを始める初心者向けのRuby入門書は何がおすすめでしょうか?

A:
プログラム作成の初心者だったら
「たのしいRuby 第2版 Rubyではじめる気軽なプログラミング」
http://www.amazon.co.jp/dp/4797336617/
他の言語経験があるんだったら
「プログラミングRuby 第2版 言語編」
http://www.amazon.co.jp/dp/4274066428/
4デフォルトの名無しさん:2008/04/14(月) 00:29:25
■前スレ
Ruby 初心者スレッド Part 18
http://pc11.2ch.net/test/read.cgi/tech/1203658291/

■関連スレ
Rubyについて Part 31
http://pc11.2ch.net/test/read.cgi/tech/1204466626/

Rubyの宿題教えてください。
http://pc11.2ch.net/test/read.cgi/tech/1106572657/
http://pc11.2ch.net/test/read.cgi/tech/1200175247/

【ActiveScript】RubyをWindowsで使うスレ【GUI】
http://pc11.2ch.net/test/read.cgi/tech/1155031689/

Ruby on Rails
http://pc11.2ch.net/test/read.cgi/tech/1191381506/

Rubyについて(アンチ専用) Part003
http://pc11.2ch.net/test/read.cgi/tech/1207233348/
5デフォルトの名無しさん:2008/04/14(月) 00:30:31
■公式/非公式関連リンク
Ruby Home Page
http://www.ruby-lang.org/ja/

Rubyリファレンス(よくサーバーエラーになります)
http://www.ruby-lang.org/ja/man/
http://www.ruby-doc.org/ (英語)

リファレンスのHTMLヘルプ版配布
http://elbereth-hp.hp.infoseek.co.jp/ruby.html
# Windowsで便利

Ruby FAQ
http://ruby-lang.org/ja/man/?cmd=view;name=Ruby+FAQ

Programming Ruby - The Pragmatic Programmer's Guide
http://www.ruby-doc.org/docs/ProgrammingRuby/
# 好評書籍をWebで公開中、ただし英語

逆引きRuby
http://www.namaraii.com/rubytips/
6デフォルトの名無しさん:2008/04/14(月) 00:31:02
RAA - Ruby Application Archive
http://raa.ruby-lang.org/

RubyForge
http://www.rubyforge.org/
# Rubyのアプリやライブラリが検索できる

日本Rubyの会 公式Wiki
http://jp.rubyist.net/
# メニューに表示されていない埋もれた情報ページ多数

Rubyist Magazine - るびま
http://jp.rubyist.net/magazine/
# コードレビューが好評

Ruby hotlinks 五月雨版(日記やblogのアンテナ)
http://www.rubyist.net/~kazu/samidare/

Rubyの本一覧
http://www.ruby-lang.org/ja/man/index.cgi?cmd=view;name=Ruby%A4%CB%B4%D8%A4%B9%A4%EB%BD%F1%C0%D2

<rubyXML/>
http://www.rubyxml.com/

Matzにっき(Ruby作者の日記)
http://www.rubyist.net/~matz/
7デフォルトの名無しさん:2008/04/14(月) 00:39:18
乙乙
8デフォルトの名無しさん:2008/04/14(月) 00:41:13
Otz
9デフォルトの名無しさん:2008/04/14(月) 00:42:26
■最近できたWiki
Ruby 初心者スレッド Hiki
http://starlet.s145.xrea.com/ruby/hiki/

Ruby Portal
http://ruby.morphball.net/portal/
10デフォルトの名無しさん:2008/04/14(月) 00:44:07
これでテンプレ全部。
>>1>>2が恐ろしいほど瓜二つなのはるびま添削本の呪い。
11デフォルトの名無しさん:2008/04/14(月) 11:47:16
文字列リテラルの説明で

> 空白を間に挟んだ文字列リテラルは、コンパイル時に1つの文字列リテラルと見倣されます。

とあったので C の文字列の要領で

print("foo"
"bar")

とやったら syntax error になってしまいました。

この場合の「空白」には改行などは含まれていないということだと思いますが、
これって何でなんでしょうか?
改行も仲間に入れてあげても別にバチは当たらないと思うのですが。
12デフォルトの名無しさん:2008/04/14(月) 11:59:18
>>11
それは実装に対する苦言?それとも、どうやったらいいか聞いてる?

前者なら、Rubyの本スレで言ってほしい。

後者なら、

print("foo" +
"bar")

でOK
13デフォルトの名無しさん:2008/04/14(月) 12:01:39
というか、そもそもの問題としてそれに頼ったコードは書かないで欲しい
明示的に連結しとけ
14デフォルトの名無しさん:2008/04/14(月) 12:21:11
改行があるなら \ でエスケープするのが常道

print 'foo' \
'bar' \
'baz'

print 限定で出力フィールドセパレータの $, 依存だが
コンマで区切っても単純に連結されたような見掛けで出力される

print 'foo',
'bar',
'baz'
15デフォルトの名無しさん:2008/04/14(月) 12:51:58
>>11
えー、それだと逆にめんどくさいじゃん

def gethoge
@str = 'foo'
'hoge'
end

って書いたら @str も gethoge の返り値も foohoge になるぞ
16デフォルトの名無しさん:2008/04/14(月) 16:07:57
>>12 >>14
質問が悪くてすみません、 folding して書きたいというのではなくて、
「前者」で経緯というか理由が知りたかったです。
ので改めて本スレで聞いてみます。

>>13
頼ると何かまずいですかね?

>>15
私の print の例の方は、括弧で括ってるのでちょっと違うような気がします。
と思って試してみたら、

def gethoge
@str = ('foo'
'hoge')
end

これだと gethoge の返り値は "hoge" になるんですね。
うーむ。
17デフォルトの名無しさん:2008/04/14(月) 16:57:13
いや、() の有無なんて関係ない
要望は「改行を挟んだ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

と全く同じこと
18デフォルトの名無しさん:2008/04/14(月) 17:01:31
改行で式が繋がるのは上の方に書いてある通りで、リテラルはその対象じゃないと
括弧の有無だけでは、中の式までは面倒みませんってことかな
19デフォルトの名無しさん:2008/04/14(月) 17:07:37
いや、コンパイル時にどう扱われるかだけの問題だから…
'a' 'b' 'c'
と書いてあったなら、それは 'abc' と書いてあるものとみなされて String オブジェクトになる
2011:2008/04/14(月) 17:29:05
うーん、どうも私がリファレンスマニュアルを読み違えてるだけな気がしてきました。
「字句構造」のところには

> 空白文字とはスペース、タブ、垂直タブ、バックスペース、キャリッジリターン、
> ラインフィード、改ページです。

とありますが、以降の記述では、
「空白」「空白文字」が文脈によって改行を含んだり含まなかったりするんですね。
読解力が無くてすみません。
21デフォルトの名無しさん:2008/04/14(月) 17:38:20
そのあとに改行についての記述があるだろ
Rubyにおける空白文字は改行を「含まない」
空白文字の中でホワイトスペースの代わりに使うと動作が変わるものが入ってなくもない気はするが(LFは怪しい)
とりあえず、基本的に「改行は空白文字ではない」
2211:2008/04/14(月) 17:57:39
なるほど。

どうやら私の誤解はその改行についての記述の中の
「行が明らかに次の行に継続する時」の認識間違いから来ているようです。

print('hoge'
'fuga')

は、私には「行が明らかに次の行に継続」しているように見えていたのですが、
>>17 で指摘いただいたように、括弧には行を継続するような機能は無かったと。
わかりました。
23デフォルトの名無しさん:2008/04/14(月) 18:05:30
行末にあるものが、文末になりえない演算子とかなら、って意味ですねそれはだいたい
2411:2008/04/14(月) 18:08:54
ああなるほど、 >>12, >>14 の例なんかはまさにそうですね。
25デフォルトの名無しさん:2008/04/14(月) 21:54:40
クラスの中で必要とする他パッケージはどこでrequireするのがいいですか?
使う直前、コンストラクタ内、クラス定義の外など
考えられるかと思いますが
26デフォルトの名無しさん:2008/04/14(月) 22:13:36
基本は「最初のファイル」の先頭だと思われる

#!/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 することはある
その場合もソースファイルの先頭のどこかにコメントとして書いておくと親切
27デフォルトの名無しさん:2008/04/14(月) 22:21:18
なるほど
必要なパッケージを明示するということですね
ありがとうございました
28デフォルトの名無しさん:2008/04/14(月) 22:25:53
autoloadっつー便利なものもあるぜ
29デフォルトの名無しさん:2008/04/14(月) 22:30:11
autoload は概念は便利だが実際には注意深く使わないといけないので微妙に面倒
30デフォルトの名無しさん:2008/04/14(月) 22:35:24
指定されたファイルに存在する全てのファイルのクラスとモジュールを精査して
自動で全てを autoload する auto_require というのを作ってみるというのはどうだろう
31デフォルトの名無しさん:2008/04/14(月) 22:38:16
>>30
requireするファイル名とクラス名に一定のルールを課すならできなくもない。
ActiveSupportにあるね。
32デフォルトの名無しさん:2008/04/14(月) 22:47:17
Rubyには名前付き引数はないみたいですが
どう実現するのがスマートでしょうか?
33デフォルトの名無しさん:2008/04/14(月) 22:49:05
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]などとして参照する。
34デフォルトの名無しさん:2008/04/14(月) 22:50:11
fooじゃないmogeの定義
35デフォルトの名無しさん:2008/04/14(月) 23:09:00
>>33
ありがとうございます
わりと自然な形で書けるんですね
36デフォルトの名無しさん:2008/04/14(月) 23:22:49
言うほど自然でもないようにも思う

まあ、RoR以外のRubyではそれほど一般的ではない
あまり使わず紛らわしいオプションをユーザーに記述させたいときとかだな
37デフォルトの名無しさん:2008/04/14(月) 23:48:00
なんか馬鹿ばっかだな
ソース読んでる?MLとか見てる?
38デフォルトの名無しさん:2008/04/15(火) 00:03:32
オブジェクトの中から、自分のクラス名を取得するにはどうしたらいいですか?
39デフォルトの名無しさん:2008/04/15(火) 00:16:34
>>38
obj.class
40デフォルトの名無しさん:2008/04/15(火) 00:17:06
self.class.to_s

41デフォルトの名無しさん:2008/04/15(火) 00:20:32
self.class.name
42デフォルトの名無しさん:2008/04/15(火) 00:30:58
>>36
RoR系統儀とgems系統を引いたら現状のRubyはほとんど残らんと思う
どっちかに依存してると思うぞ
添付ライブラリだけの「ぴゅあ」なRubyでスクリプト作ってる人はそう多くないはず
43デフォルトの名無しさん:2008/04/15(火) 00:42:13
>>42
んなわきゃない
44デフォルトの名無しさん:2008/04/15(火) 00:48:36
「blank?が公式に載ってないのでおかしいと思ったらこれActiveSupportなのね」
という内容のブログの投稿が普通にある時代だからなあ
45デフォルトの名無しさん:2008/04/15(火) 09:32:30
>>32
どちらかといえば、名前付き引数を使わないのが一番スマート
引数が複雑になりそうならこういうやり方もある

Foo.new(x, y) do |foo|
 foo.target = './dest/'
 foo.index = 10
end

この方法の利点は
Fooに存在しない名前のパラメータを設定しようとしたとき、即座にエラーを出してくれること

>>36
ハッシュで名前付き引数を渡すのは、RoR以前から広まってたぞ
46デフォルトの名無しさん:2008/04/15(火) 11:49:20
RoRな人たちに多用というか乱用されてる感はなくもないな
4711:2008/04/15(火) 13:29:46
なんかタイムリーな話題が ruby-dev に出ちゃっているようなのですが、
件の改行の制限は、設計方針的なものというよりも、
yacc (というか LALR(1) ?) の制限によるものなんでしょうかね。

これで私が当初からもやもやしていた疑問が大体解けた気がします。
48デフォルトの名無しさん:2008/04/15(火) 13:35:12
「それだと正確にパースするのめんどいから」というのに類する問題っぽいのは
かなり自明だと思ってたんだがそうでもないんか
49デフォルトの名無しさん:2008/04/15(火) 13:49:18
質問。MechanizeでWikipediaからページを取ってくるとハングアップしませんか?
agent.get('http://ja.wikipedia.org/wiki/%E3%81%BE%E3%81%A4%E3%82%82%E3%81%A8%E3%82%86%E3%81%8D%E3%81%B2%E3%82%8D')
50デフォルトの名無しさん:2008/04/15(火) 13:58:39
>>49
それFAQ。ていうか「Mechanize Wikipedia」で検索くらいしろ。
あと、ハングアップではなくサーバへのアクセスの無限ループなので試すな。迷惑だから。
引数をURIオブジェクトにすると一応動作するが、それだけではURLエンコードされたリンクはたどれない。

RubyのMechanizeではパーセントつきURL文字列を処理できない
ttp://d.hatena.ne.jp/kitamomonga/20080410/ruby_mechanize_percent_url_bug

ここではto_absolute_uriを動的に書き換えろって言ってるな。
51デフォルトの名無しさん:2008/04/15(火) 14:16:01
>>50
要はバグなんですね
agent.get(URI.parse('http://ja.wikipedia.org/wiki/%E3%81%BE%E3%81%A4%E3%82%82%E3%81%A8%E3%82%86%E3%81%8D%E3%81%B2%E3%82%8D'))
なら動作しました
52デフォルトの名無しさん:2008/04/15(火) 17:13:37
拡張モジュールをデバッグするために、-g をつけてコンパイル
したんですけど、Ruby 本体も -g をつけてコンパイルしなきゃ
いけませんか。
初心者でごめん。
5311:2008/04/15(火) 17:51:13
>>48
一連のレスの中でそう指摘してくださったのは >>48 さんが初めてだと思いますので、
自明というわけでもないのではないでしょうか?
54デフォルトの名無しさん:2008/04/15(火) 18:08:51
当たり前のことは誰も説明しない、というそれだけの話かもしれない。
5511: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が重複していて気になります
57デフォルトの名無しさん:2008/04/15(火) 19:31:57
hoge = moge[key_name]||default_value

とか?値が nil にも対応しないといけないんだとダメだけど。
58デフォルトの名無しさん:2008/04/15(火) 19:34:05
hoge = moge.fetch(key_name, default_value )
59デフォルトの名無しさん:2008/04/15(火) 19:36:21
h = Hash.new(default_value)
じゃだめかな
60デフォルトの名無しさん:2008/04/15(火) 20:05:37
>>57-59
ありがとうございました
fetchがそのためのものですね
61デフォルトの名無しさん:2008/04/15(火) 22:09:41
Rubyの流儀ではファイルとクラスの関係はどうですか?
他言語では一ファイル一クラスが多いようですが
62デフォルトの名無しさん:2008/04/15(火) 22:34:36
>>52
拡張ライブラリだけ-gついてりゃ大丈夫
デバッグ情報付きのrubyがあればあったでいいとは思うけど
63デフォルトの名無しさん:2008/04/15(火) 22:44:52
>>61
てきとう

RoRの流儀は知らない
64デフォルトの名無しさん:2008/04/15(火) 23:40:04
コンストラクタでsyslogを開いてログを取ってるのですが
デストラクタがないためcloseする場所がないです。
どうするのがペターでしょうか?
65デフォルトの名無しさん:2008/04/15(火) 23:48:20
明示的にcloseを外にさらけ出すとか、
ブロック構文にしてyieldからもどってきたらcloseするとか、
define_finalizerしといて適切にGC.Collectしてねと言い捨てるか。
66デフォルトの名無しさん:2008/04/15(火) 23:48:28
>>62
さんくす
67デフォルトの名無しさん:2008/04/16(水) 00:36:00
>>65
ありがとうございます
define_finalizerってやつ使うか…と思っていたのですが
syslogは複数ハンドルオープンできないんですね
コンストラクタで開いて開きっぱなしにする方法がそもそもマズいのでは
と思い直し
書く時だけオープンしてすぐ閉じるようにしました
68デフォルトの名無しさん:2008/04/16(水) 01:16:29
69デフォルトの名無しさん:2008/04/16(水) 03:16:58
正規表現を使ったディレクトリの再帰コピーってどうしたらいいですか?
Dir.globはワイルドカードしか使えないので困ってます
70デフォルトの名無しさん:2008/04/16(水) 04:04:40
再帰関数作ればいい。
71デフォルトの名無しさん:2008/04/16(水) 07:02:43
Dir.glob("**/*")の戻り配列をgrepして処理すれば。
あ、再帰じゃねーや(w
72デフォルトの名無しさん:2008/04/16(水) 07:56:03
>>69
1. FileUtils.cp_r を参考にする
2. Find.find {|path| do_somthing_with(path)}
3. Dir.open {|dir| dir.each {|entry| do_somthig_with(entry)}}

……こんなもん?
73デフォルトの名無しさん:2008/04/16(水) 14:45:54
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
74デフォルトの名無しさん:2008/04/16(水) 15:05:41
>>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
75デフォルトの名無しさん:2008/04/16(水) 15:15:53
で、

# 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桁動くから使用上は問題ないけどな
あと、フルパスや相対パスを引数にしてもそのディレクトリでリネームされるのでよろしく
76デフォルトの名無しさん:2008/04/16(水) 15:23:52
ありがとう><
0001.gifから0200.gifまでとかだと
どうするとよいですか!?

0詰めは、100以下のときだけですね^^;
77デフォルトの名無しさん:2008/04/16(水) 15:30:19
適切なファイル名を200個作って引数を200個渡す
以上

どこにどんなファイルがあるか知らんのでこれ以上はどうにもならん
汎用的な条件つけて頼めばもう一回くらいは誰か作ってくれるかも
引数として指定されたディレクトリのファイルを全てリネームするとか
78デフォルトの名無しさん:2008/04/16(水) 20:46:32
シェル呼び出しの時間を計るにはどうしたらいいですか?
Benchmark.measure { `sleep 10` }
これだと何故か実行時間が0になってしまうのです
79デフォルトの名無しさん:2008/04/16(水) 21:55:08
その間自プロセスはwaitしてるだけだから時間が掛かってないってことだよね。

tms = Benchmark.measure { `sleep 10` }
tms.real #=> 10.0072751045227

あと、``は結果を文字列で得たいときに使うものだから、system 'sleep 10'
のほうが行儀がよいと思う。
80デフォルトの名無しさん:2008/04/16(水) 21:59:04
ていうか
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 の違いってわかってもらえてるのかな
81デフォルトの名無しさん:2008/04/16(水) 22:15:13
「たぶんtotalだけみとけばいいんだな」くらいの理解だと思われる。
82デフォルトの名無しさん:2008/04/16(水) 22:33:13
>>76
ruby 連番 rename あたりでググると吉。
83デフォルトの名無しさん:2008/04/17(木) 02:45:11
>>50
初めて見たんだがそれ有名なのか?
84デフォルトの名無しさん:2008/04/17(木) 05:28:30
Rubyってタイプヒンティングやインターフェイスがないですが
引数にある型のオブジェクトが欲しい場合、
どうするのが普通ですか?
85デフォルトの名無しさん:2008/04/17(木) 07:11:30
>>84
お好きなのをどうぞ
* ダックタイピングを実践する
* 自分で引数を解析し例外送出などの処理を記述する
* Sapphireがリリースされるのを待つ
* いつかrubyに実装されるのを待つ
* PHPを使い続ける
86デフォルトの名無しさん:2008/04/17(木) 07:26:32
プログラミングRubyのダックタイピングの項を読み直してみました
ダックタイピングというのは
引数リストでフィルタせず、メソッドがあるものと前提して呼び出し、
ないときには発生する例外によってコーディングの間違いを知る
といったスタイルですね
基本ダックタイピングで、
厳格にしたいケースではメソッドの有無をたしかめる
といったあたりが現実的なところでしょうか・・
87デフォルトの名無しさん:2008/04/17(木) 07:46:22
テンプレートメソッドを
継承でするか、mixinでするかの判断基準は
何でしょうか?
88デフォルトの名無しさん:2008/04/17(木) 10:24:10
>>83
試してみるといい
まあ、Mechanizeしたいと考えるようなページなんて大体決まってるってことなんだろうな
引っかからない人は全く引っかからないバグだ、これ
89デフォルトの名無しさん:2008/04/17(木) 10:32:00
>>87


いやマジで
どっちも「使ったから便利明快になる」というものではない
(サンプルコードでは明快だけどな)
継承を試してわけわかめだったらmix-in用に思考を切り替えるのが一般的かもしれん
90デフォルトの名無しさん:2008/04/17(木) 10:42:07
>>87
テンプレートメソッドパターンとかはまず置いといて、継承が妥当か否かだったら
こんなんがあるな。
http://jp.rubyist.net/magazine/?0015-CodeReview#l11

Mixinとか委譲のおかげでRubyでは比較的あんまり継承しない気がするのは俺だけ?
91デフォルトの名無しさん:2008/04/17(木) 11:00:55
どんだけ注意深く作る(作らなければならない)かの話だな
private を書くかどうかに似た話
92デフォルトの名無しさん:2008/04/17(木) 15:31:03
privateとか何のためにあんの?
使わないメソッドなんて使わないんじゃね?
93デフォルトの名無しさん:2008/04/17(木) 15:39:49
>>92
うん、まあ、君の感覚はある意味正しい
ある一定規模未満の素朴なプログラムでは単にめんどくさいだけとも言える
「グローバル変数が危険とか言うけど変数の場所とか名前とか被らないようにしておけば問題なくね?」
という問題と根っこは一緒だ
94デフォルトの名無しさん:2008/04/17(木) 17:15:17
>>77
*.gifとかならできそうですかね。ありがとうございました!
95デフォルトの名無しさん:2008/04/17(木) 17:18:11
引数を()で囲まない
Class.method arg
という書き方をした時に、
「この書き方は今後のRubyではサポートしない可能性がある」というような
警告が出る時と出ない時がありますが
これはどういう時に出るのですか?
96デフォルトの名無しさん:2008/04/17(木) 17:29:31
>>95
ttp://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-dev/17868
> 具体的には
> 引数として与えるメソッド呼び出しの括弧を省略しない
> ということです。文法的に値と文の区別をはっきりさせようという
> 思いです。

っていうか関数型メソッド以外ではカッコ省略する必要ないじゃんという気はする
あとRiteって今で言うところのRuby2.0のことね
97デフォルトの名無しさん:2008/04/17(木) 18:25:10
>>96
ありがとうございます
マッツの設計思想はわかりますが
引数が一つの時は()書きたくないですね
この警告抑制したりできるのでしょうか
98デフォルトの名無しさん:2008/04/17(木) 18:27:43
ruby -W1 hoge.rb
もしかしたら W0 でないとダメかもしれん
99デフォルトの名無しさん:2008/04/17(木) 18:54:52
eachのブロックの中からループのカウント数を知る方法があれば教えて下さい。
100デフォルトの名無しさん:2008/04/17(木) 18:57:08
つ each_with_index
101デフォルトの名無しさん:2008/04/17(木) 19:05:36
数値をゼロパディングする方法は

printf("%010",NUM)
以外にないですか?
102デフォルトの名無しさん:2008/04/17(木) 19:12:44
number.to_s.rjust(width, "0")
103デフォルトの名無しさん:2008/04/17(木) 19:19:02
>>100
こんな便利なものが
ありがとうございました
104デフォルトの名無しさん:2008/04/17(木) 20:24:07
文法的なエラー、
たとえばendが足りなかったりすると
ファイルの最後の行を指示してエラーが出たりします。
変更箇所が多かった場合、どこで間違えたか分かりにくいです。
どこで間違えているかすぐにわかる方法があれば教えて下さい。
105デフォルトの名無しさん:2008/04/17(木) 20:51:58
ruby/sdlをつかってプログラムを作ろうと思っているのですが
常に最前面に表示し続けることは可能でしょうか?
106デフォルトの名無しさん:2008/04/17(木) 21:02:48
>>102
ありがとう神様
107デフォルトの名無しさん:2008/04/17(木) 21:10:49
>>104
ブロックの開始と終了の知識を確実にした上で、
ブロックをインデントしてくれるエディタを使う
インデントが大きくなるべきでないところで大きくなってるところがあれば
そこが閉じ忘れ
同様に "" や '' や () の対応を表示してくれる(色分けしてくれる)エディタを使うと
多くの場合「閉じ忘れ」がすぐ見つかるというか閉じ忘れることがない

あと ruby -c ./hoge.rb とすると文法チェックだけをしてくれる
自信ないなら中規模な変更ごとにチェックしてもらうといい
108デフォルトの名無しさん:2008/04/17(木) 21:24:31
>>105
たぶん不可能

ちなみにRuby/SDLの話なら、ゲーム制作スレの方がいい
http://pc11.2ch.net/test/read.cgi/gamedev/1207069887/
109デフォルトの名無しさん:2008/04/17(木) 22:12:21
>>107
エディタのインデントは完全ではないから、ちょっと複雑になるとあてにならないよ。
Rubyの文法は複雑だから、エディタごときが完全にパースできるわけではない。
だからエディタに任せてもendの閉じ忘れは検出できないことがよくある
110デフォルトの名無しさん:2008/04/17(木) 22:15:27
>>104
・classやmoduleの閉じ忘れ
最初に書け。
・defとかその中のifとかの閉じ忘れ
メソッドでけぇ。

対処法にあんまなってないけど考え方としてはこんな感じかなぁ。
111デフォルトの名無しさん:2008/04/17(木) 22:16:11
>>109
出たな100パーセント厨
口癖は「それは完全ではない」
90パーセントの達成度の価値を認めない人間だ
112デフォルトの名無しさん:2008/04/17(木) 22:27:51
90パーセントかどうかはともかく、8割くらいはエディタの自動インデントで見つかるよな

エディタとして何を使ってるかとRuby編集モードの出来に依存するのが難点か
Emacsのruby-modeはわりと優秀
113デフォルトの名無しさん:2008/04/17(木) 23:31:12
>>104
http://www.logic-junction.com/products/rubyend.html

patch をあてなきゃだからちょっと敷居は高いけど。
114デフォルトの名無しさん:2008/04/18(金) 01:10:16
>>113
これよくないですか?
なんで本体に取り込まれないんだろう
115デフォルトの名無しさん:2008/04/18(金) 01:59:32
parse.yをいじるからじゃないの。
Ruby2.0あたりではyacc捨てたいねえとか言う話もあったんじゃなかったっけ。
116デフォルトの名無しさん:2008/04/18(金) 02:09:29
>>113
どうでもいいが、ページの上にある「Abount」に吹いた。
117デフォルトの名無しさん:2008/04/18(金) 02:43:58
プログラミングRubyに
ブロックの記述は、一行の場合は{}
二行以上の場合はdo〜endを使うのが
Rubyコミュニティーのコンセンサスだと書いてありましたが
ブロックは複数行になる場合も{}の方が視認性よくないですか?
すべてendだと、何を閉じるものなのか、頭を見ないと分かりませんが、
{}だと、閉じカッコを見るだけで
何を閉じているのかがだいたい推測つきますし。
endにする合理的理由ってあるのでしょうか?
118デフォルトの名無しさん:2008/04/18(金) 02:56:59
主観的な問題
119デフォルトの名無しさん:2008/04/18(金) 03:06:49
・whileやifとの統一性
・だいたいソースは上から読む>何を閉じるものなのか、頭を見ないと分かりません
・Hashリテラルだって}で閉じるし、%{...}文字列リテラルなんかもある

でも結局は>>118か。
120デフォルトの名無しさん:2008/04/18(金) 04:50:55
end地獄が大嫌いだからdo〜endなんか絶対に使わない
121デフォルトの名無しさん:2008/04/18(金) 06:09:35
ってか、
そもそもなんでendなの?
文と紛らわしいしタイプも面倒くさい。
Rubyの最大の欠点がend。
122デフォルトの名無しさん:2008/04/18(金) 06:48:00
}地獄が大嫌いだから(複数行で){}なんか絶対に使わない

>>121
主観的な問題
123デフォルトの名無しさん:2008/04/18(金) 06:56:24
主観で片付けるのはおかしいよ
文と紛らわしいのも、タイプ数が多いのも
定量的な問題じゃん
理性的な判断を下せる範疇にあるはずだよ
124デフォルトの名無しさん:2008/04/18(金) 07:49:21
     end
    end
   end
  end
 end
end
125デフォルトの名無しさん:2008/04/18(金) 07:52:02
主観的な問題でないのなら
なぜ「do〜end超読みやすい! すっきりする」って人と
「do〜end読みにくい上に紛らわしすぎ」って人とに分かれるんだ
126デフォルトの名無しさん:2008/04/18(金) 08:04:48
だって引数の記述と通常の文との違いを明確にしたいmatzだよ
その認識の延長線上には、文と紛らわしいendの否定があるはずなんだよ
endをすぐに完全に廃止しろとは言わない
試しに{}も許容するようにしたらいいんだよ
コストはそんなに高くないだろう
その小さな変化は
きっと世界中の開発者に歓迎されると思うよ。
127デフォルトの名無しさん:2008/04/18(金) 08:07:12
・yaccの能力で、beginとcaseの文法が上手く纏められなかった
・endを使うとruby-mode.elが書けそうだった
こんな理由じゃなかったっけ。

ifやwhileのこと?
>試しに{}も許容するようにしたらいいんだよ
128デフォルトの名無しさん:2008/04/18(金) 09:04:24
endでいいと思うけど、emacsとかで
対応するclass,def,if,forにジャンプする
機能って無いですよね?
129デフォルトの名無しさん:2008/04/18(金) 09:16:27
>>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)
130デフォルトの名無しさん:2008/04/18(金) 09:43:04
M-x ruby-beginning-of-block
131デフォルトの名無しさん:2008/04/18(金) 09:44:51
あ、>>130は「このブロックの最初」にカーソルを移動な
カーソル移動がめどいという場合には妥当な機能
132デフォルトの名無しさん:2008/04/18(金) 09:55:22
ああ、キー操作あった
C-M-p
ちなみに {} のブロックでも有効
ただ、厳密には「インデントつける」計算上のブロックの最初に移動する
だから、

File.open('hoge.txt'){|f|
f.puts data
}

の場合は { ではなく File の F に移動する

File.open('hoge.txt'){|f| f.puts data }

の場合は検知できなくて、「ひとつ上」のブロックの最初に移動する
133デフォルトの名無しさん:2008/04/18(金) 11:06:13
end は予約語だから、Rubyスクリプトを読んでるという頭の中では何かと間違えることはないなあ
(むしろ bashスクリプトで doneではなく endと書いて動作不良に首を傾げる)
慣れと主観っちゃそのとおりだがそれはそれで台無しな意見だ(w
素直に着色なエディタを使うというのはどうだろう
134デフォルトの名無しさん:2008/04/18(金) 17:11:08
モジュールの中で、
自分を読み込むクラスに実装を期待するメソッドを定義あるいは明示するには
どうしたらいいですか?
135デフォルトの名無しさん:2008/04/18(金) 17:19:34
まにゅあるに「hogeとhageはつくってね」とかく
136デフォルトの名無しさん:2008/04/18(金) 17:28:37
え・・
Javaでいうabstractみたいな方法はないのでしょうか
137デフォルトの名無しさん:2008/04/18(金) 17:46:52
def hoge
 raise "override me!"
end
138デフォルトの名無しさん:2008/04/18(金) 17:46:54
実行中にメソッドを追加したり削除したりできるRubyではそもそも無理
別途ユニットテストとかでソースコード自体を検査させるべき
139デフォルトの名無しさん:2008/04/18(金) 17:47:05
140デフォルトの名無しさん:2008/04/18(金) 18:39:10
The Ruby Way 第2版
ttp://www.amazon.co.jp/dp/4798115339/
おおむね今週に発売(たぶんたいていの本屋に並んでるはず)
ボリュームアップし過ぎて5千円札では足りなくなりました
141デフォルトの名無しさん:2008/04/18(金) 19:09:25
結局実行時だけど、自分はこうしてる
 def foo
  bar
 end

private
 def bar
  raise NotImplementedError
 end
142デフォルトの名無しさん:2008/04/18(金) 19:14:58
モルボル教だかのお布施額がアップしたんだろ
143デフォルトの名無しさん:2008/04/18(金) 19:20:36
def SomeModule.included(klass)
 raise unless klass.method_defined?(:foo)
end
とかやればいいんじゃね?
144デフォルトの名無しさん:2008/04/18(金) 19:20:54
19種類のRubyテンプレートエンジンレビュー
Mini reviews of 19 Ruby template engines
http://www.hokstad.com/mini-reviews-of-19-ruby-template-engines.html

19種類ってありすぎww
145デフォルトの名無しさん:2008/04/18(金) 19:23:31
実行時にエラーが出るというのは致命的
実際にそのメソッドが使われないと、未定義かどうかのエラーが出ないんだからね

それこそ、めったに起きないエラー処理のメソッドだった場合は、
まともに動作して安心してた頃になって致命的なことになる

ソフトウェアテストでチェックすることをお勧めするよ
146105:2008/04/18(金) 19:26:28
>>108
ありです
147デフォルトの名無しさん:2008/04/18(金) 19:28:13
>>140
翻訳が変わってるのがすごく気になるな・・
148デフォルトの名無しさん:2008/04/18(金) 19:39:37
rubyはスペルミスがあってもそのまま動きますから、小さいことは気にしませんw
149デフォルトの名無しさん:2008/04/18(金) 19:48:44
>>147
同じく
クイープの翻訳は最近アテにならないからなあ
150デフォルトの名無しさん:2008/04/19(土) 00:00:08
Ruby初心者ですアドバイスよろしくお願いします。
.txtファイルに書かれた半角スペースで区切られた単語郡を
それぞれ配列に格納するスマートな方法があればお教えいただけないでしょうか。
汎用性を持たすために、ファイルの読み込みは
ruby test.rb < gomi.txt
にしたいです。
windowsXP ruby1.8.6
151デフォルトの名無しさん:2008/04/19(土) 00:07:20
つsplit
152デフォルトの名無しさん:2008/04/19(土) 00:10:48
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
153150:2008/04/19(土) 01:40:27
150です。早々の回答を有難うございました>151,152
二次元配列のような形にしたかったので、152さんのおっしゃるとおりです。
配列の値をActiveRecordでsqlに挿入しようと思っていました。
本当に助かりました、有難うございました。
154デフォルトの名無しさん:2008/04/19(土) 05:12:28
スキルレベルの微妙なちぐはぐさ加減が怖い
155デフォルトの名無しさん:2008/04/19(土) 06:21:48
emacsをruby-modeで使っています
この環境で定義済みクラスやメソッドのリストを見たり、
定義済みのメソッドを自動補完させたりすることは出来ますか?
156デフォルトの名無しさん:2008/04/19(土) 18:18:04
mixinとコンポジットの使いわけがよく分かりません
mixinがないほとんどの言語では、mixin的なことはコンポジットで実現しますよね
どういう時にmixinを使うんですか?
157デフォルトの名無しさん:2008/04/19(土) 18:22:53
mixin は mixin 先の実装に依存した実装を追加したい時に使う。
158デフォルトの名無しさん:2008/04/19(土) 19:44:38
ファイルパスから親ディレクトリを取得するにはどうしたらいいですか?
159デフォルトの名無しさん:2008/04/19(土) 19:47:52
>>158
File.dirname(file_name)
160158:2008/04/19(土) 20:01:35
DirとかFileUtilsばかり見てました
ありがとうございます
161デフォルトの名無しさん:2008/04/19(土) 20:05:51
ライブラリのクラスメソッドを使う場合に
それを後に書く方法があれば教えてください
たとえば
File.dirname 'hogehoge'

'hogehoge'.(File.dirname)
みたいな形で書きたいんです
162デフォルトの名無しさん:2008/04/19(土) 20:10:40
>>161
そうですか
163デフォルトの名無しさん:2008/04/19(土) 20:15:50
どっかでそんな後置の言語を見た気がする
仮にRubyで実現するとしても、それを繋ぐのは . ではないだろうな
164デフォルトの名無しさん:2008/04/19(土) 20:22:51
気持ち悪いと思わないなら
class String
def dirname
File.dirname(self)
end
end

あとはpathnameというライブラリもある。
165デフォルトの名無しさん:2008/04/19(土) 20:38:34
というか何のためにそうしたいのかによるな
166デフォルトの名無しさん:2008/04/19(土) 21:08:19
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]

こんなもんでどうかな
167166:2008/04/19(土) 21:09:58
上のは >>161
168デフォルトの名無しさん:2008/04/19(土) 21:46:47
>>165
クラスとオブジェクトとメソッドの理解がまだ足りないんだと思う
気持ちはわかるが考え方が不当

欲しいのはいわば pathenize_dirname メソッドと推測

p '/usr/local/bin/ruby'.pathenize_dirname
"/usr/local/bin/"

メソッドの引数形式を「カッコ悪い」と感じる時期に罹るハシカみたいな病気だ
169デフォルトの名無しさん:2008/04/19(土) 22:30:45
え、>>161は見た目が気に入らないというだけ?
機能的な話かと思ったら、どうやら明後日を向いていたようだ。
そういうことであれば >>166>>161の美意識には適うまい。
170デフォルトの名無しさん:2008/04/19(土) 22:33:10
こんなのもありか。

class String
def to_path
Pathname(self)
end
end

p '/usr/local/bin/ruby'.to_path.dirname
171デフォルトの名無しさん:2008/04/19(土) 22:33:40
いや、pではto_strは呼ばれないな。putsで。
172デフォルトの名無しさん:2008/04/20(日) 15:48:07
ERBについて教えてください。
railsのテンプレートでERBが使われてますが、
これは何かのタイミングで一度rubyのクラスに変換されてからHTMLに再び変換されるのでしょうか?
例えばJavaのJSPがJSP→サーブレット→HTMLと変換されるのと同じ流れですか?
173デフォルトの名無しさん:2008/04/20(日) 16:05:58
>>172
<%%>の中身がそのままRubyコードとして抜き出され、
それ以外は_erbout.print ... という形に変換されてから
Rubyで評価される感じです。
174172:2008/04/20(日) 16:30:00
>>173
なるほど、jspみたいにrhtmlファイルがクラスに対応するわけではないんですね。
あまり綺麗な仕組みではないですね…。
ありがとうございました。
175デフォルトの名無しさん:2008/04/20(日) 16:31:52
単純に、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="">


送信できていない原因は何でしょうか?
179デフォルトの名無しさん:2008/04/20(日) 18:16:00
>>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++
みたいな書き方が他言語とは挙動が異なるみたいなんですが
これはどういう動作をしているのでしょうか?
182デフォルトの名無しさん:2008/04/20(日) 20:47:58
そもそも ++ はないよ
183デフォルトの名無しさん:2008/04/20(日) 20:48:11
rubyにそんな演算子は存在しない
184デフォルトの名無しさん:2008/04/20(日) 23:54:38
>>182-183
ありがとうございました
なんでないんでしょうね?
実装も単純そうなのになぁ
185デフォルトの名無しさん:2008/04/21(月) 00:08:05




説明するの面倒なのでぐぐってくれ
インクリメントの実装自体は簡単なんだが、Rubyのほうそくが みだれる ので採用されない
186デフォルトの名無しさん:2008/04/21(月) 00:12:19
かっちょええ説明法があればたぶん普通に採用されると思う
さあ頑張って
「自分を破壊し別のオブジェクトを生み出して置き換える」
メソッドの意味を説明して説得するんだ
187デフォルトの名無しさん:2008/04/21(月) 00:18:12
モルモン教義的に不死がタブーでないのなら
Rubyでベニクラゲをモデリングしたいと言ってみる
188デフォルトの名無しさん:2008/04/21(月) 00:23:36
ループが正常に実行した時にのみ、ある処理を実行する
というプログラムを美しく書く方法があれば教えてください。
フラグを用意し、ループを抜けてからフラグをチェックするのが
普通だと思いますが、フラグの存在が冗長な気がします
例外を使うのも、何かやりすぎのような気がします
189デフォルトの名無しさん:2008/04/21(月) 00:56:43
do_this if array.all? {|x| ... }
とかじゃなく?
190デフォルトの名無しさん:2008/04/21(月) 03:20:44
どこでもrescueされなかった例外を補足するには
どうしたらいいですか?
191デフォルトの名無しさん:2008/04/21(月) 03:27:37
rescue すればいい
192デフォルトの名無しさん:2008/04/21(月) 03:56:54
全体を囲む大きなbeginブロックを書くということですか?
視認性が悪くなるので、
前もってエラーハンドラみたいなものが登録できたらいいと思うのですが・・
193デフォルトの名無しさん:2008/04/21(月) 04:07:33
基本的には処理はトップレベルにベタ書きすべきじゃないと思うから
(変数はなるべくローカルスコープに入れた方がいいので)、
C などの main 関数みたいに全ての処理を囲んだ関数を作って
トップレベルに記述する処理はその関数のみにしておくと良い。
そういう状態であれば、begin で囲むのもそこだけで済む。
194デフォルトの名無しさん:2008/04/21(月) 04:18:35
ふーむなるほど…
ありがとうございました
195デフォルトの名無しさん:2008/04/21(月) 06:16:46
Timeオブジェクトを引き算するとfloatが返ってきます
時間の差をあらわすオブジェクト(間隔オブジェクト?)が
返ってきて欲しいのですがどうしたらいいですか?
196デフォルトの名無しさん:2008/04/21(月) 07:44:30
>>196
返って来たFloatがその間隔オブジェクト(秒.マイクロ秒)
欲しい単位が分なら (t2 - t1).to_i / 60 すればいい
197デフォルトの名無しさん:2008/04/21(月) 10:59:01
>>186
代入演算子の一種として実装すればよい
例:a += 1
198デフォルトの名無しさん:2008/04/21(月) 21:39:36
199デフォルトの名無しさん:2008/04/21(月) 22:23:48
num++に問題があるというより
++numとnum++の挙動の違いをRubyの中に組み込むのに難があるという感じ?
200デフォルトの名無しさん:2008/04/21(月) 22:32:18
succはあるんだから、前置++は構文だけの問題だね
後置は……
201デフォルトの名無しさん:2008/04/21(月) 22:42:48
> succはあるんだから
ほほう
君のRubyでは
3.succ
として 3が 4になるのか?
202デフォルトの名無しさん:2008/04/21(月) 22:43:01
馬鹿ばっかだな
演算子で終わることに自体に問題があるんだろ
203デフォルトの名無しさん:2008/04/21(月) 22:45:52
>>201
ああ、succはsucc!じゃないよね
吊ってきます
204デフォルトの名無しさん:2008/04/21(月) 22:59:58
で、誰が演算子で終わることを問題にしてるの?
205デフォルトの名無しさん:2008/04/21(月) 23:51:33
Cだと 1++ で 1 が 2 になるのか。
おもしろいな
206デフォルトの名無しさん:2008/04/22(火) 00:02:31
演算子で終わることの意味も分からない馬鹿がいるな
207デフォルトの名無しさん:2008/04/22(火) 00:16:53
演算子で終わる云々なんて、この何回もループした議論の中で出てきたっけ?
そりゃ内部仕様は変えなきゃいかんだろうが、「演算子で終わったら駄目」な理由は?
というか採用されても、「特殊なメソッド」以上のものにはならんと思うが
208デフォルトの名無しさん:2008/04/22(火) 00:17:20
RubyでCGI作ってみてるのですが、system(id root)とかのコマンド結果が
どうもHTTPヘッダーとして出力されてしまっているようです。

どうにか出力しない方法ってあるんでしょうか。
209デフォルトの名無しさん:2008/04/22(火) 00:18:59
パイプ使って、標準出力/エラー出力を捨てとけ。
210デフォルトの名無しさん:2008/04/22(火) 00:23:10
>>209
ありがとです。
211デフォルトの名無しさん:2008/04/22(火) 01:48:37
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
広くメソッドというもの自体をオーバーライドすることは出来ますか?
メソッドすべてにフックを仕込んで、メッセージのやりとりを
ロギングしたり、そういうことがしたいんですが
213デフォルトの名無しさん:2008/04/22(火) 02:51:19
214212: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
になります
存在しなかったとしてもエラーが出ないように参照する方法を
教えて下さい
217デフォルトの名無しさん:2008/04/22(火) 07:11:08
def nil.[](i)
nil
end
218デフォルトの名無しさん:2008/04/22(火) 07:42:47
ハッシュのデフォルト値を[]にするとか
219デフォルトの名無しさん:2008/04/22(火) 08:03:40
あ、スマンぼけてた。問題は配列のほうか。
220デフォルトの名無しさん:2008/04/22(火) 08:16:16
多重ハッシュでも存在しないキー指定したら
undefined method `[]' for nil
になるじゃん

何をしたいか明確に書けよヴォケ
221デフォルトの名無しさん:2008/04/22(火) 10:20:15
>>216
配列じゃなくてハッシュを使う
222デフォルトの名無しさん:2008/04/22(火) 11:25:06
多次元配列などというものはRubyには存在しません
223デフォルトの名無しさん:2008/04/22(火) 13:57:40
class TajigenHairetsu << Hash
def [](*arg)
super(arg)
end
def []=(*arg)
super(arg[1,-1], arg.last)
end
224デフォルトの名無しさん:2008/04/22(火) 17:41:56
rubyのコマンドからファイルの有無を確認する方法は無いでしょうか?
無ければ指定したテキストファイルを作り
あれば追記するような仕組みを持ちたいので
225216:2008/04/22(火) 17:50:19
217さんの方法でしのぐことにしました
ありがとうございました
>>220
ハッシュか配列かではなく
nilに[]が使えないことをどうしようかという話でした
226デフォルトの名無しさん:2008/04/22(火) 18:17:46
>>224
ファイルのことについてどうこうしたいんだからFileクラスのメソッド探してみれ
227デフォルトの名無しさん:2008/04/22(火) 19:31:56
だからfetch(i,default)を使えと
228デフォルトの名無しさん:2008/04/22(火) 20:24:49
問答無用に'a'でopenすればええんとちゃうの?
229デフォルトの名無しさん:2008/04/22(火) 21:04:12
>>228
のぞんでいたどうさができました
おそらく不具合の原因は参考にしていたサイトがafile=File.new(*****)
とnewを使っていたためのようです
今まで5個ほど言語を学んできましたがrubyほどシンプルで強力な言語は
無いと感じました
本当にありがとうございます!
230デフォルトの名無しさん:2008/04/22(火) 21:28:45
>>215

動かなくなるよ。
str.each は、str.scan(/^/).each に置き換えよう。
231デフォルトの名無しさん:2008/04/22(火) 21:42:21
IO#eachは残ってるんじゃなかったっけ?
232デフォルトの名無しさん:2008/04/22(火) 22:15:01
class String
 unless method_defined?(:lines)
  def lines
   self
  end
 end
end

としておいて、1.8系でもstr.lines.eachと書いておくという手も…
233デフォルトの名無しさん:2008/04/22(火) 23:06:52
irb > print "test"
この結果が
ttt => nil
と出るんですが、これはどういう意味なんですか?

irb => ttt
と出力されることを期待したのですが。
234デフォルトの名無しさん:2008/04/22(火) 23:09:48
tttはtestのつもり?
irbの=>の後ろに出るのは、入力した式(print "test")を評価した値。
x= print "test"
とすると x = nil になるのといっしょ。

testという文字列が書き出されるのは式の評価(値を求めること)の、まぁ副作用だ。
235233:2008/04/22(火) 23:38:04
>>234
おぉ丁寧にありがとうございます。
入力コマンドを単純に実行するのではなく評価するだけなんですね。
てか使い道あるんでしょうかね…?
236デフォルトの名無しさん:2008/04/23(水) 00:34:45
ないよ
237デフォルトの名無しさん:2008/04/23(水) 00:37:12
irb > print "test"
この結果が
ttt => nil
^^^~~~~~~
^:printの出力
~:irbが返り値のインスペクションを出力

コマンドって…
238デフォルトの名無しさん:2008/04/23(水) 00:43:07
ttt => String
にはならんの?
239デフォルトの名無しさん:2008/04/23(水) 00:51:04
たぶん出力の意味を勘違いしてるよ。
irbは「=> 返り値」を印字してるだけ。
その前のprintの出力に改行がないからそんな見た目なだけ。
もしそんな出力がされるってことは、printがStringクラスを返してるというイミフなことになるぞ。
240デフォルトの名無しさん:2008/04/23(水) 06:24:22
RubyのIDEでおすすめは何ですか?
今はNetBeansを使っていますが、他のファイルのクラス等が
自動補完できないのでもう少し高機能なのが欲しいと思っています
241デフォルトの名無しさん:2008/04/23(水) 09:33:10
おすすめは無い
あと1年くらいしたら便利なの出てくるぜと3年くらい前から言われてる
242デフォルトの名無しさん:2008/04/23(水) 11:46:14
rubyらしいな
243デフォルトの名無しさん:2008/04/23(水) 14:09:47
pythonから移ってきた人向けの入門ページとかないですか?
244デフォルトの名無しさん:2008/04/23(水) 15:31:57
for文について質問です。

for book in book_array
end

このように配列を回すfor文の中でインデックスを取得することは出来ないのでしょうか?
245デフォルトの名無しさん:2008/04/23(水) 15:33:59
Enumerable#each_with_index
246デフォルトの名無しさん:2008/04/23(水) 15:53:58
>>245

ありがとうございます!できました。
java出身だとfor文でインデックス取れないって変な感じですね。
247デフォルトの名無しさん:2008/04/23(水) 16:15:35
数値計算関係はpython
日本語処理はruby
という使い分けしようと思っててるんですが、うまくミックスする方法はないのでしょうか?
248デフォルトの名無しさん:2008/04/23(水) 16:39:13
質問が曖昧すぎて意味不明
249デフォルトの名無しさん:2008/04/23(水) 19:40:43
>>246
for i in (0..book_array.size)
p i, book_array[i]
end

カウンタ変数もなしにインデックスが取れるわけないだろう
250デフォルトの名無しさん:2008/04/23(水) 20:37:16
>>249
× ..
○ ...
251デフォルトの名無しさん:2008/04/23(水) 21:54:00
上と下ならどっちがrubyらしいですか?

if foo == ""
end

if foo.is_a? String && foo.empty?
end
252デフォルトの名無しさん:2008/04/23(水) 22:07:13
オブジェクトの型をチェックするコードは常用するものではない。
253デフォルトの名無しさん:2008/04/23(水) 23:04:56
>>247
全部Python
254デフォルトの名無しさん:2008/04/23(水) 23:13:04
てかRubyの日本語処理ってNKFべっただし
PythonからRuby向けを切り出す必要があるとは思えない
Pythonで書けるなら全部Pythonで書くのがベスト
255デフォルトの名無しさん:2008/04/24(木) 00:18:41
rubyで簡単なツールを作ろうと考えております
GUIを組むにはruby/tkとか色々種類があるようなのですが、
最もメジャーなのはどれでしょうか?

ツールの詳細としては、チェックボックスやリストで設定項目を設定し、
それによるシミュレーション結果をメッセージボックスに文字列で
順次吐き出すだけというものです

※一応Javaも少しかじってます
もし「rubyのGUIは終わってるからJavaでやれ」とかならば
それはそれで結論として構いません
256デフォルトの名無しさん:2008/04/24(木) 00:28:07
際だって使われているGUIツールキットはないと思うが、tkは最初から
付いてくるから比較的メジャーと思われる。
自分はマカーなので、必要な場合はOSに付いてくるRubyCocoaを使う
ことになると思うけど。

Javaもかじってる人ならJRubyでSwing使うというのもアリかね。
257デフォルトの名無しさん:2008/04/24(木) 00:31:29
>>255
FXRuby
258デフォルトの名無しさん:2008/04/24(木) 00:35:52
railsでいいじゃん
259デフォルトの名無しさん:2008/04/24(木) 00:38:22
260デフォルトの名無しさん:2008/04/24(木) 00:41:57
配布するのか、自分の特定のマシンで使うのかにもよるよな
261デフォルトの名無しさん:2008/04/24(木) 01:00:03
漏れはRuby/Gtk2
Gnomeだからそれに合わせて。Gladeとかあって使い勝手も悪くない。
262255:2008/04/24(木) 01:07:39
>>260
一応は仕事で補助的に使うツールです
基本は自分のPCで動けばOKですが
状況によっては周囲に配らないとも言いきれませんので
配布時のパッケージングに優れていると助かりますね

263255:2008/04/24(木) 01:09:43
あと、OSはWindowsXPです
今更言う事でもありませんが、念の為…
264デフォルトの名無しさん:2008/04/24(木) 01:12:18
>>255
wxRubyかFXRubyの2択だな
265デフォルトの名無しさん:2008/04/24(木) 01:15:49
VisualuRubyはダメなのかな?
exerbでexe化もできるみたいだし。


てか、ほんと「これだ!」ってのはないと思う。
266デフォルトの名無しさん:2008/04/24(木) 09:48:06
俺AvtiveRubyとHTA
267デフォルトの名無しさん:2008/04/24(木) 10:24:49
HTA+ActiveScriptRubyなんて組み合わせ知ったときには
これぞ俺が今まで追い求めていたものだと直感した
GUIはHTMLで記述、中身の処理はRuby。夢のようだ

なのになんで使わなくなったんだっけ俺
268デフォルトの名無しさん:2008/04/24(木) 13:01:03
インターフェイスはrubyになるけど中身はIEのままじゃねそれ
eachとかProcとかないんじゃ
269デフォルトの名無しさん:2008/04/24(木) 14:45:06
>>247
>>254
xmlrpcやjsonでお互いのプログラム間で通信したらいいのかな?
270デフォルトの名無しさん:2008/04/24(木) 17:24:55
>>255
反則っぽいけどwebrickでアプリケーションサーバを作るとか
guiとかの環境依存性も配布する必要も無い
ついでにdrbで分散処理も追加
271デフォルトの名無しさん:2008/04/25(金) 00:47:28
>>255
>262,263の条件ならC#かJavaがいいと思う。
UNIX系でも使う可能性があるなら>264かな。
272255:2008/04/25(金) 02:51:02
色々候補ありましたが、日本語周りに確証が欲しかったので
差し当たりVisualuRuby触ってみる事にします
皆様レス有難うございました

しかし決め手が無くて色んな種類があるという状態は
選択肢が広いとは言え、個人的には苦手だ…
273デフォルトの名無しさん:2008/04/25(金) 04:29:00
パスが入ってる文字列のファイルセパレーター(/や\)を,
/からwindowsの\に変換するメソッドは有りますか?
274デフォルトの名無しさん:2008/04/25(金) 05:51:48
>>273
文字の置き換えだろ?
リファレンスマニュアルでStringの項を読みなさい
275デフォルトの名無しさん:2008/04/25(金) 23:54:28
文字列の50行目から100行目の範囲に対して、正規表現で検索をしたいのですが
今は
str.split('\n).each do |line|
cnt += 1
line =~ 〜 if(50<=cnt && cnt<=100)
end
のようにしているのですが、strはかなり長い文字列なので、無駄な処理をしている気がします
もっと上手は方法はないでしょうか?
276デフォルトの名無しさん:2008/04/26(土) 00:22:53
>>275
とりあえず、splitする必要ないでしょ
277デフォルトの名無しさん:2008/04/26(土) 00:31:59
>>275
ややトリッキーな方法だが

target_lines = str.split($/).slice(50..100)
if target_lines then
 target_lines.each do |line|
  line =~ 〜
 end
end
278デフォルトの名無しさん:2008/04/26(土) 00:39:05
>>276-277
ありがとうございます
279デフォルトの名無しさん:2008/04/26(土) 10:18:49
>>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
280デフォルトの名無しさん:2008/04/26(土) 10:32:56
next unless (50..100) === cnt
281デフォルトの名無しさん:2008/04/26(土) 12:00:36
何を無駄って考えてるかによりそう
strが巨大な配列になってるのがヤだっていうならsplitとeachは全滅だな
282デフォルトの名無しさん:2008/04/26(土) 13:58:48
Rubyからコマンドを実行させるには、execとかsystemとかいろいろあると
思うんですけど、出力結果を文字列として取得する場合はどうすればいいんですか?

ちなみにRuby1.8.6です。
283282:2008/04/26(土) 14:01:07
282です。
できればエラーストリームだけとれるのが望ましいです。
284デフォルトの名無しさん:2008/04/26(土) 14:13:05
http://kazuho.exblog.jp/1883201/
>日本のオープンソース開発者の中で有名なまつもと氏のような方ですらライセンス条件について間違った解釈をしてしまうのである


ほうほう。
285デフォルトの名無しさん:2008/04/26(土) 14:49:08
わざわざ自分のブログ宣伝して回るなよ
286デフォルトの名無しさん:2008/04/26(土) 16:24:59
>>282
* Open3 を使う(require 'open3')
* 自分で作る(open3 は簡単だから、読んでみるといい)
* windowsでは動かないかもしれないが↓
command = 'ls /tmp'
stderr = `#{command} 2>&1 > /dev/null`
287デフォルトの名無しさん:2008/04/26(土) 22:55:11
>>282
$stdout, $stderr を reopen して system

system のいいとこは shell を介さずに実行できるから
コマンドインジェクションを防げる。
288デフォルトの名無しさん:2008/04/27(日) 01:40:40
単純にpopenじゃあかんの?
289デフォルトの名無しさん:2008/04/27(日) 10:50:28
ポペン!
290デフォルトの名無しさん:2008/04/27(日) 18:19:04
あのさ、あるクラス Foo があって、その機能強化版をつくったとき、
クラス名は何にしたらいいと思う?
AdvancedFoo とか ExtendedFoo とか考えたけど、あまりいい名前じゃないといわれた。
かといって、雑多な機能をいくつも付け加えたから、これといって名前をつけにくいんだよな。
なんかいい名前ない?
291デフォルトの名無しさん:2008/04/27(日) 18:26:58
追加する機能をモジュールとして作り、
Fooのインスタンスにextendで機能追加する。

↑という方法では解決できず、どうしても継承でやる必要があるなら
FooWith機能名
とか
機能ableFoo
とか。

292デフォルトの名無しさん:2008/04/27(日) 18:30:36
Fooそれ自体に機能(メソッド)を追加するという方法もある。
あるいはモジュールとして作り、includeする。
Fooのインスタンスはどれでも追加された機能を使える。

class Foo
... # 元の定義
end

# 定義を再オープンして機能追加
class Foo
def 追加機能
end
...
end

>>291のextendする方法は、Fooクラスのインスタンス全体ではなく、
Fooの特定のインスタンスだけに機能を追加する方法。
293デフォルトの名無しさん:2008/04/27(日) 18:32:40
クラスに二つ以上の責任があるんじゃないか?
できれば分割して名前を明示できるようにした方がいい
294デフォルトの名無しさん:2008/04/27(日) 19:46:16
>>291,292
もとのFooは残す方向なので(ほかに継承で使っている人がいるから)、Foo自体を拡張するわけにはいかないんです

>>293
まあそうなんですけど、Rubyの大クラス主義でやっているので。
大クラス主義はたしかに便利なんだよね。既存の他のクラスのインターフェース変えなくていいし。
295デフォルトの名無しさん:2008/04/27(日) 20:19:07
>>294
大クラス主義はキッチンシンクじゃないぞ。

>>290
> かといって、雑多な機能をいくつも付け加えたから、これといって名前をつけにくいんだよな。
どうも行き辺りばったりの感じがするんだが。
UtilFooとでもしとけば。
296デフォルトの名無しさん:2008/04/27(日) 20:45:31
Rmagickで書き込もうとする、もしくは書き込んだ文字列の幅と高さを求めるにはどうすれば用でしょうか?
297デフォルトの名無しさん:2008/04/27(日) 21:48:45
>>296
ImageMagickのコマンドから推測するといい
298デフォルトの名無しさん:2008/04/28(月) 19:42:33
Rubyの利点って何?
Javaプログラマの俺にわかりやすく説明して
299デフォルトの名無しさん:2008/04/28(月) 19:55:52
状況も設定せずに利点を挙げろつってもなぁ。
まずは自分の疑問をわかりやすく説明しる。
300デフォルトの名無しさん:2008/04/28(月) 20:02:49
適当な捨てプロ書くのに凄く楽。
301デフォルトの名無しさん:2008/04/28(月) 20:09:52
>>298
君にとって利点はないと思うよ
302デフォルトの名無しさん:2008/04/28(月) 20:37:12
気楽に楽しくプログラミングできる
303デフォルトの名無しさん:2008/04/28(月) 20:37:35
>>301
その返し方は誤解を与えるかもな。
ほとんどの人にとって利点はないと答えたかったんだろ?
304デフォルトの名無しさん:2008/04/28(月) 21:00:15
>>300
それあるなぁ。
ワンライナーも併せて便利
305デフォルトの名無しさん:2008/04/28(月) 21:10:58
>>303 一人で納得してれば
306デフォルトの名無しさん:2008/04/28(月) 21:51:50
rubyで大枠の処理を書いて、細かいところはJavaを呼び出す
307デフォルトの名無しさん:2008/04/28(月) 22:09:01
JRubyでうんたらかんたらできる。
初期起動がかなり遅いけど。
308デフォルトの名無しさん:2008/04/28(月) 22:36:39
Rubyの利点って何って話だけど、
それよりむしろJRubyの利点が知りたい。
309デフォルトの名無しさん:2008/04/28(月) 22:38:33
JRubyの利点ってJavaのクラスが呼び出せるとかじゃないのかな。
これができると膨大なJavaのライブラリも使えるし。

個人的にはSwingあたりのGUIライブラリが楽に使えるとありがたい。
310デフォルトの名無しさん:2008/04/28(月) 22:40:57
大量にあるJavaの資産が使えるのがありがたい
標準のライブラリだけで大抵のものが一揃いして、もちろん完成度も高め。Swingもあるし
311デフォルトの名無しさん:2008/04/28(月) 22:47:59
>>309
>>310
へー、そうなんだ!
JAVA屋さんには便利なのかな

そういえばIronRubyはどうなったんだろう
312デフォルトの名無しさん:2008/04/28(月) 22:55:35
>>308
(顧客の)サーバにRubyのバイナリを入れるのは(政治的な意味で)非常に大変だが、
Javaはデフォで入ってるので、jarを1個放り込めばよいJRubyは非常にありがたい。
313デフォルトの名無しさん:2008/04/28(月) 23:12:25
>>312
その発想はなかった!
業務で使ってる人は大変なのね
314デフォルトの名無しさん:2008/04/28(月) 23:40:01
>>312
これあるよねー
unzipコマンドがない客先のサーバでzipファイルを解凍しなきゃいけなくて
さてどうしようと思ってたら、jarコマンドで解凍できた。
このときはjavaすげーとおもった。
315デフォルトの名無しさん:2008/04/29(火) 00:18:07
rubyの開発者
凄い人なんだろうけど、あらゆるruby本の監修になって名前貸すだけで稼ぎまくってるあの魂胆が嫌いだ
316デフォルトの名無しさん:2008/04/29(火) 00:20:36
成果をねたむ足引っ張り合い好きな国民性丸出し
トイレ掃除でもしてろ
317デフォルトの名無しさん:2008/04/29(火) 01:24:23
俺はUSBメモリにruby.exeとmsvcrt-ruby18.dllが入ってるな(他は grep sed)。
これだけでもコマンドプロンプトのお供に使えるところが好き。

Python はライブラリ無いと起動すらしないし、Perl は動くけど glob が使えねえし…。
318デフォルトの名無しさん:2008/04/29(火) 02:03:04
監修料なんて雀の涙だろ。
319デフォルトの名無しさん:2008/04/29(火) 02:15:01
 ヾヽヽ
 (,, ・∀・)チュンチュン
  ミ_ノ
  ″″
320デフォルトの名無しさん:2008/04/29(火) 02:28:02
>>318
どっかの年金では図柄変更バージョンごとに1千万とからしいけど。
図柄かえるだけのバージョンが100くらいある。
321デフォルトの名無しさん:2008/04/29(火) 03:18:35
監修料がわずかって…何を見て言ってんだ?
有名人になると筆者より儲けてるよ
322デフォルトの名無しさん:2008/04/29(火) 03:32:49
何を見て言ってんだ?
323デフォルトの名無しさん:2008/04/29(火) 03:38:27
324デフォルトの名無しさん:2008/04/29(火) 06:20:24
>>317
やあ俺
シェルと好みのエディタ入れれば、簡易開発環境が出来てしまうのが便利だ
325デフォルトの名無しさん:2008/04/29(火) 08:13:17
>>321
具体例をドゾー
326デフォルトの名無しさん:2008/04/29(火) 09:43:14
>>321
監修するなってこと? なんで? そのメリットは?
「成功者の収入が減ると、貧乏人の俺の胸がすく」という以外のメリットを感じないけど・・・。
327デフォルトの名無しさん:2008/04/29(火) 09:53:42
釣られんなよ、おまいら……。
328デフォルトの名無しさん:2008/04/29(火) 10:31:38
まぁ釣りだったことにしたいだろうなぁ、このフルボッコな状況じゃ。
329デフォルトの名無しさん:2008/04/29(火) 12:53:29
>>320
さすがに公共事業とは事情が全く異なるだろ。
そういうのはまた孫受け曾孫受けで政治家とか○暴とかの
たかり屋に流れるからその分割高だし。
330デフォルトの名無しさん:2008/04/29(火) 13:31:36
ちょっとした質問です。



・・・忘れた
331デフォルトの名無しさん:2008/04/29(火) 13:34:16
すいません、思いだしました!

Rubyで小物でもプログラムを書くときに、
クラス化しますか?
適当に書き下す(とは言っても100行オーバーの大きさ)場合はトップレベル関数ばりばりでも
よいと思うのですが、関数作りまくるプログラミングタイプだと、
いちいち関数化時に変数をグローバルにするのが面倒です。
また、配布とかも考えると、クラス化してライブラリとして使えるようにも、と思ってしまいます。

あなたはどうしてますか?
332デフォルトの名無しさん:2008/04/29(火) 14:01:16
うぜぇw
333デフォルトの名無しさん:2008/04/29(火) 14:02:37
配布を考える場合は、規模問わずほぼ確実にクラス化(モジュール化)する

配布を考えないなら、そのときどき
トップレベル関数(メソッド)から作り始めることもあれば
クラスの設計から始めることもある

ところで
>いちいち関数化時に変数をグローバルにするのが面倒です。
これはどういう意味なんだ
334デフォルトの名無しさん:2008/04/29(火) 14:19:14
この俺がエスパーしよう!

name = gets.chomp
hello = 'ぐっもーにん'
puts "#{name}さん、#{hello}"

をメソッドにすると

def say_hello
puts "#{$name}さん、#{$hello}"
end

$name = gets.chomp
$hello = 'ぐっもーにん'
say_hello

と書かなければならなくなって面倒だとか、たぶんそういう話だ!
335デフォルトの名無しさん:2008/04/29(火) 14:33:57
トップレベルは気持ち悪いからなんでもクラス化
336デフォルトの名無しさん:2008/04/29(火) 14:35:08
とりあえず関数だけで書いて
複雑になってきたらリファクタリングしてクラス化
337デフォルトの名無しさん:2008/04/29(火) 14:42:55
100行くらいなら、多分関数のみ
338デフォルトの名無しさん:2008/04/29(火) 14:47:37
メソッドのことを関数と言ってる奴は同一人物
339デフォルトの名無しさん:2008/04/29(火) 15:12:32
>>333
>>いちいち関数化時に変数をグローバルにするのが面倒です。
>これはどういう意味なんだ

>>334 そのとうりです!!

>>338
トップレベルメソッドというべきでしたか?
340デフォルトの名無しさん:2008/04/29(火) 15:59:49
確か三年ぐらい前に、初心者だった自分も同じようなことを言われたんだが
グローバル変数の使用はお薦めしない(書き捨ての短いコードだとしても)
エスパー>>334の例を借りると

def say_hello(name, hello)
 puts "#{name}さん、#{hello}"
end

say_hello(gets.chomp, 'ぐっもーにん')

こんな風に引数として渡したほうがいい
341デフォルトの名無しさん:2008/04/29(火) 16:47:55
いくらなんでも324はないだろう

def init(opt)
$_option = opt
end
def exe(arg)
if $_option[:foo]

end

init :foo => :bar
exe "hoge"


とか?
342デフォルトの名無しさん:2008/04/29(火) 16:53:28
俺の場合は新規作成した場合、自然と指が

class

って動いちまうなあ。
343デフォルトの名無しさん:2008/04/29(火) 17:03:15
Pythonと比べるとRubyの方が直感的だと感じてしまうのはRubyに毒されたからなのか。
yieldの書き方とかはRubyの方がいいな。
344デフォルトの名無しさん:2008/04/29(火) 17:06:54
コルーチンがわかってないんだろ
345デフォルトの名無しさん:2008/04/29(火) 17:35:41
>>342
毎回指で書くなら自動化すればいいじゃない
346デフォルトの名無しさん:2008/04/29(火) 17:47:28
これがコルーチンか。そう意識してみるとPythonの書き方もこれでもいいかと思えてくる。
でもRubyの方がコルーチンを中断している途中でなんか処理しているってイメージがしやすい気がする。
気のせいか慣れなのかもしれないけど。
347デフォルトの名無しさん:2008/04/29(火) 22:15:27
メソッド・オーバーライトって、具体的に、どんなときに使ったことありますか?
348デフォルトの名無しさん:2008/04/29(火) 22:31:43
ライブラリのメソッドを上書きしたいとき
349デフォルトの名無しさん:2008/04/29(火) 22:49:20
それはわかるんだけど、具体的にどんなメソッドを上書きしたの?
350デフォルトの名無しさん:2008/04/29(火) 23:10:38
inspect はしょっちゅうオーバーライドしてるなあ。
あと to_s も。
351デフォルトの名無しさん:2008/04/29(火) 23:49:21
>>349
OKまずはageだ

・自分で設計したクラスのサブクラスを作ったとき(基本)
・他所から持ってきたライブラリのバグを自分で直すとき
・ライブラリの挙動を少しいじくったり、機能を足したいとき(たいていサブクラスを作って上書きする)

上書きコードがある程度の量になってきたら、自分用のラッパーライブラリを作ることもある
352デフォルトの名無しさん:2008/04/30(水) 00:41:49
再定義はオーバーライト(overwrite)じゃなくてオーバーライド(override)だな。
353デフォルトの名無しさん:2008/04/30(水) 01:19:44
そういえば、Object#inspectって循環参照があるオブジェクトに対してもちゃんと動くよね
これってどうやって検出してるんだろう。inspectは特に引数を受け取るでもないし
354デフォルトの名無しさん:2008/04/30(水) 07:48:36
>>353

Thread.current[:__inspect_key__] でobject_idを覚えてる。
355デフォルトの名無しさん:2008/04/30(水) 09:26:26
>>354
スレッドローカルストレージ使っているのか。なるほど。
353じゃないが参考になった。
これからもあわあわと質問に解凍しやがってください。
356デフォルトの名無しさん:2008/04/30(水) 11:34:29
>>354
そういうことかー。返答ありがとう。
357デフォルトの名無しさん:2008/04/30(水) 18:32:29
javaが呼べるのは便利そうだけど
c++(cじゃなくて)の呼び方がまとめてあるサイトないですか?
358デフォルトの名無しさん:2008/04/30(水) 19:38:33
railsでないRubyではDB操作するのに何が一番使われてますか?
素のライブラリ?DBI?ActiveRecord?
359デフォルトの名無しさん:2008/04/30(水) 23:38:38
O/R MapperならActiveRecordかDataMapper
そうでなければDBIかMySQLライブラリ直書き
360デフォルトの名無しさん:2008/05/01(木) 00:28:23
activerecordだけ使うならrailsでやればいいのに
って思う。
361デフォルトの名無しさん:2008/05/01(木) 00:31:00
「Rails使うならActiveRecord使えばいいのに」なら分かるが
その逆はイミフだなぁ。
362デフォルトの名無しさん:2008/05/01(木) 17:18:14
initializeを勝手に呼び出すのは良くないんでしょうか。

class Foo
  ...
  def refresh
    initialize
  end
end
363デフォルトの名無しさん:2008/05/01(木) 17:38:07
よくないです

っていうか、そういうような処理を initialize に書いたらダメです
たとえば、別途セットアップ系のメソッドを作って、initialize と refresh から呼ぶようにするとかしてください
364デフォルトの名無しさん:2008/05/01(木) 18:32:18
>>363
なんでよくないの?
365デフォルトの名無しさん:2008/05/01(木) 19:28:22
>>340
あー、わかります。

でもRubyは参照渡し?できないですよね。

単発なら返却値で返す。
複数の返却値だとタプル?じゃなくて配列で返して、
 hoge, mage = gethogemage
でよかったと思うんですが、なれてないと妙に気持ち悪いw
みんなこんなのやってんのかな

>>342
まず体を慣らすのはいいかもですねw

私も一番慣れてる言語だと、ファイル新規作成したら無意識でclass構文が書けます(まあ大抵はスニペット使いますけど)
366デフォルトの名無しさん:2008/05/01(木) 22:27:49
>365
Rubyはむしろ全て参照渡しと言っても良いくらいなのだが。

ただし代入(=、+=など)は変数の参照先を変えてしまうので
自身を書き換えるメソッドを使わず代入で書き換えようとした場合
変数の参照先が変わり、値渡しみたいに見える。

例えば文字列なら concat は文字列自身を書き換えるが
+= は新しい文字列を作り変数の参照先を書き換えるので元の変数に影響がない。

FixnumやSymbolなどは、自身を変更するメソッドを持たないので
実質的に値渡しになる。
367デフォルトの名無しさん:2008/05/01(木) 22:29:19
>>364
べつにいいと思うよ、何度呼ばれてもいいように設計されていれば。
foo = Foo.new(0) # Foo#initialize(0) が呼ばれる
foo.do_something!
foo.initialize(0) # リセットする
foo.do_something!
foo.initialize(0) # リセットする
...

もちろん>>363のようにしてもいい。すきにどうぞ。
368デフォルトの名無しさん:2008/05/01(木) 23:57:27
正規表現でCの文字列リテラルにマッチするようなのって書けないでしょうか?
/".*?"/にすると"aaa\"bbb"みたいな場合に"aaa\"で終わってしまいますが全体にマッチして欲しいんです
/".*(?<!\\)"/にしようと思ったら1.8では(?<!)が使えませんでした
369デフォルトの名無しさん:2008/05/02(金) 00:03:40
"([^"]*?\\.)*.*?"
とかよく書くけど、どうかな
370デフォルトの名無しさん:2008/05/02(金) 00:12:20
/"([^"\\]|\\.)+"/
こんな感じ?
371デフォルトの名無しさん:2008/05/02(金) 00:28:07
>>369 >>370
どちらでもいけました、ありがとうございます!
なんでこれでいいのかまだ良くわからないので頑張って解読します
372デフォルトの名無しさん:2008/05/02(金) 02:12:18
>>371
/"[^\\"]*(\\.[^\\"]*)*"/

こっちのほうが早いかな。

詳説 正規表現を読むのをオススメするよ
373デフォルトの名無しさん:2008/05/02(金) 02:15:20
db等の外部リソースを使った時は
Rubyの終了時にメモリは自動的に解放されているのでしょうか?
明示的に解放しないとだめですか?
374デフォルトの名無しさん:2008/05/02(金) 03:21:27
ここでいいのか不明なのですが…もし良ければおしえてください

やりたいことは
CarbonEmacs上にて起動したirbで
require 'rubygems'
を行いたい。です。

環境は
OSX10.4にてCarbonEmacs2008春版を使用しています。
rubyはMacPortsからインストールしたものを使用し、
rubygemsもMacPortsからインストールしました。
375374: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済なので再読み込みはしませんが)
376374: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
--------
実行時のパスが異なるようです
どのようにしたら、この問題を解消できるでしょうか。
377デフォルトの名無しさん:2008/05/02(金) 03:33:48
うん、そのtypoは俺もよくやるよ
378374: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
オブジェクトが参照なのと、引数の参照渡しを一緒にスンナ
何が「すべて参照渡しと言ってもいいくらい」だ
380デフォルトの名無しさん:2008/05/02(金) 12:10:57
「参照の値渡し」とか「オブジェクト渡し」とか言われる形態だな
381デフォルトの名無しさん:2008/05/02(金) 14:35:21
>>378
FinderからではなくTerminal上で open -a Emacs とする、
もしくは .emacsに irb の位置をフルパスで指定する、のどちらか。

後者なら、~/.emacsなどに
(setq ruby-program-name "/opt/local/bin/irb")
と書けばいいと思う。たぶん。
382デフォルトの名無しさん:2008/05/02(金) 15:43:21
TechCrunch Japanese アーカイブ ? Twitter、Ruby on Railsを放棄か
ttp://b.hatena.ne.jp/entry/http://jp.techcrunch.com/archives/20080501twitter-said-to-be-abandoning-ruby-on-rails/
383デフォルトの名無しさん:2008/05/02(金) 18:21:49
Emacs から info で Ruby のマニュアルを調べたいと考えているのですが、
現在、配布されているドキュメントは html 形式のみですよね

Ruby 1.4 の時に配布されていた info
ruby-texi-1.4.tar.gz
も、ネット上のどこにも落ちていない…
384374:2008/05/03(土) 00:25:29
>>378
感謝です。おっしゃるとおりでした。
後者も有効です。
385デフォルトの名無しさん:2008/05/03(土) 17:38:08
Rubyに抽象メソッドって無いの?
386デフォルトの名無しさん:2008/05/03(土) 18:14:12
>>385
実行前に実装を強制させる仕組みはない。

定義してなければ呼んだときにmethod_missingが呼ばれる。
あとは
スーパークラスで抽象メソッドにしたいメソッドを定義して
raise NotImplementedError
するとか
inheritedフックを使って、継承した時点でチェックするとか。
387デフォルトの名無しさん:2008/05/03(土) 18:31:01
>>386
Class#inheritedがよさげです
ありがとうござました
388デフォルトの名無しさん:2008/05/03(土) 18:45:07
inheritedって class Hoge < Moge の中を実行する前に呼ばれてるような。
389デフォルトの名無しさん:2008/05/03(土) 22:45:28
どうしてruby使ってるの?
pythonでなくてrubyを使う理由って何でしょう?
日本人が作ったのが誇らしいとかですか????
390デフォルトの名無しさん:2008/05/03(土) 22:50:50
?が2個以上連続しているレスは釣り
391デフォルトの名無しさん:2008/05/03(土) 23:15:38
Ruby 初心者スレッド Part 18
http://pc11.2ch.net/test/read.cgi/tech/1203658291/623

623 名前:デフォルトの名無しさん[sage] 投稿日:2008/03/24(月) 14:34:59
どうしてrubyなの?
実績も何も無い言語ですよね
pythonじゃなくてrubyを使う理由を一つでもいいから教えてください
開発者が日本人なのが誇らしいとか??????
392デフォルトの名無しさん:2008/05/03(土) 23:18:17
>>389
どうして日本語使ってるの?
英語でなく日本語使う理由って何でしょう?
日本人が作ったのが誇らしいからですか????
393デフォルトの名無しさん:2008/05/04(日) 01:11:30
イエス!ジャパニーズ!
ノー!フューチャー!
394デフォルトの名無しさん:2008/05/04(日) 02:41:51
pythonはopen classじゃないとかいろいろめんどい

openclassはちゃんとしたアプリがつくれない、って言われてるけど
その通りだと思う。でもスクリプト(笑)言語でちゃんとしたアプリは
作らないから問題ない。
395デフォルトの名無しさん:2008/05/04(日) 07:31:41
式と文や、メソッドと属性なんかが分かれてるのが気に入らない。
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を外すと正常に動作するんですが。
397デフォルトの名無しさん:2008/05/04(日) 11:55:54
Pythonは「メソッド=メソッドオブジェクトが入った属性」な感じ?
メソッド側に属性を統一するのがRuby流で
属性側にメソッドを統一するのがPythonって思ってる。

俺の場合はlambdaの使い難さで使わないけどな。>>Python
文が書けないし、構文自体が無茶になるから
結局、一時的な関数内関数を書きまくることに。
398デフォルトの名無しさん:2008/05/04(日) 11:58:13
aをselfしてprivateに指定するんでしょうか?
399デフォルトの名無しさん:2008/05/04(日) 12:03:11
>>396
クラスメソッドとインスタンスメソッドと特異メソッドの勉強が必要
400デフォルトの名無しさん:2008/05/04(日) 12:06:21
観念的なのは10冊くらい読んだのですが、結局、よくわからんのです。
実際の挙動というか、メモリ上の状態を記述しているような
説明がないので。
一応、インスタンスはコピーという感じで良いんでしょうか。
クラスと特異の実際の状態が掴めないのでよく解りません。
401デフォルトの名無しさん:2008/05/04(日) 12:17:25
>>400
中田育男先生の
コンパイラの構成と最適化 お勧め
402デフォルトの名無しさん:2008/05/04(日) 12:20:51
つprivate_class_method
403デフォルトの名無しさん:2008/05/04(日) 12:34:20
>>396
self.bの定義の中ではselfは(挿入されている特異クラスはさておき)
Hogeというクラスそのものなわけだが、このとき(レシーバを
省略した)aの呼び出しでも、当然レシーバはself(=Hogeクラス)
になる。

404デフォルトの名無しさん:2008/05/04(日) 13:04:58
>>400
この辺はじっそうによるからなあ。
コード書いてみて、実験したりして挙動を確かめる方が身につくよ。
本も大事だけどさ
コード書かないで理解は無理だべさ
405デフォルトの名無しさん:2008/05/04(日) 13:18:59
>>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
そうですか。あはは。
オブジェクト指向って奥が深いですね。

何か図形的なモデルがあると理解し易いんですが。
きっと複雑な状態遷移があると思うので、
言葉だけではすぐに理解するのは難しいのかなと。
408デフォルトの名無しさん:2008/05/04(日) 15:55:51
説明が漠然としててよく分からんが
Hogeのインスタンスを作っており、なおかつ外部から呼ばれたくないメソッドなら
普通にプライベートメソッドでOK

あとself.bは、クラスメソッドの定義なので
クラスの外でもHoge.bと書けば呼べてしまう
詳しくはリファレンスマニュアル内、「クラスメソッド」の項を参照
ttp://www.ruby-lang.org/ja/man/html/_A5AFA5E9A5B9A1BFA5E1A5BDA5C3A5C9A4CEC4EAB5C1.html#a.a5.af.a5.e9.a5.b9.a5.e1.a5.bd.a5.c3.a5.c9.a4.ce.c4.ea.b5.c1
409デフォルトの名無しさん:2008/05/04(日) 20:13:44
>>407
すごい大雑把に説明すると、

クラスは鯛焼きプレートでインスタンスは鯛焼き。

def self.foo と定義したものはクラスメソッド。
def bar と定義したものはインスタンスメソッド。

インスタンスメソッドはインスタンスがないと (Hoge.new しないと) 実行できない。
クラスメソッドはクラスが定義されていれば実行できる。インスタンスは不要。

インスタンスメソッドからクラスメソッドを呼ぶのは可能。
def bar
self.class.foo
end

クラスメソッドからインスタンスメソッドを呼ぶには new しないとだめ。

あちこちに self が出てきて分からなくなってきたら p self として確認すればいいんじゃね。
410デフォルトの名無しさん:2008/05/05(月) 15:02:25
PHPのGDに相当するRubyライブラリって何でしょうか?
円や直線など基本的な描画に加えて日本語の出力を行いたいです

http://d.hatena.ne.jp/koki-h/20060822/p1
2年前の記事なのですが、現在は何か決定版があるのでしょうか?
411デフォルトの名無しさん:2008/05/05(月) 15:10:40
GDが使いたいならRuby/GD
412デフォルトの名無しさん:2008/05/05(月) 22:40:56
>>408
プライベートで良いんですね。
ありがとうございます。

>>409
なるほど。
selfで呼べば良い訳ですね。

インスタンスメソッドは関数の型宣言みたいなもので、
クラスメソッドは関数みたいな物ですね。

ありがとうございます。
413デフォルトの名無しさん:2008/05/05(月) 23:02:25
あ。違いますね。

インスタンスメソッドは実行時に一つ起動しているオブジェクトで、
スコープの範囲で何時でもどこからでも呼べる。
クラスメソッドは宣言してからようやく使えるメソッドですね。

オブジェクトの起動タイミングが違うという理解でしょうか。
414デフォルトの名無しさん:2008/05/05(月) 23:33:54
>>413
かなり致命的に理解を間違っているようなので
このスレで聞くよりも、身近なプログラマに直接質問してみることを薦める
もしくはGoogleで、オブジェクト指向について基礎から解説してるページを探すとか
415デフォルトの名無しさん:2008/05/05(月) 23:43:24
>>413
1.私は万年筆が好きだ
2.私はこの万年筆が好きだ

この二つのうち、1は万年筆というもの、2は具体的な品を指してるだろ
オブジェクト指向では1がクラス 2がインスタンス
ここで.色関数を考えると、
(2の意味の万年筆).色 ってのは、具体的な品だからちゃんと色が決まってる
これがインスタンスメソッド
(1の意味の万年筆).色 だと、色が決まらないから、クラスに対してインスタンスメソッドは
呼び出せない

同様に、そのものの種類を返す関数 .kind があったとする
このときは、(1の意味の万年筆).kind で、"万年筆"って文字が返ってくるし
(2の意味の万年筆).kind でも、同じように"万年筆"って返ってくる
これがクラスメソッド
416デフォルトの名無しさん:2008/05/06(火) 01:09:00
>>415

> (2の意味の万年筆).kind でも、同じように"万年筆"って返ってくる
> これがクラスメソッド

これは違うんじゃ...
417デフォルトの名無しさん:2008/05/06(火) 01:11:19
比喩でクラスとメソッドの関係を説明しようとするのがそもそも間違いだな
418デフォルトの名無しさん:2008/05/06(火) 12:06:22
つまり、既に初期化されている(スクリプトを読んだ時点で)のがクラスメソッドで、
インスタンスメソッドはnewなどして、その時点にならないと
初期化されないメソッドという事じゃないんですか?
419デフォルトの名無しさん:2008/05/06(火) 12:35:38
Rubyではクラスもオブジェクト。
Rubyではオブジェクト毎にメソッドを定義できる。
クラスオブジェクト(Classクラスのインスタンス)にメソッドを定義したのがクラスメソッド。
そのクラスのインスタンスとは直接は関係しないから、クラスメソッドを定義しても、インスタンスメソッドには影響しない。
420デフォルトの名無しさん:2008/05/06(火) 12:47:26
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
421デフォルトの名無しさん:2008/05/06(火) 13:09:22
>>418
どうもインスタンスメソッドに関して、誤解があるように思えるな

foo_instance = Foo.new # オブジェクトの生成
foo_instance.a(1, 2) # foo_instanceのメソッドaを実行し、結果を返す
a(1, 2) # エラー

このスクリプトでなぜエラーが出るのかは理解できる?
422デフォルトの名無しさん:2008/05/06(火) 14:41:55
では、クラスは何処にあるんですかね?
インスタンス化されたクラスは?
場所の定義は無いんですか?
423デフォルトの名無しさん:2008/05/06(火) 15:13:18
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
424デフォルトの名無しさん:2008/05/06(火) 15:16:52
訂正
>line23 listのアドレスを→instanceのアドレスを
>line29 int class_num() ⇒ int class_method()
425デフォルトの名無しさん:2008/05/06(火) 18:26:27
>>422
定義されたクラスは、定数として存在している

class Foo
 (ここにメソッドとかの定義)
end

print Foo.name # "Foo"が出力される
print Foo.class.name # "Class"が出力される
426デフォルトの名無しさん:2008/05/06(火) 18:46:53
Rubyではクラスもインスタンスもオブジェクトで、実体はオブジェクトスペースに存在してるよ。
それらに名前をつけたのが変数や定数。
変数や定数は実体がオブジェクトスペース内のどこにあるのかの情報を持ってる。
427デフォルトの名無しさん:2008/05/06(火) 19:45:36
『プログラミングRuby』にもそんな感じの章があるよ
構造体、メモリ、ポインタで説明してほしい人は
読んでみると何かしら得るものがあると思うんだ

ttp://www.ruby-doc.org/docs/ProgrammingRuby/html/classes.html

ここの図が良いんだけどFigure not availableになってるのが残念
428デフォルトの名無しさん:2008/05/06(火) 22:05:52
rubyでオブジェクト指向理解しようなんて無理でしょ
遠回りだけどjavaをしっかり勉強した方がいいじゃないの?
429デフォルトの名無しさん:2008/05/06(火) 22:10:44
Javaのオブジェクト指向はオブジェクト指向なJavaでしかないと思うんだ
430デフォルトの名無しさん:2008/05/06(火) 23:32:46
オブジェクト指向を理解するという文脈でJavaを第一に持ってくる
ってことは理解してないってことだよな。
431デフォルトの名無しさん:2008/05/07(水) 00:09:23
ていうか
Rubyのクラスとインスタンスとメソッドを理解したいのか
オブジェクト指向プログラミングのクラスやインスタンスを理解したいのか
どっちかにして欲しい
後者ならスレ違いだ
432デフォルトの名無しさん:2008/05/07(水) 00:55:34
>>430
オブジェクト指向を学ぶ上でJavaより勉強する価値のある言語って何?
批判するだけで自分の考えは何も無いの?
433デフォルトの名無しさん:2008/05/07(水) 00:57:09
Smalltalkあたりじゃないかな。
434デフォルトの名無しさん:2008/05/07(水) 00:57:26
smalltalkじゃね?
435デフォルトの名無しさん:2008/05/07(水) 00:57:55
有名なのはSmalltalkかな
436デフォルトの名無しさん:2008/05/07(水) 00:59:01
Smalltalkだろ。
437デフォルトの名無しさん:2008/05/07(水) 00:59:26
Smalltalkだな
438デフォルトの名無しさん:2008/05/07(水) 01:00:25
smalltalkがjavaより勝ってるものって何?
439デフォルトの名無しさん:2008/05/07(水) 01:05:34
純粋さ
440デフォルトの名無しさん:2008/05/07(水) 01:06:56
おっと無能の数はjavaには敵いませんな
441デフォルトの名無しさん:2008/05/07(水) 01:06:57
2chは知ったかばかり
442デフォルトの名無しさん:2008/05/07(水) 01:11:16
オブジェクト指向の学習用として考えるなら、だいたいどれも大差ない
C++でもRubyでもPythonでもJavaでも
(smalltalkは使ったことないから知らないが)
443デフォルトの名無しさん:2008/05/07(水) 01:11:46
>>438
というかJavaは、意図的に完全なオブジェクト指向にしてない
実用面ではどうかってなるとまた別の話になるんだが、
少なくともオブジェクト指向って観点から見ると美しくない

逆にSmalltalkは文字通り全部がオブジェクト
制御構造すらオブジェクトのメッセージ扱いになる
RubyもSmalltalkからメタクラスとかの概念をもらってるはず
444デフォルトの名無しさん:2008/05/07(水) 01:12:09
smalltalkがjavaより勝ってるものって何ですか〜?
445デフォルトの名無しさん:2008/05/07(水) 01:15:03
じゃあどうしてデザインパターンの書籍の多く(専門書も含めて)はJavaを元に書かれてるんだ?
446デフォルトの名無しさん:2008/05/07(水) 01:16:28
JavaはOO貫徹をあきらめてAlgol系並の実用性を手に入れたようなもんだからな。
447デフォルトの名無しさん:2008/05/07(水) 01:17:39
>>445
最初のGoFはSmalltalkだったぞ。
のちにJava優勢になったのは普及度の違い。
448デフォルトの名無しさん:2008/05/07(水) 01:18:33
>>445
オブジェクト指向をよりよく体現してる=言語として人気がある とはならないだろ
どっちにしろJavaで上手い設計してる奴はSmalltalkから来てるよ
449デフォルトの名無しさん:2008/05/07(水) 01:20:16
Javaスレッドで前にも見たような流れだな
少なくとも実用的な言語を元に学ぶのが良し、という考え方の元ではJavaだろう
Smalltalkでオブジェクト指向を学べってのは大げさ過ぎる
450デフォルトの名無しさん:2008/05/07(水) 01:20:46
>>445
実用を兼ねてるんだろう
Java使ってる人は多いだろうし、JavaはC++やC#とかとも文法が似てる

・・・・・と言いつつ、GoFのデザパタ本はSmalltalkも使ってたような
451デフォルトの名無しさん:2008/05/07(水) 01:21:40
smalltalkってそんなに完成された言語だったの??
452デフォルトの名無しさん:2008/05/07(水) 01:22:22
つかなんでいきなりデザインパターンみたいな応用が出てくるんだ
もともとの問題を摩り替えないほうがよい
453デフォルトの名無しさん:2008/05/07(水) 01:25:46
Javaで学べっていっても初心者的には構文覚えて精一杯じゃないか
自分でいい設計してるソース探してきて読むとこまで勉強するよりは
Smalltalkのライブラリでも読んでりゃいいとは思う
454デフォルトの名無しさん:2008/05/07(水) 01:26:16
GoF本は最初のバージョンはSmalltalkとC++でサンプルが書かれてる。
もともとSmalltalkで得られた知見だしな。

新しい版はJavaコードも使ってる。
455デフォルトの名無しさん:2008/05/07(水) 01:27:35
>もともとの問題を摩り替えないほうがよい
Smalltalkに噛み付く奴はスレ逸らしだろうな
456デフォルトの名無しさん:2008/05/07(水) 01:27:46
OOを覚えるためにはやはりEiffelしかないだろ
457デフォルトの名無しさん:2008/05/07(水) 02:00:12
Eiffelもやっとくべきだと思いつつまだ入門もしてないだよなー。

458デフォルトの名無しさん:2008/05/07(水) 06:09:55
なんというか>>400読んで、
ちょっと前に本スレにいた京大君を思い出すんだよな(本人だと言うわけではなく)。
んで、実際のところ質問者はCとかでは、コードをすらすら書けるんだが、
「オブジェクト指向」(または、Rubyのモデル)の概念でつまづいてコードが書けないのか。
それとも計算機の理論を一通り座学して、これからコードを書くに当たって、
(Cではなく)楽ちんそうなオブジェクト指向スクリプト言語を選んだのか。
前者と後者で、かなりすべき対応が変わると思うんだが。
459デフォルトの名無しさん:2008/05/07(水) 07:26:35
Javaは非オブジェクトな型をあえて残した言語だからな
OOPLとしては、普及してるが純粋でない。
460デフォルトの名無しさん:2008/05/07(水) 10:24:48
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」的な
切り口で見たときに、足りないところが多々あるということになり、実際にそうなっています。
461デフォルトの名無しさん:2008/05/07(水) 10:54:06
Smalltalk まで読んだ

>>458
ぶちゃけた話、オブジェクト指向を完全理解しなくてもRubyのクラスやメソッドは使えるよな
継承や委譲もなんとかなると思う
462デフォルトの名無しさん:2008/05/07(水) 12:36:37
>>458
オブジェクト指向が分からないのか、
Rubyでのオブジェクト指向を実現する技法が分からないのかでも話が変わってくるのでは
オブジェクト指向って思考法そのものは言語に依存しないと言われているし
463デフォルトの名無しさん:2008/05/07(水) 13:02:54
関数は (関数 引数 引数) 見たいな記述でもキモいって言われないのに
オブジェクトは メソッド(オブジェクト 引数 引数) だとキモいって言われるのはどうして?
464デフォルトの名無しさん:2008/05/07(水) 13:16:56
どのくらい言われてるかはわからないけど、あるとしたら、多重定義の関係じゃない?
「呼び出し先の決定権を持っている奴」が、端っこではない場所に居て、やや目立ちにくい
・・・という、ビジュアル的な違和感ではないかと思う。

結局のところ、慣れればそれまでって気がするけどね。
465デフォルトの名無しさん:2008/05/07(水) 13:18:40
第1引数を太字でシンタックスハイライトすれば解決
いやわりとマジ
466デフォルトの名無しさん:2008/05/07(水) 15:18:42
すごく初歩的な質問なんですが、

puts "あなたの名前は?"

name = gets.chomp

puts "あなたの名前は#{name}です"

これを実行しても

dan(←入力数値)
あなたの名前は?
あなたの名前はdanです

となって文字列の出力するタイミングが意図したものにならないんです^^;
どうすればいいのでしょうか?
ちなみに開発環境はRDEを使っています。
467デフォルトの名無しさん:2008/05/07(水) 15:27:17
$stdout.sync = true

puts "あなたの名前は?"
name = gets.chomp
puts "あなたの名前は#{name}です"
468デフォルトの名無しさん:2008/05/07(水) 15:44:27
smalltalkerって名前の割によく喋るね
469デフォルトの名無しさん:2008/05/07(水) 15:47:15
>>467さんありがとう!できました^^
470デフォルトの名無しさん:2008/05/07(水) 20:38:45
>>464
関数に見えるというのが。フラットな名前空間にとっちらかる感じで。
名前空間を導入すると今度は対象がわかってるのに名前空間を書かないといけないのがあれで。
……まあ結局は気分なんだが。CLOS がやっていけてるんだからやっていけるんだろう。
471デフォルトの名無しさん:2008/05/07(水) 21:55:06
>>463
> オブジェクトは メソッド(オブジェクト 引数 引数) だとキモいって言われるのはどうして?

C言語でオブジェクト指向で書くとそんな感じだから、別にキモいとは思わない。
472デフォルトの名無しさん:2008/05/07(水) 21:56:37
>>463
メソッドチェーンができないから
473デフォルトの名無しさん:2008/05/07(水) 22:51:46
smalltalkとオブジェクト指向の話面白そうだなぁ
誰かスレッド作ってくれんかなぁ
474デフォルトの名無しさん:2008/05/09(金) 09:36:58
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つでテーブルタグも吐けたりするとうれしいな
475デフォルトの名無しさん:2008/05/09(金) 11:06:53
まあとりあえずは自力で配列内容を表示させる勉強しろ
手を抜くより先に覚えることはたくさんある

「自分で作れるけどもうめんどいから他のことに時間かけるために手を抜く」
というのが正しいプログラミング

メソッドを作ることはできるかな
できないのなら作り方おぼえるといい
476デフォルトの名無しさん:2008/05/09(金) 11:22:11
引っかかる点は何だろう
「カウント○ごとに何かをする」という専用の処理が何かあると思うことかな
ありそうだけど無いよね
each_with_index で回して index + 1 の 剰余5 が 0 のとき何かする、という記述しかない?
477デフォルトの名無しさん:2008/05/09(金) 13:13:18
each_sliceともちょっと違う?
478デフォルトの名無しさん:2008/05/09(金) 18:07:17
def group_by
  hash = {}
  each do |item|
    key = yield(item)
    (hash[key] ||= []) << item
  end
  hash.collect {|key, arr| arr }
end
こんなメソッドって標準になかったっけ?
479デフォルトの名無しさん:2008/05/09(金) 20:01:55
Enumerable#group_byは1.9と1.8.7だけかな?
もっとも、Hashのままで返すけど。
というか>>478のだと、どのグループかわからなくなるんじゃないか?
480デフォルトの名無しさん:2008/05/09(金) 20:03:15
> hash.collect {|key, arr| arr }
hash.values
481デフォルトの名無しさん:2008/05/09(金) 21:16:18
>>479,480
さんくす
そうだよな、Hash#values があるじゃん
なんて間抜けなんだ
482デフォルトの名無しさん:2008/05/10(土) 14:38:43
rubyを最近習い始めたのですが、
1からキーボードで入力した数までの和をもとめる
プログラムの作り方がいまいちわからないのですが
教えていただけませんでしょうか?
483デフォルトの名無しさん:2008/05/10(土) 14:40:53
すいません、スレ違いでした。
スルーしてください
484デフォルトの名無しさん:2008/05/10(土) 14:54:50
>>482
def sum(n);n*(n+1)/2;end
485デフォルトの名無しさん:2008/05/10(土) 15:58:44
>>484 が良い解だと思うけど、Ruby的には
def sum(n); (1..n).inject{|a,b|a+b}; end
という風にできることを知っていると後で役に立つかも。
立たないかも。
486デフォルトの名無しさん:2008/05/10(土) 18:37:59
似たような演算を多数作るなら、以下のように。
ただし>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)
487デフォルトの名無しさん:2008/05/10(土) 18:54:07
send使えよ
488デフォルトの名無しさん:2008/05/10(土) 19:15:48
つか初心者スレっぽいな
489デフォルトの名無しさん:2008/05/10(土) 19:43:59
>>482に対して>>484-486を持ち込むあたりいかにも初心者だな
微笑ましい…のか?
490デフォルトの名無しさん:2008/05/10(土) 19:50:19
入力をどう扱うかも示さないと回答として片手落ちだしな
491デフォルトの名無しさん:2008/05/10(土) 20:05:25
というか初心者スレとしては普通に回答するか解説つきで説明すべきなんだがね
自分の知識の結果をただ披露して悦に入ってどうするよ
492デフォルトの名無しさん:2008/05/10(土) 20:07:48
YARVで、あるベンチマークが
* 「100%速くなった」というのは、時間が半分になったということ?
* 「200%速くなった」というのは、時間が1/3になったということ?
* 「25%速くなった」というのは、時間が20%減ったということ? ( 1 / (1-0.20) = 1.25 )
教えてえらいひと。
493デフォルトの名無しさん:2008/05/10(土) 20:17:30
自己嫌悪はそこまでにして、次w
494デフォルトの名無しさん:2008/05/10(土) 20:23:19
>>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
と場合分けすると式が短くて簡単
495デフォルトの名無しさん:2008/05/10(土) 20:44:11
>>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)では""が返ってきます
何が悪いのでしょうか
497デフォルトの名無しさん:2008/05/11(日) 11:54:30
'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
正規表現に完全にはマッチしてないのだけど、あと数文字付け加えてくれたら
完全にマッチするみたいのを検出したいのですが、いい方法はないでしょうか?
500デフォルトの名無しさん:2008/05/11(日) 18:05:01
>>498
ショートオプションはアルファベット一文字のみ
あと質問にはないが、(printpattern %filename %linenum %line) はRubyでは動かない
501デフォルトの名無しさん:2008/05/11(日) 18:31:50
>>499
そのあと数文字を付け加えてない状態を正規表現で表せばいいんじゃない?
もっと具体的にやりたいことの例を出してみれ
解決策が出てくるかもしれないよ
502498: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
}
503498: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
504デフォルトの名無しさん:2008/05/12(月) 02:46:36
>>503
>  filepatterns = wordpatterns = []
>    if wordpatterns.__id__ == dest.__id__ v = eval(v) end; dest << v

filepatterns も wordpatterns も同じだろ、これ。
505498:2008/05/12(月) 07:55:20
filepatterns = []; wordpatterns = [] にしますた
506デフォルトの名無しさん:2008/05/12(月) 19:23:13
perlの基礎的なスクリプトをたくさん公開しているサイト(KENT WEBみたいな)はいくつかありますが、
rubyのこのようなサイトはないのでしょうか?

今までperlで改造を行っていたのですが、
研究室でrubyを使うことになったので勉強ついでに乗り換えようと思ったんですが…
507デフォルトの名無しさん:2008/05/12(月) 19:24:38
python使った方がいいと思うよ。
508デフォルトの名無しさん:2008/05/12(月) 19:45:57
…そーいえば無いな
あれは日本のperl(というかCGI)の黎明期に乗ったサイトだから仕方ないか
PHPにも無いわけだし問題ないかもしれん

>>506
研究室で必要な部分だけ習うだけにしておいたほうがいいぞ
509デフォルトの名無しさん:2008/05/12(月) 19:48:34
>>506
今まで見た事はないな
そもそも「rubyでCGI」自体がかなりマイナーだから
CGI前提のスクリプトも数えるほどしかない

Web上の解説記事や書籍を頼りに、自力で何とかするのがいいと思うよ
もしくはCGIスクリプトに関してはperlに頼るか
510デフォルトの名無しさん:2008/05/12(月) 20:36:12
ありがとうございます。やはり無いですかー…
CGIに関しては今まで通りperlで作ることにします。
511デフォルトの名無しさん:2008/05/12(月) 20:43:02
何かの言語でCGIが作れるようになったらあとは言語問わずに作れるはずだけどね。
512デフォルトの名無しさん:2008/05/12(月) 21:03:26
CGI作るなんてネットワーク技術者か?それともHTTPD製作者かよ?

>>506
本ならたくさんあるよ。Ruby CGIでググれ。
ただ、ほとんどPerlと一緒だから面白みはないけどね。
動いてるruby-webアプリなら、tdiaryとかbitclustのソース読むとかしてみれ。
513デフォルトの名無しさん:2008/05/12(月) 21:55:35
>>512
tdiaryのソースはおすすめせん。bitclustなら許す。
514デフォルトの名無しさん:2008/05/12(月) 22:22:38
鯖管としてはRuby CGIは止めて欲しい。
515デフォルトの名無しさん:2008/05/12(月) 22:34:28
>>514
何故に
516デフォルトの名無しさん:2008/05/12(月) 22:34:34
まあRubyに限った話じゃないだろうけどね
自作CGIなんて動かして欲しくはないわな
517デフォルトの名無しさん:2008/05/12(月) 23:05:41
日本ならtd/hiki動かしてる人はたくさんいるだろう。まあ、railsでtypoをとか
言われたら断りたくなる気持ちはおいらも分かるけど。
その辺はruby1.9/rails3あたりで解決してるといいなあ。
518デフォルトの名無しさん:2008/05/12(月) 23:47:59
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に相当する標準のメソッドってありますか?教えてください
519デフォルトの名無しさん:2008/05/13(火) 00:14:59
同じではないがtap
Ruby1.9のメソッドだったがプレビュー版1.8.7にも入ってる
おそらく次の安定版Rubyでは標準で使えるだろう
520デフォルトの名無しさん:2008/05/13(火) 00:23:45
配列の配列をハッシュに変換する方法、という意味かもしれない

そういえば、なんで標準で「一気にハッシュに変換・登録」ができないの?
521518:2008/05/13(火) 00:30:14
>>519
一時変数を使わずにlispみたいにゴリゴリ書ける方法は無いかなぁと思って
tapを参考に作ったんですが…
標準には無いってことですか
522デフォルトの名無しさん:2008/05/13(火) 00:35:47
>>520
キーにまつわる標準的な例外考えるのめんどくさいんだと思う
[[1,'one'], [1,'いち']] が {1 => 'いち'} になったらやっぱ例外出すべきだよな、とか
523デフォルトの名無しさん:2008/05/13(火) 01:05:51
Hash[*[[1,2],%w[sys cpu]].transpose.flatten]
524デフォルトの名無しさん:2008/05/13(火) 01:27:19
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]
525デフォルトの名無しさん:2008/05/13(火) 10:32:09
>>524
> (WxWidget2.8.7をインストールしてみても、やはり同じエラーが出ました)
PATH通してある?
526デフォルトの名無しさん:2008/05/13(火) 12:34:47
1.9.7が出てるようだから試してみるといいかもしれない
ただVC8でコンパイルされてるからまずそうな気もする
wxruby-1.9.6-x86-mingw32.gemをダウンロードして入れる方が楽かも
527524: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'
528デフォルトの名無しさん:2008/05/13(火) 18:27:40
Rubyの初心者にたいして「これは読むべき」だと思うコードを教えてください。
ttp://q.hatena.ne.jp/1210650187

定番回答らしい回答が即っと無いのが現状をよく表しておるのう
529デフォルトの名無しさん:2008/05/13(火) 18:56:41
たった6時間前に登録された質問じゃん。
青木さんのコードとか、Pickaxeのコードとかいくらでもあるでしょ。
530デフォルトの名無しさん:2008/05/13(火) 20:04:07
真面目に答えようとすると難しそうだな
それにしてもRubyに限らず定番回答なんて存在するのか?
知ったか的なのならいくらでも挙がりそうだが
531デフォルトの名無しさん:2008/05/13(火) 20:19:10
net/pop.rbとかはどうだろう。
POPはプロトコル自体も小さいし。

初心者に800行近いのは無理か・・・

mailread.rbはたしかに短いけど、initializeにいっぱい詰めるのは好きじゃないんだよなあ
完全に漏れの好みの問題なんだけどさ。
532デフォルトの名無しさん:2008/05/13(火) 20:39:39
ここにぁるRubyのコードゎ
とっても勉強になるょ><
初心者なら全部読んでこんなコードを書くくせをつけたほうがいいょ><

http://golf.shinh.org/l.rb?rb
533デフォルトの名無しさん:2008/05/13(火) 21:49:26
コードなんて動けばいいんだよ
こういうコードを書くべき、なんてどんだけ
上から目線なんだよ
534デフォルトの名無しさん:2008/05/13(火) 21:50:56
まったくプログラムできないんだけど、Rubyを始めてみようかと思ってる。
理由は名前がかっこいいのと日本の方が作ったということで分かりやすいのかなぁと思ったことから。
ただ理由がこんな感じだから、勉強しててもただやり方を覚えるだけの作業のような気がしてならない。
何か作りたい物があれば、そのために勉強していけると思うんだが。

みなさんがRuby(プログラム)を始めたきっかけってなんですか?
535デフォルトの名無しさん:2008/05/13(火) 21:51:00
今から餌撒きかー
頑張れよー
536デフォルトの名無しさん:2008/05/13(火) 21:52:51
Rubyを止めたきっかけはPythonでいいと思ったから。
537デフォルトの名無しさん:2008/05/13(火) 22:01:35
>>534
CGI書くときにPerlが嫌で、他の言語を探してたらRubyに当たった

とりあえず、書籍読むなり誰かが書いたコード読むなりして
自分に合いそうだと思ったら始めてみたらいい
目的が欲しいなら、CGIスクリプトか自分用のファイル処理スクリプトでも書いとけ
ゲームが作りたいならそれを目標にしても良い
538デフォルトの名無しさん:2008/05/13(火) 22:06:35
>>534
プログラムを始めたきっかけ: 情報工学部に入ったから
Rubyを始めたきっかけ: Perlになんとなく嫌気がさしてたときに、研究室の先生にRubyをすすめられたから
539デフォルトの名無しさん:2008/05/13(火) 23:27:38
Rubyを始めたきっかけ: 昔いた会社の社長が気まぐれでMatz本買ってきてRubyおもろいと言いだした
Rubyを使うようになったきっかけ: 256本邪道編読んでOfficeだのをいぢりだしてから
540デフォルトの名無しさん:2008/05/14(水) 00:22:41
>>519
>>518 を見てそれ tap じゃんて思ったんだけど、
tap って self を返すんだっけか?
541デフォルトの名無しさん:2008/05/14(水) 01:08:17
selfを返す。
途中に挟んで(ワイヤタップして)、何事もなかったようにメソッドチェーンが進む。
542デフォルトの名無しさん:2008/05/14(水) 01:55:51
>>534
Perlでの「もっと普通にプログラムかかせろ!」という不満から。
ベターPerlから入ったが、今はPerlとは全然違うものと感じている
543デフォルトの名無しさん:2008/05/14(水) 12:33:33
Rubyだけしか知らないつまらない人間にならないために必要な言語ってなんですかね
544デフォルトの名無しさん:2008/05/14(水) 12:41:12
>>543
Python
Scheme(かGauche、なんでもいいからLisp処理系)
Haskell

この3つ
あと基礎素養としてのCな

Perl5とPHP5は身近に使う機会があるならそっち憶えてもいいかと
JavaやVisualCやC++や.net関連は仕事で必要なら勉強させられるし
仕事で使わないのなら自分から憶える必要は全くないのでスルーでOK

日本語とか英語とかそういう自然言語のレスがあると予想
545デフォルトの名無しさん:2008/05/14(水) 12:52:41
SchemeというかGaucheは今ちょっと勉強してる
let を元にして let* と fluid-let と letrec というのを作った奴はどうかしてる
もう少しわかりやすい説明的名称にするか全く新しい名前を付けるべき
546デフォルトの名無しさん:2008/05/14(水) 13:19:45
>>543
Rubyをきちんと学んでればそうそう変なことにはならないはず
再帰とか継承とか本当にきちんと理解した?
Rubyで憶えられないのに他の言語に手を出したって無駄だぞ?
547デフォルトの名無しさん:2008/05/14(水) 14:02:07
C系記法の言語を1個覚えると応用が利く。
548デフォルトの名無しさん:2008/05/14(水) 14:06:14
>>547
初心者スレっぽい
549デフォルトの名無しさん:2008/05/14(水) 14:28:57
漏れもCがいいと思うよ。
拡張も作れるし。
550デフォルトの名無しさん:2008/05/14(水) 16:22:05
Lisp系は解るがPrologは本気で解らん
カットで詰まった俺
551デフォルトの名無しさん:2008/05/14(水) 21:20:32
CつーのはALGOL系の何かということなのか、
グルーピングに{}を使う言語程度の意味でいいのか。
552デフォルトの名無しさん:2008/05/14(水) 21:35:24
記法ウンタラ言う人は無視しておk
553デフォルトの名無しさん:2008/05/15(木) 19:54:36
>>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
とエラーが出てしまいます。

どうか解決法を教えて下さい。
555デフォルトの名無しさん:2008/05/16(金) 00:01:12
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]

というのがでてしまいます。
どのようにすればいいのか教えてください。

556デフォルトの名無しさん:2008/05/16(金) 10:28:43
>>554
PATHの設定がうまくいってないんじゃないかな?
エラー文を見るとcontrollerが見つからないって言ってるわけだから
初心者ならインストールを個別にやるよりInstantRailsを使ったほうがよい

InstantRails関連
http://www.itmedia.co.jp/enterprise/articles/0703/05/news014.html
http://instantrails.rubyforge.org/wiki/wiki.pl?Instant_Rails
http://japan.zdnet.com/sp/report/story/0,2000056431,20352478,00.htm

それからIDEはAptanaとかNetBeans推奨
WEBrickの起動も全部やってくれるから
http://codezine.jp/a/article/aid/2482.aspx?p=1

初心者はとにかく楽な方法で最初を乗り切ってしまおう
557デフォルトの名無しさん:2008/05/16(金) 19:05:44
RailsはRailsスレがよいかと
【Agile】Ruby on Rails Part6【DRY】
http://pc11.2ch.net/test/read.cgi/tech/1210729470/
558デフォルトの名無しさん:2008/05/16(金) 21:04:29
生POSTを取得したいのですが、どうにも分かりません。
PHPなら、
$stdin = fopen("php://input", "r");
で開けて、EOFまでぐるぐる回すのでしょうが。
Rubyではどうするのでしょう??
ちなみにフォームから送られてくるのは、XML形式のデータです。
お願いします。
559デフォルトの名無しさん:2008/05/16(金) 21:19:13
…なまぽすと?

require 'cgi'
cgi = CGI.new
params = cgi.params

という記述をした CGI に POST すると、params に適当なハッシュが登録されるから適当なキーで取り出せ
値は1個でも配列になってるから注意な

こんなんでどう?
560デフォルトの名無しさん:2008/05/16(金) 21:35:25
CGIスクリプトで?
標準入力を読めばいいだけじゃないの?
561デフォルトの名無しさん:2008/05/16(金) 22:26:07
>>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とか?でしょうか??
やってみましたが、空っぽでした?何か大きな勘違いかもしれません。

563デフォルトの名無しさん:2008/05/16(金) 23:09:44
つうかどういうPOSTの仕方してるんだ?
564デフォルトの名無しさん:2008/05/16(金) 23:15:46
CGI.new した時点で標準入力はカラになってると思うよ
CGIモジュール内部でも標準入力を読み込み→パースしてるわけだから
565デフォルトの名無しさん:2008/05/17(土) 00:14:41
CGi.newしたら内部でinitialize_queryメソッドを使ってPOSTデータは
読み込みきってフォームパラメータ(application/x-form-encoded)や
マルチパートとして解析してしまうので、そうでない形式ならCGI.new
せずに標準入力を読まなければならない。
566デフォルトの名無しさん:2008/05/17(土) 00:14:53
>>558 >>562
もしかして、XML文書をリクエストボディに直接入れてPOSTしたいって意味か
フォームとか使わずに

そういう用途であれば、cgi.rbを使っている限り対応は不可能なので
他のライブラリに乗り換える必要がある
標準で済ませるならwebrick/cgi、外部ライブラリに頼るならRack

あと質問するときは「生POST」のように曖昧な書き方ではなく、もっと具体的に
567デフォルトの名無しさん:2008/05/17(土) 00:20:35
CGI.newする前に標準入力読んで,
$stdinにStringIOを突っ込むとかするばできそうな気がしないでもない
568デフォルトの名無しさん:2008/05/17(土) 00:49:21
まるごと Ruby! Vol.1
ttp://www.amazon.co.jp/gp/product/4844325795
ttp://www.impressjapan.jp/books/2579

また懲りもせず最初からナンバー振っちゃって大丈夫なんかいのう
Vol.2 で書くネタのアテはあるんか?
569デフォルトの名無しさん:2008/05/17(土) 00:58:16
舞波ってw
くまくまーの人か
570デフォルトの名無しさん:2008/05/17(土) 03:44:46
>>563 >>564 >>565 >>566 >>567
みなさんどうもです。

ttp://d.hatena.ne.jp/mallowlabs/20080329/1206799301
にあるように、Ajaxがらみです。
Railsならa=params[a][b][0]でいけるので
Rubyでもそんなに苦労しないだろうと思ったのですが、
その前の段階でつまずきました。
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
ですんなり行きました。


574554:2008/05/17(土) 18:42:41
>>556さん
ありがとうございます。
すべて、一旦アンインストール(Ruby MYSQL Apache)をして、[Railsのアンインストール方法が分からないですが・・・]
InstantRailsをインストールしてみます。
IDEも初めて目にするのですが、いろいろ勉強してみます。
また、壁にぶつかった時は、どうかご教授下さい。
575556:2008/05/17(土) 21:14:36
>>574
Rails関係ならこちらで
http://pc11.2ch.net/test/read.cgi/php/1207425569/
俺も常駐してるし他の人も答えやすいと思うよ
576555: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は知っているのですが、真ん中の記法にしか対応できないですよね。。
どなたかご存じの方宜しくお願いいたします。
578デフォルトの名無しさん:2008/05/18(日) 10:16:58
そういうメソッドを自分で作る(attr_accessor も実態はただのメソッド)
579デフォルトの名無しさん:2008/05/18(日) 13:03:03
正直、普段から使うほうとしてはどれかひとつに限定して制限してもらったほうが落ち着く
インスタンスへのアクセサでもメソッドへの通常引数(順番重要)でもハッシュ引数でもOK、というのはちとしんどい
580577:2008/05/18(日) 13:31:45
>>578-579
ありがとうございます。
それを聞きattr_accessorが用意されているのでそれで統一したいと思ったのですが、
klass.high = 30
klass.width = 40
とずらずらオブジェクト変数を書くのが面倒です。
みなさんずらずら書いていらっしゃるんでしょうか。
それとも何かいいやりかたがあるんでしょうか?
581デフォルトの名無しさん:2008/05/18(日) 13:55:06
> とずらずらオブジェクト変数を書くのが面倒です。
>>577のは全部ずらずら書いてるように見えるが?
普通にinitializeの引数にすればいいじゃないの

他の2つのが良く見えるのなら、メソッドにブロックかハッシュを渡せるようにするだけ
全部出来るようにするメリットは無いよ
582デフォルトの名無しさん:2008/05/18(日) 13:57:52
未初期化を許容するインスタンス変数以外はコンストラクタの中で埋めてやらないとまずいと思うな
583デフォルトの名無しさん:2008/05/18(日) 14:01:07
ずらずらと書く程沢山フィールドが存在する時点で
何かが間違ってるような気もする。
584577:2008/05/18(日) 14:12:05
>>581-583
ありがとうございます。コロコロ変わって申し訳ないんですが、
未初期化が不味いインスタンス変数がいくつもあるのでコンストラクタでハッシュを取ることにしました。
class BarGraph
 def initialize(x)
  @high = x[:high] or 300
  @width = x[:width] or 200
  etc..
こんなもんでいいんでしょうか。。
585577:2008/05/18(日) 14:13:24
すいません。orは||です。
586デフォルトの名無しさん:2008/05/18(日) 14:16:51
>>583
それの解消は単に initialize に書かなくなったってだけで、他のメソッドの引数が増えるだけだと思う
処理に必要な外部入力の量っていうのは一定だと思うぜ
587デフォルトの名無しさん:2008/05/18(日) 14:17:08
>>585
意外と知らない人が多いけど、Rubyではorも使える
588デフォルトの名無しさん:2008/05/18(日) 14:22:01
>>587

@foo = nil or 2

としたとき、@foo の値は?
589デフォルトの名無しさん:2008/05/18(日) 14:24:51
本筋からは外れるが high じゃなくて height じゃないか
590デフォルトの名無しさん:2008/05/18(日) 14:25:52
foo = (nil or 2)

puts foo
=> 2
591587:2008/05/18(日) 14:28:50
>>588
ごめんなさい恥かきました
592デフォルトの名無しさん:2008/05/18(日) 14:29:03
>>588が危険だから or は使われないんだよな
知らないわけじゃなくて、結合度の関係で意図的に避けられているだけだ
593デフォルトの名無しさん:2008/05/18(日) 14:31:42
理解してれば普通に使うだけだろう
594デフォルトの名無しさん:2008/05/18(日) 14:35:35
結合度表が頭に入ってるって人は旧い人を除いて稀だと思う
表を確認するくらいなら () で括るし、面倒になってきた人はあらかじめ || だけ使うだろう
結合度によるバグは見つけるのめんどくさいバグだから

or なら期待通りに動作するが || だと動かない、という例があった気がするがどこだったか
595デフォルトの名無しさん:2008/05/18(日) 23:06:14
俺はテスト用のシェル紛いの簡易インターフェイス書くために
while print('>>> ')or gets
p eval($_)rescue p $!
end
なんてよく書いてしまう
いやirbでも良いとは思うんだけどねw
596デフォルトの名無しさん:2008/05/19(月) 00:12:19
結合度の他には || が式を作るのに対して、
orは文を作るってところか?
597デフォルトの名無しさん:2008/05/19(月) 00:44:20
Rubyに文なんてないよ。
598デフォルトの名無しさん:2008/05/19(月) 00:47:36
いや、これのことか。

http://www.ruby-lang.org/ja/man/html/_A5D7A5EDA5B0A5E9A5E0.html
>また、メソッドの引数に指定できない式と指定できる式があります(このよう な式
>を「文」と呼び分ける場合があります)。

>メソッドの引数に指定できない式の例
>and, or, not
>if/unless/rescue 修飾式, ...
599デフォルトの名無しさん:2008/05/19(月) 01:43:01
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)
で確認。
600デフォルトの名無しさん:2008/05/19(月) 02:52:02
>>599
拡張子の関連付けの問題じゃあなかろうか?
601デフォルトの名無しさん:2008/05/19(月) 04:25:59
>>596
できるよ。
以上。
はい次の方。
602デフォルトの名無しさん:2008/05/19(月) 09:09:43
>>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デフォルトの名無しさん:2008/05/19(月) 14:25:36
本当に本気でどうでもいいんだけど、
カッコとブレースの間って空白置く派が多いのかな?
){
のほうが個人的には気持ちいいんだけど
607デフォルトの名無しさん:2008/05/19(月) 17:26:22
>>606
空白置く派だな。
標準添付のもほとんどそのはず。
608デフォルトの名無しさん:2008/05/19(月) 17:30:26
>>576
自前なのか。

修正済のバグかもしれないので、1.8.6-p114とか1.8.7-preview3あたりで確認を。
それでも落ちるようなら、gdbでバックトレースを。
めんどくさいのでできればBTSに。
609599:2008/05/19(月) 20:07:42
結論を言うと、Rubyのせいじゃなくて、
環境変数 PATHEXTに.rbが登録されてないせいだった。
.pyはpythonをインストールした時に登録されてたらしい。

PATHEXTに登録されてない場合に、
関連付けでコンソールアプリが実行されると、
コマンドプロンプトが開くのがデフォみたい。

でも、いまいち納得できないな。
どちらにしろ、コマンドプロンプトなんか開く必要無いのに。
610デフォルトの名無しさん:2008/05/19(月) 20:21:55
winの設計思想のなんたるか、だねえ

じき滅ぶよ、きっと
611デフォルトの名無しさん:2008/05/19(月) 20:32:20
人口に膾炙して10年以上も経ってるのにまだそんな口きくかね
612デフォルトの名無しさん:2008/05/19(月) 20:52:05
んー、既に自滅した気が、なんて言ったっけ、VIS...
613デフォルトの名無しさん:2008/05/19(月) 21:18:21
コンピュータが始まってまだ60年ぐらいしか立ってないから。
無くなるときは割とあっという間だと思うよ。多分携帯に駆逐される。
614デフォルトの名無しさん:2008/05/19(月) 21:30:12
PC-98 って何で死んだんだろな
615デフォルトの名無しさん:2008/05/19(月) 22:31:09
坊やだからさ…
616デフォルトの名無しさん:2008/05/19(月) 23:56:00
漢字ROMに守られていた文化が
黒船に駆逐されたからでしょ
617デフォルトの名無しさん:2008/05/20(火) 10:05:26
それまでは「パソコン」がプラットフォームの中心だったのが
Windowsに中心が移ったから。
618デフォルトの名無しさん:2008/05/20(火) 19:28:28
Windowsが本当に駆逐されたら困るなー、と思う反面
代わりにLinuxが台頭するのはちょっと見てみたいとも思う

>>606
俺は空白置かない(くっつける)派
標準ライブラリでは二派に分かれているようだ
(検索したら、空白置いてるファイルが置いてないファイルの二倍ぐらいあった)
619デフォルトの名無しさん:2008/05/21(水) 09:41:14
WindowsにRuby/GDまたはRuby/GD2を使いたいのですが、どうすればいいですか?
cygwinやcoLinuxではなくWindows上で直接動かす方法をご存知の方教えていただけるとうれしいです _ _
620デフォルトの名無しさん:2008/05/21(水) 16:49:38
コンパイルしろ。
621555:2008/05/21(水) 23:42:24
>>608
返事が遅くなってすみません。

1.8.6-p114とか1.8.7-preview2 とかをインストールしたのですが
基本的に同じような結果になってしまいます。

>> gdbでバックトレースを。めんどくさいのでできればBTSに。
これはどのようにすればいいのでしょうか?自分なりに調べてみたいのですが
どうすればいいのかよくわかりませんでした。
622デフォルトの名無しさん:2008/05/21(水) 23:50:56
>619
ちなみにmingw版でコンパイルしたsoはmswin32でもそのまま使える
(libの下のso入れるとこに突っ込めばおk)
623デフォルトの名無しさん:2008/05/23(金) 20:57:12
「みるみるRubygがわかる本」
は、初心者に勧められる入門書ですか?

購入なさった人、情報を持っている方など
感想等お願いします。
624デフォルトの名無しさん:2008/05/23(金) 21:03:06
プログラミング自体初心者には
http://www1.tf.chiba-u.jp/~shin/tutorial/index.rb

Ruby初心者には、他の言語の習熟レベルにもよるけど、
たのしいRubyかプログラミングRubyがいいんじゃないかな。



# その本の批評じゃなくてごめんね。
# 漏れは秀和ということだけで毛嫌いしちゃう
625デフォルトの名無しさん:2008/05/23(金) 21:12:50
>>623
別に気にしなくていいんだけど、
立ち読みは表紙のイメージで記憶してるので書名で言われてもぶっちゃけ覚えてねー

ttp://www.amazon.co.jp/dp/4798019291
で、これな

  「何が何でもとにかく『たのしいRuby第2版』との差額900円が惜しい人向け」


900円がないと明日家賃が払えないけど
Rubyの本を何か持ってないと明後日異界に連れ去られてしまうとかそういう人向け
626デフォルトの名無しさん:2008/05/23(金) 21:13:42
あ、あと、ある一定以上の重量の本を手に持つと骨が折れる人とか
627デフォルトの名無しさん:2008/05/23(金) 21:23:38
書籍にあるサンプルコード
ttp://ftp2.shuwasystem.co.jp/pub/book/1929/sample-list.txt
……うーん…
628デフォルトの名無しさん:2008/05/23(金) 21:35:17
3-*あたりを見るとJavaっぽいね。
RubyではgetEuroなんてまず書かない。
多分、to_euroとか
629デフォルトの名無しさん:2008/05/23(金) 21:40:56
なんだ秀和か。
あそこの本は、よそで出てないネタを押さえてる本は買う価値があるが、
よそで出てるネタの本は微妙な出来のことが多いな。
630デフォルトの名無しさん:2008/05/23(金) 21:46:28
>>627
とりあえずcaseのインデントが気持ち悪すぎる
631デフォルトの名無しさん:2008/05/23(金) 21:48:42
632デフォルトの名無しさん:2008/05/23(金) 21:53:50
>>627はftpだな
ftp://ftp2.shuwasystem.co.jp/pub/book/1929/sample-list.txt

ってftpかよ!
まあいいけど
633デフォルトの名無しさん:2008/05/23(金) 21:57:31
Javaな奴にRubyの本を書かせるな
めんどくさいから
634デフォルトの名無しさん:2008/05/23(金) 22:01:41
>>631
やはりJava・・・・・・・なのか?

入門書ばっかり
しかも売上が微妙なのかレビューがほとんどついてないのばっかりか
635デフォルトの名無しさん:2008/05/23(金) 22:02:31
Rubyは『たのしいRuby』いっとけで済むからいいよな
サポートサイトのエラッタを見ても頭ひとつ抜けてる感じだ
無理やり難点を挙げるなら熱さやユーモアに欠けるぐらいか
636デフォルトの名無しさん:2008/05/23(金) 22:07:59
本当は色々な入門書やら解説書やらが出ていいのも悪いのも結構ある、というのが理想

『たのしいRuby第2版』






というのが現実
スレ的には面倒がないが、言語普及的には好ましい状態ではない
637デフォルトの名無しさん:2008/05/23(金) 22:09:58
Rubyで小金が儲かる、という状態でないとなあ
Rubyの書籍は売れないから出しません、というような状況になるのはまずい
638623:2008/05/23(金) 22:23:55
皆さん情報提供ありがとうございました。

『たのしいRuby第2版』の情報等も参考にさせていただきます。
639デフォルトの名無しさん:2008/05/23(金) 22:26:18
他言語を知ってるならピッケル本が良いんだが
640デフォルトの名無しさん:2008/05/23(金) 22:37:12
Rubyの新しい本はRails含めて最近ちょくちょく出てるんだが、いまいちパッとしない
ttp://www.amazon.co.jp/dp/4798019437/
これは、読んだ限りではまあ、うん、まあ、同価格帯で勝負するだけはあるなって感じはするが
目次はここ
ttp://www.shuwasystem.co.jp/products/7980html/1943.html
641デフォルトの名無しさん:2008/05/24(土) 10:10:42
Amazon/AWSのResponseオブジェクトをprintで出力すると
長々と内容まで出力してくれるのですが、ppで出力すると
#<Amazon::AWS::AWSObject:0x2f82e04 ...>としか出力されません。
ppで整形した内容まで出力してくれるようにするにはどうしたらいいのでしょうか?
642デフォルトの名無しさん:2008/05/24(土) 10:46:40
>>641
今こそソース読んでステップアップするとき
pp.rb を読むんだ
643デフォルトの名無しさん:2008/05/24(土) 16:31:14
Rubyからaccessのmdbファイル内のレコードを操作するにはどうしたらいい?
644デフォルトの名無しさん:2008/05/24(土) 17:14:05
ttp://jp.rubyist.net/magazine/?0005-Win32OLE
そういう目的のためのwin32OLE。
あまり使ったこと無いので、使いやすいのか知らんけど
645デフォルトの名無しさん:2008/05/24(土) 17:38:16
win32OLEは便利だと思うけど、詳しい解説がどこにあるのかがわからない。
るびまは読んだんだけどなー
646デフォルトの名無しさん:2008/05/24(土) 19:10:13
WIN32OLEクラスの使い方さえ覚えれば、
あとはWSHの話じゃないか?
647デフォルトの名無しさん:2008/05/24(土) 19:24:37
WSHというか、あとはそのライブラリ自体のお話ってことだよねぇ。
648デフォルトの名無しさん:2008/05/24(土) 20:10:56
AccessのVBAでマクロ組んで、Rubyからそのマクロを呼ぶのが一番簡単そう。
Rubyから呼ぶ必要があるかどうかは知らんけど。
649デフォルトの名無しさん:2008/05/24(土) 20:29:03
実のところRubyはほとんど関係ないんだよな
単純にWindowsプログラミングの話になってしまう
650デフォルトの名無しさん:2008/05/24(土) 20:30:49
>>649
本質的には system() で外部コマンド呼んでるだけだからねえ…
どんなときにどんなコマンドを呼び出すべきかってのはRuby関係ないわな…
651643:2008/05/24(土) 20:43:37
>>644のリンク先の一行レコードを追加するスクリプトサンプルみると
conn = WIN32OLE.new("ADODB.Connection") 以降はvbaと同じっぽいのでなんとかやれそう
652デフォルトの名無しさん:2008/05/25(日) 01:36:18
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 をしたい。

653デフォルトの名無しさん:2008/05/25(日) 01:54:51
URI::USERINFO= /^(?:[-_.!~*'()a-zA-Z\d;:&=+$,\/]|%[a-fA-F\d]{2})*$/n
とか
654デフォルトの名無しさん:2008/05/25(日) 02:11:13
まあ基本的には無理だな
自前で書き換えるしかないわ
スラッシュって含むことできたっけ?
655652:2008/05/25(日) 02:44:45
>>653
素敵。

しかし別の新たなエラーが。もう少し調べます。(そもそも
掘って put は出来るのか?)

ありがとうございます。
656652:2008/05/25(日) 02:57:43
わかった。open-uri は ファイルを扱うものなのか。
ディレクトリは扱えないのか。

失礼しました。

657デフォルトの名無しさん:2008/05/25(日) 04:48:04
まつもとゆきひろがB型肝炎に感染
http://mamono.2ch.net/test/read.cgi/newsplus/1211364904/
658デフォルトの名無しさん:2008/05/25(日) 15:24:45
質問です。

#!/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内部サーバエラーになってしまいます。

なぜなのでしょうか?どうすれば動かせるのでしょうか?
回答よろしくお願いします。
659デフォルトの名無しさん:2008/05/25(日) 15:35:52
エラーメッセージの意味がわからんです
おしえてエロイひと

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)
660デフォルトの名無しさん:2008/05/25(日) 15:52:12
>>659
文字コードの知識もないspamブロガーさんこんにちは
661デフォルトの名無しさん:2008/05/25(日) 15:56:29
>>660
そう見えるよなあ
投稿スクリプトをサンプルとして提供するのは止めたほうがいいと思うぞ

で、まあ、seesaaはShift_JISだったはずなのでShift_JISで送れ
662デフォルトの名無しさん:2008/05/25(日) 16:07:16
>>658
CGIファイルのパーミッションを実行可能に変更していないのだと予想
663658:2008/05/25(日) 16:41:39
解決しました。
ありがとうございました。
664デフォルトの名無しさん:2008/05/25(日) 17:38:53
【プログラム】
#! 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
665664:2008/05/25(日) 17:44:59
【表示される結果】
中サイズです。
1個目 メロンソーダはnil小サイズです。
2個目 レモン&ライムはnil大サイズです。
3個目 スイカバーはnil
【表示したい結果】
1個目 メロンソーダは小サイズです。
2個目 レモン&ライムは大サイズです。
3個目 スイカバーは中サイズです。

昨日からrubyの勉強を始めました。
初めてのプログラミングなので、わからないことが多々あり苦戦しております・・・。
上記のプログラムを実行するとエラー等は出ないのですが、表示結果が思い通りになりません。
なぜ一番最初に「中サイズです。」が表示されるのかすら理解できません。
一体どの部分に問題があるのでしょうか?
わかりにくいプログラムだとは思いますが、もしよろしければ回答お願いします。

※このプログラムは、練習目的で作っているのでわざわざ面倒なことをしています。
666664:2008/05/25(日) 17:46:44
訂正

【表示したい結果】
1個目 メロンソーダは中サイズです。
2個目 レモン&ライムは小サイズです。
3個目 スイカバーは大サイズです。

でした。すいません。

667デフォルトの名無しさん:2008/05/25(日) 17:59:29
(半分ほど作り変えた時点で悩む)
あー、まあいいや
print は引数をその場で画面に表示し、返り値として nil を返す

表示部とデータ部を完全に分けて考えるべき
最終的なデータを最後に print で表示するだけ、という考え方な
Ice.sizeIce で print を使っているのはよくない
668デフォルトの名無しさん:2008/05/25(日) 18:16:52
てゆーか、継承の考え方がおーざっぱに間違ってね?
「アイスの価格」が「アイス」というクラスを継承するはずがない
「アイスの名前」や「アイスの価格」は「アイス」というクラスの変数であるべき

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
669デフォルトの名無しさん:2008/05/25(日) 18:22:51
抽象的に「アイス」があって、
「価格のあるアイス」とか「サイズのあるアイス」とか「価格とサイズのあるアイス」と
具体化...と考えているのかもしれないが、そういう継承の使い方はあっさり破綻するので
やめたほうがよい。

まずは合言葉「継承は最後の武器だ」かと。
670デフォルトの名無しさん:2008/05/25(日) 18:34:03
>>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) になっている

問題は「経験が足りない」事
もっとたくさんソースを書いて実行してデバッグすれ
671デフォルトの名無しさん:2008/05/25(日) 18:42:30
マニュアルには「返り値」「戻り値」があるけど「返却値」はないな

…なんで2種類あるんだ
マニュアルくらいどっちかに統一せえ
672664: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
674デフォルトの名無しさん:2008/05/25(日) 20:41:49
それはシンボルというものだ
675デフォルトの名無しさん:2008/05/25(日) 21:18:50
というか、Symbol クラスのインスタンスだと説明したほうがいいかも

Rubyのメソッド名や変数名は内部的に数値で管理されてる
(2455番目に登録されたメソッド、とかそんな感じで、オブジェクトIDとは別物)
シンボルは、その数値に文字でアクセスすることができる機構だ
結果として、「文字」でメソッド自体を指し示すことができる

普通に foo と書いたら foo メソッドが動いてしまって「foo というメソッド」を指し示すことができない
しかし、そのとき「メソッド foo を示す登録番号」という指定の仕方ができるとしたら、「foo というメソッド」という指定の仕方ができる

腹減ってるので自分でも何書いてるかわからなくなってきた
試しに適当な変数作って、それと同じ名前のシンボルに to_i してみ
それが内部整数値だ
シンボルを id2name するとシンボルに対応する文字列が返る
時々「シンボルを文字列にする」という表現で説明されるがこれは本当は誤り
676デフォルトの名無しさん:2008/05/25(日) 21:26:03
余計わからなくなるので>>675は読まなくてよし
もう遅いかもしれんが
677デフォルトの名無しさん:2008/05/25(日) 21:31:28
>>674
>>675

さきほど、rubyの公式にアクセスできたので、FAQ見てたらシンボルということは分かったところで、余計に理解に苦しんでましたが、、、

>>普通に foo と書いたら foo メソッドが動いてしまって「foo というメソッド」を指し示すことができない
>>しかし、そのとき「メソッド foo を示す登録番号」という指定の仕方ができるとしたら、「foo というメソッド」という指定の仕方ができる

神レスありがとうございました!よく分かりました!!
678デフォルトの名無しさん:2008/05/26(月) 10:28:13
http://www.ruby-lang.org/ が落ちているような。
679デフォルトの名無しさん:2008/05/26(月) 10:32:27
500とかはいつものことだろ、と思ったが router2.netlab.jp で止まっててアクセス自体ができないな
680デフォルトの名無しさん:2008/05/26(月) 17:39:26
SymbolとStringの違いは「優しいRailsの育て方」本が一番わかりやすかったな。
あのキモいアイドルAAを我慢できればの話だけど。
681デフォルトの名無しさん:2008/05/26(月) 20:55:34
Rubyで作成したGUI上で動くちょっとしたソフトウェアを
windowsクライアントに配布して利用してもらいたいとき、
クライアントのPCにもRubyをインストールしておかないと
実行できないでしょうか?
682デフォルトの名無しさん:2008/05/26(月) 21:04:09
>>681
exerbでぐぐってみるとか。
683デフォルトの名無しさん:2008/05/26(月) 21:05:54
Ruby/Tk以外で作らないと駄目だな
684デフォルトの名無しさん:2008/05/26(月) 21:18:10
>>682、683
exerbを利用すればいいのですか。
新しいツールは、勉強もかねてRubyで作ることにします。
さっそく、本を買いに行ってきます。
レスありがとうございました。
685デフォルトの名無しさん:2008/05/26(月) 21:20:38
rubyscript2exeもどうぞ。
686デフォルトの名無しさん:2008/05/26(月) 21:26:22
おいおい、Rubyで自分以外のためにGUIツールを作るなんてアホのすることだぞ
渡されたほうも迷惑だからそういうことはやるな
687デフォルトの名無しさん:2008/05/26(月) 21:37:59
じゃあ、何で書くのがいいのさ?
C#とか?
688デフォルトの名無しさん:2008/05/26(月) 21:47:19
うん、あのね、どうやら
「もともとのGUI対応」
「付け足しのGUI対応」
の区別がつかないらしいんだ、初心者の人
689デフォルトの名無しさん:2008/05/26(月) 21:55:42
そんなにも区別すべきなのか、というのも興味深い問題だと思うぜ

まあ、とってつけたGUIシステムで火傷したことがある人ばかりだから不評なんだけどさ
690デフォルトの名無しさん:2008/05/27(火) 12:27:50
Winで動かす物はMSの道具立てでやった方が、楽だし誤解や面倒ごとも少ないのは確かだしな
まあ仕方ないさ
691デフォルトの名無しさん:2008/05/27(火) 13:10:52
これはどういったプロジェクトなのでしょうか?
ttp://raa.ruby-lang.org/project/ghdghdgh/
692デフォルトの名無しさん:2008/05/27(火) 15:14:16
一行が長くなって読みにくい場合、改行したくなるのですが、
どうしたらイイですか?
693デフォルトの名無しさん:2008/05/27(火) 15:19:21
>>692
改行すればいいじゃん?

バックスラッシュ \ を使えば改行を隠すことができる
他にも「区切れのいいところ」で普通に改行することもできるが、
このへんは他の人のスクリプトを読んで参考にするといい
694デフォルトの名無しさん:2008/05/27(火) 18:00:06
動的メソッドって?
695デフォルトの名無しさん:2008/05/27(火) 18:09:56
Rubyの奥義のひとつ(いやRuby以外でもできるけど)
動的に定義されて動的に実行されるメソッドの8割は本当は静的でもなんとかなる
696デフォルトの名無しさん:2008/05/27(火) 21:56:33
実行するまで在るか無いかわからないってこと?
697デフォルトの名無しさん:2008/05/27(火) 22:02:04
マクロの代わりに使う例も多いと思う。
698デフォルトの名無しさん:2008/05/30(金) 17:13:30
まるごとRuby!のVol.1を眺める
ttp://www.amazon.co.jp/dp/4844325795/

…endの連続はLispの閉じカッコの連続っぽくね?というのは
それはそれでヒドいと思う

現時点でのRubyの紙媒体のまとまった情報が欲しい人向け
スレ的にはちと情報が重いか
699デフォルトの名無しさん:2008/05/30(金) 17:37:44
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 です。
701デフォルトの名無しさん:2008/05/30(金) 18:52:34
基本的には小手先では無理
env コマンドは複数の引数をうまく受け取ることを期待できないし、環境によっても動作が違う
たとえば、その記述は同じ FreeBSD の 5.x では期待通りに動作する
702デフォルトの名無しさん:2008/05/30(金) 18:56:33
いやenvがどうこうというよりカーネルが…
703デフォルトの名無しさん:2008/05/30(金) 18:59:33
あ、どうするかだっけ

#!/usr/local/bin/ruby -Ku

と書くこと
ダウンロードして即実行できないことについて文句言う的外れのアホは無視
実行するスクリプト内容を確認しないような人間をユーザーに引き込むと後々癌になるぞ

で、自前で複数環境で使いたい、という場合が問題なんだが
704デフォルトの名無しさん:2008/05/30(金) 19:20:38
>>700
shebang行(#! で始まる)に渡せる引数は1つ、という実装が多いから無難なのは、

#!/usr/bin/env ruby
$KCODE='u'
705デフォルトの名無しさん:2008/05/30(金) 19:32:52
ruby -Ku と $KCODE='u' はカレーとウンコくらい違う

ちなみに Ruby1.9 ではカレーとウンコが同じになった
706デフォルトの名無しさん:2008/05/30(金) 19:37:32
>>705
あれ? $KCODEは無視されるんじゃなかったか?
707デフォルトの名無しさん:2008/05/30(金) 19:45:49
warning: variable $KCODE is no longer effective;

値を参照しても代入しても常に nil という頑なな感じの動作
708デフォルトの名無しさん:2008/05/30(金) 19:48:01
end
end
end
end

))))
709700:2008/05/31(土) 04:50:05
調べたらFAQ的な質問みたいですね。

解決法
・フルパスでrubyのパス記述 >>703
・$KCODEで指定 >>704

パス関係なくするためにenvにしたかったけど、意味ないなあw

ところで、$KCODEで指定する場合は、
ファイルが本当にUTF-8の文字列(例えば日本語)を含んでいても大丈夫なんでしょうか?
710デフォルトの名無しさん:2008/05/31(土) 06:05:04
大丈夫
711デフォルトの名無しさん:2008/05/31(土) 06:11:40
>>686
普通に喜ばれたけどw
712700:2008/05/31(土) 06:33:23
>>710
ありがとうございます。

では、ちょっとずれてくるのですが、>>705
> ruby -Ku と $KCODE='u' はカレーとウンコくらい違う

というのはどういう違いなのでしょうか?
どこかに簡単な解説などないでしょうか?
713700:2008/05/31(土) 06:34:05
いえ、気になったというより、変なところでハマりたくないので知っておきたい、
といった理由からです。
714デフォルトの名無しさん:2008/05/31(土) 09:00:31
>>709
大丈夫じゃない場合がある

リファレンスマニュアルにも記述があるけど
$KCODEの指定が効いてくるのは、$KCODEへの代入が実行された後なので
最初に読むファイルに日本語が含まれていると、パースエラーになることがある

詳しくはFAQの10.2
ttp://www.ruby-lang.org/ja/man/html/FAQ_C6FCCBDCB8ECA4CEBCE8A4EAB0B7A4A4.html
715デフォルトの名無しさん:2008/05/31(土) 13:57:32
問題になることがあるのはShift_JISの場合。
EUC-JPはUTF-8にはそういう性質はない。

-Kを指定してあれば日本語を識別子に使うこともできるが$KCODEでは無理
という違いもあるが、それは正直お薦めしない。

ちなみに-Kは1.9でもきくが、マジックコメントのほうが推奨。

#!/usr/local/bin/ruby
# -*- encoding: ut-f8 -*-
716デフォルトの名無しさん:2008/05/31(土) 20:25:40
#!/usr/local/bin/ruby
# -*- coding: utf-8 -*-
717デフォルトの名無しさん:2008/05/31(土) 23:56:12
HOME['ENV'] って何だよ・・・
718デフォルトの名無しさん:2008/06/01(日) 00:12:49
>>717
誰か間違えてそうでありそうで無いな
719デフォルトの名無しさん:2008/06/01(日) 00:17:31
図書館にこの本があったので借りてみて一通り目を通してみました
http://www.amazon.co.jp/dp/4894714531

で、次に何かRuby買ってみようと探してみて
http://www.amazon.co.jp/dp/4274066428/
これが本屋さんあったけど・・・
上のと同じ本?

720デフォルトの名無しさん:2008/06/01(日) 01:07:13
今なら下がお勧め
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
722デフォルトの名無しさん:2008/06/01(日) 09:52:04
>>721
あなたの頭とOSが腐ってるのが原因ですね。
頭のほうはもう手遅れなので、OSの方をdebianなどに変えてmod_rubyを
apt-get一発でインストールすればどんな馬鹿でも使えるようになります。
723デフォルトの名無しさん:2008/06/01(日) 10:07:23
>>722

   〃∩ ∧_∧
   ⊂⌒(  ・ω・)  はいはいわろすわろす
     `ヽ_っ⌒/⌒c
        ⌒ ⌒
724デフォルトの名無しさん:2008/06/01(日) 12:35:47
文字化けしてるが、Shift_JISで
「指定されたプロシージャが見つかりません。」
と書いてあるようだな。

mod_ruby 指定されたプロシージャが見つかりません。

でぐぐるとわかるかもよ。
725デフォルトの名無しさん:2008/06/01(日) 14:24:14
726デフォルトの名無しさん:2008/06/03(火) 16:52:27
現在実行しているRubyファイル自身のpathを取得できる特殊変数(?)というのはありますか?
宜しくお願いします!
727デフォルトの名無しさん:2008/06/03(火) 19:45:03
事故解決しました
__FILE__
728デフォルトの名無しさん:2008/06/06(金) 21:02:52
Rubyを使いたいのだけれど使う機会が無い。どう転べばRubyを日常使用する変人になれるのか。最初にそれを説かなければ信者は増えないだろうと思う。
729デフォルトの名無しさん:2008/06/06(金) 21:08:17
>>728
君には必要ないよ
必要のないものに固執する必要はない
楽になるといい
730デフォルトの名無しさん:2008/06/06(金) 21:34:52
>>728
Project Euler とかお勧め。
731デフォルトの名無しさん:2008/06/06(金) 22:17:55
>>730
Ruby関係ないというかRubyでやるくらいならSchemeかPythonかC++でやる。
732デフォルトの名無しさん:2008/06/06(金) 23:30:06
目的を達成するのに一番便利な言語を選べばいいじゃん。
別にこだわりはないな。
733デフォルトの名無しさん:2008/06/07(土) 00:15:09
rails使えば
734デフォルトの名無しさん:2008/06/07(土) 01:05:15
まあ、みんながみんなプログラマーになる必要はないわな。

Rubyに早くなれたかったらUnixかLinux使いえばいい。シェル操作が日常に
なれば、ごちゃごちゃしたものをスクリプトで一気になにかするのが快感になるはず。
735デフォルトの名無しさん:2008/06/07(土) 02:29:00
俺は cmd.exe を使うようになってRubyの使用頻度が格段に増えた
しょぼいコマンドプロンプトの補助としては優秀
736デフォルトの名無しさん:2008/06/07(土) 13:07:20
俺は、バッチファイルで書くのが嫌になったころからだな。
unixではシェル書くのがいやになったころから
737デフォルトの名無しさん:2008/06/07(土) 13:08:08
シェルじゃねえ、シェルスクリプトだ。すまそ。
738デフォルトの名無しさん:2008/06/07(土) 13:12:37
rubyの正規表現でhtmlファイルの中から<html>の様に<>で囲まれた
文字列を取り出すにはどのようにすれば良いですか
^<.*>$まではわかったのですが
<br>のように直前に文字列が存在するタグはとりだせないのです

f = open(ARGV[0].to_s)
while line = f.gets
if /^<.*>$/ =~ line
puts line
end
end
f.close

よろしくお願いします。
739デフォルトの名無しさん:2008/06/07(土) 13:15:03
^や$(行頭と行末の位置にマッチ)を付けない。

さらに、.*だと欲張りマッチ(可能な限り長い対象にマッチ)になるので、
<h1>....</h1>に遭遇したときに全体にマッチしてしまう。
これを避けるためには、?を後ろに付けた .*?(欲張りでないマッチ)を使う。
740デフォルトの名無しさん:2008/06/07(土) 13:18:05
>>739
ありがとうございます。
しかもアドバイスまで
ありがとうございます
741デフォルトの名無しさん:2008/06/07(土) 13:20:11
>>739
ああ〜テストしてみた所
a<html>
とかが表示されてしまいました
こうではなくて
a<html>とかの行からも
<htm>だけきりだしたいのですが・・・・
742デフォルトの名無しさん:2008/06/07(土) 13:28:58
正規表現の中に()を書くと、括弧の内容を後で利用できる。
/(<.*?>)/ でマッチした後、$1というグローバル変数に<html>とか入ってるはず。
743デフォルトの名無しさん:2008/06/07(土) 13:32:35
実用の上で正しい回答は「自分でコード書かずにhtmlsplit使え」
もちろん学習用としてなら意味はあるけど

>>741
行全体(line)をそのまま表示しようとしているのが原因
マッチした部分($&)だけを表示させるようにするか
もしくは742の言うとおり、括弧と$1を使う必要がある

さらに言うと、そのスクリプトだと一行で一つのhtmlタグしか切り出せない
全てのhtmlタグを切り出すには、もう少し変更が必要
744デフォルトの名無しさん:2008/06/07(土) 13:34:16
マッチするかどうかを試験する、ということと
マッチした部分を取り出す、ということは違う
方法はいくつかあるが、概念的にめんどくさくないのは文字列に対してscanを使うこと

"a<html>b".scan(/<.+?>/){|match|
p match
}

結果:
"<html>"
745デフォルトの名無しさん:2008/06/07(土) 13:41:27
>>743-744
まとめるとどのようになるのでしょうか
最終的には
htmlファイルを指定すると
そのページ内に存在するファイルを
音楽、動画、画像などに仕分けして
そのURLをファイルに書き込んでくれてwgetなどで簡単にダウンロードできるようにしたいんです。
746デフォルトの名無しさん:2008/06/07(土) 13:46:14
… rubygem の mechanize 使え
<a href> で表記されたリンクをすべて抽出してアクセスして適当に保存までしてくれる
ネット上にあるページではないローカルにあるHTMLファイルを読み込まなければならない場合若干面倒だが
747デフォルトの名無しさん:2008/06/07(土) 13:47:58
とりあえず地道にやってみるならリンクされてるAタグでのhref="〜"部分を切り出して
リンク咲の拡張子なりで分類するとか
748デフォルトの名無しさん:2008/06/07(土) 13:52:15
だから目的のものが出るまで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一覧配列}

749デフォルトの名無しさん:2008/06/07(土) 13:55:11
>>746
そういうのが有ったんですね・・・・
なんだか自分が最初のアイデアって今では出せないんじゃないかって
最近思ってるんですよね。
何かアドバイスになる言葉を教えてください。
小学生の頃からプログラミングしていた根っからのプログラミング好きに
慰めの言葉を
750デフォルトの名無しさん:2008/06/07(土) 13:55:19
hpricotだとこうか。
require 'hpricot'
require 'open-uri'
doc = Hpricot(open(URL) {|o| o.read})
puts (doc / 'a').map {|a| a['href']}
751デフォルトの名無しさん:2008/06/07(土) 14:01:18
とりあえずは、初心者スレなので正規表現でscanするのが妥当かねえ
なんとなくだが、外部ライブラリを利用するための基礎的知識もまだ危ういように見える
便利ライブラリはもうちょい納得してから使え
752デフォルトの名無しさん:2008/06/07(土) 14:02:22
初心者スレであんまり「gemのlibhogeを使え」なんていわないほうが
いいんじゃにゃいかな。そりゃ業務的には正解だけど、たぶん牛刀割鶏になってるよ。
753デフォルトの名無しさん:2008/06/07(土) 14:09:36
rubygems に代表される公開ライブラリを流用するのは何故かというと

  「自力でゼロからまたアレやるのめっちゃ面倒だ」

という認識があるからなんだよな
「面倒なアレ」という経験が無いうちから使うと後々悲惨な結果に
苦労は初心者のうちにしておくとよいと思う
754デフォルトの名無しさん:2008/06/07(土) 14:24:14
あほらし
755デフォルトの名無しさん:2008/06/07(土) 16:33:14
別に両方教えればいいだけじゃん
html = File.read('page.html')
html.scan(/<(.*?)>/) { p $1 }

>>750
の両方。
もちろん違う人が教えてもいい。
756デフォルトの名無しさん:2008/06/07(土) 16:33:30
URI.extractでもつかっとけ
757デフォルトの名無しさん:2008/06/07(土) 17:38:20
文字出力、正規表現の際に'可能'という文字を使用したいのですがうまくいきません。
試しに以下のスクリプトでテストしてみました。
ファイルをSJIS保存 puts '能' => unterminated string meets end of file
ファイルをUTF8保存 puts '能' => '閭ス'
となってしまいます。

どうすれば扱えるのでしょうか?
どなたか本気でお願いします。

758デフォルトの名無しさん:2008/06/07(土) 17:51:51
Shift_JISの場合は ruby -Ks hoge.rb で起動
UTF-8 の場合は ruby -Ku hoge.rb で起動
759デフォルトの名無しさん:2008/06/07(土) 20:40:06
>>757
rubyは基本的に、何も指定しないと日本語を正しく扱えない
詳しくはリファレンスマニュアル(もしくは書籍)を読め
760757:2008/06/07(土) 21:39:01
ありがとうございます!
無事に出力&正規表現が実行できました。

ファイル毎に記述する癖をつけます!
761デフォルトの名無しさん:2008/06/07(土) 22:46:14
String#split* という関数はどういう挙動なのでしょうか?
文字列がかえるので split().join と同じだと考えていたのですが
どうにも違うようですし調べてもでてこないし

リファレンス(コードでもいいので)ご存知のかたいたらおねがいします
762デフォルトの名無しさん:2008/06/07(土) 22:48:02
1while などアンドキュメントな部分などの部分もご存知のかた
いたら同様に示唆していただけたらありがたいです
ruby 二日目であほなこといっていたらごめんなさい
763デフォルトの名無しさん:2008/06/07(土) 23:06:41
String#split* なんて関数は見たことない
split().join, 1while ともども簡単なコードも付けてくれると答えやすいかも
あるいはどこに書いてあったとか
764デフォルトの名無しさん:2008/06/07(土) 23:11:34
>>761
正直、Ruby の引数展開の * はあまり好きではない
あれは Ruby として明示的なメソッドであるべきだと思う

んで、引数の配列の直後に * をつけると展開して引数に渡される

arr = [1, 2, 3]
hoge(arr*)



hoge(1, 2, 3)

と同じ動作だ
文字列を split した結果の配列が展開されて渡されてるということだな
split は引数を省略すると空白で分割して配列を返すから

hoge('1 2 3'.split*)



hoge(1, 2, 3)

と同じ
正直、あまり明快な記述とは思えないので、自分から使うのは避けたほうがよい
765デフォルトの名無しさん:2008/06/07(土) 23:23:51
>>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 なので引数展開ではないのかなーと
考えています
766デフォルトの名無しさん:2008/06/07(土) 23:25:26
展開の * は前につくんだったと思うんだが

hoge(*arr)

あと、配列 * s が 配列.join(s) と同じ動作になるのは s が文字列だったときだけだぞ
s が整数だったときには単に繰り返される
だから、to_s や to_i が乱れ飛ぶ初心者のスクリプトでは紛らわしいから使ったら駄目
というか、そもそも紛らわしいから素直に join 使え
767デフォルトの名無しさん:2008/06/07(土) 23:36:09
>>765
1whileはrubyの標準にはない。たぶんコードゴルフ用の拡張

ついでに言うと、初心者がコードゴルフを参考にするのは薦められない
あれは一般的に美しくない(分かりにくい)書き方が多いから
768デフォルトの名無しさん:2008/06/07(土) 23:47:03
>>762
違ってたらごめんね

>> "abcd".split() * ''
=> "abcd"

>> print 1while true
1111111111111
>> while true; print 1; end
1111111111111
769デフォルトの名無しさん:2008/06/07(土) 23:57:22
>>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"
コメントみなさんありがとうございました
770デフォルトの名無しさん:2008/06/08(日) 00:00:25
771デフォルトの名無しさん:2008/06/10(火) 00:03:39
Ruby1.6で書かれたクラスを利用しないとアクセスできないシステムがあります
そのシステムはEUC_JPしか受け取れないため、他のエンコードを使用しようとした場合は変換したいと考えています
ですがRuby1.6時代のKconvではUTF-8→EUC_JP変換ができません

そこで質問なのですが
・Kconvに限ってRuby1.8のクラスファイルを利用する、などといったことは可能ですか?
・指定ファイルはRuby1.6、それ以外はRuby1.8というようにクラス/ファイル別にインタプリタを指定して実行することはできますか?

現在は一時ファイルに実行結果を書きとめておくことで疑似的に実現していますが、よりスマートな方法がありましたらご教示願います
772デフォルトの名無しさん:2008/06/10(火) 00:12:05
nkf.cだけ差し替えてコンパイルしてみるとか。
よしだむ氏のuconvを使ってみるとか。
773デフォルトの名無しさん:2008/06/10(火) 00:15:53
1.6のUTF8関連はuconv使ったような記憶がある

というか、1.8で動かない上に書き換えも面倒な1.6のスクリプトって重症だなあ
マニアさんが書いたようなスクリプトですかね
774デフォルトの名無しさん:2008/06/10(火) 00:28:32
でっかーいスクリプトだと1.8対応にするのはゼロから作り直すに等しい作業になりそうだな
1.6で完全に動いてるならそのまま使いたいとこだろう

Uconv試すのが一番だと思うぜ
775デフォルトの名無しさん:2008/06/10(火) 00:30:55
UTF対応の外部NKFのラッパーを自前で書くというのはどう
Kconvの中の人がやってることは同じだし

一時ファイル使ってる現状とほとんど変わらないような気もするけどな
776771:2008/06/10(火) 08:29:09
皆さんありがとうございました
Uconvの使用が一般的な方法のようですので、まずはこの方法でやってみたいと思います
777デフォルトの名無しさん:2008/06/10(火) 17:34:19
index.rhtmlからtest.rbをrequireすると
エラーは出ないのですが、test.rb内に記述された関数群が利用できずにエラーとなります。
この拡張子でのrequireは無理なのでしょうか?
もしそうであれば、どのようにファイル分けをすればよいのでしょうか?
よろしくお願いします。
778デフォルトの名無しさん:2008/06/10(火) 17:52:54
エスパー麻美の出番だな
779デフォルトの名無しさん:2008/06/10(火) 18:02:07
エスパー…あさみ…?
780デフォルトの名無しさん:2008/06/10(火) 19:00:07
ビーズで撃たれて死んでしまえ
781デフォルトの名無しさん:2008/06/10(火) 19:12:57
魔女ステかよ
782デフォルトの名無しさん:2008/06/10(火) 21:37:07
ダック・タイピングとよく言いますが、
オブジェクトが目的のメソッドを持っているかどうかの責任は、
プログラマにあるということでしょうか?
783デフォルトの名無しさん:2008/06/10(火) 21:39:05
スクリプト言語でなおかつ動的にクラスもメソッドも追加可能な言語では
「ユーザー」と「プログラマー」の間が曖昧なんだよね
784デフォルトの名無しさん:2008/06/11(水) 10:33:42
よくわからんが、処理系が実行時まで何もしてくれないことだけは確か。
785デフォルトの名無しさん:2008/06/11(水) 10:59:33
>>778
洗剤か
786デフォルトの名無しさん:2008/06/11(水) 12:05:00
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.

〜続く〜
787786: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.
788786: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で作成しようと考えてお
ります。。
789デフォルトの名無しさん:2008/06/11(水) 13:28:15
>>787
に書いてあるがな。GNU libcの
`_dl_out_of_memory@GLIBC_PRIVATE'
がないんだろ。glibcを入れ直してldconfigしてみろ
790786:2008/06/11(水) 13:46:57
>>789さん
 助言有り難う御座います。glibc関連を弄るのは初めて
 なので依存関係でしくじる気が凄くしますが取り敢えず
 調べてやってみます。
791デフォルトの名無しさん:2008/06/11(水) 16:56:35
oreilly.co.jp -- Online Catalog: 初めてのRuby
ttp://www.oreilly.co.jp/books/9784873113678/
> 本書を最後まで読めば、「Rubyリファレンスマニュアル」を自在に読みこなし多様なRubyライブラリを活用して、
> 自力で高度なRubyプログラミングを習得するだけの基礎知識が手に入るでしょう。
> Ruby1.8及び1.9に対応しています。
( ^ω^)おっおっおっ
792デフォルトの名無しさん:2008/06/11(水) 17:02:16
夢のような書籍だなw
793デフォルトの名無しさん:2008/06/11(水) 17:14:19
たった224ページじゃ無理だろと思ったら

>他言語でのプログラミング経験を持つ人を対象に

なるほど。エッセンス部分だけ凝縮することに成功すれば
あるいは・・・・・・
794デフォルトの名無しさん:2008/06/11(水) 17:17:59
魚を捕る方法を教える感じでなかなか好感が持てる

現状、9割くらいの人はオンラインのリファレンスマニュアル読んでるからな
というか、リファレンスマニュアル自体にマニュアルの読み方の解説がないというのが情けない
795デフォルトの名無しさん:2008/06/11(水) 17:19:59
まああるいはオライリーの人がフカしてるだけかもしれん
これ目次ね
ttp://www.oreilly.co.jp/books/9784873113678/toc.html
796デフォルトの名無しさん:2008/06/11(水) 19:21:21
また安いなw
最近のオライリーはどうなってるんだ,あれこれ安すぎるw
797デフォルトの名無しさん:2008/06/11(水) 19:42:21
自分の部屋の本棚をオライリーで埋め尽くす・・・
そんな風に考えていた時期が僕にもありました・・・
798デフォルトの名無しさん:2008/06/11(水) 19:58:37
2,310円?200ページとはいえ、オライリーにしてはえらく安いな
799デフォルトの名無しさん:2008/06/11(水) 20:58:19
>>796
質が落ちたから
800デフォルトの名無しさん:2008/06/11(水) 22:33:03
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』にツッコミをどうぞ
802デフォルトの名無しさん:2008/06/12(木) 04:02:01
で、rubyとどう関係あるのか
まだ訊いてないんだが?
803デフォルトの名無しさん:2008/06/12(木) 04:22:05
Ruby信者はあらゆるスレにRubyの話題を持ち込んでいるのだから、
逆にあらゆる話題がRubyスレに持ち込まれても、身から出た錆だな。
804デフォルトの名無しさん:2008/06/12(木) 06:59:14
RubyってJavaのクラスローダーみたいな仕組みはないのですか?
805デフォルトの名無しさん:2008/06/12(木) 09:46:01
>>804
requireじゃダメなの?
806デフォルトの名無しさん:2008/06/12(木) 10:07:44
「Javaのクラスローダーの○○の仕組み」と限定して欲しいとこだな
807デフォルトの名無しさん:2008/06/12(木) 11:17:08
.jarとか.classとかを実行時に読むのに相当するならrequire、
Classオブジェクトを名前な文字列とかで引っ張ってくるならModule#const_get
808デフォルトの名無しさん:2008/06/12(木) 21:39:27
ネットワーク上からRubyスクリプトを受け取ってそれに記述されているクラスを動的に定義したいんだけど

たとえば
script = URI("http://host/matz.rb").read
p script #=>
# class Matz
#  def hige
#   print "じょりじょり"
#  end
# end

eval(script)
Matz.new.hige

こんな感じで実現できるんだけど
もっとスマートな方法は用意されてないの?
ファイルには書き出したくない。
809デフォルトの名無しさん:2008/06/12(木) 21:41:29
Ruby で、現在のプロセス名を得ることはできますか。
やりたいのは、現在のコマンドが /usr/bin/ruby なのか /usr/local/bin/ruby なのか
/usr/local/ruby1.9/bin/ruby なのかを知ることです。
810デフォルトの名無しさん:2008/06/12(木) 21:43:42
ローカルファイルシステム上にないファイルをスクリプトとして読み込みたいとかいう需要に対してスマートも糞もねーよ(w
require の中身は eval だからそれで正しい動作だ
我慢しとけ
811デフォルトの名無しさん:2008/06/12(木) 21:46:53
>>810
> require の中身は eval
それは知らなんだ・・・
812デフォルトの名無しさん:2008/06/12(木) 23:20:56
Rubyで、
メタ・プログラミングやコード・ジェネレーションを学びたいのですが、
その辺を詳しく扱っている書籍やサイトはないのでしょうか?

ピッケル本とか読みましたけど、なでる程度しか載っていないので・・
813デフォルトの名無しさん:2008/06/13(金) 01:55:27
>>812
今は懐かしい256シリーズの無道編でRaccをフィーチャー(というか宣伝)してる。
でも無知な俺は、Raccを本当に活用した例ってRDtoolしか知らない。

Rubyでメタプログラミングなら、強力なevalとmethod_missingで対応するDSLが主流だね。
ActiveRecordなんか、その最たるもの。

Rubyist Magazine -あなたのコードを添削します-
http://jp.rubyist.net/magazine/?0011-CodeReview
DSLについて、一部参考になるかも。
814デフォルトの名無しさん:2008/06/13(金) 02:34:00
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
816デフォルトの名無しさん:2008/06/14(土) 18:55:36
self.unit = 2
817デフォルトの名無しさん:2008/06/14(土) 18:55:59
self.unit = 2
818デフォルトの名無しさん:2008/06/14(土) 18:56:17
self.unit = 2

だとうまくいきました
何だこの違い・・・
ほかの言語のプロパティみたいに使っちゃだめなのか
819デフォルトの名無しさん:2008/06/14(土) 18:59:52
わかるまでは 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
823デフォルトの名無しさん:2008/06/14(土) 19:11:24
>>822
Ruby以外はどんな言語を使ってるのか教えてくれまいか
ちょっと興味があるんだ
824デフォルトの名無しさん:2008/06/14(土) 19:17:11
これは筋のよさそうな自称初心者
825デフォルトの名無しさん:2008/06/14(土) 19:33:13
>>823
他にはDelphiを長年つこーてました。

Delphiだと属性でなくてプロパティなんですが、
上記コードのような形で問題なく、
selfなしでクラス内でプロパティに代入できます。
静的な言語のせいもあり、変数は宣言しないと使えないです。
826デフォルトの名無しさん:2008/06/14(土) 20:04:10
なるほど、丁寧にありがとう

今度Delphiのコード見かけたら
そこらへんちょっと気にして読んでみるよ
827デフォルトの名無しさん:2008/06/15(日) 00:03:24
やさしいやりとりだな。いい感じ。
828デフォルトの名無しさん:2008/06/15(日) 00:24:46
これは珍しく建設的なやりとり。
829デフォルトの名無しさん:2008/06/15(日) 00:45:06
初心者側に「ピンと来る力」があれば、話は俄然充実するんだよ。
830デフォルトの名無しさん:2008/06/15(日) 03:02:58
>>820
> ドキュメントのどこかに記載などありますでしょうか?

一応rubyの落とし穴には書いてあるけど見つけにくいね。
http://www.ruby-lang.org/ja/man/html/trap_A5B9A5B3A1BCA5D7A1A2C0A9B8E6B9BDC2A4.html

attr_xxx もFAQやModuleのリファレンス見ないと分からないし。
まぁリファレンスだからしょうがないか。

入門書ならselfが必要なことも含めてちゃんと書いてあるかも。
831815:2008/06/15(日) 06:40:18
>>830
おお、こんなところに記述が
やはりFAQなのですね。
わざわざありがとうございます。

attr_系の説明やサンプルは大概クラス外部からのアクセスのみかかれてますね。
832デフォルトの名無しさん:2008/06/15(日) 12:41:53
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において敢えて強調されているのは何故なんでしょうか。
例えば、何か他の言語とは異なった考え方が必要になってくるのでしょうか。
834デフォルトの名無しさん:2008/06/15(日) 15:24:50
>>822
NetBeans使ってると、unitは未使用ということでエディタ上に印が付きますね。
835デフォルトの名無しさん:2008/06/15(日) 16:12:43
>>833
強調するのは、そりゃ、「2種類」あるからだよ
self を変更するかどうかって重要じゃん
puts させただけでそのオブジェクトがそれ以降文字列になったら悲惨じゃん
836デフォルトの名無しさん:2008/06/15(日) 16:16:47
>>834
ねとびんかしこいねねとびん
837デフォルトの名無しさん:2008/06/15(日) 16:20:09
>>835
だから、その2種類の違いを他の言語より強調するのは何故か、という質問だろ。
他の言語がどの言語で、本当にそれよりRubyのほうが強調されているのかは俺はわからんが、
ともあれ比較の質問なら、Rubyの意志を比較で回答しないと納得はできんだろう。
838デフォルトの名無しさん:2008/06/15(日) 16:32:14
例えば、javaでは
メソッドへパラメータを渡すとき

配列とオブジェクトは参照渡し(rubyでいう、非破壊的・・の概念にあたる)
プリミティブ型は値渡し(破壊的・・の概念にあたる)

になってる。

ソースを見たとき、
Rubyのように明確になっているとは、ちょっといえないかもね。

Cだと、ポインタかどうかで判断する。

どうしてRubyはその辺を強調してるかだけど、
自由度が高いからじゃないかな?
上のJavaの例でいうと、参照渡しした元のオブジェクトを呼び出し先から
操作することは、Javaでは出来ない。

Rubyではその辺を任意にできる操作できるようにしたかったから、
出来る場合と出来ない場合を明確に表記して、わかりやすくしたかったのではないかと
推察します。
839デフォルトの名無しさん:2008/06/15(日) 16:38:16
すみません。

>上のJavaの例でいうと、参照渡しした元のオブジェクトを呼び出し先から
>操作することは、Javaでは出来ない。

上のJavaの例でいうと、値渡しした元のプリミティブ型を呼び出し先から
操作することは、Javaでは出来ない。

の間違い。

失礼しました。

参照渡し>>元のオブジェクトのリファレンス(アドレス、ポインタ)を渡す。(破壊的)
値渡し>>元のデータのコピーを渡す。(非破壊的)

です。

混乱させるような、書き込みをしてすみません。
840デフォルトの名無しさん:2008/06/15(日) 16:52:41
>>837
破壊的なのに!とか述語に?をつけるのはschemeからのいただきだろうな。
ただ、単なる慣用だから守ってないライブラリもいっぱいあるし深い意味はないんじゃね?
強いて言えば、識別子に!とか?が使えるってのを強調したかったとか。
C/perl/pythonは出来ないはずだし。
841デフォルトの名無しさん:2008/06/15(日) 17:11:55
>>833
Rubyだから特別強調しているというわけではない。

Rubyに限らず、手続き(Rubyの場合メソッドかProcオブジェクト)を実行すると
きに、その手続きを実行する前から存在していたすべてのオブジェクトについ


実行後、状態が変化する可能性がある(から注意して使え)のが「破壊的」
実行後、状態が変わらないことを保証するのが「非破壊的」

うまく説明できないけどこんな感じだ。状態が変わらないというのは「同じ」
ということなんだけど、じゃあ「同じ」とは何かというのがなかなか微妙。
だけどこの話を始めるとなが〜くなるから、この辺でやめとくぞ。

>>838,839 はなんか間違って理解してるみたいだぞ
842デフォルトの名無しさん:2008/06/15(日) 17:36:53
>>833
rubyの場合、他言語に比べてメソッドチェインの色合いが強いからじゃなか
他言語では戻り値がvoidになるようなものでも、rubyだとself返したりしてるし
843デフォルトの名無しさん:2008/06/15(日) 17:58:46
でも述語に?を使われると、三項演算子がちょっと見にくくなるよね

a = (isTrue?) ? 12 : 47
844デフォルトの名無しさん:2008/06/15(日) 18:20:21
>>839
とりあえずJavaに参照渡しはない
プリミティブはもちろん値渡しだが
オブジェクトだって値渡し(参照の値渡し、あるいはcall by share)だ

とかいっても>>839は信じてくれないって俺は知ってるんだ
845デフォルトの名無しさん:2008/06/15(日) 18:30:36
(´・ω・`) = (!isTrue?) ? !a.foo? : !b.foo?

846デフォルトの名無しさん:2008/06/15(日) 18:32:53
hamlet = (to?) ? be : !be
847デフォルトの名無しさん:2008/06/15(日) 18:42:35
>>833
単にメソッド名に!が付けられることを自慢したかっただけ。
848デフォルトの名無しさん:2008/06/15(日) 19:15:36
>>833
オブジェクト使い捨てることによって生まれたメソッドチェーン主体の手法と、
従来のインスタンスへの変更を区別するためだろう

849デフォルトの名無しさん:2008/06/15(日) 21:30:31
>>847
確かに、そんな気もしなくは無いですね…
850デフォルトの名無しさん:2008/06/15(日) 22:04:22
rubyで日本語の分かち書きがやりたいよん
851デフォルトの名無しさん:2008/06/15(日) 22:17:38
たとえば
mecabを直に叩くか
mecabのrubyライブラリを使うか
mecabのデータだけを使わせてもらって自分でがんばるか
852デフォルトの名無しさん:2008/06/15(日) 23:09:39
>>851
ありがとうございます
(いまさら)環境 ActiveScriptRuby
・mecab for rubyがインストールできなかった
・↓を参考に直叩き
でできました

Windows上のrubyでMeCabをちょっこっと使ってみたい - Programming Must Go On
http://d.hatena.ne.jp/kenkitii/20060705/p1
853デフォルトの名無しさん:2008/06/16(月) 00:16:14
形態素解析だっけ
yahooにもそんあ機能あったな
854デフォルトの名無しさん:2008/06/16(月) 01:10:10
tiny segmenter なら辞書要らずでお手軽
855デフォルトの名無しさん:2008/06/16(月) 11:08:26
matchdata = /[0-9]+/.match("foo=123;qoo=456;zoo=789")
p matchdata.to_a # => ["123"]

["123", "456", "789"]を期待したんですが["123"]でした。
どうしたら["123", "456", "789"]を得られますか?
856デフォルトの名無しさん:2008/06/16(月) 11:11:34
"foo=123;qoo=456;zoo=789".scan(/\d+/)
857デフォルトの名無しさん:2008/06/16(月) 11:25:49
正規表現は「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つだけは読んでおくといいぞ
858デフォルトの名無しさん:2008/06/16(月) 11:50:32
>>856-857
詳しいところまでありがとうございました。勉強になります。
859デフォルトの名無しさん:2008/06/16(月) 14:58:20
Ruby1.8.6でメール送信フォームを作っています。

次のような流れで、送信する前に確認画面を設けたいのですが―

フォーム送信(Html)

確認用CGI(Ruby)で処理

確認画面の表示・フォーム送信(Html)

送信用CGI(Ruby)で処理

名前やメールアドレスといった文字列データは、
確認画面を経由させるのに問題ありませんが、
ファイルを添付させた場合、tempfileオブジェクトをどのように経由させればよいかわかりません。

今考えているのは、ファイル名だけを経由させ、
送信用ファイルでそのファイルを処理すればよいかと考えていますが、
FireFoxではtempfileのoriginal_files要素を取得してもフルパスを取得することができません。

フルパスを取得する方法、もしくはフォーム送信時の常套句的な方法があれば教えてください。
860デフォルトの名無しさん:2008/06/16(月) 14:59:29
>送信用ファイルでそのファイルを処理すればよいかと考えていますが、
送信用CGIの間違いです。よろしくお願いします。
861デフォルトの名無しさん:2008/06/16(月) 15:19:06
>>859
「確認CGIではファイル名取得だけ行い、送信画面でそのファイル名のファイルを実際に送信する」ということはできない
Webブラウザでは、<input type='file'> を POST する場合にしか、ファイル選択ダイアログとファイル送信はできない実装になっている
だから、入力画面のsubmitを受けたときにファイルは必ず受け取らないといけない(だから、あまり確認の意味がない)
受け取ったファイルをサーバで保持して、確認画面のsubmitが来たらファイルを実際に使用する、という手順にするしかないな

問題のひとつは確認画面でキャンセルされたときのサーバ側に残ったファイルの扱いなんだが、これは適当に消せ
あと、確認画面で戻る押されて別のファイルをアップロードされたときの扱いとかも面倒だな

どちらにしても、Rubyの話ではないので適当なCGI関連のスレで研究してくれ
862デフォルトの名無しさん:2008/06/16(月) 15:31:55
>>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)のようです。
864デフォルトの名無しさん:2008/06/17(火) 12:05:19
windowsで導入してローカルで動かせばいいじゃないか
865デフォルトの名無しさん:2008/06/17(火) 12:08:55
うむ
866デフォルトの名無しさん:2008/06/17(火) 13:43:28
>>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が使えますよ〜っと書いてあるレンタルサーバーでもどのようにしてつかえばいいのかさっぱりです。
本でも読んで勉強もしますのでよろしければはじめの一歩でも教えてください。
868デフォルトの名無しさん:2008/06/17(火) 16:06:20
つか、なんで知識無い奴がRoRやってんの?
CGIとHTTPとDBの知識無い奴がRoRなんか触ったって意味ないのに
869デフォルトの名無しさん:2008/06/17(火) 16:15:51
>>867
Rails環境の構築は初心者には難しい
お薦めの手順としては

1.WindowsにRails環境を作って、そこでRailsの基礎を勉強する
基礎Ruby on RailsにもRails環境入りのCDがあるけれど、ここは「InstantRails」を使うべき

2.ある程度Railsアプリケーションをローカル(つまりWin)で作れるようになったらVPSでの公開を検討する


遠回りかもしれないがまずはローカルでRailsを動かしてみよう
学生さんですか?
ここはRubyスレで微妙にスレ違いの話になるので、捨てアドでも晒してくれたら色々と教える事は可能
870デフォルトの名無しさん:2008/06/17(火) 16:19:05
>>867
>ruby script/server
script/serverは、最初にrails generateで作ったディレクトリの中にある
あとは分かるな?

>VPS以外で
自鯖が立てられないならほぼ不可能
CGIスクリプトとして動かす手段もあるにはあるが、たぶん遅すぎて使い物にならない
それでもやりたいなら「dispatch.cgi rails」でググれ
871デフォルトの名無しさん:2008/06/17(火) 16:22:14
>>868
そんな事は無いだろう
DBは必須だがCGIとHTTPの知識が無いRailsエンジニアなんてゾロゾロいるぞ
もちろん誰かが作ってくれた環境上でアプリを作るだけしかできないが
872デフォルトの名無しさん:2008/06/17(火) 16:25:29
>>870
いや、実はRails自体入ってないんじゃないかとオレは思ってるw
867にはrails -vしてみて欲しいところだな
873デフォルトの名無しさん:2008/06/17(火) 16:32:10
>>868
まあ、Railsはどこをどう見ても

「わかってる人間が手早く作るための強力フレームワーク(※ 引き換えにパワー上限あり)」

なんだが、Javaソリューションビジネスで負けた奴らが次点を求めてRoRにツバつけようと群がったもんだから
「あなたにもRoRが簡単にできます」ビジネスの被害者が続出してる
そういう被害者の人たちのフォローをするのも初心者スレの役目だとは思うぜ
874デフォルトの名無しさん:2008/06/17(火) 16:38:38
>>873
Railsはシンプルでわかりやすいけど、それは「ある程度わかっている人」限定の話なんだよなぁ
プログラミング未経験者ならRailsよりもPHPの方が簡単に入れるだろうとは思う
875デフォルトの名無しさん:2008/06/17(火) 17:01:38
Rubyの知識はあるのかなあ
無いんだったら、俺ならダッシュで本屋行ってPHPに鞍替えするね
876デフォルトの名無しさん:2008/06/17(火) 17:19:53
おk
>>867はPHPに乗り換えなさいw
877デフォルトの名無しさん:2008/06/17(火) 18:10:33
皆様ご回答ありがとうございます。
現在の、ローカルのWindows環境では本にしたがい、localhost:3000で動くことはできました。
それを一般に公開するなんて簡単だろうperlのcgiとおなじだろ〜っと考えていたらみごとに躓きました。

ご指摘のとおりrails -vしてみたところRails 1.2.2と返ってきたので入ってはいるみたいです。

そしてRoRのソースやらが入っているディレクトリまでcdで移動して再度script/serverを打ってみると

create
File exists - script/server

と帰ってきました。どうやらサーバーがたったようではなさそうな感じですが・・・

あと一歩なんでしょうかorz

ちなみに言語経験はC#とVBを少々でございます。
捨てアドさらせば教えていただけるというとても親切な方がいらっしゃいましたのでアドレスを書いて見ます。
よろしくお願いします。
878デフォルトの名無しさん:2008/06/17(火) 18:38:56
初心者か
879デフォルトの名無しさん:2008/06/17(火) 18:43:32
>>878
まあ、初心者スレだからな

来るのはRubyの初心者だけにして欲しかったもんだが
2ch初心者とかネット初心者とかコミュニケーション初心者とかは正直勘弁
880デフォルトの名無しさん:2008/06/17(火) 18:44:48
つーか>>878とか>>868は上から目線すぎ
誰だって知らない分野はあるだろ
881デフォルトの名無しさん:2008/06/17(火) 18:47:51
lololol
882デフォルトの名無しさん:2008/06/17(火) 18:49:54
>>880
ほいほいメールアドレス晒したり
Windows以外で動作させるための文献検索すらできてなかったりするのは
どうにも擁護できんぞ
「知らない分野」とかそういうレベルではない
883デフォルトの名無しさん:2008/06/17(火) 18:53:29
>>880は「お前には無理だからやめろ」とはっきり言ったほうがいいと仰っておられるのですよ
RoR使うのやめろというレスを全部スルーしてるからな
884デフォルトの名無しさん:2008/06/17(火) 19:10:38
>>882
自分のメールアドレス晒すのは、別に擁護する必要無いだろう。
885デフォルトの名無しさん:2008/06/17(火) 19:12:56
RoR以外の手段を使えというアドバイスですが、一応RoRについての文献をすでに購入してしまったことと
また、RoRを勉強してみたいという意欲のもと始めましたので、別の言語は考えていません。
LinuxにRuby と Railsを入れる方法についてはいろいろと調べまわったつもりなのですが具体的に公開手順を示されているサイトが
みつかりません。メールアドレスを晒したのは>>869さんが親切にあのようにおっしゃってくれたからです。
微妙にすれ違いとの事ですので、失礼しました。
886デフォルトの名無しさん:2008/06/17(火) 20:02:43
Rails云々とは関係なくHTTPとCGIについてよく書けている記事があったので晒してみる
ttp://itpro.nikkeibp.co.jp/article/COLUMN/20080128/292199/?P=4&ST=oss

これを書いたやつは見込みがあるな
887デフォルトの名無しさん:2008/06/17(火) 20:11:11
そのシリーズはなかなか良質
抽象データのあたりとか、
よくまあ説明が複雑になりがちな概念をここまで平易に
888デフォルトの名無しさん:2008/06/17(火) 20:18:50
タイトルで吹いたw
889デフォルトの名無しさん:2008/06/17(火) 22:58:25
直伝噴いた
890デフォルトの名無しさん:2008/06/17(火) 23:21:08
ここまで言うならぜひ言語を作って欲しい物だ
891デフォルトの名無しさん:2008/06/18(水) 02:07:50
最近読んだ『ハッカーと画家』でrubyの評価が結構高かった。
著者曰くLispに最も漸近しているスクリプト言語とのこと。
892デフォルトの名無しさん:2008/06/18(水) 02:25:08
お前が読んだのは最近かもしれんが、書かれたのは何年も前だぞ
893デフォルトの名無しさん:2008/06/18(水) 02:33:52
原語のほうは公開されてなかったっけ
894デフォルトの名無しさん:2008/06/18(水) 02:54:16
Lispに最も漸近しているって褒め言葉になってないぞw
895デフォルトの名無しさん:2008/06/18(水) 04:17:14
>>891
それ、
『今大人気の言語RubyはLispに一番近い言語なんだよ(知ってた?)
 でもさ、だったらLispそのものを使ったほうがいいよね?』
っていうプロパガンダだよ。PGの文章は今から見ると宣伝とか
自己啓発系のものが多いから、半分眉唾で読んだほうがいいよ。
リアルタイムで読んだら興奮するんだけどね。
896デフォルトの名無しさん:2008/06/18(水) 07:54:35
MSが絡むと途端に理性を失うよねこの人
897デフォルトの名無しさん:2008/06/18(水) 15:53:28
ここは初心者が質問するスレじゃなくて性格のねじれた中級者の雑談でよろしいでしょうか?それならば私も混ぜてください
898デフォルトの名無しさん:2008/06/18(水) 15:54:24
>>896
評価するところは評価していたかと
キャッチコピーが技術者のことをよく分かってるって
899デフォルトの名無しさん:2008/06/18(水) 15:58:31
>>897
そういうのは基本的にはアンチ専用スレで
900デフォルトの名無しさん:2008/06/19(木) 00:57:36
Ruby CGIで質問です。

Print文で処理中をあらわす文字列を表示し、
処理が完了したら、次にそのことを知らせる文字列を表示したいのですが、
最初に表示した処理中をあらわす文字列を消すにはどうすればいいのでしょうか?
901デフォルトの名無しさん:2008/06/19(木) 01:08:39
CGIで逐次表示とか考えるな
902デフォルトの名無しさん:2008/06/19(木) 01:10:16
>>900
それは、ボタンをポチッと押すと
「ただいま処理中です」
とかいうメッセージの表示されたhtmlを表示して、
サーバ側の処理が終わったら*自動的*に
「終了しました」
とか書かれたhtmlを表示したいということでしょうか?
903デフォルトの名無しさん:2008/06/19(木) 02:07:05
>>900
Ajaxでどうぞ
904あぼーん:あぼーん
あぼーん
905デフォルトの名無しさん:2008/06/19(木) 07:19:48
>>901
少なくとも標準あるいは標準の応用でなんとかできるものではないな
RubyやRubyライブラリとしてのサポートはないと思われる
自前でJavaScript書くしかないねえ
906デフォルトの名無しさん:2008/06/19(木) 10:37:36
>>902
そういうことです。

>>901 >>903 >>905
CGIで逐次表示は考えないようにします。
Ajax(JavaScript)で対応したいと思います。

どうもありがとうございました。
907デフォルトの名無しさん:2008/06/20(金) 17:31:54
908デフォルトの名無しさん:2008/06/20(金) 18:50:56
爆撃荒らしうぜえ
909デフォルトの名無しさん:2008/06/20(金) 20:37:19
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でしか動かないのでしょうか?

宜しくお願いします。
910デフォルトの名無しさん:2008/06/21(土) 04:11:42
>>909
READMEに、JRubyのコンパイルにJDK1.5以上が必要って書いてあるからそうなんだろ
911909: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かつ高速に取得する方法はないものでしょうか?
913デフォルトの名無しさん:2008/06/22(日) 12:43:09
利用者のIT製品に対する基本姿勢は、Microsoftを相手にするときのそれが最も健全であって、
ブーブー言いながら使うのが一番だと思うが、最近は企業ブランド崇拝みたいのができあがっていて、
Apple教団はご愛嬌と思っていたが、何だかこれも同じような感じで、嫌な雰囲気だ。Googleしかり。

特にヘビーユーザーがそういう信者というか、エヴァンジェリストになって
教義に染まない利用者の不満をさえぎる壁になると異様。

そういうのって普及前のファンダムの色が残っているから、と楽観視していたのに。
これだけシェアを拡大しても、いっこうにあらたまらないな。
914デフォルトの名無しさん:2008/06/22(日) 12:46:44
>>912
自力でサイト固有の正規表現考えて抽出してそのサイトの URI に + するのが簡単
正規表現めどいという人に Hpricot

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| uri + e['href']}.find_all{|e| e.scheme =~ /\Ahttp/}.uniq

実行結果
http://www.ruby-lang.org/ja/downloads/
http://www.ruby-lang.org/ja/documentation/
http://www.ruby-lang.org/ja/libraries/
http://www.ruby-lang.org/ja/community/
http://www.ruby-lang.org/ja/news/
http://www.ruby-lang.org/ja/security/
http://www.ruby-lang.org/ja/about/
http://www.ruby-lang.org/ja/news/2008/06/20/arbitrary-code-execution-vulnerabilities/
http://www.ruby-lang.org/ja/news/2008/06/13/ruby-1-8-7-p17-release/

...
915デフォルトの名無しさん:2008/06/22(日) 12:53:43
('a')がAAに見えた
916912: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だからでは?
920912: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 です。
922デフォルトの名無しさん:2008/06/22(日) 16:15:27
>>921
マシンスペックにもよるが、Rails 新規インストール時に数時間返答がないのは普通
1日以上待った例もあるからそのまま放っておけ
923デフォルトの名無しさん:2008/06/22(日) 16:19:26
>>921
Debianの例で悪いけど、回避策もやはりあるみたいよ。

http://d.hatena.ne.jp/takaxi/20080128/1201482937
924デフォルトの名無しさん:2008/06/22(日) 16:36:28
めんどくさいなあ

>>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
925デフォルトの名無しさん:2008/06/22(日) 16:46:58
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
926デフォルトの名無しさん:2008/06/22(日) 16:58:19
HTML の知識はないとダメだよね
後出しで youtube 出してきたけど、欲しいのは動画ファイルのURLや各種一覧にあるURLだろうし
これからまた絞らないといけないだろうな(おそらくはCSSセレクタとかXPathとかあのへんの知識が要る)
927デフォルトの名無しさん:2008/06/22(日) 17:01:13
リンクされてるURLを抜き出すライブラリを作ってるというならともかく、
無駄にあれこれ悩むよりさっさと正規表現使って抜き出せばいいと漏れは思う。
928デフォルトの名無しさん:2008/06/22(日) 17:03:18
そういう意味では>>914の1行目の時点で回答は出てるんだよな
929デフォルトの名無しさん:2008/06/22(日) 17:32:00
うっかり汎用性を求めてしまうのはRubyスクリプトの悪い癖
初期ではそのノリで標準ライブラリになってしまったりしたが
930デフォルトの名無しさん:2008/06/22(日) 17:33:53
>>921
rubygems 1.2 で劇的に改善されたらしい。
http://rubyforge.org/forum/forum.php?forum_id=25353
931930:2008/06/22(日) 17:38:48
gem 1.2.0 にしたら、gem が笑っちゃうぐらい高速になったよ。
932デフォルトの名無しさん:2008/06/22(日) 18:19:17
RubyKaigがニコ動うpされまくってるぜ

タグ検索 RubyKaigi2008‐ニコニコ動画(SP1)
http://www.nicovideo.jp/tag/RubyKaigi2008
933デフォルトの名無しさん:2008/06/22(日) 18:24:58
>>931
メチャメチャ速くなってる気がするwwww
gem updateがさっくりオワタww
934デフォルトの名無しさん:2008/06/22(日) 18:58:55
>>932
お、今年はうpが早いな。
あとで見る。
935デフォルトの名無しさん:2008/06/22(日) 19:27:22
標準の関数的メソッド以外で引数のカッコ省略するのやめようぜ
936912:2008/06/22(日) 21:47:13
>>924-925
遅くなりましたがありがとうございました。
やはり例外との戦いなんですね。参考にします。

>>926
youtubeはたまたまブラウザで開いてるURL全部入れて試しただけです。
youtubeから抜き出したいというわけではなかったのです。
937デフォルトの名無しさん:2008/06/23(月) 14:10:30
gem1.2は爆速w
>>930ありがとう
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

でライブラリへのパスは通っていると思うんですが、
解決策をお教えいただければと思います。
940デフォルトの名無しさん:2008/06/24(火) 00:44:50
>>939
/usr/local/lib/ruby/site_ruby/1.8/dbd/Pg.rb
は存在するの?
941デフォルトの名無しさん:2008/06/24(火) 06:51:08
UNIXにおいては、ライブラリパス(というか、soの在処)は
LD_LIBRARY_PATH
あたりで設定すると記憶しているが。
942デフォルトの名無しさん:2008/06/24(火) 14:23:27
linuxではldconfig とかも使う。
943デフォルトの名無しさん:2008/06/24(火) 21:12:24
Solarisならcrleとかね
944デフォルトの名無しさん:2008/06/24(火) 21:14:08
ldd でlib全部リンクできてるか確認するとかね
945デフォルトの名無しさん:2008/06/24(火) 21:35:17
Macならotool -L だな。
946デフォルトの名無しさん:2008/06/24(火) 21:54:40
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 などでもう少し格闘してみます。
947デフォルトの名無しさん:2008/06/24(火) 23:14:53
>>946
ruby-pg はインストールしてる?

ruby -rpg -e0
を実行して何も出なければ入っているって事なんだが。

それにしても分かりにくいエラーメッセージだな>dbi
真の原因を隠すなよ。
948デフォルトの名無しさん:2008/06/25(水) 04:05:46
Rubyでシューティングゲームつくってるんですけど
949デフォルトの名無しさん:2008/06/25(水) 04:08:31
ごめ 途中でカキコしちゃった
Rubyでシューティングゲームつくってるんですけど 弾が当たってゲームオーバーになった時に画面全体を赤っぽくしたいんですけど なにかいい方法ありませんか?

一応予定としては
画面全体を赤で塗る 
透過する 
って考えているんですけどがんばっていろいろ探ってみてもやり方がわかりませんorz どうかよろしくおねがいします。
950デフォルトの名無しさん:2008/06/25(水) 04:33:13
>>949
手順
1.Rubyをアンインストール
2.HSPをインストール
3.「シューティングゲームビルダー」でぐぐる。
4.HSPをアンインストール

わざわざRubyで作る意味がわからない
951デフォルトの名無しさん:2008/06/25(水) 05:02:34
ん十年前の質問を思い出すなぁ

C言語でゲームを作りたいんですがどうすればいいですか?



しるかーぼけー
952デフォルトの名無しさん:2008/06/25(水) 07:11:46
Rubyかんけえねえw
953デフォルトの名無しさん:2008/06/25(水) 07:12:54
少し質問があるのですが、数値的なシミュレーションをして
結果を分布図(正規分布の図みたいなの)として出力したいのですが、
適したグラフライブラリはどんなものがありますでしょうか?
954デフォルトの名無しさん:2008/06/25(水) 07:20:52
Excelとかw
955デフォルトの名無しさん:2008/06/25(水) 07:35:18
数値だけ出力して、グラフはgnuplotに任せるとかはダメかな?
956デフォルトの名無しさん:2008/06/25(水) 07:59:27
gnuplotのラッパあったよな、確か。
後は

Rubyist Magazine 0006 号
Ruby Library Report 【第 5 回】 数値計算と可視化
ttp://jp.rubyist.net/magazine/?0006-RLR

とか。
957デフォルトの名無しさん:2008/06/25(水) 09:04:23
>>954-956
ありがとうございます。

ああ、gnuplotでもいいか。

GnuplotのRuby用のインターフェースはこれですね。
http://rgplot.rubyforge.org/
gemにもありました。Windowsでもつかえるかな?

あとは、テキストのとかw
Histogram class for ruby(Kodama's tips page)
http://www.math.kobe-u.ac.jp/~kodama/tips-ruby-histogram.html#japanese

かっこいいグラフとか、
Gruff Graphs for Ruby | Ruby on Rails for Newbies
http://nubyonrails.com/pages/gruff

>>956
数値計算のライブラリの詳しい紹介、助かります。

うまく画像化できそうです。一通り試してみようと思います。
ありがとうございました。
958デフォルトの名無しさん:2008/06/25(水) 09:07:44
ちょっとした疑問なのですが、srandとかrandって
何故、クラス化かモジュール化されてないのでしょうか?
徹底的にOOPしているRubyにおいてrandは不思議な存在に思えます。

MLのログなど見てみたのですが、過去にクラス化の議論はされているようで↓
http://blade.nagaokaut.ac.jp/cgi-bin/vframe.rb/ruby/ruby-dev/30954?30947-31824+split-mode-vertical

パッチが作られていて、1.9で当てられるようなことになっているのですが、
SVNのtrunkや1.9.2とかのソースを見ても当たってないようです???
959デフォルトの名無しさん:2008/06/25(水) 09:22:20
>>949
どんなライブラリを使ってるのかが分からないと、助言のしようがない
960デフォルトの名無しさん:2008/06/25(水) 09:56:07
ArgumentErrorエラーメッセージのことで質問させてください。
wrong number of arguments(1 for 0)
このとき「引数の数が間違えてる」のは文字通りわかるのですが、
(1 for 0)はどう読んだらいいんでしょうか?
引数なし(0)のところに1つ(余計に?)渡してる、みたいなニュアンスでしょうか?

今、あるライブラリを使っていてこのエラーが出ているのですが
引数の数は間違えておらず(関数側にもデフォルト値も設定されている)
原因を探しているところです。
961デフォルトの名無しさん:2008/06/25(水) 10:10:38
>>960
お前英語苦手だろ
962デフォルトの名無しさん:2008/06/25(水) 10:53:50
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)

963960:2008/06/25(水) 11:03:15
>>962
ありがとうございます。
直接呼び出しているメソッド内から呼ばれていたメソッドで
引っかかっていたようでした。
構文が古いのか(?)マニュアル見て書き直してみたらうまくいきましたm(_ _)m
964デフォルトの名無しさん:2008/06/25(水) 12:14:18
965デフォルトの名無しさん:2008/06/25(水) 12:30:57
>>950 一応Rubyの書き方覚えつつ作ろうかなぁと思ってちまちまつくってます。

ライブラリはSDLとfpstimerはいってます。
966デフォルトの名無しさん:2008/06/25(水) 12:55:07
>>964
んーたぶんそれと違うような。Mersenne Twisterをラップしたのなんだけど・・・

>>965
Rubyでゲーム制作ならこっちのスレの方がよいかと思う
【Ruby/SDL他】Rubyでゲーム制作・総合スレッド
http://pc11.2ch.net/test/read.cgi/gamedev/1207069887/
967デフォルトの名無しさん:2008/06/25(水) 13:03:33
>>966
普通の乱数ジェネレータのオブジェクト化ね。
多分やってない、やる気がないだけだと思うけど。

確か、過去の議論で、うまい名前とうまいAPIがあれば、みたいな
話になってたかな。
968デフォルトの名無しさん:2008/06/25(水) 13:10:11
>>966 スレちソマソ 誘導サンクスー
969958:2008/06/25(水) 13:20:17
MLのその後のRandomパッチの議論を見つけました。
http://blade.nagaokaut.ac.jp/cgi-bin/vframe.rb/ruby/ruby-dev/31993?31774-32131+split-mode-vertical

なんかグダグダのまま頓挫してますね・・・。
970デフォルトの名無しさん:2008/06/25(水) 16:21:36
Ruby会議でakrさんが「抱き合わせはダメ」の例で出してたな、それ
971デフォルトの名無しさん:2008/06/25(水) 17:04:57
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
972デフォルトの名無しさん:2008/06/25(水) 19:01:12
>>971
技術的な話をすると長くなるので省略するが、標準添付ライブラリimportenv.rbの10行目を削除すれば解決する。
973デフォルトの名無しさん:2008/06/25(水) 19:24:56
迷惑なことやるもんだ
974デフォルトの名無しさん:2008/06/25(水) 19:25:17
誤爆です
975デフォルトの名無しさん:2008/06/25(水) 20:52:46
大量のデータを適当に長々と処理するスクリプトがあります
未処理だよ変数からデータ1個取り出す→何かする→終わったよ変数に1個格納
こんな感じで処理自体はデータごとに独立です

で、「外部からのアクションで一時停止」「停止中のスクリプトを再開」ってできませんか?
976971:2008/06/25(水) 20:54:03
>>972
動きました。ありがとうございました。

977デフォルトの名無しさん:2008/06/25(水) 21:04:01
>>975
1ループごとに「○○番目のデータまで処理完了」ってファイルに書き込んでおく
停止したいときはスクリプトを強制終了させる
スクリプト起動時に中間ファイルの存在をチェックし、中間ファイルがあった場合は中身を読んでその番号から再開

これなら小難しいこと考えずに中断と再開ができるぞ
「1ループごとにHDDに書き込みするなんて畏れ多い!」とか考えたらダメだぞ
978デフォルトの名無しさん:2008/06/25(水) 21:12:35
>>975
外部ってのが何かによる
別スレッドでもソケットでもファイルでもいいから、そこから停止指示が出ていないか
処理1回ごとにポーリングするとか
979デフォルトの名無しさん:2008/06/25(水) 21:17:58
単純にはこんなんでいいんじゃね?

trap(:int){gets}
loop{p :foo; sleep 1}
980デフォルトの名無しさん:2008/06/25(水) 21:21:55
動かしっぱなしでいいならdrbでqueueとか。
981デフォルトの名無しさん:2008/06/25(水) 23:11:58
http://www.oreilly.co.jp/books/9784873113678/

まだ売ってなかった。週末ぐらいかな
982デフォルトの名無しさん:2008/06/25(水) 23:15:59
あ、そうか、奥付的にはもう売ってるはずだよな
近刊の欄には「予定」がついたままだから、もしかしたらちょっと遅れるのかも
983デフォルトの名無しさん:2008/06/26(木) 00:07:52
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
 やる夫で学ぶJRuby最適化 - recompile.net
http://recompile.net/2008/06/jruby-3.html
986デフォルトの名無しさん:2008/06/26(木) 11:47:19
>>984
初心者でかつ英語が読めないのであれば、まず日本語で解説したページや書籍を手に入れ、
そこで使われているバージョンをインストールして勉強すべし。
バージョンをあげるのは勉強したあとにしたほうがいい。

初心者でも英語が読めるのであれば、英語での解説ページはぐぐれば出てくるからそれを読めばいい。

初心者は本を買うことを強くおすすめする。3千円ケチったせいで実はすごく損をしていることに気づくべし。
987デフォルトの名無しさん:2008/06/26(木) 12:18:49
RubyにはTempfileっていうクラスがありますが,これは
クローズすると自動的に削除されますよね.

テンポラリファイルに書き出して書き終わったら正式なファイル名にrenameするという
イディオムはRubyではどう書けばいいんでしょうか.
テンポラリファイルの名前はThreadユニークなものにしたいです.
988デフォルトの名無しさん:2008/06/26(木) 12:57:42
Tempfileを使わない
989デフォルトの名無しさん:2008/06/26(木) 13:35:36
「今このコードが動いているスレッド」を得る方法があったら教えて下さい.
990デフォルトの名無しさん:2008/06/26(木) 13:39:39
Thread.current
991デフォルトの名無しさん:2008/06/26(木) 14:32:42
Tempfile に書き出すんじゃなくて、ファイル名だけtemporaryなものにすればいいんじゃないかな
992デフォルトの名無しさん:2008/06/26(木) 15:20:35
>>987
てぃんぽ
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 を呼ぶにはどうしたらいいでしょうか?
994デフォルトの名無しさん:2008/06/26(木) 16:25:57
>>993
オリジナルのprintをaliasしておいてそれを呼ぶ
995デフォルトの名無しさん:2008/06/26(木) 16:28:31
Kernel.print でいいんじゃね?
996デフォルトの名無しさん:2008/06/26(木) 16:42:16
>>994>>995
ありがとうございます。
alias するなら Hoge の print の名前を変えるので
Kernel を使うことにします。
997デフォルトの名無しさん:2008/06/26(木) 17:04:31
Rubyでビット演算の符号無し右シフトをするにはどうしたら良いのでしょうか?
998デフォルトの名無しさん:2008/06/26(木) 19:15:12
>>997
rubyは整数のビット幅に限界がないので、負数を2の補数で扱う場合、最上位ビットというものが存在しない。
故に、符号なし右シフトは定義できない。
999デフォルトの名無しさん:2008/06/26(木) 21:52:03
XMLの一部を抜き出すスクリプトを書いています。

読み込んだXMLに対して、
再帰処理で子エレメントを検索していってるんですが
結果をファイル出力したい場合ってどういう風にしたらいいんでしょうか?
再帰の関数のなかでREXML::Document.new()を書くとそれぞれで作られてしまう
一番最初の呼び出しをするときにREXML::Document.new()で作ったインスタンスを
引数として持たせ続ける案が浮かびました
なんかスマートな感じがしないんですが、他にどういった方法が考えられますか?
1000神本 ◆wWwwWwWwWw :2008/06/27(金) 00:00:33

10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。