5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

Ruby 初心者スレッド Part 37

1 :デフォルトの名無しさん:2010/05/18(火) 03:37:57
プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。

★注意★ Ruby 1.9.1 は初心者にはまだ時期早尚です。初心者には Ruby 1.8.7 を強くお勧めします。
 文字エンコーディング等の外部基礎知識が必要な上、不完全対応の第三者ライブラリでの問題の切り分けが手間です。
 1.8.7 は 1.9 系の新機能のいくつかが利用可能なため、1.8.7 を習得すればスムーズに 1.9 系に移行できるでしょう。

関連スレやURLは>>2-5あたりを見てください。Ruby on Rails の質問は Webプログラミング板の 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 :デフォルトの名無しさん:2010/05/18(火) 03:39:17
【よくあるしつもん】
Q:
いちからRubyを始める初心者向けのRuby入門書は何がありますか?

A:
プログラム作成自体の初心者なら
 ・「たのしいRuby 第3版 Rubyではじめる気軽なプログラミング」
  http://www.amazon.co.jp/gp/product/4797357401/
文法は理解済み(orリファレンスで乗り切る既言語習得者)の場合のRuby様式を知る必携2冊目
 ・「初めてのRuby」
  http://www.amazon.co.jp/dp/4873113679/

以下は外れが少ないとされている本です。必ず立ち読みした上で自分の目的とレベルに応じて購入してください。
 ・「Rubyレシピブック 第2版 268の技」(初心者向け)
  http://www.amazon.co.jp/dp/4797340045/
 ・「プログラミングRuby 第2版 言語編」(初心者向け)
  http://www.amazon.co.jp/dp/4274066428/
 ・「Ruby Way 第2版」(脱初心者向け)
  http://www.amazon.co.jp/dp/4798115339/
 ・ 「Rubyクックブック ―エキスパートのための応用レシピ集」(脱初心者向け)
  http://www.amazon.co.jp/dp/4873113245/

以下の本は言語作者が書いた最新本ですがとりあえず初学者向けではありません。
 ・「プログラミング言語 Ruby」(言語として深く知りたい人向け)
  http://www.amazon.co.jp/dp/4873113946/

3 :デフォルトの名無しさん:2010/05/18(火) 03:39:56
Ruby 公式・非公式便利サイト2009

・Ruby Home Page 【公式、お役立ち度が微妙】
 http://www.ruby-lang.org/ja/
・Rubyリファレンスマニュアル 【検索機能休止中、Googleなどの併用を】
 http://www.ruby-lang.org/ja/man/
 http://www.ruby-doc.org/ 【詳しい英語版】
・HTMLヘルプ版リファレンスマニュアル配布さん 【Windowsで便利、検索も無論可能】
 http://elbereth-hp.hp.infoseek.co.jp/ruby.html
・Programming Ruby - The Pragmatic Programmer's Guide 【好評書籍の初版がネットで、ただし英語】
 http://www.ruby-doc.org/docs/ProgrammingRuby/
・Rubyist Magazine - るびま 【ライブラリ紹介などの読み物、過去のコードレビューは一読の価値あり】
 http://jp.rubyist.net/magazine/

・逆引きRuby 【やりたいことから探すWiki、最近元気ないので編集者募集】
 http://www.namaraii.com/rubytips/
・はてなキーワード > Ruby 【うっかりどっさりまとまったリンク集、説明なし】
 http://d.hatena.ne.jp/keyword/Ruby

・RubyForge 【○○をやりたい管理されたライブラリを探すならここ、英語】
 http://www.rubyforge.org/
・GitHub 【○○をやりたいコードをとにかく探すならここ、英語】
 http://github.com/

・日本Rubyの会 【最近はオフライン勉強会の寄り合い場と化しているので近くで勉強会があれば】
 http://jp.rubyist.net/

4 :デフォルトの名無しさん:2010/05/18(火) 03:40:37
●関連スレ
Rubyについて Part 40
http://pc12.2ch.net/test/read.cgi/tech/1272248179/
●アンチスレ
・Rubyについて(アンチ専用) Part004
http://pc12.2ch.net/test/read.cgi/tech/1249737531/
●Railsスレ
【Ruby】Ruby on Rails Part9
http://pc11.2ch.net/test/read.cgi/php/1266563593/
●Windows用スレ
・【ActiveScript】RubyをWindowsで使うスレ【GUI】
http://pc12.2ch.net/test/read.cgi/tech/1155031689/
●Ruby 1.9 系列スレ
・魁け! Ruby 1.9.X
http://pc12.2ch.net/test/read.cgi/tech/1201603546/
●GUIの使えなさを堪能するスレ
Ruby で GUI するスレ
http://pc12.2ch.net/test/read.cgi/tech/1269609576/
●ぶん投げスレ
Rubyの宿題教えてください。2限目
http://pc12.2ch.net/test/read.cgi/tech/1200175247/

●前スレ
Ruby 初心者スレッド Part 36
http://pc12.2ch.net/test/read.cgi/tech/1269233796/
Ruby 初心者スレッド Part 35
http://pc12.2ch.net/test/read.cgi/tech/1267668057/
Ruby 初心者スレッド Part 34
http://pc12.2ch.net/test/read.cgi/tech/1264635554/

