Ruby 初心者スレッド Part 27 at TECH
[2ch|▼Menu]
1:1様
09/04/02 09:42:23
プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。

   【Ruby1.9.1 は従来版とは別物であり、書籍や解説やライブラリのサポートがまだありません】
   【自力で解決できない壁で悩むことのない最新安定版の Ruby1.8.7 での学習をお勧めします】
    ※1.8.7 は 1.8 系と 1.9 系の橋渡しをするためのリリースで、1.9 系 の便利新機能の一部が利用可能です
    ※ただし 1.8.6 より安定しているとはまだ言えないので、安定性を第一とする用途には 1.8.6 をどうぞ

関連スレやURLは>>2-5あたりを見てください。Ruby on Rails の質問は Webプログラミング板の Rails スレへ。

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

2:1様
09/04/02 09:43:25
【よくあるしつもん】
Q:
いちからRubyを始める初心者向けのRuby入門書は何がありますか?

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

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

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

3:1様
09/04/02 09:45:06
Ruby 公式・非公式便利サイト2009

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

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

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

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

4:1様
09/04/02 09:46:21
関連スレ

本スレ
Rubyについて Part 35
スレリンク(tech板)

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

Railsスレ
【Ruby】Ruby on Rails Part6
スレリンク(php板)

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

Ruby 1.9 系列スレ
魁け! Ruby 1.9.X
スレリンク(tech板)

5:デフォルトの名無しさん
09/04/02 13:07:16
英語板に振ったアホがいるが、これは単なる技術英語なので、文法論は意味がない
命令文でもないのに Abort. と表示されるのはおかしいなんて指摘しても意味があるまい

6:デフォルトの名無しさん
09/04/02 13:16:41
>>5
(前スレ質問再掲)
> □ 996  デフォルトの名無しさん  [] 2009/04/02(木) 12:43:26
>
> 英語のエラーメッセージで
> 「not found, ignored.」
> のような、かなりシンプルな構文で書かれることがありますが、これを英文法
> 上の用語でなんと言いますか?
>
> また、これについて勉強できる書籍(など)があれば教えてください。

