Ruby 初心者スレッド Part 18 at TECH
[2ch|▼Menu]
1:デフォルトの名無しさん
08/02/22 14:31:31
プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。

   【Ruby1.9 は不安定な開発版であり初心者には全く向きません】
   【最新安定版の Ruby1.8.6 の使用を強くお勧めします】

関連スレやURLは>>2-8あたりを見てください。Ruby on Railsの質問はRailsスレへ。

■質問する人へ
質問する前に次の3つをすること。ここで回答を待つよりそのほうが早い。
 ・モジュール名やエラーメッセージでググる
 ・マニュアルで引っかかったクラスの記述を探す URLリンク(www.ruby-lang.org)
 ・FAQを一応読む URLリンク(www.ruby-lang.org)
質問には以下を書くこと。へたくそな質問は再提出を要求される。
 ・詳しい内容(「動きません」「うまくできません」では回答しようがない)
 ・エラーメッセージ(自力で訳さずなるべくそのままで)
 ・実行環境(OS名、Rubyのバージョン(ruby -v でわかる))
 ・最終的にやりたいこと(もっとよい方法がある場合が多いので)
回答してくれた人には「ありがとう」のひとことをいってあげて。
■回答する人へ
相手は初心者、根気よく育てるつもりで。質問がへたくそなのも大目にみてあげる。
それができないならこないこと(だって初心者スレだもん)。
 ・既出な質問やFAQは「XXXを読め」でいいので、叩かない&怖がらせない。
 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。

2:デフォルトの名無しさん
08/02/22 14:36:38
【よくあるしつもん】
Q:
いちからRubyを始める初心者向けのRuby入門書は何がおすすめでしょうか?

A:
プログラム作成の初心者だったら
「たのしいRuby 第2版 Rubyではじめる気軽なプログラミング」
URLリンク(www.amazon.co.jp)
他の言語経験があるんだったら
「プログラミングRuby 第2版 言語編」
URLリンク(www.amazon.co.jp)


3:デフォルトの名無しさん
08/02/22 14:39:10
■前スレ
Ruby 初心者スレッド Part 17
スレリンク(tech板)

■関連スレ
Rubyについて Part 30
スレリンク(tech板)

Rubyの宿題教えてください。
スレリンク(tech板)
スレリンク(tech板)

【ActiveScript】RubyをWindowsで使うスレ【GUI】
スレリンク(tech板)

Ruby on Rails
スレリンク(tech板)

Rubyについて(アンチ専用) Part002
スレリンク(tech板)

4:デフォルトの名無しさん
08/02/22 14:40:19
■公式/非公式関連リンク
Ruby Home Page
URLリンク(www.ruby-lang.org)

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

リファレンスのHTMLヘルプ版配布
URLリンク(elbereth-hp.hp.infoseek.co.jp)
# Windowsで便利

Ruby FAQ
URLリンク(ruby-lang.org)

Programming Ruby - The Pragmatic Programmer's Guide
URLリンク(www.ruby-doc.org)
# 好評書籍をWebで公開中、ただし英語

逆引きRuby
URLリンク(www.namaraii.com)


5:デフォルトの名無しさん
08/02/22 14:41:17
RAA - Ruby Application Archive
URLリンク(raa.ruby-lang.org)

RubyForge
URLリンク(www.rubyforge.org)
# Rubyのアプリやライブラリが検索できる

日本Rubyの会 公式Wiki
URLリンク(jp.rubyist.net)
# メニューに表示されていない埋もれた情報ページ多数

Rubyist Magazine - るびま
URLリンク(jp.rubyist.net)
# コードレビューが好評

Ruby hotlinks 五月雨版(日記やblogのアンテナ)
URLリンク(www.rubyist.net)

Rubyの本一覧
URLリンク(www.ruby-lang.org)

<rubyXML/>
URLリンク(www.rubyxml.com)

Matzにっき(Ruby作者の日記)
URLリンク(www.rubyist.net)

6:デフォルトの名無しさん
08/02/22 14:42:08
■最近できたWiki
Ruby 初心者スレッド Hiki
URLリンク(starlet.s145.xrea.com)

Ruby Portal
URLリンク(ruby.morphball.net)


7:デフォルトの名無しさん
08/02/22 14:51:23

テンプレ終わり


8:デフォルトの名無しさん
08/02/22 15:04:01
   _,,....,,_  _人人人人人人人人人人人人人人人_
-''":::::::::::::`''> ゆっくりした結果がこれかよ!!   <
ヽ::::::::::::::::::::: ̄^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^ ̄
 |::::::;ノ´ ̄\:::::::::::\_,. -‐ァ
 |::::ノ   ヽ、ヽr-r'"´  (.__
_,.!イ_  _,.ヘーァ'二ハ二ヽ、へ,_7、
::::::rー''7コ-‐'"´    ;  ', `ヽ/`7
r-'ァ'"´/  /! ハ  ハ  !  iヾ_ノ
!イ´ ,' | /__,.!/ V 、!__ハ  ,' ,ゝ
`!  !/レi' (ヒ_]     ヒ_ン レ'i ノ
,'  ノ   !'"    ___   "' i .レ'
 (  ,ハ    /_ /   人!
,.ヘ,)、  )>,、 _____, ,.イ ハ

9:デフォルトの名無しさん
08/02/22 15:23:45
         r'ニニニ二二二ニニニ、ヽ
         | |     .@     | |            ト、____, へ
      rー┤|           |├、          ヽ         }
      |   | |       Π    | | |        ≡三ーーーーァ   /
      l    l l     lニ  コ  .| | |         ≡    /  /
     |    l l      |_|    | | |        ≡三   ./  /
       l__l_l______|_|__|   っ     .≡ /  /
       | /  ,イ,へ 丶、       ヘ       ≡三./  /       ノ|
       | ,' / //  \| \ ト、 ヽ ',   つ  ≡{   丶ーーーー'  }
      !j./l /        ` ヽト、ヽ }         ゝ、_______丿