5 :デフォルトの名無しさん:2010/05/18(火) 03:41:19
バージョンに関するよくある質問

・Ruby 1.8.5
 レンタルサーバ等にいまだに残ってる非安定な古いバージョン
 1.8.6 にすらなってない理由はたぶん管理の手抜きなので怒ってよい

・Ruby 1.8.6
 過去の長期政権と数の暴力で一大勢力圏を維持中の旧安定版
 公開スクリプトはこれでも動作するべきではあるんだがそろそろ 1.8.7 に譲ってくれ

・Ruby 1.8.7
 1.9 シリーズの機能をいくつか足したハイブリッドなバージョン、初学者にこそお勧め
 1.9 系機能は 1.8.6 では動かないが「えーマジ1.8.6!? 1.8.6が許されるのは小(AA略」と煽ってよい

・Ruby 1.9.0
 不安定にして先鋭機能が超満載の開発版バージョンだったもの
 1.9.x は本来全てが開発版の呼称だったのだが、事情が変わって(ここ笑うところ)1.9.1 は安定板に

・Ruby 1.9.1
 満を持して登場の 1.9 系列安定板(本体は 1.8.6 程度には使えるということになっている)
 本体と添付ライブラリの動作は問題がないのだがgem等外部第三者ライブラリの対応が超適当特に英語圏産
 初心者を脱した人が外部ライブラリの開発コミュニティに参加してくれたりすることを期待中

6 :テンプレここまで:2010/05/18(火) 03:42:02
Windows で Ruby を使う初心者はとりあえず ActiveScriptRuby の 1.8.7 をインストールして慣れろ
OneClickInstaller は単に古すぎ、RubyInstaller は MinGW32 版で現状扱い怪しい、cygwin 版は cygwin マニア専用
IDE のお勧めは特にない(せいぜい汎用のEclipseかNetBeans)、RDE は古くて独自すぎで Ruby に慣れた人向け

■ Windows でとにかく迷いたくない普通の人 … ActiveScriptRuby 1.8.7
ttp://arton.hp.infoseek.co.jp/indexj.html
 の題字のでかい 「ActiveScriptRuby 1.8.7(p249) with-winsock2 tcl-stub」

 マニュアルはWebで見ることもできるが手元にあると便利、1.8.7 の HTML ヘルプ版が
ttp://www.ruby-lang.org/ja/documentation/
 の「Rubyリファレンスマニュアル刷新計画 chm版 1.8.7用」

 夢のお告げ等、何かの間違いで Ruby の知識がないうちから 1.9.1 を使って苦しみたいマゾい人は
ttp://www.artonx.org/data/asr/ の「Ruby-1.9.1-p数字 Microsoft Installter Package」

7 :デフォルトの名無しさん:2010/05/18(火) 05:43:01
 ○  >>1 乙 もうお前に用はない 
 く|)へ
  〉   ヽ○ノ
 ̄ ̄7  ヘ/
  /   ノ
  |
 /
 |


8 :デフォルトの名無しさん:2010/05/18(火) 07:14:50
このスレッドは天才チンパンジー「アイちゃん」が
言語訓練のために立てたものです。

アイと研究員とのやり取りに利用するスレッドなので、
関係者以外は書きこまないで下さい。

                  京都大学霊長類研究所

9 :デフォルトの名無しさん:2010/05/18(火) 07:39:39
前スレ>>974
>「クラス < クラス」の場合はクラスメソッド(クラスの特異メソッド)も継承されるのに、
>「クラス < モジュール」の場合はモジュールの特異メソッドは継承されません。

「クラス < クラス」はクラスを継承してクラスを作っているからクラスメソッドは継承されるが、
「クラス < モジュール」のincludeやextendは継承階層的にはモジュールを継承しているが
作っているのはクラスだから特異メソッドは継承されない。
むしろモジュールクラスのメソッドがクラスクラスに継承されるほうが怖い気がする。
継承の仕組みを流用しているだけで、概念としてはモジュールの機能を組み込んでいる、だからincludeなんだ、と。
実際に継承しているのはモジュールじゃなくて化身クラスなわけだし。

10 :デフォルトの名無しさん:2010/05/18(火) 08:06:04
どちらが正しいかなんて考えるのは馬鹿

11 :デフォルトの名無しさん:2010/05/18(火) 08:18:55
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━-┓
┃ ┌────────────────────────ーーー┐ ┃
┃ │            / ̄ ̄\                      │ ┃
┃ │          /  ヽ_  .\                    │ ┃
┃ │          ( ●)( ●)  |     ____            │ ┃
┃ │          (__人__)      |     /      \          .| ┃
┃ │          l` ⌒´    |  / ─    ─   \       │ ┃
┃ │         . {         |/  (●)  ( ●)  \      .| ┃
┃ │           {       / |      (__人__)      |     │ ┃
┃ │      ,-、   ヽ     ノ、\    ` ⌒´     ,/__      .| ┃
┃ │     / ノ/ ̄/ ` ー ─ '/><  ` ー─ ' ┌、 ヽ  ヽ、   │ ┃
┃ │    /  L_         ̄  /           _l__( { r-、 .ト、 . │ ┃
┃ │       _,,二)     /            〔― ‐} Ll  | l) ).│ ┃
┃ │       >_,フ      /               }二 コ\  Li‐' .| ┃
┃ │    __,,,i‐ノ     l              └―イ   ヽ |   . | ┃
┃ │                l                   i   ヽl   . | ┃
┃ └ーーー────────────────────────┘ ┃
┗-━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
            平成22年5月18日 クソスレにて