どう見ても英文法の質問です。本当に(ry
真面目な話、このスレよりはスレ違いじゃなかろうと思ったんだが、まずかったらすまんかった。

7:デフォルトの名無しさん
09/04/02 13:23:18
そういやクラスやメソッド名を英語で付けようとして困ったということがよくあるなあ
みなさんどうしてますか?

8:デフォルトの名無しさん
09/04/02 13:24:37
エスパーするなら
「こういうのどうやって書いたらいいかわからないので調べたいです、必要な用語を教えてください」
だと思うけどね
文法書レベルの用語を知るためだけに質問したとは思えねー

どう書くかというのは、もう英語のソースや技術文書読むしかないな
なるべく大きなプロジェクトのもの
技術文書に関しては企業プロダクトのものが好ましい

技術英語と略語掲示文を解説した本には実は心当たりがあるんだが、見つかんねえ
無理してでも買っておけばよかった

9:デフォルトの名無しさん
09/04/02 13:28:27
○○体とか言うんじゃなかった?
まあ英文法書にはのってねーだろ普通。文系は帰れよ。

10:デフォルトの名無しさん
09/04/02 13:33:15
English板に振るほど板違いではないが、Ruby固有の問題でもないので掘り下げるのはスレ違いかなーという感じだな
ネイティブを真似っこするしかあんめえ

11:デフォルトの名無しさん
09/04/02 13:46:19
>>7
その手のスレはム板に専用のがちゃんとあるよん

ソースのコメントを英語で書くスレ
スレリンク(tech板)

クラス名・変数名に迷ったら書き込むスレ。Part14
スレリンク(tech板)

12:デフォルトの名無しさん
09/04/02 13:51:41
>>11の上で似たような話題が出てるね

ソースのコメントを英語で書くスレ
スレリンク(tech板:563番)

> 関数やメソッドの説明って主語の this function とか this method とかが省略されて
> 動詞から始まることが多いんだけど、色々調べてみるとその動詞に
> ...

13:11
09/04/02 14:06:43
それ質問してるの俺だからw

14:デフォルトの名無しさん
09/04/02 14:08:45
>>11-12 が(実用度的に)ベストアンサーっぽい?

質問の答えとしてまとめてみると、

・エラーメッセージは文法を崩していることもある
・エラーメッセージとしての慣習や慣用的な言い回しがあり、それらには英文法上の呼び名があるときも無いときもあるだろう
・勉強するならむしろ技術書を当たった方がいい?(エラーメッセージのガイドライン等)

ってこと、かな?適当なので訂正よろ。

15:デフォルトの名無しさん
09/04/02 14:32:28
>>13
ワロタ
このリンクは収穫だったわ
URLリンク(java.sun.com)

16:デフォルトの名無しさん
09/04/02 17:15:51
むしろ松本教祖の英語力に疑問があるけどな。

17:デフォルトの名無しさん
09/04/02 17:46:25
あんま関係ないかも知れんが、
俺他人にプログラミングを教えるときは、メソッド名とかを
あえて日本語ローマ字で書いてる。 (def shokika とかね。)
初心者のうちは、どれが自分で作ってる部分でどれが言語仕様なのか
区別つかんだろうなーと思って。
(ダサさ満点だけど)

18:デフォルトの名無しさん
09/04/02 19:36:39
>>17
それ公開されているプログラムでも見たことがある。
p2とか見てみなよ面白いからw

19:前スレ751
09/04/02 19:43:34
FasterCSVでExcelで出力したcsvで以下のエラーが出る件ですが、解決いたしました。
" Unquoted fields do not allow \r or \n (line 1)."

CSV自身の改行は\r\nで特に問題なく困っていたのですが、
どうやらFasterCSV自身は改行を \n(0A) として扱っているらしく、\r\n(0D 0A) が混じるとエラーが出る場合があるようです。
以下のように改行コードを明示的に指定(:row_sep => "\r\n")してやると無事に読みこむことができました。

 FasterCSV.read(filename, :encoding => 'sjis', :row_sep => "\r\n")

:row_sepはデフォルトでは :autoになっているみたいですが、場合によってはエラーになるみたいです。

というわけで、皆様ありがとうございました。

# しかし、出力時もFasterCSVで改行コード指定しなかったら \n だけになってて orz

20:デフォルトの名無しさん
09/04/02 19:47:41
引数としてもらったブロックを他のメソッドのブロックとして渡す、ということは可能なのでしょうか?
ブロックを持つメソッドのラッパーなどを作った場合に、どうしたものかと。

今は、Procで受け取って、メソッド呼び出し時にわざわざブロックを作ってその中で Proc.callしています。
以下のような感じです。

def open_from_nantoka(filename, &block)
 open(filename) {|f| block.call(f) }
end


21:デフォルトの名無しさん
09/04/02 19:54:05
def open_from_nantoka(filename, &block)
 open(filename, &block)
end

22:デフォルトの名無しさん
09/04/02 20:00:10
>>20
普通に

open(filename, &block)

でいけると思うんだけど。

$ irb
irb(main):001:0> p = lambda { puts "hoge" }
=> #<Proc:0x7ff9c264@(irb):1>
irb(main):002:0> 3.times(&p)
hoge
hoge
hoge
=> 3

23:デフォルトの名無しさん
09/04/02 20:45:46
>>21-22
ありがとう。& つければよかったのか…
マニュアルでは "ブロック付きメソッド呼び出し"のところにありました。

24:デフォルトの名無しさん
09/04/02 20:48:09
まー単純なクラスとメソッドの説明に乗らないそのへんはマニュアル一通り読んでもらわないとわからんな

25:デフォルトの名無しさん
09/04/02 20:50:39
mapとかで便利以外のSymbol#to_proc の便利どころを探してます。
1.8.7から使える Symbol#to_procって Methodの代わりのようには使えないのでしょうか?

irbで以下のようになって、 ?と首を傾げています。

> def a(method) method.call "hoge" end
=> nil
> a(Kernel.method(:puts))
hoge
=> nil
> a(:puts.to_proc)

=> nil

26:デフォルトの名無しさん
09/04/02 21:23:03
class Symbol
 def to_proc
  lambda{|receiver, *args| receiver.__send__(self, *args) }
 end
end

みたいなもんだから。
レシーバは既に知ってるMethodの代わりにはならないんじゃないかと。

27:デフォルトの名無しさん
09/04/02 21:58:30
a(:puts.to_proc) は、self.puts() という意味になっちゃうから、
でもってこれはinclude KernelしているObject#puts()だから、
改行して終了ということだな。


28:デフォルトの名無しさん
09/04/03 00:13:40
LAMPという言葉がキモくて仕方がありません。

いったい誰がこのような言葉を広めたのでしょうか。
流行?
web2.0と同じくらい下らない。

そもそもこの言葉使いますか?
「おし、じゃあサクっとLAMP環境構築しておいてよ」
「これからはPHPだよな。LAMPさいこー」
なんて言いますか?

こんなキモい言葉が港では当然のように使われているのが許せません。
早く死語になりますように ><

29:デフォルトの名無しさん
09/04/03 00:20:23
Rubyが先に死なないようにしないとね。

30:デフォルトの名無しさん
09/04/03 00:24:57
LAMP には別に正負どっちの感も持たないけど
>>28はうっとおしいと思った。

31:28
09/04/03 00:30:31
見ておくれ、このひどい有様を!!
Wikipedia項目リンク

構成要素に応じてAMP、LAPPのように言葉も変わっている類似用語があげられてる。
これこそまさにキモい!

なにコイツらって感じ。
「俺は面白い言葉遊びを考えたんだぜ〜」とか思ってるのか?

そして「は?LAMPも知らないの?」と、知っていて当然のように喧嘩売ってくる奴は、きっとこの言葉遊びの工作員だから、いっしょに死んで欲しい。

32:デフォルトの名無しさん
09/04/03 00:32:11
港でlampが使われるのは用途あってのことだろうしどうでもいいだろ

33:デフォルトの名無しさん
09/04/03 01:19:27
マカだと、MAMPとか逝ってるしな。リナックスでいいだろと思う。

34:デフォルトの名無しさん
09/04/03 01:27:59
うーん、微妙だ
URLリンク(www.google.com)

35:デフォルトの名無しさん
09/04/03 04:07:39
結局>>28自身がキモイだけだったな。

36:デフォルトの名無しさん
09/04/03 08:08:04
       /ニYニヽ
   (ヽ   /( ゚ )( ゚ )ヽ   /)
  (((i ) /::::⌒`´⌒::::\  ( i)))  でっていうwwwwwwwwwwwwwww
 /∠_| ,-)___(-,|_ゝ \
( ___、  |-┬-|    ,__ )
    |    `ー'´   /´
    |         /



37:デフォルトの名無しさん
09/04/03 10:22:11
    _, ._
  ( ・ω・)
  ○={=}〇,
   |:::::::::\, ', ´
、、、、し 、、、(((.@)wwwwwww

38:デフォルトの名無しさん
09/04/03 11:55:37
class C
attr_accessor :hoge
end
p C.new.instance_variables

class C
def initialize ; @hoge=nil; end
attr_accessor :hoge
end
p C.new.instance_variables

結果

[]
["@hoge"]

…まーそりゃ確かに hoge= が呼ばれない限り @hoge は存在すら感知できませんが、なんかちょっとヤだなあ
instance_variables を使ってナニカの存在をチェックするという行為のほうが筋が悪いきちんとデータベース作っとけというのは
いやもう全く以ってその通りではございますですが


39:デフォルトの名無しさん
09/04/03 12:20:45
明示的に初期化しましょう、で終了

40:デフォルトの名無しさん
09/04/03 12:22:04
初期化(笑)

41:デフォルトの名無しさん
09/04/03 12:24:11
attr_accessorが作るのはメソッドであって変数そのものではないのだが
なにか勘違いしてるんじゃないだろうか

42:デフォルトの名無しさん
09/04/03 12:28:39
p @hoge



@hoge=nil
p @hoge

が状態が違うというのはあまり好きではない
オブジェクトに関連付けられていないインスタンス変数はローカル変数同様にエラーを返すほうがよかった気がする

43:デフォルトの名無しさん
09/04/03 12:42:50
>>26-27
ありがとう。

なるほど、receiverはself固定なのね
やっぱ代わりにはならないか

Kernel.method(:puts)が書きずらいなーと思ったので、
:Kernel.puts.to_proc ってまあ、無理かw

44:デフォルトの名無しさん
09/04/03 12:45:18
>>28 じゃないけど、職場でLAMPって言葉使ったら、m9(^Д^)プギャー!!されてしまった。
そんな言葉、聞いたことないよ、と
用語説明しても、それは単にソフトウェアの構成のことであって、うんぬん


45:デフォルトの名無しさん
09/04/03 12:51:15
Wintelみたいなもんだろ?>LAMP
言葉は知ってても使わない、っていう人も多いだろうし、知らない人は知らないし。
言葉だけではとくに m9(^Д^)プギャー!! されるもんでもなかろう

使い方じゃね?

46:デフォルトの名無しさん
09/04/03 12:51:38
>>42
いきなり

if @name.nil? then
@name = '上戸彩'
end

とかできないのか

全部initializeで初期化するべきだな

47:デフォルトの名無しさん
09/04/03 12:56:07
>>46
こういうときって defined? と nil? 両方でみるべきなのかね
if defined?(@name) || @name.nil?
@name = "mage"
end

いや、やっぱinitializeでnil初期化がらくだ

48:デフォルトの名無しさん
09/04/03 12:58:14
attr_accessor に、全部nilで初期化ってくらいのオプションがついててもいいと思うんだ。
どうせsyntax sugarなんだから。

49:デフォルトの名無しさん
09/04/03 12:59:37
>>44
知らない奴が知ってる奴に「m9(^Д^)プギャー!!」するのは何かおかしいだろう。
まあ知ってるからどうだという言葉ではあるが。

50:デフォルトの名無しさん
09/04/03 13:17:46
>>46
@name ||= '上戸彩'

>>42は = で代入が行われてないインスタンス変数は instance_variables に登録されないとかなんかその辺の話だろう
どちらも nil を返すが後者はインスタンス変数が存在していると

51:デフォルトの名無しさん
09/04/03 14:08:33
>>50

なんでだよw

@is_man = false
@is_man ||= true
p @is_man => true

「||=」と「if xxx.nil?」は違う

52:デフォルトの名無しさん
09/04/03 14:13:06
>>51
50じゃないけど慣用句的に使ってたよ('A`)
nilじゃないときは代入、みたいに

53:デフォルトの名無しさん
09/04/03 14:16:03
falseが入ってこないという仕様ならいいと思う

ただ完全な置き換えではないということは知っておかないと、
リファクタリングのときとか微妙に挙動を変えることになるかもね。
微妙なのがわかりづらい。あからさまなのはわかりやすい。

54:デフォルトの名無しさん
09/04/03 14:23:51
FlaseClass のオブジェクトがどこからともなく入ることはそもそもありえないだろ

55:デフォルトの名無しさん
09/04/03 14:41:12
Flase

落ち着け

つ旦~


56:デフォルトの名無しさん
09/04/03 14:53:44
>>54みたいに間違いを指摘されると意固地になるやつって面倒なんだよな
指摘しないと仕事にならないときとか困る
やんわり言ってもやんわり意固地になるし・・・どーすりゃいいのよ

57:デフォルトの名無しさん
09/04/03 15:35:31
>>56
>>46が @name == false をチェックしてないということ自体が答だろ
false はこの場合「入るはずがない」のが前提
nil? メソッドを defined? でチェックしてないのと同じ

58:デフォルトの名無しさん
09/04/03 15:50:59
もしfalseが入ってるなら上書きしちゃまずくないか?
という流れじゃないのか?おれの勘違いだったらスマン

59:デフォルトの名無しさん
09/04/03 16:01:17
false の時は動作しないだろ、という突っ込みが文脈上無意味またはオタ臭い重箱隅つつき、というようなアリガチな話だと思った

60:デフォルトの名無しさん
09/04/03 16:05:14
>>46
できる。未定義のインスタンス変数を参照するとnilが返るから。
でもって>>50
@ivar ||= val という書き方を提案した。
これは @var = val unless @ivar みたいなもんなので
>>51が@varがfalseでも上書きしちゃうぞ、と突っ込んだ

61:デフォルトの名無しさん
09/04/03 16:10:23
DBのブール型を普通に使ってるおれは興味深かったが、
true/falseを変数に入れるって使わないやつは使わんのかね。

62:デフォルトの名無しさん
09/04/03 16:14:19
>>60

>>42をよく嫁よ
オブジェクトに関連付けられていないインスタンス変数はローカル変数同様にエラーを返すほうがよかった気がする

63:デフォルトの名無しさん
09/04/03 16:47:54
>>46からの流れだよ。
>>42の意見はどーでもよかったから省いた。
そんな仕様だったら死ぬ。

64:デフォルトの名無しさん
09/04/03 16:56:18
>>40
なにが(笑)なのかkwsk

65:デフォルトの名無しさん
09/04/04 00:20:16
普段pythonを使ってるのですが
rubyとの対応表みたいなのがあるサイトはないでしょうか

rubyを手間かけないで覚えたいのです

66:デフォルトの名無しさん
09/04/04 01:08:47
>>65
URLリンク(pub.cozmixng.org)

67:デフォルトの名無しさん
09/04/04 19:16:07


68:デフォルトの名無しさん
09/04/04 22:44:13
Hikiって文書の中にRubyのスクリプト埋め込んだりできないの?

69:デフォルトの名無しさん
09/04/04 23:04:56
Wikiの文書にサーバーで動作可能なスクリプトを埋め込めるとか怖過ぎるだろ…

70:デフォルトの名無しさん
09/04/04 23:06:19
Hiki公開しちゃダメ

71:デフォルトの名無しさん
09/04/05 04:39:49
URLリンク(asobi.sqweebs.com)

質問用テンプレ作りました。

72:デフォルトの名無しさん
09/04/05 09:48:03
テンプレ作ってくれて助かるが、webサービスにする必要あるのか?ww

73:デフォルトの名無しさん
09/04/05 09:49:12
>>71-72
せっかくなのでテンプレコピペ(ちょい修正)

◆質問用テンプレ
【詳しい内容(「動きません」「うまくできません」だけでは回答しにくい)】

【エラーメッセージ(自力で訳さずなるべくそのままで)】

【実行環境(OS名、Rubyのバージョン(ruby -v しる)】

【最終的にやりたいこと(もっとよい方法がある場合が多いため)】


74:デフォルトの名無しさん
09/04/05 10:16:28
>>71
乙、しかし Rubyで作れw

75:デフォルトの名無しさん
09/04/05 10:24:31
ランダムディレクトリ名でランダムファイルのCGIはアクセス解析とスパイウェア注入と相場が決まってる
アクセスしたお前らオタワ\(^o^)/

76:デフォルトの名無しさん
09/04/05 10:38:13
Rubyスレに貼られるPHPのCGIなんざ俺が踏むわけねーだろ

77:デフォルトの名無しさん
09/04/05 13:44:32
外部コマンドを一定時間実行して実行を打ち切るのってどうすればいいですか?

なんとかBSDでのTS抜き環境が出来てddコマンドでUSBデバイスからコピーすればデータが流れてくるようになりました。
停止しなければ延々放送波が流れてくるので、CTRL+Cで停止する必要があるのですが、
rubyでラッパーを書いて利用する際にどうすれば時間指定を出来るのかと思った次第です。

78:デフォルトの名無しさん
09/04/05 13:50:00
Rubyあんま関係ないな
システムコールとか勉強するといいぞ
時間指定は cron とかの外部スケジューラに任せるのが一般には間違いない

79:デフォルトの名無しさん
09/04/05 14:00:22
さっぱり分からんがスレッド使って時間をみたりするのはダメなのか?

80:デフォルトの名無しさん
09/04/05 14:22:59
子供を1時間動かしておいて、30秒だけしか待ってやらない親

require 'timeout'

pid = fork

if pid
begin
timeout(30) do
puts "waiting #{pid}"
sleep
end
rescue Timeout::Error
Process::kill('KILL', pid)
ensure
Process.wait
end
else
exec("sh -c 'sleep 3600'")
end

81:デフォルトの名無しさん
09/04/05 14:28:09
>>79
個々のスクリプトとしては sleep するしかないので、正直あんまりよくはない
自分の見てる前で30分だけ動かすとかそういうのならいいけどさ

82:デフォルトの名無しさん
09/04/05 21:04:00
OpenStructクラスで、[]、[]=、count(from Enumerable)などのメソッドを使いたいのに
定義されていない場合は、OpenStructを継承して派生クラスで定義してくれってことですか?

83:デフォルトの名無しさん
09/04/05 21:47:41
>>77

pid=fork

if pid==nil then
exec('やりたいコマンド')
else
sleep 動かしたい時間
# まずはSIGINTで止めてみる
Process.kill(pid,'INT')
stat=Process.waitpid(pid,Process::WNOHANG)
if stat==nil then
# ダメなのでSIGTERMで
Process.kill(pid,'TERM')
stat=Process.waitpid(pid,Process::WNOHANG)
if stat==nil then
# これもダメだったのでSIGKILLで。これなら確実に終了できる
Process.kill(pid,'KILL')
stat=Process.waitpid(pid)
end
end
end

確かforkは失敗すると例外を投げるはず

84:デフォルトの名無しさん
09/04/05 21:48:40
>>82
他にどーしろと…

st[0] でも st[:hoge] でも st.hoge でも st.each でもアクセス可能なコレクションというのは
デフォルトでは添付されてない
どれか諦めてくれ

85:77
09/04/05 22:44:07
>>80 >>83 有り難うございます
別のプロセスをforkで作り、子供側にはnilを返し親にはpidを返すので
下に分岐を入れて子供には外部コマンド実行、親にはスリープしたのちkillさせる、ってことですね。

確かにrubyはあんまり関係ない処理だなあ・・・。unixの勉強がいるなあ。

86:デフォルトの名無しさん
09/04/05 22:45:57
>>83
pid = fork {exec('...')} とブロックのほうがいいんじゃまいか
1.9ならspawnがあるんだが。

87:デフォルトの名無しさん
09/04/05 22:51:45
それから、シグナル送ってからちょっとくらい待ってやれよ。

以下、Bourne Shell版。

#!/bin/sh
やりたいコマンド &
pid=$!
sleep 動かしたい時間
kill -INT $pid 2>/dev/null &&
{ sleep 1; kill -TERM $pid 2>/dev/null; } &&
{ sleep 1; kill -KILL $pid 2>/dev/null; }
wait


88:デフォルトの名無しさん
09/04/06 01:21:04
クラス名を文字列で受け取ってnewしたいとき、どのようなコードになりますか。
いろいろ試してみたけど最終的にはシンプルにevalしか思い当たらないんですが、漠然と他にありそうなような。

classname = "SomeClass"
require classname #ファイル名とクラス名が同じと仮定した場合
obj = eval("#{classname}.new")

89:デフォルトの名無しさん
09/04/06 02:36:15
>>88
classnameが::を含まない前提?

> require classname #ファイル名とクラス名が同じと仮定した場合
普通は require classname.downcase

> obj = eval("#{classname}.new")
obj = Object.const_get(classname).new のほうが速い

active_supportあたりにそんな機能があるよ、確か。

90:88
09/04/06 06:20:11
>>89
ありがとうございます!
>>88の例では明示的にrequireしていますが、実際にはオートロードするように書いていたため
evalしかダメでした。(evalした時点で暗黙に読み込まれる)
const_getだと、すでに読み込まれている定数に対してですが、
そのことに気づかずにあれやこれやと・・・orz
現在は修正してうまくいっています。

active_supportは使えない環境なんですが、ファイル名のことなども参考になりましたm(_ _)m

91:デフォルトの名無しさん
09/04/06 10:55:14
>>90
> >>88の例では明示的にrequireしていますが、実際にはオートロードするように書いていたため
> evalしかダメでした。(evalした時点で暗黙に読み込まれる)
> const_getだと、すでに読み込まれている定数に対してですが、
> そのことに気づかずにあれやこれやと・・・orz
> 現在は修正してうまくいっています。
バージョンとエラーメッセージは?

$ echo 'class C; end' > c.rb
$ /usr/bin/ruby -ve 'autoload :C, "c"; p Object.const_get(:C); p $"'
ruby 1.8.6 (2008-03-03 patchlevel 114) [universal-darwin9.0]
C
["c.rb"]



92:デフォルトの名無しさん
09/04/06 18:37:54
Rubyプログラミング入門 ?はじめてのプログラミング、はじめてのRuby
URLリンク(www.bnn.co.jp)
サンプルコードを読む限りはまー最初ならこんなもんじゃねーの、と思った
少なくとも同時期のナントカの冒険よりは読む価値があると思う

サンプルコードのダウンロードURLが書いてあったんだけど
まさかサイトに書いてない購入者限定の代物だとは思わなかったので記憶してくるの忘れた
サンプルコード公開すれば売上伸びる系統の本だと思うのに

93:デフォルトの名無しさん
09/04/06 19:10:52
Rubyの冒険とかめちゃくちゃ懐かしいんだが
それとは関係ないんだな

94:90
09/04/06 20:43:51
>>91
いただいたコードを見ると、const_getでautoloadしないわけではなかったのですね。
今一度自分のコードを見直してみたところ、const_getでautoloadできました。(解決!)

最初、Javaのように文字列からクラスを生成する書き方ばかり想像していて
>>88で説明のための適当なコードを載せたばかりに、余計な手間をおかけしました。
いまさらですができているコードを書いておきます。

#testfactory.rb
module TestFactory #モジュール内のメソッドは公開済み
 autoload :TestClass1, "testclass1.rb"
 autoload :TestClass2, "testclass2.rb"
 
 def get_instance(classname, *args) #インスタンスを返す
  # eval("#{classname}.new(*args)) #>>88の時点のコード
  
  # require classname.downcase       #>>90の時点のコード(レシーバ違いでrequireが必要だった)
  # Method.const_get(classname).new(*args) #requireしないと=> uninitialized constant Method::TestClass1
  
  self.const_get(classname).new(*args) #現在のコード(問題なし)
 end
 
 #その他の同種のメソッド
 def get_class(classname);       self.const_get(classname); end      #クラスを返す
 def method_missing(classname, *args); self.const_get(classname).new(*args); end #同じくインスタンスを返す
end

95:90(続き)
09/04/06 20:45:03
#test.rb
require "testfactory"   #ファクトリモジュールを読み込み
classname = get_classname #あるメソッドによりクラス名(文字列)を決定

obj = TestFactory::get_instance(classname, arg1) #OK!

Rubyのバージョンは以下のとおりです
ruby 1.8.7 (2008-06-20 patchlevel 22) [i386-mswin32]

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

96:デフォルトの名無しさん
09/04/06 21:15:58
ruby:1.8.7
rails:2.1.0
でやってるんだけどto_dateって使えないの?
ググったら1.8.6だとprivateメソッドで定義されて〜
とか書いてたけどto_datetimeやto_timeとかもundefind methodになる…

97:デフォルトの名無しさん
09/04/06 21:19:21
>>96
Railsのライブラリで定義されてるメソッドの話はスレ違い
【Ruby】Ruby on Rails Part6
スレリンク(php板)

98:96
09/04/06 21:24:10
>>申し訳。

そっちで聞いてみます。

99:デフォルトの名無しさん
09/04/06 21:27:17
スレ的にはRailsをRuby初学者が使うのは全くお勧めしない

100:デフォルトの名無しさん
09/04/06 22:46:32
「Rubyレシピブック 第2版 268の技」を買いたいと思ってるんですが
レシピブックって言うのはもっといたほうがいいんですかね?
言語挫折厨なもんで、、、便利なら買いたいと思っています。

101:デフォルトの名無しさん
09/04/06 22:52:58
>>100
対象がほんのり古いが、「Rubyは実際にどう書くのが一般的と考えられてるのか」がたくさん載っててとても便利
95%くらいは今でも使える、基本ライブラリを使うときはこう書いておけばとりあえずは恥ずかしくない、というコード片が満載

独学可能な領域なので無理してまで買わなくてもいいが、買うと勉強が早く済むよ

102:デフォルトの名無しさん
09/04/06 22:56:49
間違いなく買い
初版持ってるけど、よれよれになってるよ

103:デフォルトの名無しさん
09/04/06 22:58:48
ありがとうございます、買い、みたいですね。
参考にさせていただきます。

104:デフォルトの名無しさん
09/04/06 23:17:10
WindowsのRuby/TKで簡単なランチャを作って使ってるんですが
Rubyから別コマンドを実行するのがsystemしかなく
ふつうにsystem使うと、コマンド終了待ちでRubyが止まっちゃうので
Thread.new{system 'ほげほげ.exe 引数'}
としてます
外部コマンド一つ起動するごとにスレッドが増えるけど
外部コマンドが終了すればスレッドも終了するだろうし
同時に起動することなんて多くても数十程度だろうから
大丈夫かなと

forkしてexecするのが普通の同期しない外部コマンド起動のさせかたなんですか?
Windowsなんでforkできないのです
1.9だとspawnが使えるんですけど


105:デフォルトの名無しさん
09/04/06 23:30:02
>>104
win前提ならstartコマンド経由で呼べばすぐ戻ってくる
system "start ruby -e 'sleep 10'"

106:デフォルトの名無しさん
09/04/06 23:35:32
startはcmd.exeの内部コマンドなので
GUIから呼ぶと一瞬cmd.exe起動の為に
コマンドプロンプトウィンドウが出てしまうのです
rubyw -e "system('start winver')"
とかするとわかります


107:デフォルトの名無しさん
09/04/06 23:47:02
>>106
これはどうよ?
require 'win32ole'
wsh = WIN32OLE.new('Wscript.Shell')
wsh.Run('cmd /c echo', 0, false)

108:デフォルトの名無しさん
09/04/06 23:51:39
ああ、wsh 厨が来た

ってか Windows の cmd.exe の肝心なときに使えない度は異常

109:デフォルトの名無しさん
09/04/07 00:11:46
>>106
忘れてたorz

Thread.new{system 'ほげほげ.exe 引数'}.kill
というのは?スレッド殺してもプロセスまで殺さないはず。

110:デフォルトの名無しさん
09/04/07 00:19:59
>>108
ゲイツソフトに無理言うなよw

111:デフォルトの名無しさん
09/04/07 00:26:10
win32api使えばいいんじゃ
URLリンク(d.hatena.ne.jp)

112:デフォルトの名無しさん
09/04/07 00:51:25
ちゃんとするならWin32APIなんでしょうね
でも、お手軽じゃないなぁと
Thread.new{system 'hoge.exe'}
で、動いちゃってるので
まあいいかなとそのままです

>>109
すいません
私の場合は非同期に外部コマンドを起動したいだけなので
後々のコントロールできなくてもよいのです

でも、Windowsで >>77 みたいなことをRubyにさせようとすると
どうすればいいのでしょうね
Win32APIを駆使?
めんどくさそうだなぁ


113:デフォルトの名無しさん
09/04/07 01:17:57
>>112
CreateProcessするんじゃね?
使ったことないけど

114:デフォルトの名無しさん
09/04/07 09:31:01
1.8で、コマンドプロンプトを見せるな、という制限を課されるといろいろつらいな。
CreateProcessなりShellExecute(Ex)なりを直接叩くしかないと思う。

115:デフォルトの名無しさん
09/04/07 09:36:05
IO.popen(program, "w") とか

116:デフォルトの名無しさん
09/04/07 13:30:59
すみません。Cで拡張ライブラリを書くためにREADME.EXT.jaを
読んでいるのですが、次のような箇所があります。

> 既に『1.5 Rubyのデータを操作する』で一部紹介したような関数を
> 使えば,Rubyの機能を実現している関数を直接呼び出すことが出来
> ます.
> # このような関数の一覧表はいまのところありません.ソースを見
> # るしかないですね.

これが書かれてから15年近く経った今でもそうなんでしょうか?
日本語・英語問わず、どこかに一覧表があれば欲しいのですが・・・。

117:デフォルトの名無しさん
09/04/07 18:07:07
rspec で BDD だとかなんかそんなのやってみようかなーと思ってるんだけど、
これってパブリックなメソッドの返り値しかチェックできないの?
いくつも小さなメソッドに分割された、ある程度フクザツなメソッド作ってる最中は役に立たない?

118:デフォルトの名無しさん
09/04/07 18:22:29
>>117

「作り始め」のメソッドの大きさはみんな一緒

119:デフォルトの名無しさん
09/04/07 18:34:39
tdiary 以外でテーマやスキンの充実した ruby アプリって何かありませんか。

120:デフォルトの名無しさん
09/04/07 19:31:53
Hiki

121:デフォルトの名無しさん
09/04/07 19:34:59
>>116
スレ違い

122:119
09/04/07 19:55:35
tdiary と同じテーマやスキン以外でお願いします><

MT や WP、Xoops みたいにド派手に変えられると嬉しいです。

Ruby ベースの CMS
URLリンク(diaspar.jp)
をみてもテーマ公開しているの少ないよね…。

123:デフォルトの名無しさん
09/04/07 20:01:41
>>117
RSpecでテストとか勉強しようと思ってずっと待ってるんだけど、そういう解説は見たことないね
なんかテストのなんたるかを知ってる人が自由に使ってる感じがして、ちょっと寂しい
個々のマッチャとかの動作はわかりやすいんだけど、実際にこれどう使うのよみたいな

124:デフォルトの名無しさん
09/04/07 22:08:10
モデル・ビュー・コントローラの知識がないとたぶんダメ

125:デフォルトの名無しさん
09/04/07 22:27:18
>>122
PinkyBlog

126:デフォルトの名無しさん
09/04/07 22:29:47
>>123
TDDは俺もよくわからんので勉強中。

書籍だと「10日でおぼえる Ruby on Rails入門教室」がTDDやりながら開発する解説があるらしい。
rspecかどうかはわかんないけど

Amazon.co.jp: 10日でおぼえる Ruby on Rails入門教室: arton: 本
URLリンク(www.amazon.co.jp)
URLリンク(images-jp.amazon.com)

127:デフォルトの名無しさん
09/04/07 22:43:56
RSpecでBDDやって遊んでるだけでも、17インチ液晶の左右分割では幅が足りないと強く思う

家でだらだらスクリプト書いてるだけだしこれくらいでいいじゃんとこれまでは思ってたけど、ちょうど足りない
少なくとも19が欲しい
大きめフォントをちょっと小さくしたけど、やっぱ足りん
うおー

128:デフォルトの名無しさん
09/04/08 01:22:05
>>116
URLリンク(doc.loveruby.net)
ずっと503
URLリンク(www.ruby-doc.org)
doxygenの自動生成だからヘッダ読むのとほとんど変わらない
URLリンク(www.nilab.info)
かなり古い、1.6.8

こちらの知る限り現状はこんなところ
loveruby.netが直れば一番いいんだろうけどずいぶん前から503のままなので期待薄

129:デフォルトの名無しさん
09/04/08 07:49:58
csvをMySQLに食わせるtsvにしたくてモゾモゾやってるんだけど
a = ["mesi", "kue", "", "unko"]
として
a.map do |x|
if x == ""
x = "\N"
end
end
の結果が
[nil, nil, "\N", nil]
となるのは何でなんでしょう。eachじゃダメだし。
つーか、["mesi", "kue", "\N", "unko"]にするステキな方法を
教えてくだしゃんせ。

130:デフォルトの名無しさん
09/04/08 08:12:54
ブロックつきの map{} は、ブロックの返り値で要素を置き換える
で、

irb> p (if 1 == 2 then "true!" end)
nil

else 節がない if 文で条件が偽だった場合の文そのものの返り値が nil だ
else を明示的に書くのがよい

a.map{|e| if e.empty? then "\n" else e end}

131:デフォルトの名無しさん
09/04/08 08:24:47
x = "\N" は x = "\N" の返り値がたまたま "\N" だったからたまたま動作しただけだな
ブロックつきメソッドは仮引数に代入することで動作するわけではない
[1,2,3].map{|x| x = x*2} というような書き方は誤りで、 単に返り値だけを [1,2,3].map{|x| x*2} のように書く

132:デフォルトの名無しさん
09/04/08 08:37:27
△ ブロックの返り値で要素を置き換える
○ ブロック内で最後に評価された値が要素と置き換わる

ブロックつきmapの「ブロックの返り値」は変換後の配列だ
ブロックで最後に評価された値のことをブロックの返り値と呼んではいけない

133:デフォルトの名無しさん
09/04/08 08:53:51
× if 文
○ if 式

公式でも if 文って書いてしまってるけどな
既存言語の影響は強い

134:デフォルトの名無しさん
09/04/08 09:30:31
Rubyでは文も式なだけであって、文を文と呼ぶのが誤りなわけではない。

135:デフォルトの名無しさん
09/04/08 09:59:47
最新のparse.yを見る限り、
symt→expr→arg→primary→if という流れになってるので、
ifは式です。

136:119
09/04/08 10:30:51
>>125
ありがと。
「CSS着せ替えテンプレートプロジェクト」の存在も知ることができて感謝。

137:デフォルトの名無しさん
09/04/08 10:49:01
少々お聞きします。
以下のソースにて、Ctrl+Cをトラップしようとして、

trap 'INT' do
 puts "TRAP!!"
 raise "ctrl+c"
end

loop do
 Kernel.sleep 1.5
end

実行してみたんですが、
Ruby win32 + コマンドプロンプト : OK
Ruby win32 + コマンドプロンプト + cygwin bash: OK
Ruby win32 + cygwin terminal + cygwin bash: x
Ruby cygwin + cygwin terminal + cygwin bash: OK

という結果になってしまいました。
Ruby win32 + cygwin の bashでCtrl+Cをトラップすることはできないのでしょうか?

138:デフォルトの名無しさん
09/04/08 11:10:14
>>133-135
Rubyでの文は「カッコなしのメソッド呼び出しの引数よりも優先順位が低い式」のこと。


139:デフォルトの名無しさん
09/04/08 11:12:34
>>137
> Ruby win32 + cygwin の bashでCtrl+Cをトラップすることはできないのでしょうか?

できてるだろ。
> Ruby win32 + コマンドプロンプト + cygwin bash: OK

非cygwinプログラムからはcygwin terminalはttyには見えないので、
Ruby win32 + cygwin terminal ではできない。


140:デフォルトの名無しさん
09/04/08 11:25:04
>>139
ごめん。コピペミス・・・

> Ruby win32 + コマンドプロンプト + cygwin bash: OK

Ruby win32 + コマンドプロンプト + cygwin bash: x

ていうか、調べてたら cygwin から nativeアプリに(non-cygwin app) Ctrl+Cは鬼門みたいですね…。

141:デフォルトの名無しさん
09/04/08 14:04:44
>>133
○if文
◎if式

こうでしょ?
例えば関数呼び出しは式であり文でもあり。

142:デフォルトの名無しさん
09/04/08 14:07:16
とりあえず一つだけ。
初心者スレに過度の原理主義はあんまりよくない。
やりたいなら、本スレにコピペでも持って行って存分にやればいいと思うんだ。

143:デフォルトの名無しさん
09/04/08 14:19:15
すまんかった。正直ifの扱いはどうでもいいんだけど
「文は返値を持たないものだけを指す」と言わんばかりなのが気になって。
初心者スレだけになおさらね。

144:デフォルトの名無しさん
09/04/08 14:20:23
文が値を返すのって感覚的にも不自然だと思う
if は if 式と意図的に呼ぶべき
初心者スレならなおさら、初期の用語の統一は非常に重要
URLリンク(www.google.com)
URLリンク(www.google.com)
うおー負けてるー

145:デフォルトの名無しさん
09/04/08 14:20:39
式の一部になれないのが文だっけ?

146:デフォルトの名無しさん
09/04/08 14:22:08
ifが式ってのが、Rubyの特徴のひとつだもんな。

147:デフォルトの名無しさん
09/04/08 14:27:06
「if 式」のほうが実態をよく表してるし勘違いの元にもならないし興味の取っ掛かりにもなる
つい口に出るもんなので仕方ないが、なるべく式と言うべきだと思った

ちなみに、 for なんかは式だったかどうかをよく覚えてないので
「制御構造 for」とかいう表現で逃げたりする
大人は汚いね!

148:デフォルトの名無しさん
09/04/08 14:30:52
>>145
あっちにレスした
スレリンク(tech板:50番)

149:デフォルトの名無しさん
09/04/08 14:31:38
>>145
スレリンク(tech板:50番)
> ( ) で囲めばなんでも式の一部 (primary) になる。

150:149
09/04/08 14:31:58
>>148
ごめん_| ̄|○

151:デフォルトの名無しさん
09/04/08 14:40:39
Cなどの既存言語の経験者が戸惑わないようにif文って呼んでるのに
その辺の事情を無視してif式って呼ぼうってのは、悪しき原理主義だよなあ

そういやこの前「関数って言うな」なんてのもあった
あれも根っこは一緒か

152:デフォルトの名無しさん
09/04/08 14:41:59
>>151
既存言語の経験者が同じだと勘違いするほうが問題とか、
少しも思わない?

153:デフォルトの名無しさん
09/04/08 14:44:53
初心者が引かない程度に抑えるのが肝要ってことでどうだろうか
スレの使い分け大事

154:デフォルトの名無しさん
09/04/08 14:55:49
>>151
なんで違うものをわざわざ同じ名前で呼んで混乱させようと思うわけ?

155:129
09/04/08 15:14:57
>>130-131

thx!

156:デフォルトの名無しさん
09/04/08 15:38:31
マニュアルの最初の説明でそう書いてある場合は、Rubyでは

            無理せずに

そう呼べばいいじゃんね
無理して別の名前で呼ぶ理由もなかんべ

157:デフォルトの名無しさん
09/04/08 15:48:45
>>117で話が出たので自分用スクリプトでちょっとやってみた
小さなメソッドひとつにつき正常と境界と例外で8つくらいずつテスト項目作る羽目になって非常にめんどくさい

別なとこ改造してもspecのテストさえ通ればとりあえず他への影響を忘れて次のことをしていいというのは気楽

158:デフォルトの名無しさん
09/04/08 16:45:49
a.map!{|s| s.sub(/var/, 'foo')} をもっと短く書く方法ってありますか?

なくてもいいのですが、なんか ruby ならありそうな気がして。

159:デフォルトの名無しさん
09/04/08 17:01:14
>>158
特にない
あと String#sub 系列はできれば sub(/var/){'foo'} と書いてくれ
これは Ruby の構造的欠陥だが

160:デフォルトの名無しさん
09/04/08 17:03:10
何十万回も置換を行うような場合は sub のブロック生成コストが気になるお年頃

161:デフォルトの名無しさん
09/04/08 17:04:58
{'foo'}あるいは{"foo#{1}bar"}程度のような単純なブロックは最適化してほしいもんだ

162:デフォルトの名無しさん
09/04/08 17:11:09
>>159
その構造的欠陥について詳細キボンヌ

163:デフォルトの名無しさん
09/04/08 17:51:27
後方参照するときに$1か\1か迷ったり
\をいくつ重ねればいいのか非常にわかりにくいという問題はある。

後方参照しないときまでブロックで書く理由は知らない。
転ばぬ先の杖じゃないかと思うけど、それなら理由書いたほうが。

164:デフォルトの名無しさん
09/04/08 18:01:30
単に構造的欠陥と言ってみたかっただけです。

165:デフォルトの名無しさん
09/04/08 18:09:02
ユーザーは何も悪くない以上、構造上の欠陥ではあるような気はする

166:デフォルトの名無しさん
09/04/08 18:31:02
そんなことよりもさー

require 'spec'
require 'logger'

class C
attr_accessor :log
def err
log.info('error!') if log
raise
end
end

describe "C" do
before :each do
@obj = C.new
end
describe "#err" do
it "ログにエラーの旨が記録されランタイムエラーが発生する" do
sio = StringIO.new ; @obj.log = Logger.new(sio)
lambda{lambda{@obj.err}.should change(sio, :to_s).from('').to('error!')}.should raise_error(RuntimeError)
end
end
end

これをかっちょよく書く方法教えておくれよ
最初は
lambda{@obj.err}.should change(sio, :to_s).from('').to('error!')
lambda{@obj.err}.should raise_error(RuntimeError)
って書いて上の行で例外が飛び出てうまくいかないって質問しようと思ってて、
書き込む寸前に lambda を2重にすることに思い至ったんだけど、なんかあんま普通っぽくないんだよねこれ


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

5374日前に更新/278 KB
担当:undef