.     | | .!/.!  ○    ○ l l |ヽ,'    ⊃
       l | | .l/////////////! | !.|      
       .| ! | ト、  ,-ー¬   .ィ| .| l     こ、これは>>1乙じゃなくてバギクロスなんだから
        | l ! l l` r --.' <j ,' | |    変な勘違いしないでよね!
        | .l ', l |ャ-ミ≡彳ァトイ ,'! !   
      .| | ヽ| | l r´ )/ハy / | ',


10:デフォルトの名無しさん
08/02/22 15:29:55
    < ̄ ̄ ̄>
       ̄>/
     / /
    /  <___/|
    |______/
        |
     /  ̄  ̄ \
   / ノ   \ \
  /  <●>::::::<●>  \  こ、これは乙じゃなくてエナジーボンボンなんだから
  | /// (__人__) /// |  変な勘違いしないでよね!
  \    ` ⌒´    /
  / ̄ ̄ ̄ ̄ ̄ ̄ ̄ \

11:デフォルトの名無しさん
08/02/22 15:40:31
AA厨うぜえ

12:デフォルトの名無しさん
08/02/22 17:48:57
ifの条件をorで繋げて書いているのですが凄く長くなってしまいます、
途中で改行したいのですがどうしたらいいでしょうか?

13:デフォルトの名無しさん
08/02/22 18:10:07
orが行末にくるように改行を入れる。

見やすさのためにthenを省略しないようにするといいかも。

14:デフォルトの名無しさん
08/02/22 18:43:09
Rubyスクリプティングテクニック
― テスト駆動による日常業務処理術
URLリンク(www.oreilly.co.jp)

これいい本ですか?

15:デフォルトの名無しさん
08/02/22 22:53:02
>>13
ありがとうございます _ _綺麗になりました。

立て続けに質問すみません。
Ruby/Tkで部品(ラベル)を作成しその中のテキストを処理中に複数回変更したのですが、
即時に変更されず、一番最後の変更のみが反映されます。
バッファリングがなされているのかと思い、STDOUT.flashを間に挟んでみたのですが、うまくいきませんでした。
ご助言頂けると嬉しいです _ _

16:デフォルトの名無しさん
08/02/22 23:12:59
>>15
Thread.start{処理}
ってして見るのはどうか。

17:デフォルトの名無しさん
08/02/23 10:48:38
matlabから乗り換える言語の候補でrubyを考えてるのですが
行列計算やグラフのplotはRと連携するのでしょうか?
Rとの連携ってどこまでできるのでしょうか?

18:デフォルトの名無しさん
08/02/23 12:28:44
>>17
うむ、Rでできることのほとんどについて、ロクにサポートできないといっていい

というか、matlabから移行する先としては不適当だろ
Rubyは単なる汎用なオブジェクト指向スクリプト言語に過ぎない

19:デフォルトの名無しさん
08/02/23 13:04:05
matlabとは性質が全然違うと思う
octaveなら分かるがw

20:デフォルトの名無しさん
08/02/23 14:03:52
組込クラスや標準ライブラリに木構造を扱うクラスが無いのはなぜでしょうか