12 :デフォルトの名無しさん:2010/05/18(火) 08:21:11
前スレ994ですがスレ間違えました

13 :デフォルトの名無しさん:2010/05/18(火) 08:23:42
      ,―ヽ_(((((_、―
   ,/  ノ       ヽ  ~\
  /   ノ   IPA    ヽ   ~\
/   ノ           ヽ、  `ヽ
|    ノ / ̄\   / ̄~ヽ ヽ    i
|   ノ              |  ノ
\  |  <●>  <●>  (  )
 \ |      | |       i /
    |      /  ヽ       レ
   i     (●_●)      /  
    i、    ,-――-、   ・ /
    i、  <(EEEEE)> ∵/    IPA Rubyスレは誰でもウェルカム
      i、  \   ./  /
       \   ーー   ,ノ       
  ,,.....イ.ヽヽ、ー-―一ノ゙-、.
  :   |  '; \_____ ノ.| ヽ i
      |  \/゙(__)\,|  i |

14 :デフォルトの名無しさん:2010/05/18(火) 10:03:29
http://www.youtube.com/watch?v=1qdlcfqTbDU
            ∩
            | ゝ  <ヽ
.─ ────=≡/ /   ヽ ∨     
           ./  i    / /
 ───=≡.  /  丿   /  ノ      ズザーーーーーッ 見よ!わたしの華麗なダイブ
)⌒`)       (   ヽ、 /  〈
  `)⌒`)     \  /'' ー'' ⌒`/ヽー 、           
  ────=≡ \/       〉   ⌒彡彡ミミ\
  `)⌒`);;;`)⌒`)   ヽ   ,, -‐"      彡彡彡ミヽ
  `)`)⌒`)  )     \/      / ィ. _彡彡彡}
──=≡;;;⌒`)≡⌒)≡≡"ーーーー(,,___/つミ彡ノ

15 :デフォルトの名無しさん:2010/05/18(火) 12:45:35
前スレ >>995

Ruby 初心者スレッド Part 36
http://pc12.2ch.net/test/read.cgi/tech/1269233796/995

995 名前:デフォルトの名無しさん[sage] 投稿日:2010/05/18(火) 02:10:27
落ちそうだけど質問いいですか?

falseか値がない場合は、
un ||= "unko"
とかできますが、
同じような感じで簡単に文字列の追加はできないもんでしょうか?

un << "unko"
では当たり前ですが aが nil の場合エラーがでます。

(un ||= "") << "unko"

とか考えたんですが、自分で書いておいてかなりギョットします。

16 :デフォルトの名無しさん:2010/05/18(火) 20:46:33
前スレ読んで、ずっと悩んでいた文字化け現象の
原因が p249 のせいだったとは…!

17 :デフォルトの名無しさん:2010/05/18(火) 23:21:45
webrickのWEBrick::Daemonで複数のサーバーを立てる方法ってありますか?
server1 = WEBrick::HTTPServer.new({
:BindAddress = '127.0.0.1',
:Port => 443,
:SSLEnable => true,
:SSLCertificate => OpenSSL::X509::Certificate.new(SSL_CERTIFICATE),
:SSLPrivateKey => OpenSSL::PKey::RSA.new(SSL_PRIVATE_KEY),
:ServerType => WEBrick::SimpleServer
})
server2 = WEBrick::HTTPServer.new({
:BindAddress = '127.0.0.1',
:Port => 80,
:ServerType => WEBrick::SimpleServer
})
Thread.new{server1.start} # サーバー起動
Thread.new{server2.start}
sleep(1) while true
WEBrick::SimpleServerの場合このコードで動きますがWEBrick::Daemonにすると
server2が動きません。何か良い方法があったら教えてください
よろしくお願いします

18 :デフォルトの名無しさん:2010/05/18(火) 23:39:01
>>15
素直に二行で

falseじゃない場合に限れば
un = "#{un}unko"
無駄なオブジェクトができる?しらんがな

19 :デフォルトの名無しさん:2010/05/18(火) 23:57:08
>>16
1.8.7-p249の文字化け(inspectのバグ)はFAQレベルのような気がする。
string.cを自分で修正してmakeすれば対応できるし、
次のバージョンアップ(1.8.8?)では修正されているらしいけど、いつリリースされるか分からないし。


20 :デフォルトの名無しさん:2010/05/19(水) 00:32:38
「自分で修正して」のレベルなら次のパッチレベルリリースで直るでしょ

21 :デフォルトの名無しさん:2010/05/19(水) 00:53:35
パッチレベルでいうと p250 相当で直ってるんだなこれが…
svn diff -c 27145 http://svn.ruby-lang.org/repos/ruby/branches/ruby_1_8_7
で取ってこれるのでコンパイルが出来る人はやってみよう。


22 :デフォルトの名無しさん:2010/05/19(水) 02:24:39
改行が \r\n のテキストに BB って行があるか調べるために正規表現を使う方法で、
"AA\r\nBB\r\nCC\r\n".match(/^BB$/) と書いたら nil になってしまって予想外だったんだけど
これって match(/^BB\r?$/) とかわざわざ書かないとダメ?

23 :デフォルトの名無しさん:2010/05/19(水) 05:56:12
>>22
Ruby あんま関係ないシリーズ絶好調だな

$ が何にマッチするかというと「\n の直前の幅 0 の隙間(と \n の直後の隙間)」だ
無理矢理可視化すると line1$\n$line2 みたいな感じ

\r は \n ではないので、/line$/ は "line\n" にはマッチするが "line\r\n"にはマッチしない
そんだけ

\r\n を改行フレーズとみなして $ が直前にマッチするようなマッチエンジンはけっこう特殊だと思う
…ああ、まずいなあ、改行文字という言葉を注釈なしで使ってる解説が多すぎる
ttp://www.ruby-lang.org/ja/man/html/_C0B5B5ACC9BDB8BD.html
正規表現の改行文字は \n のみ
irb> p /./ =~ "\r"
0
irb> p /./ =~ "\n"
nil


24 :デフォルトの名無しさん:2010/05/19(水) 07:20:58
>>17
最後に WEBrick::Daemon.start してうまくいってないということなら、
最初にやってみたらうまくいくかも。

fork を発行したスレッド以外は殺されてしまうというあれ。違うかしらんけど。

25 :デフォルトの名無しさん:2010/05/19(水) 10:30:04
ASR版がwin7のx64でインスコできないな
どうにかならない?

26 :デフォルトの名無しさん:2010/05/19(水) 11:36:25
jaとjpの違いって何?
前者が日本語で後者が日本国?

27 :デフォルトの名無しさん:2010/05/19(水) 11:44:45
LOCALEのja_JPの意味としてはそう

28 :デフォルトの名無しさん:2010/05/19(水) 11:46:44
もはや、なぜこのスレで尋ねたのかを説明してもらう必要があるレベルだなw

29 :デフォルトの名無しさん:2010/05/19(水) 12:35:59
なぜwww.ruby-lang.orgのディレクトリはjaで、rubyist.netのサブドメインはjpなのか、
という質問かもしれないw

30 :デフォルトの名無しさん:2010/05/19(水) 13:10:35
>>23
なるほどー。\r の存在はきちんと意識しとかないといけないんですね
改行を含んだ文字列を正規表現に含めるとき無意識に /AA\nBB(.*)/ とか書いてしまうんで。

31 :デフォルトの名無しさん:2010/05/19(水) 13:14:06
jaは日本語、jpは日本国または日本国っぽい地域

32 :デフォルトの名無しさん:2010/05/19(水) 13:51:41
Dir::globとDir.globって書き方の2種類を見かけるんですが同じ意味でしょうか?
後者はわかりますが(クラスメソッド)、前者の「::」がよくわかりません
また、どちらを使うのが一般的でしょうか

33 :デフォルトの名無しさん:2010/05/19(水) 14:04:53
後者
前者は忘れていいし、使ってる人がいたら陰で指差して笑え

34 :デフォルトの名無しさん:2010/05/19(水) 14:12:05
クラスメソッドの :: はそろそろ無かったことにしたい表記だろうと思う
初心者スレ的には使う必要もないし覚える必要もないしこれ使ってるスクリプトを参考にする必要もない
素直にドットで接続すればよろし

保守されてるのはともかく、新しく書かれたライブラリでこれ使ってるのって無い…よね?
:: でクラスメソッドを書いてるのは 1.6.x の臭いがするわん

35 :デフォルトの名無しさん:2010/05/19(水) 15:58:07
def value(x, default='-')
 return x.blank? ? default : x
end
という関数を作ったんだけど、いい名前が思いつかない。
だれかよさげな名前を考えてください。

36 :デフォルトの名無しさん:2010/05/19(水) 16:36:52
>>33
>>34
レス遅くなってすみません、ありがとうございます
もうひとつ質問させてください
クラスメソッド以外の意味で「::」を使うことはありますか?ある場合、どういう意味で使われるのか知りたいです
それともRubyでは「::」という記述はどういう意味においても今後使う必要のない記号なのでしょうか

37 :デフォルトの名無しさん:2010/05/19(水) 16:52:48
Ruby では :: はクラスとモジュールと定数のアクセスに使う
Net::HTTP とか
これは :: を使わないと普通書けない
というかそれくらいは適当な解説にでも書いてあるかと思う

Ruby でいうところのクラスメソッドにアクセスするのに :: を使う言語があって、
それに似せておくとわかりやすいんじゃないかなーと Ruby の初期に考えられたことがあった
それが尾を引いてる

38 :デフォルトの名無しさん:2010/05/19(水) 17:05:47
>>37
なるほど、ありがとうございます
クラスメソッドとしてだけ使わない方がいいということですね

39 :17:2010/05/19(水) 17:29:36
>>24
レスありがとうございます
>最後に WEBrick::Daemon.start して
server1 = WEBrick::HTTPServer.new({
:BindAddress => '127.0.0.1',
:Port => 443,
:SSLEnable => true,
:SSLCertificate => OpenSSL::X509::Certificate.new(SSL_CERTIFICATE),
:SSLPrivateKey => OpenSSL::PKey::RSA.new(SSL_PRIVATE_KEY),
:ServerType => WEBrick::SimpleServer
})
server2 = WEBrick::HTTPServer.new({
:BindAddress => '127.0.0.1',
:Port => 80,
:ServerType => WEBrick::SimpleServer
})
WEBrick::Daemon.start{server1.start}
WEBrick::Daemon.start{server2.start}
とやってみましたがこれでは両方とも動きませんでした

>最初にやってみたら
これはどういう事でしょうか?

40 :デフォルトの名無しさん:2010/05/19(水) 21:03:03
>>39

snip
Thread.new {server1.start}
Thread.new {server2.start}
WEBrick::Daemon.start

っていうスクリプトかと思ったんで

WEBrick::Daemon.start
snip
Thread.new {server1.start}
Thread.new {server2.start}

にしてみたらという話をした、だけ。前者だと fork を呼んだ == WEBrick::Damon.start を呼んだ
スレッド以外は死んでしまうから……というところで何で server1 は生きてるんだろうと悩んでしまった。

>>39 のスクリプトからするとそもそもスレッドは関係無かったのね。
こっちで server2 が動かない理由は簡単で、WEBrick::Damon.start が中で fork and exit! してるから
server2 を動かそうとしてる WEBrick::Daemon.start まで制御が行かないだけ。

41 :デフォルトの名無しさん:2010/05/19(水) 21:06:09
>>40 fork and exit! してるから、じゃなくてその後にブロックがあったらブロックに yield してるから、か。
要するに server1.start; server2.start とやっても server2.start に制御が行かないのと同じこと。

42 :17:2010/05/20(木) 04:52:39
>>40-41
レスありがとうございます。なるほど、WEBrick::Daemonってそうやって使うのか・・・
WEBrick::Daemonってドキュメントに何も書いていないのでよくわからない(´・ω・`)
とりあえず下の方の書き方で>>39のサンプルは動くようになりました