21:デフォルトの名無しさん
08/02/23 15:00:05
ネタにマジレス(ry

22:デフォルトの名無しさん
08/02/23 15:02:57
>>17
Python で numpy 使うといいよ

23:デフォルトの名無しさん
08/02/23 16:12:50
>>17
RSRuby
URLリンク(web.kuicr.kyoto-u.ac.jp)

24:デフォルトの名無しさん
08/02/23 16:40:25
rushってどうよ?あなたのはづかしい体験談プリーズ
URLリンク(journal.mycom.co.jp)

25:デフォルトの名無しさん
08/02/23 20:00:55
Rushはプログレハード

26:デフォルトの名無しさん
08/02/23 21:37:26
RubyでJAVACCみたいなパーサ生成
モジュールってありますか?

AST扱える奴がいいのでつが

27:デフォルトの名無しさん
08/02/23 23:21:42
今だと treetop とか。

28:デフォルトの名無しさん
08/02/24 12:01:00
>>26
Racc
Lex なら StringScanner または Ragel

29:デフォルトの名無しさん
08/02/24 12:31:43
>>28
フォロー。
Raccはyaccみたいなパーサジェネレータだから、ASTは自分で組む必要がある。

30:デフォルトの名無しさん
08/02/24 12:47:04
メール送信をしようと思って、
gemsを見たらメール関連のパッケージがたくさんあります
現在一番使われてるパッケージってどれですか?

31:デフォルトの名無しさん
08/02/24 13:19:48
…TMailかな

Rubyだけでもなんとかなると思うけれど

require 'nkf'
mail=<<EOM
From: #{@sender} <#{@from}>
To: <#{@to}>
MIME-Version: 1.0
Subject: #{NKF.nkf('-jM',@subject.tojis)}
Date: #{@now.rfc2822}
Content-Type: text/plain; charset=ISO-2022-JP
Content-Transfer-Encoding: 7bit

#{NKF.nkf('-Ej',@body)}
EOM

Net::SMTP.start(@smtp_server,25,@helo_domain){|smtp|
smtp.send_mail(mail, @from, @to)
}

32:デフォルトの名無しさん
08/02/24 13:53:43
テストツールの利用の仕方がよくわかりません

33:デフォルトの名無しさん
08/02/24 14:08:46
>>32
テストの知識がないとだめだよ
ソフトウェアテストをRubyでも行うというツールであって、ソフトウェアテストをRubyでも学べるというツールじゃない

タイミング的に
Rubyスクリプティングテクニック ― テスト駆動による日常業務処理術
URLリンク(www.oreilly.co.jp)
これを持ち出して「ただの初心者本であってテスト駆動云々については書いてないじゃん!」とかDisるのがよいぞ

「Rubyで学ぶテスト入門」とかいうのは需要はあると思うんだけどねえ

34:デフォルトの名無しさん
08/02/24 14:17:54
メソッド間の値の受け渡しのとこにてきとーな値と正しい答えのペアを持ってきて
メソッドが正しく動作するか検証するツールだろ

35:デフォルトの名無しさん
08/02/24 14:20:44
>>33
Rubyを256倍使うための本 極道編
というのがあるこたあるが、2001年というのはこの世界だと古文書だな。


36:デフォルトの名無しさん
08/02/24 16:39:43
>>32
「Ruby Test::Unit」または「RSpec」でぐぐれ


37:デフォルトの名無しさん
08/02/24 16:40:08
>>29
>Raccはyaccみたいなパーサジェネレータだから、ASTは自分で組む必要がある。
kwsk

38:デフォルトの名無しさん
08/02/24 16:50:50
>>36
そういう話ではないと思われ

39:デフォルトの名無しさん
08/02/24 17:19:48
>>33
「disる」とかいうのやめ

40:デフォルトの名無しさん
08/02/24 21:48:25
>>37
BNFとか書けばASTを完璧に組み上げる
パーサを生成してくれるわけじゃないという意味。
(というかそこまで出来たらコンパイラコンパイラ名乗って
いい気がする)

構文解析である文法規則に還元されたときの
処理は自分で書かないといけない。

41:デフォルトの名無しさん
08/02/24 23:11:50
>>40
それは Racc の説明であって JavaCC ではないという理解で OK?
もしそうなら、JavaCC はASTを自動で作ってくれるの?

42:40
08/02/25 00:53:05
ぉk。

JavaCCのことはさっぱり。
ただ>>26の要求にRaccは微妙かなと思って。

43:デフォルトの名無しさん
08/02/25 06:21:28
class Foo
 class <<self
 end
end

これの2行目の意味が良く分からないんですが・・・

44:デフォルトの名無しさん
08/02/25 06:32:09
>>43
特異クラスの定義
Railsで時々見るな
URLリンク(www.ruby-lang.org)


45:デフォルトの名無しさん
08/02/25 10:51:44
すいません、クイッククエスチョン。

特異メソッドは特異クラスのサブクラスに継承されるけど
クラスインスタンス変数は継承されないよね?あってる?

46:デフォルトの名無しさん
08/02/25 11:27:47
rhtmlファイルでシンタックスエラーがあるみたいなんですが、どこがエラーか分かりません。
調べる方法があればおしえてください。

47:デフォルトの名無しさん
08/02/25 11:52:29
ppよりもっとディープなインスペクション(そのインスタンスの
メソッドやプロパティーのリストまで表示したり)をするには
どうしたらいいですか?

48:デフォルトの名無しさん
08/02/25 11:52:45
>>45
そんな感じだったような気がする

>>46
静的なファイルなのなら、コマンドラインからerbやerubyコマンドに渡せばいい
スクリプトで動的に生成されたものにエラーがあるという話なのならちょっと違う

~$ cat test.rhtml
<title>てすと</title>
<h1>Hello, <%= World %>.</h1>

~$ erb test.rhtml
(erb):2: uninitialized constant World (NameError)
~$ cat test.rhtml
<title>てすと</title>
<h1>Hello, <%= "World" %>.</h1>

~$ erb test.rhtml
<title>てすと</title>
<h1>Hello, World.</h1>


49:デフォルトの名無しさん
08/02/25 12:06:33
>>47
よーわからんがここ読め
URLリンク(www.ruby-lang.org)

irb> 'str'.class.instance_methods
["send", "between?", "%", "rindex", "reject", "[]=", "split", "<<",
"object_id", "strip", "size", "singleton_methods", "downcase", "gsub!",
"count", "succ!", "__send__", "downcase!", "intern", "member?", "squeeze!",
...
irb> require 'net/http'
irb> Net::HTTP.instance_variables
["@proxy_port", "@proxy_addr", "@proxy_pass", "@is_proxy_class", "@proxy_user"]

50:デフォルトの名無しさん
08/02/25 18:59:27
#:nodoc: とか #.nodoc: ってなに?

51:デフォルトの名無しさん
08/02/25 19:31:31
ドキュメントなんか書くものか!というRubyistの強い意志

52:デフォルトの名無しさん
08/02/25 22:34:11
>>46
erb -x test.rhtml | ruby -wc
または
erubis -z test.rhtml
つーかここよめ
URLリンク(d.hatena.ne.jp)

>>48
それはtest.rhtmlを実行しているだけなので、シンタックスエラーのチェックには向かない。


53:デフォルトの名無しさん
08/02/26 01:42:14
ハッシュを使い回すのではなく、俺用データのクラスを作ろうと思いました
def initialize の中で、インスタンス変数を
@hoge=nil
@hage=nil
@fuga=nil
...
と15個くらい書いてるんだけど、initializeの時点でnil入れておくって無意味だよね?

54:デフォルトの名無しさん
08/02/26 02:22:09
@hogeの使途が分からない俺たちにとってnilを入れておく事に意味が有るか無いかは判断できない

@ary = []
@ary.each{|e| p e}
ってやれば何も出力されないけど

@ary = nil
@ary.each{|e| p e}
ってやるとnilでっせって怒られる

いきなり
@ary.each{|e| p e}
ってやると@aryなんて知りまへんでって怒られる

俺は1番目を良く使うけどね

55:デフォルトの名無しさん
08/02/26 02:39:29
>>54
自分でそのコード実行してみた?

56:デフォルトの名無しさん
08/02/26 02:42:47
irb(main):001:0> nil.each{|e| p e}
NoMethodError: undefined method `each' for nil:NilClass
from (irb):1
from :0
irb(main):002:0> @hoge.each{|e| p e}
NoMethodError: undefined method `each' for nil:NilClass
from (irb):2
from :0
irb(main):003:0> @hoge = []
=> []
irb(main):004:0> @hoge.each{|e| p e}
=> []

57:デフォルトの名無しさん
08/02/26 02:51:17
>>54
>いきなり
>@ary.each{|e| p e}
>ってやると@aryなんて知りまへんでって怒られる
インスタンス変数でなくローカル変数の場合はその通りなのだが
未初期化のインスタンス変数を参照した場合は nil となるはず

>>53
上記のことを踏まえての質問ということでおk?
やってもやらなくてもnilが入っているという意味ではその通りかも知れないが
クラスで用いるインスタンス変数を明示的に示しておくという意味では無意味ではないと思う

58:デフォルトの名無しさん
08/02/26 02:53:56
>>55
インスタンス変数は「定義」しなくてもnilだってのは忘れられがちだよな

インスタンス変数の「定義」をinitializeでする意味はRuby的にはあまりないと思う

59:デフォルトの名無しさん
08/02/26 02:59:02
厳密にはメソッドが追加されるからただの定義ではないけど attr_reader とか


60:デフォルトの名無しさん
08/02/26 02:59:28
外部からアクセスされるなら直後のattrに名前が出るし
外部からアクセスされないインスタンス変数って一体

あ、サブクラスからアクセスしたいか

61:デフォルトの名無しさん
08/02/26 03:23:53
>>60
外部からアクセスされないインスタンス変数はあっても全然おかしくないと思う
むしろすべての実装を外部からアクセスできるように公開する方がまずいのでは

62:デフォルトの名無しさん
08/02/26 03:28:17
インスタンス変数は外部からアクセスしたいときにのみおもむろに使え、ということなのでは
それ以外ではメソッド引数とかで細々とやれと

63:デフォルトの名無しさん
08/02/26 03:42:22
Rubyのスコープはちょっといろんな言語と違うからね

a = 100
def foo()
return 1 + a
end
foo()
とすると何がかえってくると思う?aが定義してないってエラーになるんだぜ

64:デフォルトの名無しさん
08/02/26 03:43:47
こういうときはaを@aに変えるのが定石

65:デフォルトの名無しさん
08/02/26 04:08:26
>>63
そもそもの問題として、メソッド定義の中以外にローカル変数なんて置くなよ…

66:デフォルトの名無しさん
08/02/26 04:16:55
トップレベルに定義したメソッドなんだろ

トップレベルのローカル変数は特別扱いしてくれてもいいような気もするけどな

67:デフォルトの名無しさん
08/02/26 06:06:31
でもnilの特別扱いは要らない…

68:デフォルトの名無しさん
08/02/26 06:25:56
irb(main):001:0> a=[0,1,2]
=> [0, 1, 2]
irb(main):002:0> [a]
=> [[0, 1, 2]]
irb(main):003:0> [*a]
=> [0, 1, 2]
irb(main):004:0> [3,4,5,*a]
=> [3, 4, 5, 0, 1, 2]
irb(main):005:0> [*a,3,4,5]
SyntaxError: compile error
(irb):5: syntax error, unexpected ',', expecting ']'
[*a,3,4,5]
^
from (irb):5

4行目は良いのに5行目はダメっていう挙動が理解できないんだが・・・


69:デフォルトの名無しさん
08/02/26 06:59:48
>>68
*arrの「うしろ」に置けないだけ
先頭に書けないんじゃなくて、展開後にも何かがあると文法エラー

irb> a = [1, 2, 3]
[1, 2, 3]
irb> [9, 8, *a, 7]
SyntaxError: compile error


70:デフォルトの名無しさん
08/02/26 07:01:21
ていうか、もしかして *array を「arrayの要素をバラす表現」とかいう理解をしてる?

71:デフォルトの名無しさん
08/02/26 07:06:23
1.9なら通るよ

72:デフォルトの名無しさん
08/02/26 13:04:14
自作プログラムをクラスごとにファイルに分けると20ファイルくらいになる
「ああ、実行するたびに20回もHDDにアクセスしてるんだ」と考えると憂鬱になる

ということで開発用ディレクトリと実行用ディレクトリを分けた
実行用ディレクトリには開発用ディレクトリにあるスクリプトを連結したものを入れてる
これならファイルアクセスの回数は数回で済む

いや標準添付のクラスとかrequireしてる時点で何個もファイル読み込みまくってるのはわかってんだけど

73:デフォルトの名無しさん
08/02/26 21:55:41
>>72
その最適化で何秒早くなったの?

74:デフォルトの名無しさん
08/02/26 21:57:22
時間が問題だと思ってる?

75:デフォルトの名無しさん
08/02/26 22:17:03
>>74
>>72はそういうことを言いたいわけではないと思われ

76:75
08/02/26 22:17:55
>>72じゃなくて>>73だorz

77:デフォルトの名無しさん
08/02/26 22:30:19
>>72は一言も最適化とは言ってないな。


78:デフォルトの名無しさん
08/02/26 23:34:14
ディスクアクセスが無意味に多いのが心情的に嫌なのだろう
そう感じるセンスそのものは悪くはない

79:デフォルトの名無しさん
08/02/27 01:28:06
無意味に多いのかそれは、とか
全部動かさずにユニットテストしろよ、とか

80:デフォルトの名無しさん
08/02/27 01:49:05
要するにプリコンパイルヘッダーが必要ということか?

81:デフォルトの名無しさん
08/02/27 04:45:24
C++ とかやると、コンパイル時にいくつヘッダ読んでるかなんて
全く気にならなくなるZE

82:デフォルトの名無しさん
08/02/27 11:05:29
コンパイル時(>>72の例だと開発中)はどうでもいいんだが、実行時に、というのが心情的に気持ち悪いという話だろう。

83:デフォルトの名無しさん
08/02/27 11:26:02
なら、コンパイル系の言語を使えばいいんじゃまいか?

84:デフォルトの名無しさん
08/02/27 11:54:36
そんな読み込み程度を気にするのがいかにも初心者だな

85:デフォルトの名無しさん
08/02/27 11:55:55
Ruby使いはお茶でも飲んでまたーりするがよい
わっはっはっは

86:デフォルトの名無しさん
08/02/27 12:06:07
>>84
そうか?
「それ自身は事実だから好きにせえ」以外の必死な否定論が出ることのほうがよっぽど初心者だと思うが…

87:デフォルトの名無しさん
08/02/27 12:07:32
ところでCが書けないRuby書きはニワカだと思いますがどうですか。

88:デフォルトの名無しさん
08/02/27 12:13:07
I/O を工夫することはパフォーマンスチューニングでは基本事項。
もとの環境や条件が不明だけど、CGIのようにリクエストのたびにプロセスを
実行しなきゃいけない場合は、読み込み速度を工夫するのは別におかしな話ではない。
ファイルサイズが小さくても、ファイルの数が多ければハードディスクのシークタイムは
バカにならない。
ただ、ファイルを連結しても断片化してたら効果は少ないから、デフラグを
ちゃんとやってやる必要があるけど。

89:デフォルトの名無しさん
08/02/27 12:17:28
もうそんな時代でもないんだけどな

90:デフォルトの名無しさん
08/02/27 12:24:31
>>89
ストレージへのアクセスが問題にならないコンピュータができたならぜひ教えてくれ

というか最近の子は「HDDがガリガリ言う」とか気にしないもんかね
静音化されて意識しなくなったんだろうか

91:デフォルトの名無しさん
08/02/27 12:29:29
HDDはアクセスすると壊れるからなあ
いや、こんなんで壊れる確率がはっきり増えるHDDってのもかなりアレだが…

とりあえず
「クラス単位の細切れファイルをインストール時に数個にまとめとく」
というのは別に非難されるようなことじゃないと思うぞ
というかそんなにまでして行為そのものを否定する理由を知りたい

92:デフォルトの名無しさん
08/02/27 12:30:48
ガリガリ言うほどのアクセスを問題にしてるのか?
そもそもそんなこと言ってたらRubyなんて選択肢にならんだろ

93:デフォルトの名無しさん
08/02/27 12:32:34
鈍足のRubyを使う人は達観した境地にあるので小さいことは気にしない

94:デフォルトの名無しさん
08/02/27 12:57:19
正直、完全に論点がずれてるような気がしてならない。
元発言は、無駄を嫌うというプログラマの美徳を発揮してるだけじゃないの?

95:デフォルトの名無しさん
08/02/27 13:04:35
チューンナップを突き詰めるとRuby使うなになるからおすすめしない

96:デフォルトの名無しさん
08/02/27 13:08:02
Railsみたいな糞のかたまりで遊ぶのがRubyistだからな

97:デフォルトの名無しさん
08/02/27 13:16:36
Railsのナカミを喜んでる人は少数だと思う

Railsは開けないほうがよい箱だ
あくまで外部から自分のために便利に使うシステム

98:デフォルトの名無しさん
08/02/27 14:42:30
これが SyntaxError になるんだけど何故でしょうか?

def foo?; end
def bar?; end

case
when not foo?
when not bar?
end


99:デフォルトの名無しさん
08/02/27 14:52:00
>>94
まぁ、美意識の問題だわな。
そしてそれは、そんな変なエネルギーってわけではない。

100:デフォルトの名無しさん
08/02/27 15:15:48
>>98
notだから。

case
when (not foo?)
when (not bar?)
end



case
when ! foo?
when ! bar?
end

なら期待通りに動く

101:デフォルトの名無しさん
08/02/27 15:16:13
>>98
この辺の話かな
URLリンク(www.ruby-lang.org)

when (not foo?)
ならおkのはず

102:デフォルトの名無しさん
08/02/27 18:42:53
[標準出力へのフックを仕込む]
標準出力に出力
標準出力に出力
標準出力に出力
[標準出力に書き出した内容をメールで送信]
ってやりたいんですが、
どうやったら出来ますか?

103:デフォルトの名無しさん
08/02/27 18:55:07
出力時にスコープの広い変数に文字列を追加保存しとけばいいじゃん?

104:98
08/02/27 19:02:54
>>100, >>101
なるほど。
てっきり「not foo?」は「式」かと思っていたんですが、「文」なんですね。
了解しました。深いっす。

105:デフォルトの名無しさん
08/02/27 19:12:13
phpでいうis_array()はどうやればいいですか?
rubyは配列もあるしハッシュもあるし、自分でコレクションも作れるしで
どう判定していいのか分かりません(?o?)

106:デフォルトの名無しさん
08/02/27 19:17:02
[0,1,2].is_a?(Array) #=> true
[0,1,2].kind_of?(Array) #=> true

ArrayクラスはObjectクラスを継承している。
だからArrayクラスはObjectクラスのクラスメソッドやインスタンスメソッドも使える。
Objectクラスのリファレンスをみるべし。
URLリンク(www.ruby-lang.org)


107:デフォルトの名無しさん
08/02/27 19:30:43
>>106
ありがとうございます
試してみたところ、PHPとは異なり、
ハッシュと配列は明確に区別されているようですね
ハッシュ.is_a Array → false
配列.is_a Hash → false

108:デフォルトの名無しさん
08/02/27 19:34:50
オブジェクト、実際的には変数、が配列かどうかを調べなければならないコードというのはRubyではかなり異常
極力他のアプローチを取るようにしたほうがいい

109:デフォルトの名無しさん
08/02/27 19:40:03
case arg
when Array
when Hash
とかよくやるじゃん

110:デフォルトの名無しさん
08/02/27 19:42:06
そうですか(><)
YAMLで書いた設定ファイルを読んで
該当キーをeachで回すようにしてるんですが、
キーを省略した時にはnilになりますよね。
nilをeachしたらエラーになるので、eachできるかどうかを調べてから
eachしたいのですが、
こういう場合はruby的にはどう書くものですか?

111:デフォルトの名無しさん
08/02/27 19:45:14
>>110

・ 変数がnilかどうかを事前にif文で比較して弾く
・ eachでnilが例外エラーを起こしたらその例外をキャッチする

どっちか好きなほう使え

112:デフォルトの名無しさん
08/02/27 19:45:32
def hoge(foo, bar)
 raise ArgumentError unless foo.is_a?(String)
 raise ArgumentError unless foo.is_a?(Array)
 ・
 ・
 ・
end
とかメソッドの最初でモリモリやっちゃうのはだめ?

113:デフォルトの名無しさん
08/02/27 19:58:48
>>112
わりと下品。

まあ、それ以上でもそれ以下でもない程度かと。
コレを無くすために悩む時間がえらい長引くってんならあっても仕方ないんじゃね。おいおい考え変えていけばいいかと。
そのクラスやメソッドに本当にそんなクラスのインスタンスが指定されることがあるのか? をよく考えるといい。
標準添付で「結果の数によってStringあるいはArrayが返ります」とかいうメソッドがあるかい?

…そういえばなんか添付モジュールで複数のクラスが返ってくる可能性のあるやつあった気がするがまあいいや。

「Stringが来たときはHashに変換しよう」とかいうのも同様。Stringなんか渡してくる奴が悪い、で桶。
raaやgemで公開して育てる気マンマンでちまちまフールプルーフさいこー、という場合はあったほうがいいのかも。

114:デフォルトの名無しさん
08/02/27 20:07:48
日本語がよくわからない

115:デフォルトの名無しさん
08/02/27 21:35:03
>>102
require 'stringio'
# 標準出力へのフックを仕込む
$stdout = StringIO.new
# 標準出力に出力
puts '未承諾広告'
puts 'こんにちは^^)'
#
# 標準出力に書き出した内容を
$stdout.rewind
text = $stdout.read
メールで送信(text)

116:デフォルトの名無しさん
08/02/27 21:42:15
>>115
ぬう、適切だが邪悪だ…

117:デフォルトの名無しさん
08/02/27 21:45:13
>>110
eachに反応するときだけeachしたいなら、
respond_to? :each する。

と思ったことが私にもありました。

なんでStringがeach持ってるんだよ……(1.8での話)



118:デフォルトの名無しさん
08/02/27 21:48:51
>>116
標準出力をフックしたいとか言う元の要件自体が邪悪なだけだ(w

使い方自体は巻き戻せるIOの正しい使い方
$stderrに仕込んでおくとwarnの出力をロギングできるぞ
warn使ってる人ってあんまり見ないけどな

>>117
eachの中でArrayやHashという構造べったりの処理をするからあまり意味がなかったり…

119:デフォルトの名無しさん
08/02/27 21:52:27
STDOUTに元の残ってるし、
writeメソッドがないとTypeErrorだし、
邪悪っていうにはおとなしい希ガス。
バッドノウハウなのは確かだけど。

120:デフォルトの名無しさん
08/02/27 23:24:04
>>118
>標準出力をフックしたいとか言う元の要件自体が邪悪なだけだ(w
そんなことないだろ
なんで邪悪なのか説明してみな

121:デフォルトの名無しさん
08/02/28 09:08:29
Herokuってどうよ

122:デフォルトの名無しさん
08/02/28 12:40:13
>>120
出力先が固定になってるあたりかな。


123:デフォルトの名無しさん
08/02/28 13:02:13
なんでパイプしてその先でメールするんだと
駄目なんだろ。

124:デフォルトの名無しさん
08/02/28 13:06:51
>>122
それだけじゃわかんね。固定してたらなぜだめなの?

125:デフォルトの名無しさん
08/02/28 13:16:13
標準出力をフックしたい⇒出力先が固定
意味不明だな。

126:デフォルトの名無しさん
08/02/28 13:20:35
なんかのはずみで標準出力に出るようなものも全部キャプチャしたいなら
すなおに別プロセスで読み出せ

127:デフォルトの名無しさん
08/02/28 14:07:34
こんなもんでいいんじゃね

class Dummy
@@origout = $stdout

def initialize
@buf = ''
end

def write(str)
@@origout.write(str)
@buf << str
end

def flush
tmp = @buf
@buf = ''
tmp
end
end

$stdout = Dummy.new
puts "hello"
puts "world"
$stderr.puts $stdout.flush.inspect

思い切り誤爆してきた。。。


128:デフォルトの名無しさん
08/02/28 15:43:56
>>126
なんで別プロセスにするのがいいの?
$stdout = StringIO .new
だとなんか問題あるの?

129:デフォルトの名無しさん
08/02/28 15:47:47
>>118 バカ
>>122 バカ
>>126 バカ

130:デフォルトの名無しさん
08/02/28 15:53:15
バカとしか言えない>>129はバカでよい
是正させる気も無いようだしただの害悪だな

131:デフォルトの名無しさん
08/02/28 16:52:29
>>128
URLリンク(www.ruby-lang.org)

大抵はそれで問題ないけど
拡張ライブラリとか子プロセスなんかの出力は
$stdoutを書き換えるだけだとリダイレクトできないはず

132:デフォルトの名無しさん
08/02/28 18:41:22
Rubyに限ることではありませんが、
httpでpostするデータが大きくてメモリ不足になるとき
どうやって回避するのがよいのでしょうか?
Net::HTTP.start(host) {|http| r = http.post(path, data, header) }
という感じでpostするときdataが大きすぎる場合に備えて
小出しに分けて送ることってできませんか?


133:デフォルトの名無しさん
08/02/28 19:08:26
>>131
だったら最初からそう書けよ
おまえの書き方だと $stdout を変更するのがすべて悪いみたいじゃないか

>>130
バカはおまえだろ

134:デフォルトの名無しさん
08/02/28 19:13:28
>>132
サーバ側の話? それともクライアント側の話?
サーバ側の話なら、cgi.rbを使わず自前でHTTPを解析する必要がある。
クライアントの話なら、dataをファイルに保存しておいて、例えば10MBずつ読み込んで送信を繰り返せばいいんじゃね?

135:デフォルトの名無しさん
08/02/28 20:13:54
空気悪いな
>>131はこの話題に関しては初めて書きこんだのだが

>>132
クライアント側だとすると、body_streamを使うのはどう?
URLリンク(d.hatena.ne.jp)
この辺か

136:デフォルトの名無しさん
08/02/28 20:34:05
>>133=129
あきらめろ、幾ら頑張ってもお前の>>129は「馬鹿じゃない」と解釈する余地が無い。

137:デフォルトの名無しさん
08/02/29 01:19:04
URLリンク(www.ruby-lang.org)
1.9 featureって書いてあるから1.8じゃ使えないのかと思ったら1.8.6でも使えるのね。よかった。


138:デフォルトの名無しさん
08/02/29 11:22:09
>>134
クライアントです。
分けるといっても複数のpostを一連の1つのpostと
認識させるにはどうしたらいいんでしょうか…

>>135>>137
チャンク形式っていうんでしょうか?
で、body_streamを使えばヘッダとか気にしなくていい
ってことでよいでしょうか?

>>132 のdataの内容を一旦 data.txt に書き出しておいて、
あとは >>135 の例のchunkedを使うようにするとできたっぽいですが、
一時ファイルを使わないようにできないでしょうか?


139:デフォルトの名無しさん
08/02/29 12:48:00
RubyにあるモジュールはCGIやHTTPの知識の必要性を良くも悪くも隠蔽しない
その知識のまま進むのは危険だ
HTTPやCGIの勉強をすることを勧めるよ

140:デフォルトの名無しさん
08/02/29 13:29:26
>>138
>>137が書いてるページの body_stream 使うんだろうけど、おれもやったことないからわからん。
ぐぐったらこんなのあった
URLリンク(d.hatena.ne.jp)

141:デフォルトの名無しさん
08/02/29 14:11:22
curlコマンド使うのが一番楽やねん

142:デフォルトの名無しさん
08/02/29 18:17:48
「年・月・日」ではなく「年・月」の2つしかないデータがあるんだけど、
これを格納するデータオブジェクトって何がいいかな?

いや、年月日が揃ってるデータと「年・月」が同じかどうかという比較をするんよ
年月日ならDateオブジェクトなんだけど、日をどうしようかなあと

143:デフォルトの名無しさん
08/02/29 18:30:19
>>142
 ・ 「どうせ参照されないからいいじゃん?」とか年金式にdayを1に固定してDateを使う
 ・ [year, month] という配列に入れておく
 ・ Dateを継承した「dayが無指定でも動く」という新しいDateを作る

144:デフォルトの名無しさん
08/02/29 21:05:14
・Date に適当にメソッドを足して適当に YYYY/MM/01 でも代表元に使う

145:デフォルトの名無しさん
08/02/29 21:09:37
require 'yaml'

yaml_str = <<YAML_STR
hoge:
- moge: [poge, page]
YAML_STR

data = YAML.load(yaml_str)
data['hoge'].each {|key,value| p key,value}

こうすると、
keyが{"moge"=>["poge", "page"]}
valueがnilになってしまいます。

key=moge,value=[poge, page]
になって欲しいのですが…。
どこが間違っているのでしょうか?

146:デフォルトの名無しさん
08/02/29 21:47:44
data["hoge"] #=> [ {"moge"=>["poge", "page"]} ]
つまり "moge"=>["poge", "page"] という(キーが一つの)ハッシュを一つ持つ配列

mogeをリストにせずにインデントで階層にすれば
data["hoge"] #=> {"moge"=>["poge", "page"]}
になる

147:デフォルトの名無しさん
08/02/29 22:09:30
>>145
data['hoge'].each {|hash| hash.each {|key,val| p key, val}}

148:デフォルトの名無しさん
08/02/29 22:17:20
>>146-147
ありがとうございました
YAMLのマッピングの記述を勘違いしていたようです

149:デフォルトの名無しさん
08/03/01 01:09:51
なんか最近思うんだけどさ
ここ「初心者」スレだよな・・・

素直に本家行けば?って人ばっかりじゃね?

150:デフォルトの名無しさん
08/03/01 04:39:41
本スレはMatzと愉快な仲間たちについて
あれこれ語るスレであって、プログラムを語るスレではないのです


…あれ? じゃあ板違いじゃない?

151:デフォルトの名無しさん
08/03/01 11:36:51
「Rubyの初心者」のスレでしょ?
プログラミング自体の初心者じゃないといけないの?

152:デフォルトの名無しさん
08/03/01 11:44:14
>>149が考えるところの「本スレ」のレベルに依存するな

153:デフォルトの名無しさん
08/03/01 18:15:48
>>149
同意。

154:デフォルトの名無しさん
08/03/01 18:39:06
あんなS/Nの小さいスレ
使ってられねーよ

155:デフォルトの名無しさん
08/03/01 20:00:41
irb> s = '2'; case s; when /(1)/,/(2)/,/(3)/ then p $1 end
"2"

irb> s = '2'; case s; when Regexp.union(/(1)/,/(2)/,/(3)/) then p $1 end
nil

なんで?

156:デフォルトの名無しさん
08/03/01 20:07:39
unionすると
/(1|2|3)/ になるのではなく
/(1)|(2)|(3)/ になって、
今回マッチしたのは(2)のとこだからグループとしては$2。
$1ではない。


157:デフォルトの名無しさん
08/03/01 20:16:53
>>156
をを

…正規表現をコンマで並べても用が済むcaseでunionを使うのはめんどくさいっすな

158:デフォルトの名無しさん
08/03/01 21:37:16
nkf.guessやKconv.guessなんかを文字列にしたいんだけど、
この文字列の配列ってあらかじめ定義されてないんでしょうか?

文字コードの推測
URLリンク(www2u.biglobe.ne.jp)

159:デフォルトの名無しさん
08/03/01 21:54:35
ないっす
いわゆるエンコーディングの名称・略称を表示するようにはできてない

puts "#{str}は日本語EUCだよ!" if NKF.guess(str) == NKF::EUC

というような使い方しか想定してない模様

一応
irb> NKF.constants
["UTF8", "VERSION", "JIS", "UNKNOWN", "NKF_VERSION", "ASCII", "UTF32", "SJIS", "NOCONV", "AUTO", "REVISION", "UTF16", "EUC", "BINARY", "NKF_RELEASE_DATE"]
の結果をどうにかすればできなくはないけど、
自前で文字列対応テーブルを書いたほうがたぶん早い

160:デフォルトの名無しさん
08/03/01 22:05:26
>>159
サンクス >>158のページのようなのを使いまわすことにする

161:デフォルトの名無しさん
08/03/02 00:52:59
net/httpで相手サーバがタイムアウトした場合の例外をキャッチしたいんだけど、
具体的に何の例外が発生するんですか?

というか、そのへんの情報ってどっかにまとまってませんか?

162:デフォルトの名無しさん
08/03/02 00:58:15
手元の俺スクリプトの例

rescue Net::ProtoRetriableError,Net::ProtoFatalError,Net::ProtoServerError,Errno::ETIMEDOUT,TimeoutError =>ex
puts 'サーバーから応答がないので空データを使います'
return ''

正直、ドレが効いてるんだかよくわからん

163:デフォルトの名無しさん
08/03/02 01:04:24
net/protocol.rbを見ると、ソケット生成(接続)や読み書きは
timeoutメソッドの中でやってるのでTimeout::Errorかな。
TimeoutErrorはこれの後方互換用。



164:デフォルトの名無しさん
08/03/02 01:10:11
http.getに該当する部分から飛び出す例外を全部捕捉して
「よくわからんけど鯖がエラー返しましたエラー」にすれば桶

begin
res = open(uri).read
rescue
puts "#{uri.host}のサーバかそこへのアクセスで何かエラーです"
res = ''
end

実際問題としてサーバー側の原因以外の例外はここでは起こらんわけだし
Timeoutだけ補足してもProtoServerErrorの500系エラーはスルーされるぞ
500系エラーって新幹線みたいだな

165:デフォルトの名無しさん
08/03/02 01:15:10
Timeout::ErrorはStandardErrorのサブクラスではないので、
引数なしのrescueでは捕まらんのだわ。


166:デフォルトの名無しさん
08/03/02 01:27:51
>>165
既にFAQレベルだな…
URLリンク(blade.nagaokaut.ac.jp)

直感的という言葉は使いたくないがやっぱ説明なしじゃわかりにくいよね
シグナルとかあのへんの勉強をするといいんだが、ちと重いな

167:デフォルトの名無しさん
08/03/02 01:33:49
Errno::ETIMEDOUT って何?

168:デフォルトの名無しさん
08/03/02 01:39:30
タイムアウトした(Timed Out)というエラー。


169:デフォルトの名無しさん
08/03/02 01:46:43
ネット系はErrno::ECONNABORTEDとかErrno::ECONNRESETみたいなのも飛んでくるし、
例外をキャッチしても、それ以降の接続はなにやっても失敗したりするので悩ましい

170:デフォルトの名無しさん
08/03/02 01:51:49
>>167
システムコールが返すタイムアウト

Timeout::Error → 「相手のWebサーバからHTTPの返事が返ってこない」
Errno::ETIMEOUT → 「Webサーバ以外の色々から返事が来ないタイムアウト」

と思って桶
そもそもサーバが見つからないとかそういうの。たぶん

>>169
retryはたいてい成功しないよね

171:デフォルトの名無しさん
08/03/02 16:23:37

return @hoge = kekka



@hoge = kekka
return kekka



@hoge = kekka
return @hoge

ってどれが一般的かな

172:デフォルトの名無しさん
08/03/02 19:11:27
@hoge = kekka

173:デフォルトの名無しさん
08/03/02 20:47:42
@hoge = kekka
return

174:デフォルトの名無しさん
08/03/02 21:09:01
>>171
returnを使いたくて仕方ないのなら2番目でよろしく
1番目はなんか見てて不安だ

175:デフォルトの名無しさん
08/03/02 21:33:05
win環境で、一番簡単に
ファイルのオープンダイアログを表示するには
どうすればいいでしょうか

もろもろインストールの必要を最小限にしたかったりもします。

176:デフォルトの名無しさん
08/03/02 22:03:12
require 'win32ole'

d = WIN32OLE.new("MSComDlg.CommonDialog")
d.maxFileSize = 256
d.showOpen
p d.fileName

177:デフォルトの名無しさん
08/03/02 22:05:12
楽なのはVisualuRubyかなぁ。通常のrubyには入ってないけど、
Windows用のActiveScriptRubyならデフォで入ってます

require 'vr/vrcontrol'
fn=SWin::CommonDialog::openFilename(nil,[ ["All file","*.*"],["bmp file","*.bmp"] ])
p fn

細かいことはVisualuRubyサイトのドキュメントやサンプル見てください

ActiveScriptRuby
URLリンク(arton.hp.infoseek.co.jp)
VisualuRuby計画(仮称)
URLリンク(www.osk.3web.ne.jp)

178:デフォルトの名無しさん
08/03/02 22:13:20
ファイルロックに関する事なんですが、みなさんはどの様なロジックで組んでますか?
自分は普通に以下みたいな感じなんですが、ごくたまにファイルが壊れる事があるんですよね…
なにか良い方法があればご教示お願いします。

File.open('data.dat', 'r'){|file|
file.flock(File::LOCK_SH)
file.read
}

File.open('data.dat', 'w'){|file|
file.flock(File::LOCK_EX)
file.write(data)
}

179:デフォルトの名無しさん
08/03/02 22:17:53
>>178
スレッド使ってる?

180:デフォルトの名無しさん
08/03/02 22:22:39
>>179
いえ使ってません。

181:デフォルトの名無しさん
08/03/02 22:45:34
書き込みの場合は、アンロックする前に
flushしないと、アンロックした後に書き込みが行われる場合がある
みたいな事を言っている方がいたので、その辺の問題のせいでしょうか…

File.open('data.dat', 'w'){|file|
file.flock(File::LOCK_EX)
file.write(data)
file.flush
file.flock(File::LOCK_UN)
}

とかなのかな??


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

5369日前に更新/81 KB
担当:undef