でも、今作っているのはデーモンになってくれない・・・WEBrick::Daemon.startしちゃうと
エラーメッセージとか出なくなっちゃうからデバッグが面倒だ・・・もう少しがんばってみます

43 :デフォルトの名無しさん:2010/05/20(木) 13:06:43
文字列の%qや配列の%wなどの記法って何由来ですか?あとこのアルファベットって何かの頭文字なんでしょうか
なかなか覚えられなくて…

44 :デフォルトの名無しさん:2010/05/20(木) 13:45:23
qはquote、wはたぶんwords
由来はない(Rubyオリジナル)なんじゃないかと思う

45 :デフォルトの名無しさん:2010/05/20(木) 13:53:48
>>44
なるほど、納得できました
ありがとうございます

46 :デフォルトの名無しさん:2010/05/20(木) 14:04:35
Perlのq//とqw//を踏襲したんじゃないのかな?

47 :デフォルトの名無しさん:2010/05/20(木) 15:00:13
>>46 yes.

48 :デフォルトの名無しさん:2010/05/20(木) 19:23:49
%はどっからでてきたの

49 :デフォルトの名無しさん:2010/05/20(木) 19:55:11
parseに支障のない記号を適当に持って来たんじゃない

50 :17:2010/05/20(木) 21:29:08
自己レス
WEBrick::Daemon.startするとカレントディレクトリが変わるのね
カレントディレクトリを正しい場所に変更するようにしたら動きました

51 :デフォルトの名無しさん:2010/05/20(木) 21:35:38
前スレの974です。
>>9
> 継承の仕組みを流用しているだけで、概念としてはモジュールの機能を組み込んでいる、だからincludeなんだ
この一文でスッキリしました。ありがとうございました。

実際モジュールメソッドが継承されてしまうなら、Mathモジュールをトップレベルでinclude
しただけで、すべてのオブジェクトからsinとか呼べるようになっちゃうわけですしね。

52 :デフォルトの名無しさん:2010/05/20(木) 21:37:05
cd / は、デーモンになるときの作法の一部ですな。


53 :デフォルトの名無しさん:2010/05/21(金) 20:17:20
指定した秒数(UNIX time)からn秒たったら処理を実行させたいのですが、どんな方法がありますか?

54 :デフォルトの名無しさん:2010/05/21(金) 21:14:51
その時刻までsleep

55 :デフォルトの名無しさん:2010/05/22(土) 02:53:38
自分は逆にn秒経ったら停止して欲しいと思って
time = ARGV[0]
t0 = Time.now
t1 = t0 + time.to_i
while t0 <= t1 do
puts "Hello"
t0 = Time.now
end

とやっているのですが(timeは引数じゃなくて中で指定してもいいのですが・・・)
もっといい書き方ありますかね?一応自分の思った通りには動いているのでいいのですが・・・
twitterのstreamを指定時間DLしようと思ってタイマーをどうすればいいか書いているところです

56 :デフォルトの名無しさん:2010/05/22(土) 02:57:22
puts "hello" を sleep(1) とかに変える

57 :デフォルトの名無しさん:2010/05/22(土) 08:12:04
>>55
require "timeout"

Timeout.timeout(n) do
# some task
end

58 :デフォルトの名無しさん:2010/05/22(土) 14:47:21
他スレでも質問したのですが返答頂けなかったのでこちらで質問します。

class Hoge
def foo
end
end
のように普通に定義されたインスタンスメソッドをHoge.fooのように
クラスメソッドのように呼び出しているコードをしばしば見るのですが、
これはRubyの習慣なのですか?
Javaしか知らない自分としては少し気持ち悪いのですが。

59 :デフォルトの名無しさん:2010/05/22(土) 14:51:41
NoMethodError: undefined method `foo' for Hoge:Class


60 :デフォルトの名無しさん:2010/05/22(土) 16:30:45
ExerbでWindows用の実行ファイルに変換したものが元のRubyスクリプトに比べ
同一マシン上で異様に高負荷となってしまうのですが何かFAQがありますでしょうか?
使用環境はWin XP SP3/ruby 1.8.7 (2009-06-12 patchlevel 174) [i386-mswin32]/Exerb 5.0.0です
使ったプログラムは
#!/usr/bin/ruby
require 'thread'
require 'date'
threads = []
threads.push(Thread.new{i = 0; loop do; puts DateTime.now.to_s + ' ' + i.to_s if i % 1000 == 0; i += 1; sleep 0.005; end})
threads.each{|t| t.join}
sleepの値は適当に調整してRuby版でCPU負荷がほぼ0%となるような値を選択しました
私のマシン上ではRuby版が1000回転するのにおよそ16秒かかりその間負荷はほぼ0%でした
一方同一マシン上でExerbで変換したWin版では31秒かかり負荷はほぼ25%でした

ためしに新たにThreadを起動せずメインスレッドで上記のループを回してみたところ
Ruby版Win版とも1000回転に16秒かかりその間の負荷はほぼ0%となりもとのプログラムのRuby版とほぼ同じ結果が得られました
このことからThread周りに原因があるのではないかと想像しているのですが
何か間違っている点あるいは回避策アドバイス等ございましたらご指南いただければと思います

現在Threadを使ったソフトを作っているのですがWin版のみ高負荷となってしまい
簡単なサンプルを作って確かめてみたという次第です
よろしくお願いいたします

61 :60:2010/05/22(土) 16:48:07
ごめんなさい
アップデートが出ていたんですね
ruby 1.8.7 (2010-01-10 patchlevel 249) [i386-mswin32]/Exerb 5.1.0
にアップデートしたら問題解決しました
テンプレをよく読まずにお騒がせしました

62 :デフォルトの名無しさん:2010/05/22(土) 21:05:50
どんまい

63 :デフォルトの名無しさん:2010/05/22(土) 22:39:08
スレッド内からスレッドの外にある変数を変更することは出来ますか?

64 :デフォルトの名無しさん:2010/05/22(土) 23:16:33
Rubyのどんなスクリプトも、なんらかのスレッド内で実行されてるわけだが。

で、ローカル変数やインスタンス変数やグローバル変数はスレッドローカルではないので、
スレッドと関係なく変更できる。

65 :デフォルトの名無しさん:2010/05/23(日) 00:07:40
なんだこの馬鹿は

66 :デフォルトの名無しさん:2010/05/23(日) 02:56:16
ruby触り始めて2日目。OOP自体Rubyが(ほぼ)初めて。

ソケットと付随するデータを変数として持つクラスを作ったんですが
複数生成したインスタンスのIO多重化をIO.selectで行い結果を受け取った後でそのソケットが属するインスタンスをどうやって取り出したらいいかで詰まりました。

読み出しができるソケットを持つインスタンスを取り出したいというのが目的です。

何かいいやり方はありますか?
もしくは設計自体がまずいでしょうか?

67 :デフォルトの名無しさん:2010/05/23(日) 03:27:37
self

68 :デフォルトの名無しさん:2010/05/23(日) 03:33:40
ダックタイピングなRubyがOOPとは
個人的には言いたくない
どちらかと言うとC++のテンプレートに近い

69 :デフォルトの名無しさん:2010/05/23(日) 05:19:58
>>67
不勉強なせいかまだよくわからんです。

class Hoge
 def initialize(foo, bar)
  @s = TCPSocket("localhost", 2000)
  @foo = foo
  @bar = bar
 end

 attr_reader :s
end

hoge = Hoge.new("foo", "bar")
ret = IO.select([hoge.s])

ret[0].each do |s|
 #ここをどう書く?
end

70 :デフォルトの名無しさん:2010/05/23(日) 06:19:57
>>69
Hoge に alias to_io s して、Hoge を IO のように扱えるようにしてから
IO.select に渡すのを hoge.s でなく hoge そのものにする。
または、ソケット→Hogeインスタンスなハッシュテーブルを持っておく。というのはどうかな。

71 :デフォルトの名無しさん:2010/05/23(日) 06:55:30
ありがとうございました

72 :デフォルトの名無しさん:2010/05/23(日) 08:23:42
>>65 煽るだけのバカは氏ねよクズ

73 :デフォルトの名無しさん:2010/05/23(日) 10:40:41
なんだこの馬鹿は

74 :デフォルトの名無しさん:2010/05/23(日) 11:02:04
素朴な疑問なんだけど
どうしてRubyはBooleanクラス作らなかったの?
単純に不要だったからって理由?
trueとfalseの親がまんまObjectって言語他にあったっけ

75 :デフォルトの名無しさん:2010/05/23(日) 11:07:09
TrueClass と FalseClass があればいらん、と判断したんじゃないかなぁ。
falseもnilも偽だし、それ以外は全部真だから、わざわざBooleanを作る意味が
あまりないし。

76 :デフォルトの名無しさん:2010/05/23(日) 11:11:19
>>75
ありがとうございます。
やっぱりそうなのかな…
そういえば明示的にtrue書くこと自体あまりないですね

77 :デフォルトの名無しさん:2010/05/23(日) 11:59:10
>>68
ダックタイピングだからOOPじゃないってことは流石に意味不明だろ。
SmallTalkだってダックタイピングだし、新しいGoもダックタイピングを全面に押し出してる。

Java流(静的言語流?)OOPじゃないってのが正しい言い方。
しかしJavaのインタフェースすらも、ダックタイピングに制限を加えた
形だと見ることができる。

78 :77:2010/05/23(日) 12:06:49
x ないってこと
o ないっての

79 :デフォルトの名無しさん:2010/05/23(日) 12:15:54
>>74
すべての比較演算子にtrueとfalseでは違う挙動するから、親クラスは必要ない。
Javaみたいにif式がbooleanしか受け取れないみたいのもない(ダックタイピング)だから
やはり親クラスは必要ない。
trueとfalseでは挙動が違うのだから、TrueClassとFalseClassは必要。

80 :デフォルトの名無しさん:2010/05/23(日) 12:17:17
比較演算子じゃなくて論理演算子だった。ゴメン。

81 :デフォルトの名無しさん:2010/05/23(日) 12:18:33
>>77
継承関係関係なしで多態できてしまうのはちょっとねえ、と
まあ動的型付けじゃ仕方ないけど
OOPはそれだけのものじゃないから
まあ部分的にはOOPと呼べるけど

82 :デフォルトの名無しさん:2010/05/23(日) 12:20:58
継承が(仮に)なくてもOOPはOOPなんだし

83 :デフォルトの名無しさん:2010/05/23(日) 12:21:44
部分と全体が逆になってるような気がする

84 :デフォルトの名無しさん:2010/05/23(日) 12:22:09
booleanがないんじゃなくて、全てがbooleanなんだお

85 :デフォルトの名無しさん:2010/05/23(日) 13:20:53
>>68>>81を見てデザインパターンを覚えたばかりの頃に無駄に継承したくなった過去を思い出したw

86 :デフォルトの名無しさん:2010/05/23(日) 13:58:02
>>81
> 動的型付けじゃ仕方ない
むしろダックタイピングのために動的型付けになってる(特にRuby)
> 部分的にはOOP
>>83も言ってるけど、静的言語のOOPがダックタイピングOOPの特殊例。
ってか多態性はOOP3大機能のひとつなのに、なんでそれを制限する静的型付けの方
が全体になるのかわからん。

>>85
それはあるw

87 :デフォルトの名無しさん:2010/05/23(日) 15:24:16
どっちかというと、C++やJavaをオブジェクト指向言語と呼ぶのに抵抗がある
別に厳密な定義があるわけじゃないし、自身がそういうならそうなんだろうけどさ
>>68みたいなのを生み出す要因になってるよね

本来クラスよりインスタンスの方が重要なんだけど、あの辺の言語に染まっていると
クラスがオブジェクト指向の本質だと思い込みがち

88 :デフォルトの名無しさん:2010/05/23(日) 16:04:12
ちょっとライブラリの質問です。
Rubyのちょっとしたスクリプトで、エラーというか例外が起きて中断されたような場合に
メールを送ってくれるようなRubyGemsで入れられるようなライブラリはありませんでしょうか?

Railsでは以下のものが見つかりましたが、Rails依存があり素のRubyスクリプトではそのままで使えないようです。

rails's exception_notification at master - GitHub
http://github.com/rails/exception_notification

89 :デフォルトの名無しさん:2010/05/23(日) 16:12:32
>>88
ライブラリは知らないけど、全体をbegin 〜 rescue Exceptionで括って一般的なメール送信方法を行えばいい
構文エラーが予想されるときは該当部分(スクリプト本文)を別の.rbファイルにしてbegin内でrequireもしくはload

たぶんtDiaryやHikiあたりが参考になる
エラー発生時に例外処理でエラー文をアウトプットしてるから、それをメール送信処理に差し替え

90 :88:2010/05/23(日) 16:51:14
ありがとうございます。hikiのtrunkのソースのwebrickでの処理を見ていたんですが、
rescueで例外処理をトラップしてメッセージやスタックトレースを表示しているだけなんですね。
これをメールで送ればいいと。

misc/webrick/hikilet.rb:95:
      rescue Exception => err
        res.status = 500
        res['content-type'] = 'text/html'
        res.body = [
          '<html><head><title>Hiki Error</title></head><body>',
          '<h1>Hiki Error</h1>',
          '<pre>',
          CGI.escapeHTML( "#{err} (#{err.class})\n" ),
          CGI.escapeHTML( err.backtrace.join( "\n" ) ),
          '</pre>',
          "<div>#{' ' * 500}</div>",
          '</body></html>',
        ].join('')
      end

ついでにログ残せたらなと、log4rやloggingというライブラリを見ていたら
ログをメール送信する機能もありましたので、そちらも合わせてみてみたいと思います。
ありがとうございました。

91 :デフォルトの名無しさん:2010/05/23(日) 18:46:33
>>79
>すべての比較演算子にtrueとfalseでは違う挙動するから、親クラスは必要ない。
なんでやねん


92 :デフォルトの名無しさん:2010/05/23(日) 19:20:54
>>87
>本来クラスよりインスタンスの方が重要なんだけど、あの辺の言語に染まっていると
>クラスがオブジェクト指向の本質だと思い込みがち

これJavaから入った自分には耳が痛いのですがw、ダックタイピングとポリモーフィズムって厳密な違いはなんですか?同じこと?

93 :15:2010/05/23(日) 19:37:55
>>18
> un = "#{un}unko"
代入時と同時に未定義のunを式展開で使う場合はエラーでないですね。初めて知りましたw
あ、でもfalseの場合は "falseunko"になるのかー。

気になってirbで確認したのですが、代入しないとやはり未定義だとエラーでるんですね。

irb(main):001:0> "#{un} unko"
NameError: undefined local variable or method `un' for main:Object
from (irb):1

ローカル変数unでなくフィールド(?Rubyだとなんというでしたっけ?)の@unの場合は未定義でもいけるんですね。

> un = un << "unko"
だとやはりエラー出ますし、これって評価のタイミングなんですね。


可読性やfalseの時も考えると、2行でいいかという気もしますし、
キモいのが嫌ならコメントつけるなりメソッド化してみます。

ありがとうございました。

94 :デフォルトの名無しさん:2010/05/23(日) 21:06:15
>>92
ポリモーフィズムはもっと概念的な話で、名前空間の親戚
javaで継承やinterfaceを使わなくてもメソッド名が同じならポリモーフィズム

>>93
一度も使われていない可能性のあるローカル変数を呼ぶ、という事態そのものが不自然
if false then un = 1 end
p un #=> nil


95 :デフォルトの名無しさん:2010/05/24(月) 00:46:00
プログラミング言語Rubyを読んでいるのですが、

オブジェクトoがStringクラスのインスタンスであることを確かめるために、
o.class == String
というコードが書かれています。

この場合の==演算子ってClassクラスのインスタンスメソッドって認識で合ってます?
どういう条件で真偽を返してるのでしょうか。

96 :デフォルトの名無しさん:2010/05/24(月) 00:55:22
合ってるけどちょっと怪しいな、右辺Stringの==メソッドではない
(o.class)の返値がClassインスタンスで、その==メソッド
便宜的に書き換えるならo.class.equal?(String)

>どういう条件
Classで定義されてなくて親のModuleにも定義されてないからさらに親のObject#==に従う
つまり一般的なオブジェクト同士の==と同じ
http://doc.okkez.net/187/view/method/Object/i/=3d=3d

97 :95:2010/05/24(月) 01:08:18
>>96
ご丁寧にありがとうございます。
ただまだ分からない点があります。

Object#==をそのまま引き継いでるとすると、
o.class == String
は常に偽になってしまいそうに思うのですが、
考え方が間違ってますか?

oがStringのインスタンスだったとしても、
o.classとStringは同じクラスですが異なるオブジェクトですよね?

98 :デフォルトの名無しさん:2010/05/24(月) 01:25:05
StringはClassインスタンス
o = ""とすると、oはStringインスタンス
o.classは「Stringインスタンスのクラスのオブジェクト」、つまりStringオブジェクトそのもので
ClassインスタンスでありStringという定数(ここポイント)の値と同一

おまけ
obj = Object # 定数だから値を読み出したりそれを代入することができる
o = obj.new # その値(Objectオブジェクト)を使ってnewもできる
o.instance_of? Object # 当然Objectのインスタンス

99 :デフォルトの名無しさん:2010/05/24(月) 01:31:33
おまけ部分の肝心なところを忘れてた
class C; end
C = Class.new
この二つはほぼ同一(厳密には微妙に差があったかもしれない)

本題にも蛇足しとくと、p Stringとかp o.classとか
さらにそれらのObject#object_idとか確認してみるといいかもね

100 :95:2010/05/24(月) 02:22:52
度々ありがとうございます。とても勉強になりました。
なるほど、String定数自体は一つだから同じオブジェクトになりますね。。

237 KB
■ このスレッドは過去ログ倉庫に格納されています

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)