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

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

Ruby 初心者スレッド Part 27

1 :1様:2009/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つをすること。ここで回答を待つよりそのほうが早い。
 ・モジュール名やエラーメッセージでググる
 ・マニュアルで引っかかったクラスの記述を探す 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 :1様:2009/04/02(木) 09:43:25
【よくあるしつもん】
Q:
いちからRubyを始める初心者向けのRuby入門書は何がありますか?

A:
プログラム作成自体の初心者なら
「たのしいRuby 第2版 Rubyではじめる気軽なプログラミング」
http://www.amazon.co.jp/dp/4797336617/
文法は理解済み(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 :1様:2009/04/02(木) 09:45:06
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 :1様:2009/04/02(木) 09:46:21
関連スレ

本スレ
Rubyについて Part 35
http://pc12.2ch.net/test/read.cgi/tech/1238194350/

アンチスレ
Rubyについて(アンチ専用) Part003
http://pc11.2ch.net/test/read.cgi/tech/1207233348/

Railsスレ
【Ruby】Ruby on Rails Part6
http://pc11.2ch.net/test/read.cgi/php/1224838013/

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

Ruby 1.9 系列スレ
魁け! Ruby 1.9.X
http://pc11.2ch.net/test/read.cgi/tech/1201603546/

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

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

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

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

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

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

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

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

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

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

ソースのコメントを英語で書くスレ
http://pc12.2ch.net/test/read.cgi/tech/1224696505/

クラス名・変数名に迷ったら書き込むスレ。Part14
http://pc12.2ch.net/test/read.cgi/tech/1230477632/

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

ソースのコメントを英語で書くスレ
http://pc12.2ch.net/test/read.cgi/tech/1224696505/563

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

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

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

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

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

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

15 :デフォルトの名無しさん:2009/04/02(木) 14:32:28
>>13
ワロタ
このリンクは収穫だったわ
http://java.sun.com/j2se/javadoc/writingdoccomments/index.html#styleguide

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

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

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

19 :前スレ751:2009/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 :デフォルトの名無しさん:2009/04/02(木) 19:47:41
引数としてもらったブロックを他のメソッドのブロックとして渡す、ということは可能なのでしょうか?
ブロックを持つメソッドのラッパーなどを作った場合に、どうしたものかと。

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

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


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

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

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

25 :デフォルトの名無しさん:2009/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 :デフォルトの名無しさん:2009/04/02(木) 21:23:03
class Symbol
 def to_proc
  lambda{|receiver, *args| receiver.__send__(self, *args) }
 end
end

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

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


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

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

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

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

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

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

31 :28:2009/04/03(金) 00:30:31
見ておくれ、このひどい有様を!!
http://ja.wikipedia.org/wiki/LAMP

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

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

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

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

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

34 :デフォルトの名無しさん:2009/04/03(金) 01:27:59
うーん、微妙だ
ttp://www.google.com/search?hl=ja&safe=off&num=50&q=%22%E6%B8%AF%E3%81%A7%E4%BA%BA%E6%B0%97%E3%81%AE%22&lr=lang_ja

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

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



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

38 :デフォルトの名無しさん:2009/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 :デフォルトの名無しさん:2009/04/03(金) 12:20:45
明示的に初期化しましょう、で終了

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

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

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



@hoge=nil
p @hoge

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

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

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

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

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


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

使い方じゃね?

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

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

とかできないのか

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

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

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

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

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

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

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

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

なんでだよw

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

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

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

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

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

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

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

落ち着け

つ旦~


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

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

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

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

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

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

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

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

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

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

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

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

66 :デフォルトの名無しさん:2009/04/04(土) 01:08:47
>>65
http://pub.cozmixng.org/~the-rwiki/rw-cgi.rb?cmd=view;name=%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8%B8%C0%B8%EC%A4%CE%C8%E6%B3%D3

67 :デフォルトの名無しさん:2009/04/04(土) 19:16:07


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

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

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

71 :デフォルトの名無しさん:2009/04/05(日) 04:39:49
http://asobi.sqweebs.com/cdxidyfk/sphvpisz.php

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

83 :デフォルトの名無しさん:2009/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 :デフォルトの名無しさん:2009/04/05(日) 21:48:40
>>82
他にどーしろと…

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

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

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

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

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

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

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

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

91 :デフォルトの名無しさん:2009/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 :デフォルトの名無しさん:2009/04/06(月) 18:37:54
Rubyプログラミング入門 ?はじめてのプログラミング、はじめてのRuby
ttp://www.bnn.co.jp/books/title_index/web/ruby_ruby.html
サンプルコードを読む限りはまー最初ならこんなもんじゃねーの、と思った
少なくとも同時期のナントカの冒険よりは読む価値があると思う

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

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

94 :90:2009/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(続き):2009/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 :デフォルトの名無しさん:2009/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 :デフォルトの名無しさん:2009/04/06(月) 21:19:21
>>96
Railsのライブラリで定義されてるメソッドの話はスレ違い
【Ruby】Ruby on Rails Part6
http://pc11.2ch.net/test/read.cgi/php/1224838013/

98 :96:2009/04/06(月) 21:24:10
>>申し訳。

そっちで聞いてみます。

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

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

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

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

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

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

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

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


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

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


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

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

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

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

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

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

111 :デフォルトの名無しさん:2009/04/07(火) 00:26:10
win32api使えばいいんじゃ
ttp://d.hatena.ne.jp/mokehehe/20070812/createProcess

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

Ruby ベースの CMS
ttp://diaspar.jp/node/79
をみてもテーマ公開しているの少ないよね…。

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

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

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

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

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

Amazon.co.jp: 10日でおぼえる Ruby on Rails入門教室: arton: 本
http://www.amazon.co.jp/dp/4798114723
http://images-jp.amazon.com/images/P/4798114723.09.MZZZZZZZZZ.jpg

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

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

128 :デフォルトの名無しさん:2009/04/08(水) 01:22:05
>>116
ttp://doc.loveruby.net/refm/capi/
ずっと503
ttp://www.ruby-doc.org/doxygen/1.8.4/index.html
doxygenの自動生成だからヘッダ読むのとほとんど変わらない
ttp://www.nilab.info/docs/Ruby1.6.8/refm364.html
かなり古い、1.6.8

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

129 :デフォルトの名無しさん:2009/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 :デフォルトの名無しさん:2009/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 :デフォルトの名無しさん:2009/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 :デフォルトの名無しさん:2009/04/08(水) 08:37:27
△ ブロックの返り値で要素を置き換える
○ ブロック内で最後に評価された値が要素と置き換わる

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

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

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

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

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

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

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


139 :デフォルトの名無しさん:2009/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 :デフォルトの名無しさん:2009/04/08(水) 11:25:04
>>139
ごめん。コピペミス・・・

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

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

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

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

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

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

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

144 :デフォルトの名無しさん:2009/04/08(水) 14:20:23
文が値を返すのって感覚的にも不自然だと思う
if は if 式と意図的に呼ぶべき
初心者スレならなおさら、初期の用語の統一は非常に重要
ttp://www.google.com/search?hl=ja&safe=off&num=50&q=Ruby+%22if%E5%BC%8F%22&lr=lang_ja
ttp://www.google.com/search?hl=ja&safe=off&num=50&q=Ruby+%22if%E6%96%87%22&lr=lang_ja
うおー負けてるー

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

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

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

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

148 :デフォルトの名無しさん:2009/04/08(水) 14:30:52
>>145
あっちにレスした
http://pc12.2ch.net/test/read.cgi/tech/1238194350/50

149 :デフォルトの名無しさん:2009/04/08(水) 14:31:38
>>145
http://pc12.2ch.net/test/read.cgi/tech/1238194350/50
> ( ) で囲めばなんでも式の一部 (primary) になる。

150 :149:2009/04/08(水) 14:31:58
>>148
ごめん_| ̄|○

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

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

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

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

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

155 :129:2009/04/08(水) 15:14:57
>>130-131

thx!

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

            無理せずに

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

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

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

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

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

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

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

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

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

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

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

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

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

166 :デフォルトの名無しさん:2009/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重にすることに思い至ったんだけど、なんかあんま普通っぽくないんだよねこれ

167 :デフォルトの名無しさん:2009/04/08(水) 18:57:00
> これをかっちょよく書く方法教えておくれよ

高いスーツを買って、ポルシェで高級ホテルに乗り付け、
最上階のレストランでノートPCを開いて書く。

168 :デフォルトの名無しさん:2009/04/08(水) 18:59:25
何という昭和w

169 :デフォルトの名無しさん:2009/04/08(水) 19:02:56
> これをかっちょよく書く方法教えておくれよ

走ってくるトラックの前に飛び出して、
僕は死にません!Rubyが好きだから!僕は死にません!

で、泣き止んで家に帰ってから書く。

170 :デフォルトの名無しさん:2009/04/08(水) 19:05:35
何という昭和からの平成w
っていうか平均年齢おかしいだろこのスレ

171 :デフォルトの名無しさん:2009/04/08(水) 19:12:38
いま従事している ruby のプロジェクトで、
ソースファイルの改行コードがばらばらになっていることに気づきました。

開発は Windows、本番環境はLinuxです。
Linux の LF に合わせようと思いますが、質問です。

Ruby は、ソースコードの改行コードがばらばらだったり、プラットフォームにあっていなくても動きますか?
たとえば、Windows 上で、改行コードが LF のソースを動かす、など。

もし問題ないのならば、そのままにしてしまおうかなとも考えています
(sed で置換しようと考えたが、sed の式をミスってソースの関係ないところも変えてしまったらどうしよう、と思っている)

172 :デフォルトの名無しさん:2009/04/08(水) 19:20:16
なんか精神的に嫌だな。

173 :デフォルトの名無しさん:2009/04/08(水) 19:31:29
>>123
RSpecの書籍がでるらしい。今はpdf版が無料で読めるみたいだ。
RSpec 本 1 章のメモ - たかみやの日記
http://d.hatena.ne.jp/ytakamiya/20090407/1239078380

174 :デフォルトの名無しさん:2009/04/08(水) 20:58:07
質問させてください、Rubyで日本語を扱いたいと考えています

Rubyのバージョンは1.9.1です("ruby -v"を実行すると"ruby 1.9.1p0 (2009-01-30 revision 21907) [i386-mswin32]"とでます)
PCはWindowsXPHomeEditionSP3 を利用しています(Vistaでも使いたいです)、コードの実行はコマンドプロンプトで行っています

やりたいことは日本語と英語の文字列の含まれたファイルから特定の文字列を正規表現で指定し置換することです
しかし、最初からいきなりつまずいてます
まず、以下のコードが実行できません
puts "あ"

実行すると、"invalid multibyte char (US-ASCII)"と表示されます
rubyのソースコードはUTF-8で保存しています

また、日本語の含まれたファイルを読み込み中身を表示しようとして以下のコードを実行しました
filename = ARGV[0]
puts filename
File.open(filename, "r:utf-8") do |file_input|
file_input.each do |line|
puts line
end
end

しかし、日本語の部分が文字化けして表示されてしまいます(puts filenameの部分は日本語でも正常に表示されます)
ソースコード、読み込むファイルともUTF-8で保存しています、また、読み込むファイルはファイル名に日本語を使っています

基本的な部分かもしれませんが、ネットで検索しても対策が良くわかりません
アドバイスや情報をいただけると助かります、よろしくお願いいたします


175 :デフォルトの名無しさん:2009/04/08(水) 20:59:49
>>166
あ、それ逆
「例外 E と変化 C が起きる」場合は
 lambda{ obj.should change(C) }.should raise_error(E)
ではなく
 lambda{ obj.should raise_error(E) }.should change(C)
の順番で書いてくれ
前者は raise_error が満たされた時点で終了してしまって change が検証されないよ

それが証拠に、StringIO#to_s は StringIO オブジェクトを返して change(sio, :to_s) は失敗するはずなのに
何も起こってない

176 :デフォルトの名無しさん:2009/04/08(水) 21:00:39
>>174
Ruby1.9.1 をアンインストールして Ruby 1.8.7 を使え

177 :デフォルトの名無しさん:2009/04/08(水) 21:00:44
>>174
ttp://jp.rubyist.net/magazine/?0025-Ruby19_m17n#l18
マジックコメントを書きましょう

178 :デフォルトの名無しさん:2009/04/08(水) 21:11:56
サポートしてくれるものが無い場合は>>176が正解
1.9.1を解説してくれる何かを頼りに学習してる場合はここで躓く可能性はないわけで、
つまりは1.9.1を教えてくれる教科書に該当するものを持ってないってことで
そういう場合は無理せずに1.8.7を使ってRubyに慣れるのが吉

一生のうちに1種類の言語しか学習できない呪いがかかってるとかそういう場合は別途相談

179 :174:2009/04/08(水) 21:14:45
レスありがとうございます
>>176
できれば最新版を使いたいのですが、1.8系は1.9系より日本語の使用が楽なのでしょうか?

>177
マジックコメントを記述した結果
puts "あ"
は実行できました!
しかし、残念なたら表示は文字化けしたままです
また、日本語を含むファイルの文字化けも直りません
表示するときに、文字コードを指定するような方法はないのでしょうか?
よろしくお願いいたします

180 :デフォルトの名無しさん:2009/04/08(水) 21:21:43
最新版だって判断できるくらいRubyに習熟してるなら自力でやれ

181 :デフォルトの名無しさん:2009/04/08(水) 21:24:37
>>179
Ruby1.9では文字列はそれ自身がエンコードを持っていて
入出力などで必要なら自動で文字コード変換が走る
しかし、コンソールへの標準出力では自動変換はなされないので
必要なら(Shift_JIS以外の文字列を出力するなら)自分で変換する(1)
あるいは、自動変換が走るようにIOの設定を変える(2)
のいずれかの対処が必要
らしい

(1)
puts line.encode("Windows-31J")
(2)
$stdout.set_encoding(Encoding.default_external)
$stderr.set_encoding(Encoding.default_external)


182 :181:2009/04/08(水) 21:29:30
結果は同じだけど、(1)のほうも
puts line.encode(Encoding.default_external)
のほうがいいかな

183 :デフォルトの名無しさん:2009/04/08(水) 21:33:02
>>181
初心者に後者勧めるとかマジキチ

184 :デフォルトの名無しさん:2009/04/08(水) 21:40:31
初心者向け書籍は1.9.2になるまで出ないんじゃないかと最近は思う

185 :174:2009/04/08(水) 21:59:21
レスありがとうございます
おかげさまで、無事できました

def my_puts str
puts str.encode(Encoding.default_external)
end
なる関数を作成し、putsの代わりに使用しています

これから、日本語を含んだ正規表現の利用を試します
また何かありましたら、よろしくお願いいたします

186 :デフォルトの名無しさん:2009/04/08(水) 22:03:12
Windows版のコンソール(cmd.exe?)への出力を諦めれば、相当楽になるような気がする。
例えばファイルにそのまま出すとか。
敢えて茨の道を進む>>185(>>174)に祝福あれ。

187 :デフォルトの名無しさん:2009/04/08(水) 22:06:30
1.8.7なら倍のスピードで学習できるけどな
悲惨だ

188 :デフォルトの名無しさん:2009/04/08(水) 23:26:28
nkf で変換とかだめなの?
by 初心者

189 :デフォルトの名無しさん:2009/04/08(水) 23:36:08
nkfじゃutfがだめじゃない?

190 :デフォルトの名無しさん:2009/04/08(水) 23:36:51
UTFも扱えるけど標準出力に書き出すたびにNKF呼ぶんだぞ
死ぬほど面倒じゃないか

191 :デフォルトの名無しさん:2009/04/09(木) 00:12:04
>>190
何その Ruby 1.8 以前を全て敵に回した発言

192 :デフォルトの名無しさん:2009/04/09(木) 00:42:28
以前と未満を間違えるとプログラムは動かないぞ

193 :デフォルトの名無しさん:2009/04/09(木) 01:34:11
<バージョン>Ruby 1.8</バージョン> <時間>以前</時間>
<バージョン>Ruby 1.8</バージョン> <バージョン>未満</バージョン>

194 :デフォルトの名無しさん:2009/04/09(木) 03:04:54
本題とはズレるけど、
cygwin を入れ、cygwin 付属のターミナルを使わずに UTF-8 Teraterm の cygterm で
コンソールを開き、Teraterm のコンソールの出力の文字コード(Kanji (receive) を UTF-8 にすると、
プログラムが UTF-8 で標準出力に出力しても、読めるようになる。

cygwin 入れる場合は、環境変数 PATH で、
cygwin 付属の ruby より mswin32 の ruby の方が前に来るように気をつける。

というか Linux で ruby 勉強した方が余計なところに躓かない気がする。
Linux なら、OS の文字コードも UTF-8 だし。

195 :デフォルトの名無しさん:2009/04/09(木) 08:30:52
a = [1, 2, 3, 4, 5]

# no1 p a.inject(0) do |sum, x| sum += x end
p a.inject(0) { |sum, x| sum += x }

なんでno1では以下のようなエラーが出るんでしょうか?
/tmp/r.rb:20:in `inject': no block given (LocalJumpError)
from /tmp/r.rb:3:in `each'
from /tmp/r.rb:3:in `inject'
from /tmp/r.rb:3


196 :デフォルトの名無しさん:2009/04/09(木) 08:41:13
http://www.ruby-lang.org/ja/man/html/_A5E1A5BDA5C3A5C9B8C6A4D3BDD0A4B7.html#a.a5.d6.a5.ed.a5.c3.a5.af.c9.d5.a4.ad.a5.e1.a5.bd.a5.c3.a5.c9.b8.c6.a4.d3.bd.d0.a4.b7


197 :デフォルトの名無しさん:2009/04/09(木) 08:44:38
p するからだ
do〜end ブロックを関数的メソッドに渡したい場合は引数全体を ( ) で括れ
理由は省くが、空白の有無でパースがコケている

198 :デフォルトの名無しさん:2009/04/09(木) 09:28:12
do〜endと{}では結合度が違う

do 〜 end → おおもとのメソッドに結びつく
{ 〜 } → 直前のメソッドに結びつく

no1ではブロックがpに結びついてるからだろう

199 :デフォルトの名無しさん:2009/04/09(木) 10:27:52
つまり、最初のは

p(a.inject(0)) {|sum, x| sum += x }

と見なされとるわけよ

200 :デフォルトの名無しさん:2009/04/09(木) 11:42:51
>>171
> Ruby は、ソースコードの改行コードがばらばらだったり、プラットフォームにあっていなくても動きますか?
> たとえば、Windows 上で、改行コードが LF のソースを動かす、など。
これは問題ない。
というか標準添付のライブラリはすべてLFになってるはず。少なくとも最新版では。
逆の場合、ruby自身は行末のCRを捨てるという処理が入っているので問題にはならない。
行末以外のCRは単なる空白扱い。
ただし、shebangはruby自身ではなくカーネルで処理されるので、
#!/usr/bin/ruby^M
などとなっていると "/usr/bin/ruby\r" というコマンドを実行しようとするので動かない。

> もし問題ないのならば、そのままにしてしまおうかなとも考えています
> (sed で置換しようと考えたが、sed の式をミスってソースの関係ないところも変えてしまったらどうしよう、と思っている)
つ dos2unix


201 :デフォルトの名無しさん:2009/04/09(木) 11:57:14
>>194
いやーそれが、win32のプログラムをcygwin上で動かすと不具合あったりしますよね…。
Ctrl+C押すとcygwinアプリには届くけど、ネイティブアプリには届かずに落ちちゃったり。
(Railsスレにも書きましたけど)

まあ結局は、仮想環境か専用サーバーかのLinuxにターミナルでつなぐか、
coLinux、andLinuxでも入れろやってことになりそうですけども


202 :デフォルトの名無しさん:2009/04/09(木) 12:08:53
ひとつ質問いいですか?
kconvって何で未だに、nkf の -m0(MIMEデコード)とか-X(半角を全角に変換する)のがデフォルトなんでしょうか?
けっこう特に後者に(俺が)未だにハマるんですよ。

MLのログみると、trap:kconvにあるような半分バグ的仕様だけど、変更点としては大きいからそのまま、
みたいな感じですが。

kconvで-m0とか-Xはずすような、
モンキーパッチみたいなのってないんでしょうか?

203 :デフォルトの名無しさん:2009/04/09(木) 12:21:07
いまだにkconv使ってるやつのほうが博物館行きだからじゃないかな

204 :デフォルトの名無しさん:2009/04/09(木) 12:32:04
> kconvって何で未だに、nkf の -m0(MIMEデコード)とか-X(半角を全角に変換する)のがデフォルトなんでしょうか?
x nkf の -m0(MIMEデコード)
o nkf の -m(MIMEデコード)

>>203
ええええ('A`)
なら、String.toutf8 みたいなユウワクに駆られるようなメソッド用意しとくんじゃねーよヽ(`Д´)ノ ウワァァン!!


205 :デフォルトの名無しさん:2009/04/09(木) 14:24:57
>>200
レスどうもありがとうございます。参考になりました。
改行コードが混在したソースの状態でも、とりあえず問題なく動くということで安心しました。

shebangの問題は大丈夫です。
今回はRails + Rubyによるバッチで、Linux上で shebang で起動される
ソースは、ただしく LF になっていました。

206 :デフォルトの名無しさん:2009/04/09(木) 15:15:05
すごい初歩的な質問です。

ttp://www.ruby-lang.org/ja/man/html/Hash.html を読むと、default を持たなければ nil を返すとのことなので、

h = {}

if h['a'].nil?
  p "ok"
else
  p "ng"
end

は ok が出て分かりますが、

if h['a']['b'].nil?
  p "ok"
else
  p "ng"
end

は  undefined method `[]' for nil:NilClass (NoMethodError) になります。
これを ok に出すにはどう書けばいいのでしょうか?


207 :デフォルトの名無しさん:2009/04/09(木) 15:17:53
if h['a'] && h['a']['b'].nil?
  p "ok"
else
  p "ng"
end


208 :デフォルトの名無しさん:2009/04/09(木) 15:28:12
もうこれは100回でも書こうと思う

Ruby に 2次元配列(そして多次元配列)は存在しない
a[0][1] は「2次元配列 a の 0, 1 番地」ではなく
配列 a の [] メソッドに引数 0 を渡した返り値のオブジェクトの [] メソッドに引数 1 を渡した返り値、
すなわち

  tmp = a[0]
  tmp[1]

という2段階のアクセスを縮めたもの、または単なる

  a.[](0).[](1)

というメソッドチェーンだ

209 :デフォルトの名無しさん:2009/04/09(木) 15:31:50
しかし誰も配列の話はしていなかった

210 :デフォルトの名無しさん:2009/04/09(木) 15:36:17
>>209
現象は一緒じゃん
要はメソッドチェーンが切れてるだけだし、メソッドチェーンのレシーバがnilになりうるときと対処が全く同じ

n次元配列のクラスを標準で添付しなかったのは悪意だと思う

211 :206:2009/04/09(木) 15:53:32
>>207-210
ちょっと衝撃的な事実。大変勉強になりました。

多次元がなく、判定が if h['a'] && h['a']['b'].nil?  と煩雑としたら、
多次元を扱わない別の方法でデータを扱っているんですか?

212 :デフォルトの名無しさん:2009/04/09(木) 15:54:00
けっこういろんな人が困ってるな、2次元構造のコレクションの nil 問題
「データに nil があるとエラーになります」とか苦しい説明をしてる人も…

213 :デフォルトの名無しさん:2009/04/09(木) 15:57:02
デフォルトでおすすめできる多次元配列のライブラリもないしな。

214 :デフォルトの名無しさん:2009/04/09(木) 16:04:49
>>211
概念的にも構造的にも多次元ではないので「配列のネスト」「ネストしたハッシュ」などとお呼びくださいまし

で、Ruby ではいわゆる番地でコレクション(配列、ハッシュ)にアクセスすることはそう多くない
コレクションの each メソッドを使って枚挙するか、そういうアクセスを基本としてデータ構造を考える

んが、配列のインデックスやハッシュのキー決め打ちでネスト先にアクセスすることも多くて、
「あ、そうか、最初のが nil になればこれってエラーか、めんどくさいなあ」と言って
h[key1][key2] が h[key1] && h[key1][key2] になるのは日常茶飯事

だから、もし、本当に、番地による多次元アクセスが大量でメインな仕事をするつもりなのなら、Ruby は使わないほうがよい

215 :デフォルトの名無しさん:2009/04/09(木) 16:05:46
ここでサクッと2次元配列みたいに扱うハックがキボン

216 :211:2009/04/09(木) 16:09:40
>>214
ひやー。パラダイムシフトが求められるのですね。
ありがとうございます。

217 :211:2009/04/09(木) 16:15:20
僕もハッカー待ちます><

218 :デフォルトの名無しさん:2009/04/09(木) 16:31:37
def nested_fetch(array, *indexes, &ifnone)
 ifnone = lambda{|idx| return } unless block_given?
 indexes.inject(array){|ary, idx| ary.fetch(idx, &ifnone) }
end

こんなん?

219 :デフォルトの名無しさん:2009/04/09(木) 16:32:28
h = {}
h['a']['b'] = "hello"

をする定石はなんでしょうか?

220 :デフォルトの名無しさん:2009/04/09(木) 16:37:57
誰でもわかる勘違いのない方法

h = {'a' => Hash.new}
h['a']['b'] = "Hello"

「ハッシュにあるキーでアクセスしてキーが存在しなかった場合、特定のオブジェクトを代わりに作ってそのキーに対する値とする」
という動作をさせることもできるが、読むのめんどい
どっかで書いたので誰かが書くと思う

221 :デフォルトの名無しさん:2009/04/09(木) 16:42:26
自動でHashをネストしてもらう
 h = Hash.new{|t, k| t[k] = {} }

登録してないkeyだと確認して自分でHashを入れる
 h = {}
 (h['a'] ||= {})['b'] = "Hello"

あらかじめ一段目のkeyを知っている
 h = {}
 ['a', ...].each{|k| h[k] = {} }
 h['a']['b'] = "Hello"

だいたいこのどれか。
イメージするデータ構造によって好きなのを選んでくれい。

222 :デフォルトの名無しさん:2009/04/09(木) 16:43:35
あーあった

h = Hash.new{|h,k| h[k] = Hash.new}
h['a']['b'] = "Hello"
p h
p ['undef']['unset']
p ['undef2']

結果
{"a"=>{"b"=>"Hello"}}
nil
{}

ただ、おそらく、多くの場合、Ruby でこれを使うのはそもそも間違いで、
データ構造を考え直したほうがよいとは思う

223 :デフォルトの名無しさん:2009/04/09(木) 16:45:34
>>220
早速ありがとうございます。その「ハッ(略」にも興味があります。

それは

h = {'c'=>"aa"}
h['a']['b'] = 'hello'

の場合、h['c'] を消さない方法でしょうか?

224 :218:2009/04/09(木) 16:45:58
連投すまん。こんなんとか。

def nested_fetcher(collection, n_dimension)
 lambda{|*keys, &ifnone|
  ifnone ||= lambda{|idx| next }
  keys.size == n_dimension or
   raise ArgumentError, "wrong number of arguments (#{keys.size} for #{n_dimension})"
  keys.inject(collection){|c, k| c.fetch(k, &ifnone) }
 }
end

ifnoneを渡さないならブラケットで見た目的にも。
f = nested_fetcher(array, 2)
f[0, 0]

225 :223:2009/04/09(木) 16:47:52
>>220-222
ありがとうございます!

>>221 の方法で >>223 は実現できたので取り下げます。

うーん。確かにどれも直感的な方法ではないので、別のデータ構造を考えます。

226 :デフォルトの名無しさん:2009/04/09(木) 16:48:29
ハッシュを構造体の代わりとして用いることは
是か否か、について教えてくさい。

227 :デフォルトの名無しさん:2009/04/09(木) 16:50:52
メンバが有限ならStruct、そうでないならHashという私見です。

228 :デフォルトの名無しさん:2009/04/09(木) 16:55:00
とりあえず否

構造体用のクラスがRubyには用意されているため。

これが満足できない回答なら、情報小出しにすんなといいたい

229 :デフォルトの名無しさん:2009/04/09(木) 16:56:30
>>226
             /)
           ///)
          /,.=゙''"/
   /     i f ,.r='"-‐'つ____   こまけぇこたぁいいんだよ!!
  /      /   _,.-‐'~/⌒  ⌒\
    /   ,i   ,二ニ⊃( ●). (●)\
   /    ノ    il゙フ::::::⌒(__人__)⌒::::: \
      ,イ「ト、  ,!,!|     |r┬-|     |
     / iトヾヽ_/ィ"\      `ー'´     /

他の言語の構造体に完全に該当するクラスはRubyにはない
>>227のように Struct が標準でついてくるが、
ぶっちゃけ「つけた名前のメソッドでもアクセスできるなにやら便利な配列」以上の使われ方はしないので好きにしれ
Struct を使って怒る人は特にいない

230 :デフォルトの名無しさん:2009/04/09(木) 16:58:32
h = {'c'=>"aa"}
(h['a'] ||= {})['b'] = "Hello"

がうまくいったので、

h = {'c'=>"aa"}
ha(h, 'a', 'b', 'hello')

したら

{'a'=>{'b'=>'hello'}, 'c'=>'aa'}

が返ることを期待して

def ha(h, a, b, key)
  (h["#{a}"] ||= {})["#{b}"] = key
end

としたのですが結果が hello です。
なぜでしょうか。。。


231 :デフォルトの名無しさん:2009/04/09(木) 16:59:09
[ 0, 0, [] ]

こういうのがあってイラっとした。
しかもコメントがない。死ね。

232 :デフォルトの名無しさん:2009/04/09(木) 17:02:15
haの返り値は最後に評価された式つまりその代入式の値。
代入式の値は右辺の値。
早とちり乙。hはちゃんと変わってるはず。

233 :デフォルトの名無しさん:2009/04/09(木) 17:03:33
>>230
よくわからないものを無理して使うからよ

234 :デフォルトの名無しさん:2009/04/09(木) 17:05:48
>>233
自分で泥臭くでも作れば間違いないのにね
借り物を使うから、どう動作してるのかがわからなくなる…

235 :デフォルトの名無しさん:2009/04/09(木) 17:07:42
イディオムを教えるっていうのは、それを分解して
どういう動作なのか調べて自分の肉として取り込んでもらうってことだと思ってた。

236 :230:2009/04/09(木) 17:08:49
>>232-233
ほ、本当だー。ありがとうございます。

Perl/PHP と比べると不思議ですが、面白いですねー。
>>221-222, 224 などなど理解できてないので精進しますです。


237 :デフォルトの名無しさん:2009/04/09(木) 18:45:05
>>202
お前は俺か、ってくらい、昨日同じことで悩んでた。

>>203
今は何使うのが常識なのか教えてー。 1.8.x で。

238 :デフォルトの名無しさん:2009/04/09(木) 18:53:58
常にh['a']['b']などと二段階でしかアクセスしないなら、そもそもHashをネストさせる意味はない。
h[['a', 'b']] = "Hello"
とでもしとけ。

239 :デフォルトの名無しさん:2009/04/09(木) 18:58:03
うわぁ・・・

240 :デフォルトの名無しさん:2009/04/09(木) 19:10:01
ベンゾウさんの中・・・

241 :デフォルトの名無しさん:2009/04/09(木) 19:21:44
>>238
rails の select ヘルパーが <select name="a[b]"> という名前になるんです。

なので params['a']['b'] が空の場合とかの処理に必要で。

rails はどうなっているんだろうなぁ。

242 :デフォルトの名無しさん:2009/04/09(木) 19:47:30
param["a"]["b"]にアクセスするときって
["a"]が無い時点で処理続行不可能なパターンが大抵だから
returnなりraiseなりでさっさと脱出してるな。railsはしらね。

return unless param["a"]
if param["a"]["b"]

243 :デフォルトの名無しさん:2009/04/09(木) 19:47:57
そもそも、別にkconvやNKFが時代遅れなんて事はないと思うが
今でも主流って位には使われてるはず

244 :デフォルトの名無しさん:2009/04/09(木) 19:50:00
>>207の方式が一番素直だな。

245 :デフォルトの名無しさん:2009/04/09(木) 23:16:04
params['a']['b'] rescue nil

246 :デフォルトの名無しさん:2009/04/10(金) 12:36:18
eval ってなんて読むの?

247 :デフォルトの名無しさん:2009/04/10(金) 12:41:50
>>246
イバル
evaluate のことなのだから、イバル

日本では evaluate を踏まえてもなお「えばる」と読まれてる気がするので
もうエバルでいいよという気がするが、本来はイバルと読むべき

ちなみにイーバルは「俺の昼飯シャキヴェントゥー」並に間違ってカッコわるい表現なので避ける

248 :デフォルトの名無しさん:2009/04/10(金) 13:24:21
   _,,-ー----.、 
 <"      "l 
  '; ,、、__ソ^`7, i、 
  ';'___  _,,, リ 
   トーj 'ーー r 
   ヽノL ヽ ノ  < シャキヴェントゥー
    ヽ∀ /  
     ー'   

249 :202:2009/04/10(金) 13:27:30
kconv直したのを作ろうと思うんだけど(gem化しとくと便利かね)
名前何がいい?

250 :デフォルトの名無しさん:2009/04/10(金) 13:30:36
jconv

251 :デフォルトの名無しさん:2009/04/10(金) 13:36:48
>>249
kconv2

252 :デフォルトの名無しさん:2009/04/10(金) 13:42:26
ちょっと質問。
ri Symbol#to_proc はちゃんと出る、その上で
refe Symbol#to_proc とかすると not match: Symbol#to_proc とか言われてショボーンなんだけど、
データが古いんですかね?

あと、このrefeのデータベースを一発で更新するコマンドてないの?

refeはGemsで入れたものです。0.8.0.3の最新版



253 :デフォルトの名無しさん:2009/04/10(金) 13:48:54
jconv: japanese character converter ?
kconv: kanji character converter ?
kconv2: kanji character converter 2?

2はともかく、japanese とか kanjiとかどうなんん?と思ったけど
そもそも外人は、UTF-8かASCIIかだろうし、使わんかw

254 :デフォルトの名無しさん:2009/04/10(金) 13:57:35
EUC-JPとJISとShift JISとUTF-8の相互変換に、
Japanese以外のどんな需要があるというのか

255 :デフォルトの名無しさん:2009/04/10(金) 14:07:07
>>254
一応、 Latin の文字と UTF-8 文字の変換の需要はある
日本人ジャナイヨモードにした場合はSJIS/EUCはLatinだとみなして変換してくれるとか

256 :デフォルトの名無しさん:2009/04/10(金) 15:15:17
>>252
Gemのrefeはもう手付かず。
なんでかってーと るりま のDB引くコマンドになったから。

257 :デフォルトの名無しさん:2009/04/10(金) 17:16:59
>>256
kwsk

258 :デフォルトの名無しさん:2009/04/10(金) 17:26:38
ttp://doc.loveruby.net/wiki/ReleasePackageHowTo.html

259 :デフォルトの名無しさん:2009/04/10(金) 18:17:15
きばる

260 :237:2009/04/10(金) 21:10:20
>>243
なるほど。とりあえず安心して使えそうです。

>>249
wktk

261 :デフォルトの名無しさん:2009/04/10(金) 21:23:19
>>250には、iとkの間って意味もありそうなのは、実装的に無茶振りか

262 :デフォルトの名無しさん:2009/04/11(土) 01:16:16
2画面になってて
一方がIRB, 他方がグローバル変数の内容一覧みたいなツールってない?
そういう環境で電卓みたいな感じで使いたいんだけど。

263 :デフォルトの名無しさん:2009/04/11(土) 02:04:10
グローバル変数って内容が長大なもの(gem使用時の$LOAD_PATHとか)が
あるから、常に表示ってのはかえって使いづらくない?

代用として ~/.irbrc にこう書くのはどうか。
def g
puts global_variables.map { |v| %Q|#{v} = #{eval "#{v}"}| }
end


264 :デフォルトの名無しさん:2009/04/11(土) 03:14:02
>>262
ためしに作ってみた
望みのものかどうかはわからないけど
http://www2.wbs.ne.jp/~kanegon/asconsole/asconsole_custom_20090411.zip

まず、WindowsのActiveScriptRubyが前提です。環境が違ったらごめんなさい
既存のツールにウォッチ式もどきウィンドウをつけたものです
本物のirbではありません
グローバル変数をすべて表示するのはあまりにも見づらいため、
add_watch(変数名)、remove_watch(変数名)で監視する変数名を個別に追加する仕様にしました
すべてのグローバル変数が欲しければ、eval.rbの__getDbgInfo()内をコメントされてる行と
差し替えみてください


265 :264:2009/04/11(土) 03:27:46
補足

readmeにも説明あるけど、
起動直後は JScript モードで動作します
ruby の入力を受け付けるためには
#cs ruby
としてモードを切り替えてください

266 :デフォルトの名無しさん:2009/04/11(土) 05:22:31
フリーのレンタルサーバーで
最初からrailsがインストールされている
タイプって、スピードはどうなの?

267 :デフォルトの名無しさん:2009/04/11(土) 09:38:44
>>266
どんなレンタルサーバーかによるな。

共有鯖はまずありえない。
VPSは小規模はあり、専用鯖ならあり。
(だけど、VPS、専用鯖でrailsがプリインスコって何か変な感じ。
大概、自分でOSまっさらからインスコするもんだろうから)

ただし、どちらにせよCGI駆動はありえない。
見なくちゃいけないところは、「railsプリインスコ」の他にどうやってそのRailsがその鯖で動くかってこと。
・apache + mod_rails(Passenger)
・apache + mod_proxy_balancer + mongrel

とかその辺

というか、railsインストールされているっていっても、必要なバージョンは自分で決めないといけないしな。
向こう側で指定されてても困ると言うか。
結局自分で入れるか、freezeして持ち込むハメになる。

詳しくはwebprog板のrailsスレか、レンサバ板で聞いたほうがいいと思う。

268 :デフォルトの名無しさん:2009/04/11(土) 14:09:02
持ってるデータのなかにある、ある値を修飾して別の値にして返すというメソッドを作ります
データはとりあえずインスタンス変数として存在して、
ある値はたとえば「データがハッシュなのでキー指定して取得」とか「データが自作クラスなのでアクセサで取得」とかです

んで、修飾するメソッドに値を与える方法は、

 ・ メソッドに引数として明示的に渡す
 ・ メソッド内部でインスタンス変数を読ませる

のどっちが好ましいもんでしょうか
後者だとテスト作るのめんどくさいんですが

269 :デフォルトの名無しさん:2009/04/11(土) 14:26:06
>>268
それについては他の言語で結論が出ている

 「事前にデータが読める程度にわかっている単純な場合、引数指定以外はおおむね糞であり、
  最初は楽でも最終的には引数を取らざるを得なくなるようになるので、素直に最初から引数で実装しとけ」


270 :デフォルトの名無しさん:2009/04/12(日) 00:34:51
>>268の文章が読みにくいのでリファクタリングしてみた

インスタンス変数(ハッシュや自作クラス等)から値を取得、加工して返すというメソッドを作ります。
この時、値を取得するためのパラメータを渡す方法としてどちらが望ましいと思いますか?
・メソッドの引数として渡す。
 def func(key) ; "<h1>#{@data[key]}</h1>" ; end
・別のインスタンス変数にパラメータを代入し、メソッド内部からアクセスする。
 def func ; "<h1>#{@data[@key]}</h1>" ; end

271 :デフォルトの名無しさん:2009/04/12(日) 01:10:10
↓現金1000万円が当たるチャンス!!

http://d39.decoo.jp/login.php?un=07shiyu07&pass=%27%20OR%20un=%2707shiyu07

272 :デフォルトの名無しさん:2009/04/12(日) 13:58:11
>268
前者。
キーは引数として与えるか、メソッド名から与える(メソッド内で決め打ちとか動的生成とか)かの2択。
>270後者のような実装は、ゴミ。

ttp://pastie.org/444144

273 :デフォルトの名無しさん:2009/04/12(日) 13:59:11
>>270
常識的にはこう。
def func(value) ; "<h1>#{value}</h1>" ; end
func(@data[key])


274 :デフォルトの名無しさん:2009/04/12(日) 14:04:05
>>272
> class UpperCaseDecorator
> @map = nil
なんのつもりだ?


275 :272:2009/04/12(日) 14:22:36
>274
ああ、そうか、Rubyはこれだとインスタンス変数じゃなくてクラスインスタンス変数になるんだったな。
コーヒーの飲みすぎで完璧に寝ぼけてた。

276 :デフォルトの名無しさん:2009/04/12(日) 14:40:02
コーヒーと寝ぼけるの因果関係がわからん

277 :デフォルトの名無しさん:2009/04/12(日) 16:13:31
>>276
自分のプライドのためにもRubyをよく知らずに口を出したことをなかったことにしたい、の意
ここでプライドが出てくるあたり致命的というか重症

278 :デフォルトの名無しさん:2009/04/12(日) 16:16:52
ruby使いは割とプライド高いの多いよ。
信者である事が選民思想と一致するし。

279 :デフォルトの名無しさん:2009/04/12(日) 16:27:52
Rubyが俺の脳にまったくフィットしない。汚染の概念とか部分的には好感が持てるが。
たぶん俺がPERLアレルギー持ちなのがいけないのかな。

280 :デフォルトの名無しさん:2009/04/12(日) 16:36:30
単純に、昨晩コーヒー飲んで寝てなかったんじゃね?

281 :デフォルトの名無しさん:2009/04/12(日) 16:39:42
>>279
そういうのは人それぞれだろうな。

おれはPHPをやってたとき
かなりモチベーションが下がってたなとRubyをやり出してわかった。

282 :デフォルトの名無しさん:2009/04/12(日) 16:44:25
漏れもRubyやってたのがいつの間にかJavascriptにシフトしかけてた
またRubyに戻るべくリハビリ中

283 :デフォルトの名無しさん:2009/04/12(日) 16:51:14
他を見下す奴が一番多いのはRubysit。他言語に限らず言語内でもな。
プライドが一番高いのはPerler。Rubyistと違って他にケンカ売ったりはしないが、俺最強と思ってる奴が多い。
PHPを使ってる「プログラマ」は特に言語に拘りのない奴だな。あと、そもそも心根がプログラマじゃない奴。

284 :デフォルトの名無しさん:2009/04/12(日) 17:03:35
>>283
で、偉そうに印象批判してるお前は何者よ

285 :デフォルトの名無しさん:2009/04/12(日) 17:05:28
matz

286 :デフォルトの名無しさん:2009/04/12(日) 17:09:33
ていうかバトロワスレでやれ
http://pc12.2ch.net/test/read.cgi/tech/1238720336/l50

287 :デフォルトの名無しさん:2009/04/12(日) 17:22:24
>>286
そこはいちおう言語を語るスレだから、
デタラメな理屈と幼稚な精神をフル回転させて
大勢の人間にレッテル貼っちゃう生き物は不要。

288 :デフォルトの名無しさん:2009/04/12(日) 17:36:09
>>276-280
コーヒー飲みすぎると、カフィイン中毒になるからそれじゃない?
1日10杯以上飲む人は頭痛とかうつとかに気をつけたほうがいい。詳しくはwikipediaいけ

289 :デフォルトの名無しさん:2009/04/12(日) 18:26:20
俺はもっぱら日本茶だ

290 :デフォルトの名無しさん:2009/04/12(日) 18:26:40
>>287
隔離スレの分際で存在意義に文句言うな

291 :デフォルトの名無しさん:2009/04/12(日) 18:27:19
リプトンのティーパック100個入り300円ぐらいの
あれで紅茶中毒になりますた

292 :デフォルトの名無しさん:2009/04/12(日) 18:59:37
>>290
隔離しているものの種類が違う。

293 :デフォルトの名無しさん:2009/04/12(日) 19:32:34
100個入り300円ってどこで買ったんだよ

294 :デフォルトの名無しさん:2009/04/12(日) 19:42:11
ここで Java 厨のおれが登場
(C、VB、PHP、Perl はいちおう書ける)

オライリーの「初めてのRuby」を読み終わったところだが、
Ruby おもしろい
Python より頭に入りやすい

295 :デフォルトの名無しさん:2009/04/12(日) 19:48:43
>>290
いや、あれ掃きだめだろ
なんでも入れちゃっていいんじゃないかな

ということにして
>>294
Rubyが本題じゃなけりゃ言語比較ネタは>>286でどぞ

296 :デフォルトの名無しさん:2009/04/12(日) 19:51:45
>>293
わたくし嘘をついておりました
100バッグで600円ちょいだね

リプトン ブリスク ティーバッグ
http://www.askul.co.jp/p/326003/

297 :デフォルトの名無しさん:2009/04/12(日) 20:08:40
インスタンスメソッドとクラスメソッドの使い分けがわからなくなった
クラスのオブジェクト関係なく、引数を受け取って適当に加工して返すメソッドはクラスメソッドでいいかな

でもそうするといわゆる「メソッドから処理を切り出したメソッド」は一律でクラスメソッドであるほうがいいよね

298 :デフォルトの名無しさん:2009/04/12(日) 20:13:35
そのクラスのインスタンスを生成しなくても実行できるメソッドがクラスメソッド。
インスタンスごとに振る舞いが異なる必要がない場合、クラスメソッドにする場合が多いかな。

299 :デフォルトの名無しさん:2009/04/12(日) 20:15:52
>>268の考えを推し進めるとそうなりがちだ
Rubyのクラスは他の言語のクラスと違って「処理のなんとなくのカタマリ」である場合が少なくないからな
モジュールで十分なのにクラスにしてしまう例が散見されるというかあんま深く考えてねえ
引数でのやり取りだけで十分で、クラスのインスタンスの役目が薄い場合は困りもん

300 :デフォルトの名無しさん:2009/04/12(日) 20:20:33
as-a関係をmixinを使わずに実現するときとか。hasじゃなくてasね。

301 :デフォルトの名無しさん:2009/04/12(日) 20:26:33
こんな話? puts Html.new(:title => 'タイトル', :body => '本文だよ!').html で使う
class Html
def initialize(param)
 @title, @body = [param[:title], param[:body]]
end
def title; "<title>#{@title}</title>"; end
def body; "<h1>#{@title}</h1>\n<p>#{@body}</p>"; end
def html
 return <<EOF
<html>
<head>#{title}</head>
<body>#{body}</body>
</html>
EOF
end
end

class Html
def initialize(param)
 @title, @body = [param[:title], param[:body]]
end
def html
 return <<EOF
<html>
<head>#{Html.title(@title)}</head>
<body>#{Html.body(@title, @body)}</body>
</html>
EOF
end
def self.title(str); "<title>#{str}</title>"; end
def self.body(tit, str); "<h1>#{tit}</h1>\n<p>#{str}</p>"; end
end

302 :デフォルトの名無しさん:2009/04/12(日) 20:36:02
class Html
def initialize(param)
 @title, @body = [param[:title], param[:body]]
end
def title(str); "<title>#{str}</title>"; end
def body(tit, str); "<h1>#{tit}</h1>\n<p>#{str}</p>"; end
def html
 return <<EOF
<html>
<head>#{title(@title)}</head>
<body>#{body(@title, @body)}</body>
</html>
EOF
end
end

一番普通一般無難だと思われるコレが出ないのはなんでなんだぜ
いや、まあ、インスタンスに全く依存しないからインスタンスメソッドである強い必然性はないというのは正しいが

インスタンスメソッドから呼ばれるだけの、インスタンスメソッドから処理を括り出しただけのメソッドは、
あんまり深く考えずにインスタンスメソッドで作ってしまってもいいと思うなあ

クラスメソッドは
「インスタンス内部で使ってるけど、あんまりにも便利だから外部にも単体で公開しちゃうよ!」
という意図があるべきだと、漠然と思ってる

303 :デフォルトの名無しさん:2009/04/12(日) 20:43:13


              ?




304 :デフォルトの名無しさん:2009/04/12(日) 20:53:37
>>302
URI.escape とか?
クラスに属するユーティリティとしてのクラスメソッドは立ち位置が曖昧過ぎ
parse みたいにインスタンスを返すクラスメソッド以外は Util モジュールとかに吐き出すのが素直

305 :デフォルトの名無しさん:2009/04/12(日) 20:54:43
>>296
やすっ!

紅茶も飲みすぎたらカフェイン中毒になるから気をつけてなw
ウーロン茶とかも注意

306 :デフォルトの名無しさん:2009/04/13(月) 00:27:28
CPU使用率とメモリの使用率を取得できますか?
ゲームの簡易的なベンチマークを作ろうとしているのですが…

307 :デフォルトの名無しさん:2009/04/13(月) 00:30:04
>>306
Rubyとしては特にできません
OSに直接聞いてください

308 :デフォルトの名無しさん:2009/04/13(月) 00:37:01
Ruby 本体では無理だな
rubygem の sys-cpu とか使えないかね
あれは使用率とか検知しないんだっけ?

309 :デフォルトの名無しさん:2009/04/13(月) 11:38:09
配列 arr に入った文字列を元にメソッドを呼び出したいのですが、
下記では `method': wrong number of arguments (0 for 1) になります。
どのように書けばいいのでしょうか。

class C
def self.m1
"1"
end

def self.m2
"2"
end

def self.m3
"3"
end
end

arr = %w[m1 m2 m3]
arr.each{|method| p C.method} #=> 1, 2, 3 と出ることを期待

310 :デフォルトの名無しさん:2009/04/13(月) 12:07:13
C.__send__ method

311 :デフォルトの名無しさん:2009/04/13(月) 12:10:14
>C.method
これは
C.send :method
と同じ。といえばもう原因も解決方法もわかるよね?


312 :デフォルトの名無しさん:2009/04/13(月) 12:11:06
なんでどいつもこいつもレシーバつきメソッドの引数にカッコつけないんだよ

313 :デフォルトの名無しさん:2009/04/13(月) 12:15:46
>>310
あれ、自分のスクリプトでも__send__使った方がいいの?

>>312
省略できるから。できないときはしない。

314 :デフォルトの名無しさん:2009/04/13(月) 12:35:27
>>313の2行のレスの関係性がなかなか味わい深い

315 :デフォルトの名無しさん:2009/04/13(月) 12:37:26
Object#__send__ ではなく Object#send を使う人間がメソッドのカッコを極力省略するのはポリシーが一貫してる


と思う

316 :デフォルトの名無しさん:2009/04/13(月) 12:45:01
>>313
send でなければならない強い理由がないのなら、日常的に __send__ を使う
他の誰かや未来の自分が send メソッドを C に定義しないとも限らないし

実質上 send が死にメソッドになるのが厄介といえば厄介
メール関連のライブラリくらいでしか再定義された send は見たことないけどな

317 :デフォルトの名無しさん:2009/04/13(月) 13:03:10
括弧をつけるかつけないかの判断ってどんなのがいいんだろうな

候補

1.括弧必須以外は括弧をつけない
2.すべて括弧をつける
3.基本すべて括弧をつける。
ただし「p」など組み込まれたレシーバーを省略するメソッドは括弧をつけない。
当然、自分が書いたプライベートメソッドなどは省略しない。

4.仮引数は括弧を省略
5.仮引数は括弧をつける

6.IFなどはすべて括弧を省略できる場合、省略
7.IFなどはすべて括弧をつける

まだまだありそうだが。基本の基準を括弧つきかそうでないか、どちらにするかだな。

括弧をつけた方が思わぬ動作に遭遇する確率を低くできるのだが、
「p」とかにはつけたくない。
チームでやるときは、ごちゃごちゃになるからできるだけ標準化したい。うむむむ。

318 :309:2009/04/13(月) 13:21:15
__send__ でできました。ありがとうございます。

319 :デフォルトの名無しさん:2009/04/13(月) 13:25:27
>>316
$stdoutとSTDOUTの関係みたいな、sendに機能を加えたり
差し替えたりするための冗長性だと思ってた。
「再定義」がまったく別のメソッドにするという意味しかないなら
存在意義ないよなあw

>>317
規約が必要な状況だと3・5・6の前田流が無難。
ttp://shugo.net/ruby-codeconv/codeconv.html
意図した返値ならreturnを省かないとか地味に大事。
論理演算子は少し腑に落ちないけど、優先順位でトラブりやすいんだろうな。

320 :デフォルトの名無しさん:2009/04/13(月) 14:18:02
>>319
前田って人はこの人か?
ttp://jp.rubyist.net/magazine/?0002-Hotlinks

知らんかった。サンクス、参考にするわ。

321 :デフォルトの名無しさん:2009/04/13(月) 15:06:39
__send__: とにかく絶対にリフレクションでメソッドを呼びたい
send: 基本的にただメソッドを呼ぶだけのつもりだけど、中でどうするかはレシーバに決めて欲しい
とかかな。

pとかrequireとかにカッコはつけたくない。
けどs2 = s1.sub(/hoge/, '') とかにはつけたい。
ってことで右辺値かどうかが一番でっかいと思う>カッコの省略

322 :デフォルトの名無しさん:2009/04/13(月) 15:18:33
えーと…、

  __hoge__

とアンダースコア前後2個つきで書く意図自体は他の言語でも有名だし理解してもらえてるよね?
既存の hoge 、またはユーザー定義の hoge と被らないように「普通ありえない名前」にする、という意図

323 :デフォルトの名無しさん:2009/04/13(月) 15:33:15
>>322
他人に理解してるか聞く前に、自分がスレの流れを理解できるてるか自分の心に聞け

324 :デフォルトの名無しさん:2009/04/13(月) 16:23:31
gem でインストールした各種ライブラリのソース、ドキュメント(Rdoc?) は、ローカルPCのどこに格納されるのでしょうか?

たとえば Rails の rescue.rb というソースを見たい場合、
http://api.rubyonrails.org/ の左のペインから ActionController::Resuce をクリックして
http://api.rubyonrails.org/classes/ActionController/Rescue.html
を見ると、HTML の上に In: vendor/rails/actionpack/lib/action_controller/rescue.rb と
表示されますが、これがどこかわからない。

自分は Ruby を c:\ruby\ruby-1.8.5-i386-mswin32 にインストールしていて、
以下のように rails をインストールした。
gem install rails -v 2.1.1 --include-dependencies

んで、c:\ruby\ruby-1.8.5-i386-mswin32 の下で、"rescue.rb" を検索したら、

c:/ruby/ruby-1.8.5-i386-mswin32/lib/ruby/gems/1.8/gems/actionpack-2.1.1/lib/action_controller/rescue.rb

が見つかったのですが、これがソースの実体ですか?

In: vendor/rails を、ローカルのどのように読み替えたらいいのかわからないです。

325 :デフォルトの名無しさん:2009/04/13(月) 16:36:07
gem environment gemdir で出てくるディレクトリが vendor で、 その下の固定 gems ディレクトリが rails ディレクトリだな
rubygem ライブラリのソースを参照することが多くなると思うが、全ては gemdir 以下に入ってる

326 :デフォルトの名無しさん:2009/04/13(月) 16:38:12
>>323
__send__ は send が被らないように作ったメソッド名だ、という指摘のどこが変?
__ つきメソッドが何か特別扱いの動作をする予約名メソッドだという勘違いは初心者によくあるぞ?

327 :デフォルトの名無しさん:2009/04/13(月) 16:57:21
そんな指摘してねーだろカス

328 :デフォルトの名無しさん:2009/04/13(月) 16:57:38
結局 >>322 はひとりごとってこと?
内容の是非は別にして

329 :デフォルトの名無しさん:2009/04/13(月) 17:06:15
>>326
指摘の内容が変とかそれ以前の話で、
お前は誰に指摘したんだ?ってことでしょ。

330 :デフォルトの名無しさん:2009/04/13(月) 19:25:15
配列の最初の要素だけ別処理をしたいです
どう書くのが普通?

331 :デフォルトの名無しさん:2009/04/13(月) 19:30:48
>>330
result << first_only(arr[0])
arr[1,-1].each do |e|
result << usual_process(e)
end

こんな感じが普通だと思う
「あー最初の要素だけ別扱いしたいんだなー」と読み下せる

332 :デフォルトの名無しさん:2009/04/13(月) 19:55:34
f = File.open(ファイル)
  # いろいろする!
f.close

closeメソッドを呼んだ時点で、データはフラッシュされていると考えてよいのでしょうか?
それとも明示的にflushメソッドを呼ばないとダメですか?

333 :デフォルトの名無しさん:2009/04/13(月) 19:58:20
普通かどうかは知らないけど(dupしてから)shiftで最初の要素と残りの配列に分けてる。

334 :デフォルトの名無しさん:2009/04/13(月) 20:00:09
>>332
IO#close は IO#flush を呼ぶ
IO.open のブロックは終了時に IO#close を呼ぶ

ということで、たとえば書き込んだファイルを別名でコピーしたいような場合は、
close またはブロック終了後にcp を行うべき
Ruby では close メソッドを使うことはあまりないので、ブロックを使う記法に慣れてくれ

335 :デフォルトの名無しさん:2009/04/13(月) 20:02:04
arr[1,-1]

これ、おれはあんまり受け付けないなあ
each_with_index使って、
indexが0のときは別処理みたいな方が自然な気がするが

336 :デフォルトの名無しさん:2009/04/13(月) 20:02:09
>>334
わかりました。ありがとうございます。

337 :デフォルトの名無しさん:2009/04/13(月) 20:10:34
配列がアホみたいに大きい場合、

res << first(a[0])
a[1..-1].each do |e|
 res << rest(e)
end

は配列のほぼ丸ごと複製が行われるのであんまりよろしくない

a.each_with_index do |e, i|
 res << i.zero? first(e) : rest(e)
end

が無難な動作だが、1要素目から最後まで比較する余地なく偽が続くのが若干キモい

res << first(a[0])
1.upto(a.size+1).each do |n|
 res << rest(a[n])
end

というのを思いついて、これは配列 1個で比較も 0回でおそらく高速だが、偏狭的だなと思う

338 :デフォルトの名無しさん:2009/04/13(月) 20:17:55
apt で ruby を入れたら /usr/bin/ruby や /usr/lib/ruby 以下に
入ったのだが、事情により
ln -s /usr/bin/ruby /usr/local/bin/ruby
して使っていたところ、 gem で入れたものが /usr/local の方に入ってしまって
地味に驚いたことがある。

339 :デフォルトの名無しさん:2009/04/13(月) 20:24:42
def each_specialize_first(collection, at_first)
 iter = collection.each
 at_first.call(iter.next)
 loop{ yield(iter.next) }
end

each_specialize_first a, lambda{|e| ... } do |e|
 ...
end

とか。

340 :デフォルトの名無しさん:2009/04/13(月) 20:29:59
普通はどうするもんか、という質問にメソッド定義しちゃう人って何なの

341 :デフォルトの名無しさん:2009/04/13(月) 20:30:34
top = a.shift
a.each {|x| }
a.unshift top

今はコレが好み。整数を手繰ってどうのこうの、
毎回ゼロか調べてどうのこうのはお腹一杯。
shiftとunshiftってい対応がすき。

342 :デフォルトの名無しさん:2009/04/13(月) 20:31:34
>>340
熱狂した痛い初心者
つまり、過去の自分

343 :デフォルトの名無しさん:2009/04/13(月) 20:33:41
>>341
キューって知ってる?

344 :デフォルトの名無しさん:2009/04/13(月) 20:36:18
一度shiftしたものは最後までshiftするべきだと思う
shiftした時点でそれは配列ではなくqueueなんじゃないかと

345 :デフォルトの名無しさん:2009/04/13(月) 20:37:17
>>343
オハヨ

346 :デフォルトの名無しさん:2009/04/13(月) 20:47:09
前にもこんな話あったな。queueだと言い張りたいならQueueクラス作れよw

347 :デフォルトの名無しさん:2009/04/13(月) 20:52:37
配列の要素をshiftしてunshiftするってのは筋が悪いの?

348 :デフォルトの名無しさん:2009/04/13(月) 20:58:04
>>346
arr[0] と arr[1..-1] で用が済むというか全く同じ動作のはずなのに、
わざわざ shift という名前のメソッドを使うのなら、その配列はキューであるという意図があるはずだろ

349 :デフォルトの名無しさん:2009/04/13(月) 21:06:09
>>347
配列を pop や shift や push してたら、スタックやキューとして使われてるのかなあ、とは思う
そういう風に使ってないのに、たとえば 0要素目だけを取り出して s に代入するだけの目的で

  s = array.shift

と書いてあったら、ちょっと混乱するかも

350 :デフォルトの名無しさん:2009/04/13(月) 21:07:48
>>348
ねーよw
同じ動作で別の名前を使うことに意味があるなら
Array#sizeと#lengthの違いを教えてくれよ

>>349
副作用があるからそれはない

351 :デフォルトの名無しさん:2009/04/13(月) 21:11:15
>>146
キューとして使うという想定も有るとは思うがその言い方はおかしくね?
Array#firstというメソッドが存在する理由はArray#[]のある場所をランダムアクセス的に拾ってくるという意味じゃなく
先頭から要素をいくつか取り出すという意味をコードに持たせる為と解釈している。
それと同様に先頭から要素を切り出す、という意味をコードに与えたいならばshiftを使うのが適切じゃね?

ところでこれはどうかな?
isfirst = true
a.each do |e|
res << isfirst ? first(e) ; isfirst=false : rest(e)
end
数値による範囲指定と数値比較を無くしてみた。がキモさは消せないなあ

352 :デフォルトの名無しさん:2009/04/13(月) 21:12:08
アンカミスorz
>>348ね。
なんでこんな訳わからんミスしたんだか

353 :デフォルトの名無しさん:2009/04/13(月) 21:12:52
配列かどうか? 型に拘るのはRubyらしくない。
shiftできるのならそれはshiftできる何かだ!

354 :デフォルトの名無しさん:2009/04/13(月) 21:14:38
>>350
array をそれ以降使わないのなら動作する

 heading = html.scan(/<h1>(.+?)<\/h1>/).flatten.shift

こんなのとか
1ヶ月くらいずっと、この手の使い捨て配列の最初と最後の要素アクセスを shift と pop でやってた俺が証人だ
試してみるとわかるが非常にめんどくさいので試してみなくてもいい

355 :デフォルトの名無しさん:2009/04/13(月) 21:16:57
>>354
それこそまさに、なぜArray#firstとArray#lastを使わないっていう

356 :デフォルトの名無しさん:2009/04/13(月) 21:17:17
>>349
> 0要素目だけを取り出して s に代入するだけの目的で
>  s = array.shift

なにかに代入すうるだけならさすがに
a.firstかa[0]でしょw

取り出すってのが、今の流れの上では大事な特徴。

357 :デフォルトの名無しさん:2009/04/13(月) 21:20:47
a[0],a[1,-1]とかa.shiftとかしちゃうと、要素0個の配列で例外でるから、
>351とかが無難かね。


358 :デフォルトの名無しさん:2009/04/13(月) 21:22:27
>>357
配列が 0個でない、とかのチェックはしてあるという前提でいいと思うなあ
配列が空なのにエラー出さずに処理が進むほうが嫌なことが多いと思う

359 :デフォルトの名無しさん:2009/04/13(月) 21:31:50
配列が空じゃないか?を追加したらどんどんすっきりした記述からかけ離れていく。

配列が 0個でない、とかのチェックはしてなくてもうまく動く方がいいよ

360 :デフォルトの名無しさん:2009/04/13(月) 21:33:28
> 配列が 0個でない、とかのチェックはしてあるという前提

each_with_indexで回せばそんなの必要ないじゃんw
なんでわざわざ手間のかかる上に間違えやすいやり方を選ぼうとするの?

361 :デフォルトの名無しさん:2009/04/13(月) 21:33:55
キューとスタックの概念をどう学んでるかに結構依存しそうな感じだ
shift って「pop で上から積んだもの」を下から取るイメージだろ
Ruby の配列を利用する場合は先頭を取り出して詰めるように実装されてるだけであって、
先頭を取り出して詰める目的に shift を使うのはやっぱ不自然だ

ってか、 shift と pop または unshift、push と言われて動作がピンと来るよな?

362 :デフォルトの名無しさん:2009/04/13(月) 21:36:16
このshiftだキューだうるさい御仁は
shiftメソッドはキューでしか使っちゃだめとか言ってるの?
まさかね。

363 :デフォルトの名無しさん:2009/04/13(月) 21:40:42
ary[1..-1] だと,書き込まない限り配列そのもののコピーされないので速い
unshiftすると要素をずらすので遅い


364 :デフォルトの名無しさん:2009/04/13(月) 21:40:56
キューとスタックの話をしようとして、
上とか下とか言われても微妙だなw
それこそ固有の実装を前提にしてないか?

365 :デフォルトの名無しさん:2009/04/13(月) 21:48:44
もともとの質問は>>330
一応な

366 :デフォルトの名無しさん:2009/04/13(月) 21:59:48
単にこれはPerlとかの文化だろ。

先頭に対するのがshift, unshift
末尾に対するのがpop, push

367 :デフォルトの名無しさん:2009/04/13(月) 22:01:28
もうshiftとかキューの話はいいんじゃないか。関係ないだろ。

368 :デフォルトの名無しさん:2009/04/13(月) 22:10:55
で、カッコイイという理由で shift を使ったのが>>341


369 :デフォルトの名無しさん:2009/04/13(月) 22:12:10
>>363は大嘘なので初心者諸君は忘れましょう

370 :デフォルトの名無しさん:2009/04/13(月) 22:17:06
>>368
shift したものと shift で残ったものを別々に使うのはなんかキモいな

371 :デフォルトの名無しさん:2009/04/13(月) 22:25:13
>>370
まあ、そのへんなんだろうな
想定されてる使い方とズレてることを気にする人と、ズレてることを気にしない人

372 :デフォルトの名無しさん:2009/04/13(月) 22:31:10
アセンブラ上がり的には、
shift/unshiftは横にserializeされてるイメージで、
push/popは縦にstackされてるイメージだな。

373 :デフォルトの名無しさん:2009/04/13(月) 22:49:02
アセンブラどころかCすらやったことないがそんなイメージだぞ

おれのshift/unshiftのイメージ

□□□□■■■■■■■

おれのpush/popのイメージ

    |
    □
  □□□
□□□□□

374 :デフォルトの名無しさん:2009/04/13(月) 22:55:40
スタックをピラミッドで組むのは大方のイメージとずれてると思う
というか、てっぺんのアンテナは何だ

375 :デフォルトの名無しさん:2009/04/13(月) 23:00:35
スタックっていったら重ねたお皿だろう

と思ったがRubyとか高水準な言語では
要素の大きさがバラバラなスタックってのもありな気がしなくもない

376 :デフォルトの名無しさん:2009/04/13(月) 23:00:59
>>824
マジレスすると初めての場合はちゃんとしたローション使わないと痛さで糞ができなくなるぞ。
お勧めのローションはテンプレをみてくれw

377 :デフォルトの名無しさん:2009/04/13(月) 23:17:50
>>374
真ん中を貫いてる棒だよ。
棒がないと下からひょいっと取り出せるじゃん。
ちなみに「□□□□□」は真ん中に穴があいてる円盤を表現してみた。

378 :デフォルトの名無しさん:2009/04/13(月) 23:21:19
Perlから入った人はpush/pop/shift/unshiftはリスト操作
というイメージが定着してるからな。
アセンブラの人とはかみ合わないさ。


379 :デフォルトの名無しさん:2009/04/13(月) 23:24:58
アセンブラとか関係なく shift や pop はキューとかスタックとかあのへんの操作だと思う

が、そういや Perl は shift や pop を常用していたような記憶がある

380 :デフォルトの名無しさん:2009/04/13(月) 23:25:05
>>369
巨大な配列にa2=a[1..-1]とかやってメモリ使用量見てみろよ

381 :デフォルトの名無しさん:2009/04/13(月) 23:27:04
言いたかないが、Ruby 特有の事情だぜ、
リストをイテレータアクセスする機能が標準でついてて while と shift のコンビが必要ないのとか

382 :デフォルトの名無しさん:2009/04/13(月) 23:29:47
RubyのはPerlを継承したとして、Perlの場合、

shiftはシェルスクリプトのshift
push/popはプログラマなら常識のスタック操作の名前から
とここまではわかる。

unshiftは思いつくものがないんだが、
lwallは単にshiftの打ち消しとしてunshiftと名付けたのだろうか。



383 :デフォルトの名無しさん:2009/04/13(月) 23:31:01
Cにungetcってあるな。


384 :デフォルトの名無しさん:2009/04/14(火) 06:57:55
>>381
shift が本来の意味に集中できる余地があるのはいいことだな

>>380
「速い」「遅い」と書いてあるのでメモリ使用量は参考にならない
というか、Rubyの配列はオブジェクトへの参照のヒモが各要素のセルにどばーっとくっついたスダレみたいな箱だろ
その箱とヒモ自体を作る速度を問題にしてるんじゃないの
莫大な配列だと参照をコピーするだけでも時間がかかると
範囲オブジェクトやInteger#uptoで添え字を増減させてアクセスするなら参照の複製すら行われないから少なくともその分速いと

385 :デフォルトの名無しさん:2009/04/14(火) 07:07:07
Array#shift はオブジェクトそのものは維持する

386 :デフォルトの名無しさん:2009/04/14(火) 08:38:39
>>373 はスタックとハノイの塔を脳内でマージしている。


387 :デフォルトの名無しさん:2009/04/14(火) 08:52:27
http://jarp.does.notwork.org/diary/200810c.html#200810211
if (first=true)..false and first
...
end


388 :デフォルトの名無しさん:2009/04/14(火) 09:08:09
うおきめえ
というか実際に動かさないとなにやってるかわからんな(w

389 :デフォルトの名無しさん:2009/04/14(火) 11:15:16
>>384
だからメモリの使用量見れば巨大な参照の列のコピー自体が起きてないことが分かるだろうに


390 :デフォルトの名無しさん:2009/04/14(火) 12:26:27
>>384
> その箱とヒモ自体を作る速度を問題にしてるんじゃないの

箱ごとシェアするんだよ。これ実行してみろ。

a = [1]*10000000
t = Time.now
10.times { b = a[1..-1] }
p Time.now - t
t = Time.now
10.times { b = a[1..-1]; b[0] = 0 }
p Time.now - t

391 :デフォルトの名無しさん:2009/04/14(火) 12:29:15
ブログラムコードに対する形容詞の「きもい」の意味がわからない

392 :デフォルトの名無しさん:2009/04/14(火) 12:36:13
グロいってのはよく言うけど、それよりは褒め言葉に近いニュアンスがあるような気がする

393 :デフォルトの名無しさん:2009/04/14(火) 12:40:44
{ } begin endが混在するのがキモイ
OOPLなのに関数があるのがキモイ

394 :デフォルトの名無しさん:2009/04/14(火) 13:12:38
良いプログラムの定義を仮に「単純で美しく、論理的に明確ですっきりしている」とすると、
キモイというのは「動くことは動くが良いプログラムとはほど遠い」ということだろう。
大抵「なんでこんなことやってるの?」とか感じると思う。
知ってる知識を使うことが目的になって、かえってごちゃごちゃにするやつは割と見かける。

395 :デフォルトの名無しさん:2009/04/14(火) 17:44:57
PRaggerのTracとPRagger wikiがあらされまくってんだけど、なんとかしろよ。
どこ言えばいいんだこれ。
更新してないのかもしれんが放置せず管理しろ。
今時スパムフィルターくらいいれろ。あと、メールかなんかで通知されるように設定しろ

PRagger - Trac
http://pragger.ikejisoft.com/

FrontPage - PRaggerまとめサイト それPra
http://garyo.sakura.ne.jp/ruby/pragger/index.php?FrontPage

396 :デフォルトの名無しさん:2009/04/14(火) 18:21:02
おいおい落ち着けよ






・・・ってRubyでPlagger使えたのかよおぉぉおおぉおぉおおおお!!!

397 :デフォルトの名無しさん:2009/04/14(火) 18:54:59
>>395 IKeJIだろJK

398 :デフォルトの名無しさん:2009/04/14(火) 21:03:18
RubyでPostScriptファイルの情報を取得して表示しようとしているのですが
RMagicで印刷枚数、部数、プリントサイズ、モノクロかカラーかって取得できますか?
ImageMagicをコマンドラインで動かすのは面倒なんですが、
RMagicは画像の加工でしか使えないですかね?

399 :デフォルトの名無しさん:2009/04/14(火) 21:16:35
取得できる情報はここにあるだけかも。
http://studio.imagemagick.org/RMagick/doc/imageattrs.html


400 :デフォルトの名無しさん:2009/04/14(火) 22:43:49
>>390
へえ、なるほど
部分配列のコストなんて考えたこと無かったけど
元の配列とシェアするんですね
で、代入された時点で初めて完全なコピーが行われる
もとの配列の要素が増減した時にもちゃんとコピーされる
上手いこと出来てるなあ
require 'benchmark'
def bm(mes,&b) print mes;puts Benchmark.measure(&b) end
a = [1]*10000000
b =nil
bm('部分削除'){a.delete_at(5)}
bm('挿入 '){a.insert(5,1)}
bm('部分参照'){b=a[1..-1].size}
bm('部分削除'){a.delete_at(5)}
bm('挿入 '){a.insert(5,1)}


401 :デフォルトの名無しさん:2009/04/14(火) 22:49:48
あ、間違ってた
bm('部分参照'){b=a[1..-1].size}
じゃなくて
bm('部分参照'){b=a[1..-1]}
でした

でも、参照した影響っていつまで残るんでしょうか
部分配列を参照して使い捨てた後でもコピーが起こってるみたいなんですけど
require 'benchmark'
def bm(mes,&b) print mes;puts Benchmark.measure(&b) end
a = [1]*10000000
bm('部分削除'){a.delete_at(5)}
bm('挿入 '){a.insert(5,1)}
bm('部分参照'){a[1..-1]} #使い捨て
GC.start
bm('部分削除'){a.delete_at(5)}
bm('挿入 '){a.insert(5,1)}


402 :デフォルトの名無しさん:2009/04/14(火) 22:53:45
結局動作上は即レスの>>331が無難なのか

403 :デフォルトの名無しさん:2009/04/14(火) 22:55:16
>>402
誰でもすぐ思いつく泥臭いのがうまくいくことも多いってことだな

404 :デフォルトの名無しさん:2009/04/14(火) 23:00:41
ベンチマーク取ってみるとRangeとか使って添字で回すより、
部分配列でeachした方が速かったり

405 :デフォルトの名無しさん:2009/04/14(火) 23:06:27
>>402
配列の要素が2つ以上無いと例外になるってばさ。
「最初の要素だけ特別な処理」って時に要素一つだけの配列を
渡されるケースもそんなにまれではなさそうに思うんだけどな・・・

なんか揉めてたが、動作的に無難っていったら>>341かもよw

406 :デフォルトの名無しさん:2009/04/14(火) 23:10:10
>>405
いやそれなら配列以外を渡されるチェックもすべきだろ
Enumerable だけ対応して shift メソッドが定義されてなかったらどうする

407 :デフォルトの名無しさん:2009/04/14(火) 23:12:21
うむ、rescue ブロックが100行くらいついてない時点でどれも論外だ

408 :デフォルトの名無しさん:2009/04/14(火) 23:21:37
真珠を継承しちゃったおかげで、悪い所も継承しちゃった感じだな。
そろそろ反省して次の言語来る?

409 :デフォルトの名無しさん:2009/04/14(火) 23:24:34
>>405
irb(main):001:0> [1][1..-1]
=> []

要素1つでも問題ない

410 :405:2009/04/14(火) 23:24:51
なんか勘違いしてた。要素が一つあれば例外にはならないのね。
あと、その後のレスでもみんなさりげなく翻訳してるが、
arr[1,-1] は arr[1..-1] なのな。

>>406
お題が配列だし、そこまで行くと何もシンプルには書けないような(´・ω・`)

411 :デフォルトの名無しさん:2009/04/14(火) 23:24:57
>>405
snippetとか例文とかそういう概念はないんか

412 :405:2009/04/14(火) 23:26:57
なんか言い訳が間に合わなかったZE!
しばらくROMってます(´・ω・`)

413 :デフォルトの名無しさん:2009/04/14(火) 23:28:37
要素が0個のときうまくいかねーって

414 :デフォルトの名無しさん:2009/04/14(火) 23:54:38
a = [1,2,3,4,5]
top = a.shift
a.each {|x| p 1}
1
1
1
1
a.unshift top => [1,2,3,4,5]


a = []
top = a.shift
a.each {|x| p 1}
a.unshift top => [nil]


こうしてくだらないバグがこの世に一つ増えるのだった

415 :デフォルトの名無しさん:2009/04/15(水) 00:17:16
プログラム関係ないけど、Ruby使いの人はどんなエディタ使ってるの?
gvim使ってるけどVisualStudioしか使ったことなかったから
インテリセンスなっしんぐのエディタは結構きついです・・・

416 :デフォルトの名無しさん:2009/04/15(水) 00:20:24
NetBeansが続々とスクリプト言語に対応していってる。
でも型情報が無いからインテリセンス並のコード補完は期待できないな。

417 :デフォルトの名無しさん:2009/04/15(水) 00:24:26
Aptana Studio。RDTとRadRailsね。

Rubyは変数の型を動的に変えられるから、
インスタンスメソッドだとインテリセンスはほとんど役に立たないよ。
クラスメソッドならOKだけど。ステップ実行は便利。

418 :デフォルトの名無しさん:2009/04/15(水) 00:25:19
いまんとこ、対応してるIDEはNetBeansとEclipsだけですか?

419 :デフォルトの名無しさん:2009/04/15(水) 00:31:01
Rubyならばここだぜ
http://www.tech-arts.co.jp/technologies/new-technologies/ruby-on-rails.html

420 :デフォルトの名無しさん:2009/04/15(水) 01:09:54
>>414
「配列の最初の要素だけ別処理する」という仕様に対して、
長さ0の配列が渡されたら何もしないのが正しいと言い切れるの?

421 :デフォルトの名無しさん:2009/04/15(水) 01:22:26
>>401
>参照した影響っていつまで残るんでしょうか

sliceすると、sliceされた配列も新しく出来た配列もシェア状態になる。
シェア状態になった配列を破壊的に変更するとコピーが起きる。
コピーがされたらシェア状態じゃなくなる。

というわけで、破壊的変更がされるまで。

422 :デフォルトの名無しさん:2009/04/15(水) 01:24:15
以前からArrayはcopy on writeに違いないと訳もなく信じていたのだけど、
今回の話でちょっと興味を持ったので少し実験してみた。
もしかして一部分でも書き換えたら、巨大な配列だろうと丸コピーしてる?

irb(main):001:0> a = Array.new(1<<24) { |i| i } # メモリ使用量70MB程度
irb(main):002:0> b = Array.new(1<<8) { a[1..-1] } # メモリ使用量そのまま
irb(main):003:0> b.each { |e| e[0] = 1 } # たった256要素も変更できない
NoMemoryError: failed to allocate memory
from (irb):3:in `[]='
from (irb):3
from (irb):3:in `each'
from (irb):3
from :0

ソースを読むだけの気力も能力もないので適当なことを言わせてもらうけど
配列をブロックに小分けするようなことはしていないようにみえる。

ガチガチの配列ならともかく、RubyのArrayってどこにでも追加削除可能な
万能コンテナみたいだから、内部的にはある程度の長さのブロック(配列)と
ハッシュやツリーなんかの混合構造の方が効率良さそうに思えるけど。
それとも、やり過ぎて添字アクセスが遅くなるのを嫌っているのかな?

423 :デフォルトの名無しさん:2009/04/15(水) 02:05:38
>配列をブロックに小分けするようなことはしていないようにみえる。
その通り。

>ハッシュやツリーなんかの混合構造の方が効率良さそうに思えるけど。
>それとも、やり過ぎて添字アクセスが遅くなるのを嫌っているのかな?

たぶん、ちゃんと検討されたことはない。でも、

- この最適化で速くなるRubyプログラムは少なそう(多いというなら説得が必要)
- わずかだろうけど遅くなるプログラムは結構ありそう(添字アクセス)
- 配列がflatなメモリだと期待している拡張ライブラリ(非常に多い)が動かなくなる

というあたりから、標準のArrayに組み込むのは微妙かなあ。
SparseArrayみたいな別ライブラリがいいと思う。やるとしたら。

424 :デフォルトの名無しさん:2009/04/15(水) 03:07:21
java で、
Vector → ArrayList
さらに LinkedList や CopyOnWriteList と、言語のバージョンが上がるごとに List の派生クラスが増えていったように
Ruby も Array の派生組み込みクラスが作られていくかな?

Ruby の文化からすると、あまりそういうことはしなさそうだけど。

425 :デフォルトの名無しさん:2009/04/15(水) 05:18:29
>>422
ttp://i.loveruby.net/ja/rhg/book/object.html

426 :デフォルトの名無しさん:2009/04/15(水) 05:48:59
>>425

422じゃないけど、Rubyの場合は
基本的に変数はすべて参照になっているって事でいいのかな。

irb --prompt simple
>> a = [1, 2]
=> [1, 2]
>> b = a
=> [1, 2]
>> a << 3
=> [1, 2, 3]
>> a << 4
=> [1, 2, 3, 4]
>> b.size
=> 4
>> b
=> [1, 2, 3, 4]

この場合、aとかbってのはただのラベルで配列の実体は別の場所にあるってことでいい?

427 :デフォルトの名無しさん:2009/04/15(水) 06:53:21
> 基本的に変数はすべて参照になっているって事でいいのかな。
いいと思うけど、俺にアンカーつける必要なくない?
他にもいい人はたくさんいるよ

428 :422:2009/04/15(水) 08:15:18
>>423
組み込みオブジェクトの内部表現が変わってもスクリプト側には
影響ないと思ってたんだけど、拡張ライブラリが駄目なのか。

>>424の言うように派生クラスにするか、Arrayを初期化するときに
内部実装を選択するヒントとかパラメータを指定できるようになれば
面白いかなって思ったんだけど。


>>425
これ、Ruby Hacking Guideってやつだよね?
Webで見れたとは、こりゃありがたい。
後でゆっくり読ませてもらうわ。

429 :デフォルトの名無しさん:2009/04/15(水) 08:32:04
初心者スレだったんだっけ

>>426
オブジェクトを「捕まえる」「入れておく」ことはできない
名前で参照するしかない
変数に対する = は、"右辺" の指すオブジェクトに新たなラベルをつける行為で、本当は「代入」ではない
irb> a = [1, 2]
irb> b = a
irb> a << 3
irb> p (a.object_id == b.object_id)
true

で、スレ的にもこれだけでいいと思うんだが、こっからがめんどい
irb> a = [1, 2, 3, 4, 5]
irb> p (a[0..2].object_id == a.object_id)
false

a と a[0..2] は違うオブジェクトなので、
  [1, 2, 3, 4, 5]
  と
  [1, 2, 3] ← a[0..2] が返す、できたてほやほや配列
という2つの配列オブジェクトが(Rubyの「オブジェクト置き場」に)存在しているように感じるが、実は
  [1, 2, 3, 4, 5] <共有済>
  と
  <注: id:3324 の配列を共有、0要素目から2要素目までを返す、ただし、破壊的変更が来たら配列内容をコピーして保持する>
という、1つの「share された」配列と1つの「share した」配列になってる
これらは自分が share 関係にある配列と自分が share 状態であるということを覚えていて、破壊的変更が自分に来たら share 関係にある配列にそれを通知する
通知または破壊的変更がきた場合の動作は
 ・ 自分が共有元(a)である場合は share 状態を解除し普通の配列に戻る(破壊的変更を自分が受けていた場合は受け付ける)
 ・ 自分が共有先(a[0..2])である場合は共有元の要素の参照をきちんと複製して share 状態を解除し普通の配列に切り替える
ということである、というようなてきとーな理解でいいか>>421
array.c を読めばなんか書いてあるのかね

430 :デフォルトの名無しさん:2009/04/15(水) 08:40:40
この最適化が入ることで、逆にそれ以外のところが遅くなるはずだが、
配列って部分参照することってそんなにあるっけ?


431 :デフォルトの名無しさん:2009/04/15(水) 08:43:53
>>429
ん、単純に

[ <id:0011>, <id:0013>, <id:0015>, <id:0018>, <id:0411> ]

という普通の配列と

[ a[0], a[1], a[2] ] # a が変更されたらオブジェクトIDの参照に切り替えること

の関係になるという話なんじゃないの?
や、こんな 2段階やるくらいなら最初から [ <id:0011>, <id:0013>, <id:0015>] という配列作っとけよ、という感じではあるんだが

432 :デフォルトの名無しさん:2009/04/15(水) 10:03:58
お、おまいらここは初心者スレだぜ( ´ー`)y─┛~~ コウドナワダイデビビラスナ

433 :デフォルトの名無しさん:2009/04/15(水) 10:19:32
>>420の分かってないっぷりにワロタw

434 :デフォルトの名無しさん:2009/04/15(水) 10:24:56
>>431
オブジェクトにラベルを新たに付けるという行為が、
配列をインデックスで参照するように指定するという行為よりずっとコストのかかる行為であった場合には、
[ a[0], a[1], a[2] ] のほうが有効だと思われ
ホントのとこはどうなのかは知らない

435 :デフォルトの名無しさん:2009/04/15(水) 10:28:46
また仕様バグか

436 :デフォルトの名無しさん:2009/04/15(水) 10:56:44
require 'benchmark'

a = (1..1000000).to_a
Benchmark.bmbm do |bm|
bm.report('a に追加'){a.delete_at(0); a.push("s")}
end
a = (1..1000000).to_a
Benchmark.bmbm do |bm|
bm.report('部分参照して追加'){a[1..-1].push("s")}
end

結果:
               user   system   total    real
a に追加        0.050000  0.000000  0.050000 ( 0.048458)
               user   system   total    real
部分参照して追加  0.050000  0.010000  0.060000 ( 0.053062)

破壊的変更した際に別に遅くなるとも思えんのでバグではないな
部分参照だけをした場合が笑えるほど速いので問題は無い

…まあ、push しただけなのにdeleteとpushの2段階と同レベルの処理速度に落ちるということ自体
コードの見かけと実際の関係上あまりよくないという観測もなくはない気もするが
(つまり、「共有の配列」から「本当の配列」に変換される、Rubyの裏側の動作がかなりごっつい)

437 :デフォルトの名無しさん:2009/04/15(水) 11:21:01
>>436
残念
遅いのは delete_at の部分
share の部分配列を通常の配列に変換する、というのは、
配列から要素を削除して詰める、という行為と大して変わらない

ちなみに、これがわりと速いぞ

a2 = Array.new
a2.push(*a[1..-1])

配列の一部分を得たい場合は配列のスライス arr[s..e] を使うほうがいい、ってことだな

438 :デフォルトの名無しさん:2009/04/15(水) 12:41:21
エラーが出ても処理を止めず、最後まで実行するようにしたいのですが、どうすればよいでしょうか??
PHPのようにブラウザで実行したとき、エラーメッセージをエラーが出た部分に出力するようにしたいのです。
begin とか rescue を使えばできるのかな?と思っているのですが・・
ご教示頂けると幸いです。

439 :デフォルトの名無しさん:2009/04/15(水) 13:20:37
>>438
エラーが出たってことはそれ以上処理ができないということ

で、まあ、使ってるフレームワークのヘルプでも読め
処理中に起こって止まる原因となった例外をWebブラウザ上に表示させる方法がたいてい載ってる

440 :デフォルトの名無しさん:2009/04/15(水) 13:24:30
レスどもです。
PHPの場合はエラーが発生してもなんとか最後まで実行しようとしてくれますよね??
rubyだとエラーが発生したあとの処理はどう頑張ってもやってくれないということでしょうか?

441 :デフォルトの名無しさん:2009/04/15(水) 13:32:47
とりあえず、いきなりCGI作るのやめろ
RubyはCGIを特別扱いしない
普通のコンソールのスクリプトでどういうことができるか勉強してからCGIやれ
きっとそっちのほうが早い

442 :デフォルトの名無しさん:2009/04/15(水) 13:37:33
PHPはWebブラウザから入力してWebブラウザに出力する特化型言語だからなあ…

> PHPの場合はエラーが発生してもなんとか最後まで実行しようとしてくれますよね??
いいえ

443 :デフォルトの名無しさん:2009/04/15(水) 13:49:20
PHPのエラーってWarningのこと言ってるの?
それ以上処理できなかったらPHPだって止まるよ

444 :440:2009/04/15(水) 14:50:12
あそうか、warningの時は続けて実行してくれるけれど、fatal error の時はPHPでも止まるのか・・勘違いしてました、すいません。
ありがとうございますm(_ _)m

445 :デフォルトの名無しさん:2009/04/15(水) 18:26:19
klassってなんですか><

446 :デフォルトの名無しさん:2009/04/15(水) 18:27:25
klassの部分をclassに修正してみれば分かるよ

447 :426:2009/04/15(水) 19:57:26
遅レスだが

>>429
だいたいその理解でおk
細かいこというと、共有元を破壊的に変更する場合は、シェア状態を解除
するのではなく、複製してそっちを指すようになる。つまり共有先と同じ

>>431,434
ちがう

448 :デフォルトの名無しさん:2009/04/15(水) 21:36:05
>>445-446
clazzを使う流儀もあるな。


449 :デフォルトの名無しさん:2009/04/15(水) 23:01:12
このスレってmatz, yugui, yarv, shugoさんとかが名無しで答えてたりするのかなぁ

450 :デフォルトの名無しさん:2009/04/15(水) 23:26:03
少なくともよく答えてることはまずないと思う。
1〜2週間スレを見てればわかる。答えてたら失望するわ、おれ。

451 :デフォルトの名無しさん:2009/04/15(水) 23:29:00
ここまでMatzの自演

452 :デフォルトの名無しさん:2009/04/15(水) 23:29:53
こんな金にならないスレに顔出すより、
ブログに何か書く方が大事だろw

453 :デフォルトの名無しさん:2009/04/15(水) 23:34:02
しかし、こういう立場のひとってブログに大きな態度で書けないよな。
リーナス君のようにならないことを祈る。。

454 :デフォルトの名無しさん:2009/04/15(水) 23:36:39
どっちもどっちのような

455 :デフォルトの名無しさん:2009/04/16(木) 05:58:10
内容見ずに態度見るような馬鹿を気にしてもしょうがないよ。
有名になると、何書いたって行為と悪意を両方増やす結果になるし。

456 :デフォルトの名無しさん:2009/04/16(木) 05:59:32
×行為 ○好意

457 :デフォルトの名無しさん:2009/04/16(木) 09:03:10
>>449
Ruby1.9には2ch bot yarvを新装備!


458 :デフォルトの名無しさん:2009/04/16(木) 10:00:57
RSpec で、 hogehoge.rb に対して hogehoge_spec.rb を作ったら、シェルの補完で

  hog <Tab>

と打って hogehoge.rb が一発で出るとかそういうのが阻害されてしまうから不便だ、という話をしたら

 spec ファイルは spec/ ディレクトリにまとめて入れろバカ

というツッコミが来た
知らんかった
でもこれって spec ファイルのほうからどうやってオリジナルのスクリプト読むん?

459 :デフォルトの名無しさん:2009/04/16(木) 10:11:22
>>458
> spec ファイルは spec/ ディレクトリにまとめて入れろバカ
Rails on Rails の流儀だな
spec ディレクトリは自動で追加される環境の人だ
自力でどうにかできるものではないので、Rails で作ってないなら無視してよし
一応 File.expand_path とか File.dirname(__FILE__) とか駆使したファイルパスを require するようにすればなんとかなるとは思うが

460 :デフォルトの名無しさん:2009/04/16(木) 10:23:47
>>458
俺の場合は __FILE__ を基準にして、他の場所のオリジナルを読むようにしてる
たとえばlibディレクトリなら

Pathname.new(__FILE__).dirname.parent.parent + 'lib'

で探す

461 :デフォルトの名無しさん:2009/04/16(木) 10:27:58
RSpec使ったことないけど
補完の問題だけを考えるとspec_hogehoge.rbにするのはどうか?

462 :デフォルトの名無しさん:2009/04/16(木) 10:31:18
>>458
$LOAD_PATH << ".." << "../lib"
require 'spec'
require 'hoge'
...

オフィシャルなファイルと被るファイル名の自作ファイルがあると動作しないのが難点だが、
require はまあそもそもそんなもんだな
ただ、下手に lib/ と spec/ があると、Rails の auto_spec.rb とか
なんかあのへんが動作すると期待されてしまうかもしれない

463 :デフォルトの名無しさん:2009/04/16(木) 10:37:27
>>461
一応、spec/*_spec.rb というファイルをまとめて実行して
一気に lib/ 内のファイルのテストを試すサポートプログラム(autospec)が存在するので、
いつか自動テスト実行を覚えた時用に hogehoge_spec.rb という名前であったほうが好ましい

が、一人で使うぶんには spec_hogehoge.rb にしておくのがいちばん無難だな、めんどくさくないし

464 :デフォルトの名無しさん:2009/04/16(木) 11:37:51
>>458-459
別にRails流ってこともないだろ。
Gemsとかつくる前提のときも spec/ に入れるのが一般的だし、
autotestも標準で spec/以下 と lib/を関連付けて見てくれる。

といっても、慣例でしかない気がするけど

465 :デフォルトの名無しさん:2009/04/16(木) 14:18:57
>>458
$LOAD_PATH.unshift File.join(File.dirname(__FILE__), '..', 'lib')

とかかな。
いちいち書くのめんどくさけりゃ>>464のいうautotestや、
Rakeにspec/rake/spectaskのSpec::Rake::SpecTaskを使って
テスト実行を肩代わりしてもらう。

この二つはデフォでは spec/*_spec.rb を相手にするから
たかが慣習、されど慣習と。

466 :デフォルトの名無しさん:2009/04/16(木) 16:28:48
ねーよw

467 :デフォルトの名無しさん:2009/04/16(木) 19:04:41
ファイルのロックを File#flock でなく IO#fcntl で実装しようかと思ったんですが、
これシステムの struct flock に依存するから簡単には portble に書けないですかね?

468 :デフォルトの名無しさん:2009/04/16(木) 20:55:51
どこまでのポータビリティを求めてるのかによる。
Windowsとか言い出すなら問題外。

469 :デフォルトの名無しさん:2009/04/16(木) 21:14:34
あ、rspec の、エクスペクテーションの should をまとめたいと思ってメソッド定義するよね
あれってどこに書くべき?
before で作ったインスタンス変数が読めなかったり def で定義したメソッドが見えなかったりでどこがどう妥当なのかよくわからん

470 :デフォルトの名無しさん:2009/04/16(木) 21:59:37
>>469
何を言いたいのかよく分からないが
it (specify) を、複数の ExampleGroup で共有したいって事なら
share_as メソッドを探すと幸せになれるかもしれない

471 :デフォルトの名無しさん:2009/04/16(木) 22:09:06
…たぶん、

describe Hoge do

 before :all do
  @val1 = ... ; @val2 = ...
  # (1)
 end

 (2)

 describe "#foo" do
  matomete_val_tesuto
 end

end

としたいときに、 def matomete_val_tesuto を (1) に書くか (2) に書くかって話なんじゃね
(1) に書いたら describe "#foo" の中では使えないはず
(2) に書いたら @val1 にアクセスできんな

472 :デフォルトの名無しさん:2009/04/17(金) 00:13:56
setter の返り値について質問
a.hoge = b.hoge = value みたいな書き方ができるようにしようと思うのですが、

def hoge=(value)
@hoge = validate(value)
@hoge
end



def hoge=(value)
@hoge = validate(value)
value
end

ではどちらがいいでしょうか?
場合によって value != validate(value) となります。

473 :デフォルトの名無しさん:2009/04/17(金) 00:22:53
> a.hoge = b.hoge = value みたいな書き方ができるようにしようと思う
そういうのやめとけ
めんどくさいから

ちなみに、 = つきメソッドは引数を返すように作られていることが期待されてる
つまり、

def hoge=(val)
 @hoge=val
end



474 :デフォルトの名無しさん:2009/04/17(金) 00:28:15
前者をよしとする人はいないんでないの
a=b=c が a==b==c にならないのはバグの元だし
オペレータオーバーライドの悪い点をわざわざ利用する必要はないよ

475 :デフォルトの名無しさん:2009/04/17(金) 00:31:08
今調べたら、セッターとして使うと引数が問答無用で返って、
sendで呼ぶと返した値が返る

476 :デフォルトの名無しさん:2009/04/17(金) 00:37:49
>>475
うわあこれ知らんかった
今まで引数の値をわざわざ返してたのにー

477 :デフォルトの名無しさん:2009/04/17(金) 00:44:12
…。

いや、なんつーか、 hoge = 1 の返り値は 1 だというのは知ってるよな
def set_hoge
 @hoge = 1
end

これの返り値は 1 だし、attr_* 系で作られる hoge= みたいなメソッドも引数を返す


478 :472:2009/04/17(金) 00:48:14
皆さんレスありがとうございます。

>>475
>今調べたら、セッターとして使うと引数が問答無用で返って、

ほんとだw
そもそも返り値を選択できなかったとは……

def hoge=(value)
return
end

でも引数が返ってきました。
setter の呼び出しは処理系が特別扱いしてるんですね。

479 :デフォルトの名無しさん:2009/04/17(金) 01:25:51
[ruby-core:00637]より。

|If an assignment method which doesn't return an argument is not
|intuitive, why don't ruby force it?

Agreed. Last time I thought that, I was too lazy to modify compiler
itself, and then forgot. I will fix it someday.

だって。

480 :472:2009/04/17(金) 02:25:15
>>479
なるほど。
その結果として 1.8 では setter の戻り値を破棄して
引数を返すように変更されたと

確認してみたらピッケル本にもそのことがちゃんと書いてありました(言語編 p76)

481 :デフォルトの名無しさん:2009/04/17(金) 08:42:59
>>477
バーカ

というかお前322と似てるな。バカ具合が

482 :デフォルトの名無しさん:2009/04/17(金) 09:00:50
わざわざ終わった話題に安全圏から罵倒、というのはつい最近どこかで

483 :デフォルトの名無しさん:2009/04/17(金) 09:45:27
クラスメソッドのエイリアスはどうやって定義しますか。

484 :デフォルトの名無しさん:2009/04/17(金) 09:52:51
class Hoge
 def self.hoge ; end
 class << self
  alias hage hoge
 end
end
これ以外の方法知らん。他のやり方があったら教えて。

485 :デフォルトの名無しさん:2009/04/17(金) 10:23:07
>>484
alias メソッドを使うとしたらそれくらいしかなさそうだな
あとは普通に self.hoge の中で self.hage を呼ぶしかあんめえ

486 :デフォルトの名無しさん:2009/04/17(金) 10:43:50
alias_methodを使うというひねりもできるが、メタクラスを使う以外の方法はない。

487 :デフォルトの名無しさん:2009/04/17(金) 10:48:13
rubyでcgiを作ろうと思います
postを受け取るにはどうすればいいですか

488 :デフォルトの名無しさん:2009/04/17(金) 10:52:20
>>487
他の言語でpostを受け取るのと同じ方法でできます。

489 :デフォルトの名無しさん:2009/04/17(金) 11:05:40
>>487
単純には、標準入力に環境変数CONTENT_LENGTH長だけ入ってる、はず。
マルチパートやらデコードやらいろいろあるので、ライブラリを使うのが吉。
どのライブラリをどんな風に使うのがいいのかは、詳しい人を待って(オイ)。

490 :デフォルトの名無しさん:2009/04/17(金) 13:46:48
>>488
うん、変わらんな
というか一度は自力でPOSTとか全部やってみたほうがいいと思うんだ

>>487
標準で cgi というライブラリがあるからそれ使え
自力で外部ライブラリをインストールしてもいい環境なのなら、
rubyforge から cgialt をインストールしてそれを cgi 互換ライブラリとして使え
他にもいくつかあるが、cgi ライブラリの使用経験とかを前提にしてたりするんで、最初は素直に cgi ライブラリ使え

491 :デフォルトの名無しさん:2009/04/17(金) 14:36:38
rubyのcgiはかなりアレ。

492 :デフォルトの名無しさん:2009/04/17(金) 16:14:01
>>468
メジャーな UNIX (Linux, *BSD, Solaris あたり) で動けば十分なんですが、
Google ソースコード検索や Koders でも Ruby の fcntl の用例が少ないみたいなんで
Ruby Inline か拡張ライブラリで fcntl(2) を直接使うことにします。

493 :デフォルトの名無しさん:2009/04/17(金) 16:51:33
>>491
アレって何?


494 :デフォルトの名無しさん:2009/04/17(金) 17:07:46
>>492
IOクラスにfcntlメソッドがあるので、わざわざそんな難しい方向に行かんでもええよ

495 :デフォルトの名無しさん:2009/04/17(金) 17:07:54
指示代名詞も知らないゆとり乙

496 :デフォルトの名無しさん:2009/04/17(金) 17:09:43
>>493
491じゃないが、仕様と実装が残念だった。
1.9系で後者は改善されたけど。

497 :デフォルトの名無しさん:2009/04/17(金) 17:38:58
>>494
その IO#fcntl ですが、例えば file.fcntl(Fcntl::F_GETLK, arg) するとき、
arg には struct flock に pack したものを指定する必要があるのですが、
struct flock にどんなメンバがあるかは Ruby レベルからは知り得ないので、
やっぱり C で書く必要があると思うのです。

498 :デフォルトの名無しさん:2009/04/17(金) 18:01:32
>>497
なんだ、そんなレベルのポータビリティでいいのか。

499 :デフォルトの名無しさん:2009/04/17(金) 19:35:12
>>487
今ならRack使う方がいいと思う

500 :デフォルトの名無しさん:2009/04/17(金) 19:44:30
初心者に標準添付以外をいきなり勧める人って何なの

501 :デフォルトの名無しさん:2009/04/17(金) 20:49:03
今ならgem install rackするだけだろ?

rubyみたいな日本だけのドマイナー言語を選んで、さらにcgiがやりたいなんて
茨の道を歩くのは覚悟してもらわなきゃ


502 :デフォルトの名無しさん:2009/04/17(金) 21:01:04
> rubyみたいな日本だけのドマイナー言語を選んで、さらにcgiがやりたいなんて

海外の開発系カンファレンスに何度か出席しているが、
どうみても日本より海外の方が、Ruby の関心が高い。

むしろ日本人は「Ruby 出来ない子」が多い、と感じる。

503 :デフォルトの名無しさん:2009/04/17(金) 21:07:40
> 海外の開発系カンファレンス

そういうやつらは「寿司、天ぷら、藤山、芸者」の日本好きの変わり者geekだろ。
狭いコミュニティに閉じこもって「関心が高い」じゃないだろ。

目を覚ませ。もう戦争は終わったんだ。
今は蛇言語でgwtの時代なんだよ。

504 :デフォルトの名無しさん:2009/04/17(金) 21:12:12
せめてこのスレでは、Ruby初心者に有益な情報を書くように心がけられないもんかね
Pythonがいいよってのも、Rubyのことを聞きに来た人間を迷わせる効果しかないと思うんだがね

アンチは本スレでもアンチスレでも行けばいいんだ。
初心者スレにまで顔出すことはなかろうに。本格的に人間性を疑うわ。

505 :デフォルトの名無しさん:2009/04/17(金) 21:12:23
カンファレンスは知らないがおれもそれは感じる。
新しいバージョンとかでつまづいたときググると、
役に立つのは大抵海外のサイト。向こうの方が精力的にやって気がする。
2ちゃんなんてRubyスレ全般で「1.9は使うな」だもんな。
2ちゃん見てる時点でアレだろと言われたらそれまでなのだが。

506 :デフォルトの名無しさん:2009/04/17(金) 21:16:56
裸で冬山に特攻する初心者がいれば「行くな」とも言いたくなるわな

507 :デフォルトの名無しさん:2009/04/17(金) 21:21:08
>>505
お前英語苦手だろ
英語で書いてあるというだけで凄いって思ってるだろ
海外の人だって「初心者」は Ruby 1.9 を使ってない

508 :デフォルトの名無しさん:2009/04/17(金) 21:22:39
Vimで入門始めたけど、アホらしくてNetBeans入れてみた

信じられないくらい快適になった

509 :デフォルトの名無しさん:2009/04/17(金) 21:27:00
>>507
別に得意じゃないけど英語だけですごいなんて思わないだろ。小学生かよ。
新しいことに関して日本のサイトはほとんど引っかからないし、
読んで実際に解決することが多いからそう思う。

あと「Rubyスレ全般」ってわざわざ書いてるんだからちゃんと読んでな。
たった5行なんだからさ。初心者スレに限定してないだろ。

510 :デフォルトの名無しさん:2009/04/17(金) 21:34:10
日本人はRuby初心者が多い印象がある
外国人の人にとってのRubyは日本人にとってのPythonくらいの「詳しい人向け言語」な感じ

511 :デフォルトの名無しさん:2009/04/17(金) 21:48:53
ruby-talk読んでるが、初心者らしいというかほほえましい質問が半分くらい(たいかん)

512 :デフォルトの名無しさん:2009/04/17(金) 22:42:31
詳しい人はこんなところこないと思うよ
前にmswinの人がキレてたじゃん
わざわざ顔出して見ず知らずのしかも自分の足下にも及ばないようなやつに、
口汚くレスされたりしてストレスためる必要ないだろ
あと日本のRuby好きはRubyで何か作るというよりも、メンテナとかをやるのが好きなのかもね

513 :デフォルトの名無しさん:2009/04/18(土) 01:24:40
ゴルフやってるんじゃねーの


514 :デフォルトの名無しさん:2009/04/18(土) 11:16:09
month = 4
などの数字が入ってるとき、これを to_sなどで
"04"という風に変換したいんですが、どうすればいいですか?
month = 11
のときは、"11"です。
どうかお願いします。


515 :デフォルトの名無しさん:2009/04/18(土) 11:23:44
'%02d' % 2 => "02"
'%02d' % 11 => "11"

516 :デフォルトの名無しさん:2009/04/18(土) 12:06:19
もしくは

$ irb
irb(main):001:0> sprintf("%02d", 4)
=> "04"
irb(main):002:0> sprintf("%02d", 11)
=> "11"

517 :デフォルトの名無しさん:2009/04/18(土) 12:53:26
MySQLをDBIを介して使おうとしているのですが、
テーブル名一覧を取得する方法をお教えいただけないでしょうか?

dbh = DBI..connect("dbi:Mysql:test:localhost","user","password")
table_names = dbh.execute("SHOW TABLES")
p table_names

とやると全然違うものが出力されてしまいます。
すいませんが、お教えいただけますでしょうか?

518 :デフォルトの名無しさん:2009/04/18(土) 13:32:41
聞くときだけは丁寧だな。がんばれよw

519 :517:2009/04/18(土) 16:44:37
自己レスです。

結局DBIを介して行う方法はわからなかったので、Ruby/MySQLで接続して行いました。
require "mysql"

dbh = Mysql::new("localhost","username","password")
dbh.query("use database")
p dbh.list_tables

これで取得できそうです。

520 :デフォルトの名無しさん:2009/04/18(土) 19:34:20
FreeBSD 7.1-RELEASE-p4 で irb 使ってます
Delete キーを押すと ~ が表示されるんですが、同じような症状をさくっと治したという方はいませんでしょか
csh 上では普通に後ろの文字が消えます

521 :デフォルトの名無しさん:2009/04/18(土) 20:26:40
端末は何を使っとるん?

522 :デフォルトの名無しさん:2009/04/18(土) 20:37:48
ええと、アプリケーションは Windows 上の PuTTY で、端末文字列は xterm-color 、
csh から bash を起動して C-v したあとに Delete キーを押すと ^[[3~ が表示されてます(csh 上ではどうやるんだろう?)
screen 等は(まだ)使ってません
接続先は具体的にはさくらインターネットのレンタルサーバです
なんか Ruby あんま関係ないような気がひしひしとしてます

523 :デフォルトの名無しさん:2009/04/18(土) 20:43:38
irb を起動するとキー操作の動作が違う、という場合はいちおう Ruby スレの範疇だと思う
まあ、irb 自体が独自に何かやってるわけじゃないけどさ

524 :デフォルトの名無しさん:2009/04/18(土) 21:22:16
>>522
自分もさくらのレン鯖契約しているのでやってみた。
ログインシェルが csh なので、bash にしたあとで irb 起動してみたけど、
C-v したあとだったら delete キーを押すと再現したけど、
C^v しなければ、irb のプロンプト中に delete キーを押したら、ちゃんとカーソル位置の文字が消えたよ

C-v って何のためにやっているの?

525 :デフォルトの名無しさん:2009/04/18(土) 21:57:44
C-vは、つぎの入力文字を視覚的に表示する機能では?


526 :521:2009/04/19(日) 00:31:07
>>525
C-v って vi のと同じように、次の入力をキーコードそのまま入力する機能だと思う。
PuTTY が Delete で吐くキーコードが 1b 5b 33 7e ってことだよね。

FreeBSD 7.1-RELEASE-p4 & PuTTY 0.60 ごった煮版 2007年8月6日版だけど、
カーソル位置の文字が消えた。

もし Readline を入れてなければ入れて、
それでダメなら ~/.inputrc に↓コレ書いてみて。

"\e[3~": delete-char

527 :デフォルトの名無しさん:2009/04/19(日) 02:37:16
RubyのDBIを使おうとしているのですが、
$ irb
irb(main):001:0> require 'dbi'
=> true
irb(main):002:0> DBI.connect('dbi:mysql:test','root','root00')
DBI::InterfaceError: Could not load driver (undefined local variable or method `e' for DBI:Module)
from /usr/local/lib/site_ruby/1.8/dbi.rb:312:in `load_driver'
from /usr/local/lib/site_ruby/1.8/dbi.rb:154:in `_get_full_driver'
from /usr/local/lib/site_ruby/1.8/dbi.rb:139:in `connect'
from (irb):2
となってしまい、うまくコネクトできません。ドライバはインストールしたつもりなのですが、
何か間違ってるでしょうか?

528 :527:2009/04/19(日) 02:50:31
mysql-ruby-2.8.1.tar.gz
をインストールしたらできました。
DBIだけじゃなくて、Ruby/Mysqlのドライバもインストールしないとだめなんですね。
失礼しやした。


529 :464:2009/04/19(日) 08:50:34
連投規制で書き込めなかった

>>464
> autotestも標準で spec/以下 と lib/を関連付けて見てくれる。
は、厳密には間違いで、rspecに含まれる autotest用のプラグイン?が spec/とlib/を関連付けてみてくれる

>>469-471
spec_helper.rb(か、もしくはそこからrequrieする.rb)内でshare_asで定義して、includeするとか

530 :デフォルトの名無しさん:2009/04/20(月) 11:08:49
ruby 1.8.7 (2008-08-11 patchlevel 72) [i386-mswin32]を使用しています
open("|")(I/Oパイプ付)で起動した外部プロセスを強制終了する事ってできますか?
外部コマンドの結果でその後の動作を変えるようなことをしていますが
大体の場合全ての結果を受け取らずとも判定が出来るので
判定が出来た時点で外部コマンドを強制終了して判定にかかる時間を短縮したいです

531 :デフォルトの名無しさん:2009/04/20(月) 11:09:51
>>530
適当にシグナル送ればいいんじゃね

532 :デフォルトの名無しさん:2009/04/20(月) 13:28:18
>>530
IO#pid で外部コマンドの pid が取れるみたいね。あとは >>531 の通りで。

533 :デフォルトの名無しさん:2009/04/20(月) 17:25:24
UTF8のBOMを含むStringからBOMを取り除く方法は?

534 :デフォルトの名無しさん:2009/04/20(月) 17:38:35
>>533
toutf8

535 :デフォルトの名無しさん:2009/04/20(月) 17:41:57
iirb> require 'kconv'
irb> text = File.open('test.txt'){|f| f.read}
=> "\357\273\277test\ntest\ntest\n"
irb> text.toutf8
=> "test\ntest\ntest\n"

まあ、ある意味盲点ではあるな

536 :デフォルトの名無しさん:2009/04/20(月) 18:05:57
盲点ってかただの副作用では
そういうのこそ、メソッドを用意すればいいのに

537 :デフォルトの名無しさん:2009/04/20(月) 18:11:30
>>536
nkf -w8 はBOM を除去する

538 :デフォルトの名無しさん:2009/04/20(月) 18:18:58
というよりは、 BOM 無し UTF-8 を出力する、だね

539 :デフォルトの名無しさん:2009/04/20(月) 18:21:47
BOMについては特につけることも取ることもしない、というスタンスなんだっけか

540 :デフォルトの名無しさん:2009/04/20(月) 18:35:22
.toutf8もNKFも、余計な変換をしそうで怖いです。
やりたいのはBOMを除くことだけで、変換とかいっさい必要ないんですが。

あと、BOMを含むかどうかの判定方法もお願いします。
今は str.unpack('H6').first == "efbbbf" としてるんですけど、どう考えても頭悪い方法です。


541 :デフォルトの名無しさん:2009/04/20(月) 18:54:51
BOM = "\357\273\277"
str[0,3] = "" if str[0,3] == BOM
str.sub(/\A#{BOM}/, "")

こういうのでいいんじゃない?

542 :デフォルトの名無しさん:2009/04/20(月) 18:58:20
str.sub!(/\A\xEF\xBB\xBF/, '')
あたりで

543 :デフォルトの名無しさん:2009/04/20(月) 19:00:35
Ruby 1.8.7以降だとString#start_with?ってのがあるからそれで判定しても

544 :デフォルトの名無しさん:2009/04/20(月) 22:53:34
自分でString#bom?とか適当なメソッドを定義すればいい
表面上スマートに見えても内部は泥臭いなんて当たり前

545 :530:2009/04/21(火) 00:17:20
>>531-532
レスありがとうございます
やってみました…が、外部プロセスの実行が終了したあとにI/Oパイプが開いている気が…
io.each_lineで読み出し中にProcess.kill(9, io.pid)しても実行時間が変わりません
仕様かな…

546 :デフォルトの名無しさん:2009/04/21(火) 01:13:24
>>545
io.closeするだけで良いんじゃね?

547 :デフォルトの名無しさん:2009/04/21(火) 10:33:13
require したファイルの一覧って取得できますか

548 :デフォルトの名無しさん:2009/04/21(火) 10:42:06
自己レスですが
>>547
$LOADED_FEATURES というのがあるらしい。
マニュアルは読んでみるものですね。

549 :464:2009/04/21(火) 12:39:37
riに失敗してしまうのですが、これはどのようなエラーでしょうか?
回避する方法はありませんでしょうか?

> ri String#lines
(ruby installed directory)/lib/ruby/gems/1.8/gems/rdoc-2.2.0/lib/rdoc/ri/driver.rb:532:in `lookup_ancestor': undefined method `+' for nil:NilClass (NoMethodError)
from (ruby installed directory)/lib/ruby/gems/1.8/gems/rdoc-2.2.0/lib/rdoc/ri/driver.rb:610:in `run'
from (ruby installed directory)/lib/ruby/gems/1.8/gems/rdoc-2.2.0/lib/rdoc/ri/driver.rb:605:in `loop'
from (ruby installed directory)/lib/ruby/gems/1.8/gems/rdoc-2.2.0/lib/rdoc/ri/driver.rb:605:in `run'
from (ruby installed directory)/lib/ruby/gems/1.8/gems/rdoc-2.2.0/lib/rdoc/ri/driver.rb:588:in `each'
from (ruby installed directory)/lib/ruby/gems/1.8/gems/rdoc-2.2.0/lib/rdoc/ri/driver.rb:588:in `run'
from (ruby installed directory)/lib/ruby/gems/1.8/gems/rdoc-2.2.0/lib/rdoc/ri/driver.rb:311:in `run'
from (ruby installed directory)/lib/ruby/gems/1.8/gems/rdoc-2.2.0/bin/ri:5
from (ruby installed directory)/bin/ri:19:in `load'
from (ruby installed directory)/bin/ri:19
> ri --version
ri 2.2.0
>ruby --version
ruby 1.8.7 (2008-06-20 patchlevel 22) [i386-mswin32]

550 :549:2009/04/21(火) 12:46:51
名前の464はミスです。キニシナイでくだしあ

551 :デフォルトの名無しさん:2009/04/21(火) 13:06:36
gemで自分でriを入れたのか。
それを消せばいいんじゃね?

552 :デフォルトの名無しさん:2009/04/21(火) 21:28:24
1年前のスクリプトを眺める

…ライブラリそのものをナチュラルに継承すんな、っていうか重要メソッド上書きすんな
ライブラリのオブジェクトをインスタンス変数に保持してメソッドを依頼するラッパー操作クラス作るだけで十分じゃねーか

来年には「この改造無駄だったなー」と思えるようになるのだろうか

553 :デフォルトの名無しさん:2009/04/21(火) 22:58:43
家庭用プログラムのテスト駆動開発とかなんかそのへんでしつもん

a というメソッドを作ってる最中に、その中の特定の処理を a' というメソッドに分けたとして、

def a
 aaaaa
 bbbbb
 ccccc
 ...

 ↓

def a'
 bbbbb
 ccccc
end
def a
 aaaaa
 a'
 .....

その a' についてのテスト項目は作るほうがいい?
それとも、 a についてのテストをちょこっと詳しくする程度で、a が完動したことをもって「隠して」おくのが普通?

554 :デフォルトの名無しさん:2009/04/21(火) 23:35:11
「普通」がまだ決まってない。
テストしろ、とかpublicなメソッドのテストがパスしてるんだからおkとか、
モックとかスタブとか使えば、とか。

555 :デフォルトの名無しさん:2009/04/22(水) 01:07:07
privateなメソッドはそもそもテストできないようなテストフレームワークもあるような?

556 :デフォルトの名無しさん:2009/04/22(水) 01:11:35
テストしまくり中はメソッドのアクセス制御は敢えてしないと思うんだが
ユーザーからの隠蔽だけが目的の場合(つまり大多数の場合)はふつうにめんどくさいじゃん?

557 :デフォルトの名無しさん:2009/04/22(水) 01:18:51
>>553
基本的には作らないが、他のメソッドからも使う(ような気がする)場合は仕様書的にspecファイルに書く
return するものがたくさんあるようなメソッドにうっかり育ててしまった場合もやっぱ書く

最初は全部書いてたんだけど、describe がメソッド 1個に対応するような使い方をしてると引数とかで正直非常にめんどい

558 :549:2009/04/22(水) 07:43:36
>>550
うは。確かにgemのrdocに入っているんですね。
gem update rdocしたらエラーでなくなった!!

でも…

> ri String#lines
Updating ri class cache with 5126 classes...
Nothing known about String#lines

うーん。こういうことって普通にあるの?

gemのrdocのriが駄目かと思ってrdoc消してみたら、

>ri String#lines
(ruby directory)/lib/ruby/site_ruby/1.8/rubygems.rb:805:in `report_
activate_error': Could not find RubyGem rdoc (>= 0) (Gem::LoadError)
from (ruby directory)/lib/ruby/site_ruby/1.8/rubygems.rb:24
3:in `activate'
from (ruby directory)/lib/ruby/site_ruby/1.8/rubygems.rb:50
:in `gem'
from (ruby directory)/bin/ri:18

orz

559 :デフォルトの名無しさん:2009/04/22(水) 10:22:13
インスタンス変数へのアクセスと、クラス変数へのアクセスと、ローカル変数へのアクセスを
速い順にならべるとどうなりますか。
クラス変数へのアクセスはだいぶ遅そうだとは思いますが、インスタンス変数とローカル変数へのアクセスにどのくらい違いがあるのか知りたいです。

560 :デフォルトの名無しさん:2009/04/22(水) 10:27:08
>>559
これが速度に影響するような用途のプログラムであるなら、Rubyで作らないほうがよい
ブロックつきメソッドとか使われてたら奇声上げてキーボード投げつけるレベル

ちなみに

     アクセス遅い                               アクセス速い
 クラス変数 > インスタンス変数 > ブロック外のローカル変数 > ブロック内のローカル変数

こんな順番だったと思うが、どっかに言及があったはず

561 :デフォルトの名無しさん:2009/04/22(水) 10:38:03
tips: Hash[:symbol] > Struct > Hash["string"] >>>>>(越えられない壁) >>>> OpenStruct

562 :デフォルトの名無しさん:2009/04/22(水) 12:57:25
PHPのuniqid() に相当する関数やライブラリはありますか。
uniqid()とはこんなやつです。
ttp://php.benscom.com/manual/ja/function.uniqid.php

563 :デフォルトの名無しさん:2009/04/22(水) 13:05:03
>>562
例えば、これでどう?

require "securerandom"
p SecureRandom.uuid

564 :デフォルトの名無しさん:2009/04/22(水) 13:09:46
テンプレに入れてもよさそうなRuby関連Googleブック検索
ruby - Google ブック検索
http://books.google.co.jp/books?lr=&as_brr=3&q=ruby&btnG=%E6%9B%B8%E7%B1%8D%E3%81%AE%E6%A4%9C%E7%B4%A2

565 :デフォルトの名無しさん:2009/04/22(水) 13:14:49
def uniqid(prefix = "", more_entropy = false)
id = "%s%x" % [prefix, Time.now.to_f*1_000_000]
id << ".%.8d" % rand(100_000_000) if more_entropy
id
end


566 :デフォルトの名無しさん:2009/04/22(水) 18:23:16
>>563
SecureRandom.uuidは1.8.7じゃ使えないからなぁ。


require "rubygems"
require "uuidtools"
p UUID.timestamp_create


567 :デフォルトの名無しさん:2009/04/22(水) 20:21:26
>>564
「赤毛のアン」が検出されるんだが・・・?

568 :デフォルトの名無しさん:2009/04/22(水) 22:18:55
Rubyも赤いからいいんじゃない?

569 :デフォルトの名無しさん:2009/04/23(木) 08:38:48
どこでいいからまからんでここで聞きます

下記のようなプレゼンの外見のテンプレートがRuby界隈では最近流行っているのですが、
このプレゼンはどのようなツールもしくは、テンプレートで作られているのでしょうか?
Sinatraで鼻歌まじりのWeb開発
http://www.slideshare.net/dara/sinatraweb

570 :デフォルトの名無しさん:2009/04/23(木) 09:47:29
そんな「Ruby界隈」は知らない。

571 :デフォルトの名無しさん:2009/04/23(木) 09:55:18
>>570
気を悪くしたらすいません。
なかなか見やすいと感じたので気になっているのです。

572 :デフォルトの名無しさん:2009/04/23(木) 09:59:30
>>571
気を悪くしたんじゃなくて、それが流行ってるのは「Ruby界隈」と言えるほど広い世界でもないし中心に近くもないだろ、と。

で、その辺の人たちはKeynote使ってるんじゃないの。

573 :デフォルトの名無しさん:2009/04/23(木) 10:17:56
もしかして、「高橋メソッド」のことを言ってるとか?

574 :デフォルトの名無しさん:2009/04/23(木) 11:58:51
>>569
このプレゼンはおもしろかった。

このなかで Rails は「ちょっとしたことをやるには大げさ」とあるが、
自分は Java → Ruby ときたけど、Java の web フレームワークに比べれば
Rails はずっと軽くて楽だと感じる。

この sinatra というのは、流行っているんですか?

575 :デフォルトの名無しさん:2009/04/23(木) 12:08:02
最近名前聞くねぇ。
使ったことないというか、そっち方面は全然手がけないんだが。

576 :デフォルトの名無しさん:2009/04/23(木) 12:23:36
Winでファイルのアーカイブフラグが立っているかを判定したり
フラグをセットしたりするのってどうやるの?

577 :デフォルトの名無しさん:2009/04/23(木) 12:49:38
>>576
File::Stat に見当たらないということはサポートされてないのかなあ
自分には Win32API の GetFileAttribute/SetFileAttribute を呼ぶくらいしか思いつかない


578 :デフォルトの名無しさん:2009/04/23(木) 13:25:25
標準では無いよ
gemのWindowsファイルシステム操作ライブラリで見た覚えがあるので適当なの使え

579 :デフォルトの名無しさん:2009/04/23(木) 14:43:45
win32-fileにあったと思う


580 :デフォルトの名無しさん:2009/04/23(木) 16:05:39
opensslライブラリのマニュアルを読んでいるんですけど
http://www.ruby-lang.org/ja/man/html/OpenSSL_Cipher_Cipher.html
pkcs5_keyivgen('str') で生成したキーを取り出すことってできないんでしょうか。

581 :デフォルトの名無しさん:2009/04/23(木) 17:29:42
rubyscript2exeが動かなくなってしまいました。非常に困っています。
何か解決策はありませんでしょうか?

> rubyscript2exe test.rb
Tracing test ...
Gathering files...
c:/DOCUME~1/unkoman/LOCALS~1/Temp/tar2rubyscript.d.5684.1/rubyscript2exe/require2lib.rb:60:in `gatherlibs':
undefined method `list' for Gem::Specification:Class (NoMethodError)
from c:/DOCUME~1/unkoman/LOCALS~1/Temp/tar2rubyscript.d.5684.1/rubyscript2exe/require2lib.rb:30
from test.rb:1
hellow
Couldn't execute this command (rc=256):
d:\software\ruby\bin\ruby -r 'enumerator.so' -r 'rubygems/rubygems_version.rb' -r 'rubygems/defaults.rb'
-r 'thread.so' -r 'thread.rb' -r 'etc.so' -r 'rbconfig.rb' -r 'rubygems/exceptions.rb' -r 'rubygems/requirement.rb'
-r 'rubygems/version.rb' -r 'rubygems/dependency.rb' -r 'rubygems/gem_path_searcher.rb' -r 'rubygems/user_interaction.rb'
-r 'rubygems/platform.rb' -r 'rubygems/specification.rb' -r 'rubygems/source_index.rb' -r 'rubygems/builder.rb'
-r 'stringio.so' -r 'yaml/error.rb' -r 'syck.so' -r 'yaml/ypath.rb' -r 'yaml/basenode.rb' -r 'yaml/syck.rb' -r 'yaml/tag.rb'
-r 'yaml/stream.rb' -r 'yaml/constants.rb' -r 'rational.rb' -r 'date/format.rb' -r 'date.rb' -r 'yaml/rubytypes.rb'
-r 'yaml/types.rb' -r 'yaml.rb' -r 'Win32API.so' -r 'rubygems/config_file.rb' -r 'rubygems/custom_require.rb' -r 'fileutils.rb'
-r 'rubygems.rb' -r 'ubygems.rb' -I 'c:/DOCUME~1/unkoman/LOCALS~1/Temp/tar2rubyscript.d.5684.1/rubyscript2exe'
-I 'c:/DOCUME~1/unkoman/LOCALS~1/Temp/tar2rubyscript.d.5684.1'
-I 'd:/software/ruby/lib/ruby/gems/1.8/gems/rubyscript2exe-0.5.3/bin'
-I 'd:/software/ruby/lib/ruby/gems/1.8/gems/rubyscript2exe-0.5.3/lib'

582 :デフォルトの名無しさん:2009/04/23(木) 17:30:30
-I 'd:/software/ruby/lib/ruby/site_ruby/1.8' -I 'd:/software/ruby/lib/ruby/site_ruby/1.8/i386-msvcrt'
-I 'd:/software/ruby/lib/ruby/site_ruby' -I 'd:/software/ruby/lib/ruby/vendor_ruby/1.8'
-I 'd:/software/ruby/lib/ruby/vendor_ruby/1.8/i386-msvcrt' -I 'd:/software/ruby/lib/ruby/vendor_ruby'
-I 'd:/software/ruby/lib/ruby/1.8' -I 'd:/software/ruby/lib/ruby/1.8/i386-mswin32'
-I '.' -I 'd:/home/test/ruby/' -I 'c:/DOCUME~1/unkoman/LOCALS~1/Temp/tar2rubyscript.d.5684.1/rubyscript2exe'
-I 'c:/DOCUME~1/unkoman/LOCALS~1/Temp/tar2rubyscript.d.5684.1/rubyscript2exe/lib' -I 'c:/DOCUME~1/unkoman/LOCALS~1/Temp/tar2rubyscript.d.5684.1/rubyscript2exe'
-I 'c:/DOCUME~1/unkoman/LOCALS~1/Temp/tar2rubyscript.d.5684.1/rubyscript2exe/lib' -r 'c:/DOCUME~1/unkoman/LOCALS~1/Temp/tar2rubyscript.d.5684.1/rubyscript2exe/require2lib.rb' 'test.rb'
Stopped.

> ruby --version
ruby 1.8.7 (2008-06-20 patchlevel 22) [i386-mswin32]
> gem --version
1.3.2

583 :デフォルトの名無しさん:2009/04/23(木) 18:55:38
undefined method `list' for Gem::Specification:Class (NoMethodError)

Gem::Specification.listメソッドはgem 1.3.1になら存在する。
1.3.2では削除されたようだ。
gatherlibsを修正するか、gemコマンドをダウングレードする。
そしてrubyscript2exeの開発元に連絡をする。


584 :デフォルトの名無しさん:2009/04/23(木) 19:26:02
>>583
ありがとう。
どうやらそのようですね。RubyGems1.3.2のスレッドでも話題になってたみたいです。

RubyGems 1.3.2 - ruby-talk-google | Google グループ
http://groups.google.com/group/ruby-talk-google/browse_thread/thread/cc65ca7852f2d562

そこで紹介されていた、Ocraというrubyscript2exeみたいなパッカーがあったので試してみています(windowsのみですが)
larsch's ocra at master - GitHub
http://github.com/larsch/ocra/tree/master

Ocraそこそこコンパクトな上に、起動が早くてよさげです。
rubyscript2exeは今まで何でもうごいてたので、同じようにスクリプトが動くか検証してみます。

585 :デフォルトの名無しさん:2009/04/23(木) 19:28:40
x Ocraそこそこコンパクトな上に、起動が早くてよさげです。
o Ocraそこそこコンパクトな上に、exe化したプログラムの起動が早くてよさげです

586 :デフォルトの名無しさん:2009/04/24(金) 23:45:20
どうして、ruby -pの後のgsubはレシーバが省略できるのですか?
いつも使ってて便利だなあと思ってるけど不思議に思ってます。

ruby -p -i.bak -e'gsub(/hoge/, "fuga")' data.out



587 :デフォルトの名無しさん:2009/04/25(土) 00:17:28
>>586
関数的メソッド gsub が呼ばれているだけだ(こいつは $_ をレシーバとして扱う)
String#gsub が直接ワンライナー用にいじられて呼ばれているとかそういうわけではない

588 :デフォルトの名無しさん:2009/04/25(土) 08:35:56
class SomeClass
 @@message = "call myself Mr.#{@name}!"
 def initialize(name)
  @name = name
 end
end

このまま@@messageを参照すると、@nameが未定義の段階で定義しているため出力は"call myself Mr.!"となります。
このように後で@nameに値が入ったとき(あるいは変更されたとき)
@@messageを参照する段階で@nameを再度当てはめるとしたら、どのように書けばよいでしょうか。

589 :デフォルトの名無しさん:2009/04/25(土) 08:46:15
クラス変数を使わない

いやわりとマジで
特定のインスタンスの状態に左右されるクラス変数というのは奇妙
特定のインスタンスの変数を参照する大域変数というのはそれは普通インスタンス変数にする
というか、@@name を initialize の中で毎回変更してそれを @@message で参照するという形ではダメなん?

590 :588:2009/04/25(土) 09:24:21
>>589
ありがとうございます。た、たしかに言われてみたら使い方もちょっとおかしいし、
そもそもクラス変数でやってたのがよくなかったんですね・・・
試しに@@messageをメッセージを返すインスタンス"メソッド"にしてみたら問題なく置き換えられました。
なお試してみますm(_ _)m

591 :デフォルトの名無しさん:2009/04/25(土) 17:51:40
はじめまして。困ってます;至急お願いします。
Rubyをはじめようと思うのですがどうすればいいかわかりません。
まず公式HPに行ってもどれをダウンロードすればいいかわかりません。
ソースコード以外に実行ファイルが見当たりません。
何かをインストール等する必要はないのですか?
僕はパソコンは上級者と言ってもいいほどなんでもできるのですが
ここまでわけのわからないことは初めてで焦っています。
まずルビーのプログラムを書く段階までのやり方を教えてください。


592 :デフォルトの名無しさん:2009/04/25(土) 17:54:17
またそんな玄人的なネタを投下してw

593 :デフォルトの名無しさん:2009/04/25(土) 17:57:30
初心者だから教えてくれ、という意味?

それは唯の対処療法で根本的原因の解決ではない。
頭痛がするから薬を使って誤魔化すのと同じこと。
また困った時に同じように薬使ってごまかすのかな。

使い方はそこらへんに結構転がっているよ。
自分の環境構築するのも技術の一つだよ。

594 :デフォルトの名無しさん:2009/04/25(土) 18:00:46
いや、上級者だといってるだろ

595 :デフォルトの名無しさん:2009/04/25(土) 18:09:52
もしかしてメモ帳で書く、ということですか?
エディターみたいなものは公式サイトで配布していないのですか?
他の候補で見ていたC#なら公式サイトでMicrosoft Visual Basic 2008 Express Editionというのが配布されていました。
簡単に作りたかったのでRubyを選んだのですが本当に困っています。
小さいころにHSP(Hot Soup Processor)をやったことがあるのですがそこの公式サイトでもエディターやテストするためのものが公式サイトで配布されていました。
僕は今そのようなものを探しているのですが見当たりません。
そのようなものは存在しないのですか?

596 :デフォルトの名無しさん:2009/04/25(土) 18:11:17
>>591
> ルビーのプログラムを書く段階までのやり方

1.エディタを用意します。なんでもいいです。目的はテキストファイルを作成することです。
  例えばMS-DOSに馴染んでいれば、最悪
    copy con hello.rb
  なんてのでも大丈夫です。

2.思う通りのるびーのプログラムを書いたら、その内容をテキストファイルとして保存して下さい。

※ 上記の2は、書くまでの段階では必要ではありませんので、飛ばしても結構です。

以上です。

597 :デフォルトの名無しさん:2009/04/25(土) 18:13:16
>>596
俺は君が好きだな

598 :デフォルトの名無しさん:2009/04/25(土) 18:17:09
>>593さんの書き込みをヒントに「ruby 開発環境」と検索したところ
RDEというエディターを見つけました。とりあえず解決しましたので
回答していただいたみなさまありがとうございました。

599 :デフォルトの名無しさん:2009/04/25(土) 18:21:05
IDEがないというのは上級者にとっては最初に焦る事態なのか
なるほど

600 :デフォルトの名無しさん:2009/04/25(土) 18:27:39
>>599
俺は20代だけど、周りみてると統合環境から入るやつが大半だった
学生の時分とかね


601 :デフォルトの名無しさん:2009/04/25(土) 18:28:02
つメモ帳 でよかったのか
PC上級者は、プログラムは専用アプリで書くものと思いがちってことなのかな
勉強になった

602 :デフォルトの名無しさん:2009/04/25(土) 18:29:33
時代は巡るねぇ。

603 :デフォルトの名無しさん:2009/04/25(土) 18:31:58
どっちかというと
下地が分からないからIDEなんだと思う。


604 :デフォルトの名無しさん:2009/04/25(土) 18:41:18
紙に書いてパンチカードで打ってた時代があったとか、知識や想像の範囲外なんだろうな
デバッグは全部プリントアウトとか
そんなの実際には知らんから、もしかして俺騙されてる?

605 :デフォルトの名無しさん:2009/04/25(土) 18:45:09
プログラム全体が一望できた時代は、デバッグは全部プリントアウトでも良かったし
それの方が効率が良かったんだよ
今はテストケース無しでは不可能だろう、そうするとIDEの力を借りる必要が出てくる。
今ではIDEが使えないのでは上級とは言えないだろう。

606 :デフォルトの名無しさん:2009/04/25(土) 18:49:51
用は
IDEしか使えないと
IDEを使ってる
ではぜんぜん違うということでしょ?

607 :デフォルトの名無しさん:2009/04/25(土) 18:50:12
「IDEが使えない」と
「IDEがないと何も出来ない」はぜんぜん違うよ。


608 :デフォルトの名無しさん:2009/04/25(土) 18:50:27
>>605
だが待って欲しい
それは本当に、まずルビーのプログラムを書く段階まで、に必要な事だろうか
ってあんまりこれ引っ張るのもなw

609 :デフォルトの名無しさん:2009/04/25(土) 18:50:52
全部を知る必要も無いって事でもある

610 :デフォルトの名無しさん:2009/04/25(土) 18:56:08
パンチカードの思いでをちょっと
あれは一瞬で行が入れ替えられる、それを活用したデバッグやトラインアドエラー作業はいろいろと面白い効率の高さがあった。
でもね、あれはCOBOLやFORTRANの時代のプログラムが行単位で記述されているから効率がいいんだ。
今の自由文法でそれは可能だろうか?、否ですね。
今の時代には今のやり方があるって事だ。

611 :デフォルトの名無しさん:2009/04/25(土) 18:56:46
先生! make や rake は IDE に入りますか?
あるいは、IDE 足り得ますか?

612 :デフォルトの名無しさん:2009/04/25(土) 19:00:29
>>610
ていうかプログラミングの形態ではなくて、backgroundはどうなっているか
を理解しているかどうかの話だと思ってた。

613 :デフォルトの名無しさん:2009/04/25(土) 19:03:08
背景を追うと、ではどこまで追う気だって話になる、どこかで打ち止めしておかないと、話が進まない。
まあ、中にはC++のように背景無しでは思わぬ罠にはまる、しかもはまっている事に気づいていないなどという恐ろしい言語もあるのですべてとは言わない。

614 :デフォルトの名無しさん:2009/04/25(土) 19:04:00
>>611
IntegratedなEnvironmentでないとIDEとは呼べないと思う。


615 :デフォルトの名無しさん:2009/04/25(土) 19:05:03
>>603
>>606-607
>>612

もちろん、言うまでもなく、そうだろ。
ネタ〜マジの間のどのへんでつきあってるのかわかりにくい流れだな、これ。

616 :デフォルトの名無しさん:2009/04/25(土) 19:05:48
ネタと信じたいと思いつつマジレス、あたりで。


617 :デフォルトの名無しさん:2009/04/25(土) 19:06:30
>>591
http://www.ruby-lang.org/ja/downloads/
1.Windows版(mswin32、mingw)の場合
どこかでバイナリを配ってる
2.cygwinの場合
同じくバイナリ配られてる
3.Mac OS Xの場合
MacPortで入れればOK
4.Ubuntuの場合
sudo apt-get install ruby
5.Debianの場合
su -
apt-get install ruby
exit
6.Fedoraなどの場合
su -
yum install ruby
exit
7.その他Unix系の場合
まずgccやmakeがあることを確認
ソースコードを持ってきて解凍する(やり方はさすがに知ってるだろJK)
configureのあるディレクトリにcd
./configure
make
su
make install
exit

618 :デフォルトの名無しさん:2009/04/25(土) 19:23:48
>>617
で、どうやってプログラム書くんですか><

って質問だったりするんだなこれが。
解決済みだし、もういいじゃんw

619 :デフォルトの名無しさん:2009/04/25(土) 19:25:24
>>618
初心者スレにはちょっとヤな感じ。自重しよう。

620 :デフォルトの名無しさん:2009/04/25(土) 19:26:02
とりあえず、大体皆が同じ認識を持ってることは分かったから
なんか嬉しい。

621 :デフォルトの名無しさん:2009/04/25(土) 21:38:18
>>618
1.まず適当なテキストエディタ(Windowsなら極論すればメモ帳でもいいが
あとあとつらくなる)を準備しましょう
2.次にこのようなプログラムを書きましょう
puts "Hello, world"
3.これを拡張子rbにして保存しましょう(メモ帳の場合はすべてのファイルにしてから
適当な名前.rbと名前欄に入力)
4.次にこのようにコマンドを入力しましょう(カレントディレクトリはさっきの
プログラムの場所で、rubyへのパスはすでに通っていると仮定する)
ruby さっきのプログラム名
5.すると次のように表示されるでしょう
Hello, world
これでプログラムが実行できていることがわかります

622 :デフォルトの名無しさん:2009/04/26(日) 03:58:24
IDE無しのほうが分かり易いというか、IDEの使い方覚えるのが面倒。

汎用IDEといえばこのあたり?

http://pc12.2ch.net/test/read.cgi/tech/1218959013/
【Java】NetBeans Part4【Sun】
http://pc12.2ch.net/test/read.cgi/tech/1238338503/
Eclipse統合M27【Java/C/PHP/Ruby/Python/Perl】
http://pc12.2ch.net/test/read.cgi/tech/1239945063/
プログラマーがよく使うソフト
http://pc12.2ch.net/test/read.cgi/tech/1191875993/
Emacs Lisp 3
http://pc12.2ch.net/test/read.cgi/tech/1081517094/
統合開発環境Eclipseプラグイン開発QA


623 :デフォルトの名無しさん:2009/04/26(日) 07:44:04
「IDEが面倒」と思ってる人に聞きたいんだけど
Ruby開発において、それでもやっぱりIDEが役に立つ場面ってある?

何度か手を出そうとはしたんだけど、その度にやる気が出ず挫折している
「IDEのこんな部分が便利」という点があれば教えてほしい

624 :デフォルトの名無しさん:2009/04/26(日) 08:41:18
RadRails使っているよ。補完重すぎるし、候補で過ぎて意味ねえ
そんなにすごいいいかって言われると、ないよりマシって感じ。てか重い

625 :デフォルトの名無しさん:2009/04/26(日) 08:51:16
RadRailsのいいところ

・GUIでデバッグできる。
・メソッドにカーソル合わせるとドキュメント表示(今は日本語化ける)
・インテリセンスみたいな構文考慮した補完が効く(重い、候補多すぎ)
・ファイル構造をツリー表示
・rake タスクをGUIで選択実行

他なにかあるかなー。文脈非依存の単語補完とかスニペットはテキストエディタでもあるしな。
基本的には、他のIDEと一緒だと思うけど、
全体的にはまだまだ。とりあえず、IDEほしいという人向け。
Visual StudioとかCodeGear(Borland)みたいなIDE想像したら駄目。

あと、>>624も言っているけど、静的型言語のIDEみたいな補完じゃない。
インテリセンスとかで高速で補完しまくってガリガリ書いていくのを経験してきた人が使ったら、
たぶんガッカリすると思うよ。


NetBeansはプロジェクトルートに.rb置けないww ので即アンインストールした
あと、クリップボード処理がうんこ。まともにコピー、ペーストもできないIDEワロタ
めちゃくちゃ軽くて初見はすばらしかったんだけどね

626 :デフォルトの名無しさん:2009/04/26(日) 08:54:36
RadRails追加。というか、ほとんどEclipseの機能だと思うけど

・インクリメンタルでメソッド選択してジャンプ
・インクリメンタルにファイル検索して開く
・指定ファイルの指定行に飛ぶブックマーク機能

Aptanaの機能も入れるなら、Aptana Cloudと連携してIDEから一発デプロイとかまあ、あるけどさ
(でもどうせデプロイはCapistranoとかで書いてるでしょみなさんは)

627 :デフォルトの名無しさん:2009/04/26(日) 08:56:54
NetBeansは、autotest対応はよかったな。
autotest/screenみたいに、エディタの下に色つきで表示出る

628 :デフォルトの名無しさん:2009/04/26(日) 22:43:18
1.8.7とVistaHPという環境でコマンドラインからRubyファイルを実行すると
pメソッドもprintメソッドも日本語が文字化けします。
起動オプションで -Ks を指定しても文字化けします。
ファイルのエンコーディングはUTF-8ですがSHIFT-JISで保存し直しても文字化けします。
NetBeansでデバッグすると、printでは文字化けしませんがpだと文字化けします。
何が原因でしょうか?

629 :ごすけ:2009/04/26(日) 22:59:17
こんばんは。質問させてください。
/*引数(自然数)n(<=1000)の入力に対して1~nの間の素数をすべて求めて、
コンソールに表示するプログラムを作成せよ。(ちなみに1は素数ではない)*/
のC言語でのプログラムの作り方を教えてください。ルートは使わず、なるべくfor文で
お願いします。

630 :デフォルトの名無しさん:2009/04/27(月) 00:56:22
http://pc12.2ch.net/test/read.cgi/tech/1240226599/
C/C++の宿題片付けます 125代目

631 :デフォルトの名無しさん:2009/04/27(月) 09:54:55
>>628
Vistaのことはわかんけど、

>NetBeansでデバッグすると、printでは文字化けしませんがpだと文字化けします。

これはしょうがないんじゃないかな。他の環境でも同じだと思う。

-- hoge.rb --
puts 'ほげ'
p 'ほげ'

-----------

$ ruby hoge.rb
ほげ
"¥343¥201¥273¥343¥201¥222"

正確に言うと、これは文字化けではなくて、文字列をバイナリ表記したもの。
p は引数をinspectした結果を表示するけど、日本語を含む文字列だとinspectするとバイナリ表記になってしまう。



632 :デフォルトの名無しさん:2009/04/27(月) 13:32:05
array への追加についての質問です。
DBのいくつかのテーブル数分検索し、検索結果を配列に追加したいです。

my_array = []
for table_name in table_names
 my_array.push = my_func(table_name)
end

上記のコードだと、my_func が返す array を、my_array の要素とするので2重の配列になってしまいます。

result = my_array + my_func とすると、
配列の後ろにどんどん要素を追加することができ、これが自分のやりたいことなのですが、
Rubyのリファレンスをみると、array の + は my_array は変更せず、左辺に新しい配列を作成します。

上記の for table_name in table_names は結構なループ量になり、
かつ my_func が返すレコード件数(配列のサイズ)も大きいため、毎回
新しい配列を作って返すのは、コストが高いのではと懸念しています。

そこで下記のようなコードを書きましたが、+ でつなげるのと下記のコードと、
どちらがいいでしょうか?

my_array = []
for table_name in table_names
 result = my_func(table_name)
 result.each do |val|
  my_array.push val
 end
end

633 :デフォルトの名無しさん:2009/04/27(月) 13:58:34
my_array.concat(my_func(table_name))


634 :632:2009/04/27(月) 14:09:10
>>633
ドンピシャです!! どうもありがとうございました。
おなじ Array のマニュアルページに書いてあるのに見逃してしまった。

635 :デフォルトの名無しさん:2009/04/27(月) 15:54:07
Singletonをインクルードしたクラスのinstanceメソッドに引数渡せないのって不便くね?

636 :デフォルトの名無しさん:2009/04/27(月) 16:43:27
生成時に渡す引数によってオブジェクトの振る舞いが変化するようなものは
そもそも Singleton に向かないってことなんじゃまいか?

色々必要ならそんだけクラス作れよと

637 :デフォルトの名無しさん:2009/04/27(月) 17:01:35
instanceに引数が渡せるほうが不安だ。

638 :デフォルトの名無しさん:2009/04/28(火) 04:54:52
>>635
Singletonをインクルードしたクラスを生成するメソッドを書けばおk

639 :デフォルトの名無しさん:2009/04/28(火) 13:05:27
どこで聞いたらいいのかわからんのですが、ここで聞きます。

Ubuntu 8.0 LTSだと apt-getで入るのが Rubyが1.8.6なのですが、1.8.7が使いたいです。
1.8.7使うには自分でコンパイルするしかないのでしょうか?

Rubyスレの方がよかったら誘導してください

640 :デフォルトの名無しさん:2009/04/28(火) 13:09:08
すいません、Ubuntu 8.0 LTS → Ubuntu 8.04 LTS です

641 :635:2009/04/28(火) 13:17:57
ごちゃごちゃやってたら、頭の中がこんがらがってきた。

結局コンストラクタに引数を渡せるようにしたままsingleton化したい場合は、Singletonモジュールは
使わずに、該当クラスのnewメソッドを複数のインスタンスを生成できないように書いてしまえばいい
だけ? とか思ったが、何か根本的に間違ってるような気もするw

クラスメソッドとしてのnewは明示的に書けてしまうみたいだけど、その場合自分(クラス)のインス
タンスを生成するコードはどうやって書けばいいのかな? newメソッドはインスタンスを返すのが
普通だから、それを生成するコードがどうしても必要だよね?

642 :デフォルトの名無しさん:2009/04/28(火) 13:22:57
>>640
自前ビルドでRubyを入れると、他のRubyに依存してるパッケージも全て
自前ビルドするか、パッケージの依存関係をごまかすかしなきゃならない。

どちらにしてもすごく簡単ではないけど大丈夫?

643 :デフォルトの名無しさん:2009/04/28(火) 15:58:25
>>641
自己レス。

特定のクラスが(自分の定義中で)自分のインスタンスを生成するには、クラスメソッド(たとえばnew)
の中で<自分の名前>.allocateを実行すればいいらしい。(allocate自体はどこからでも呼べる)

ただしそのインスタンスをinitializeするには、(自分の定義中にある)他のインスタンスメソッドを
介さなければならない。

なぜなら、<自分の名前>.allocateの戻り値をinstで受け取ったとするとinst.initializeとしたくなるが、
initializeはprivateメソッドなのでレシーバ省略形式でしか呼び出せず、レシーバ省略形式で呼び出す
には、(クラスメソッドから呼び出せる)publicなインスタンスメソッドの中で呼び出すしかないから。

644 :デフォルトの名無しさん:2009/04/28(火) 18:20:00
>>639
>1.8.7使うには自分でコンパイルするしかないのでしょうか?
うんそう。
UbuntsuってDebian系だよね。DebianだとRubyが複数のパッケージに分散していてインストールするのがめんどくさいから、
おれが試した時は自前でインストールするほうが簡単だった。

以下おれの方法。rubyのバージョンごとにディレクトリを分けているので、configureするときに--prefixをつけてる(つけなければ/usr/localになる)。

wget ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7-p160.tar.bz2
tar xjf ruby-1.8.7-p160.tar.bz2
cd ruby-1.8.7-p160/
sudo mkdir -p /usr/local/ruby/1.8.7-p160
./configure --prefix=/usr/local/ruby/1.8.7-p160
make
sudo make install


645 :デフォルトの名無しさん:2009/04/28(火) 19:24:22
パッチレベルすらディレクトリを分離してるのか。
まあその方が、トラブル時には切り分けやすいか…。

646 :デフォルトの名無しさん:2009/04/28(火) 19:27:09
ディスクがたくさんあっていい感じだ

647 :デフォルトの名無しさん:2009/04/28(火) 19:29:02
文字列、配列、ハッシュの初期化の書き方についての質問です。
以下のそれぞれのペアは、等価?(どっちで書いても良い?)

my_string = ""
my_string = String.new

my_array = []
my_array = Array.new

my_hash = {}
my_hash = Hash.new

648 :デフォルトの名無しさん:2009/04/28(火) 19:35:46
>>647
Yes

649 :647:2009/04/28(火) 19:37:17
>>648
どうもありがとうございます!

650 :デフォルトの名無しさん:2009/04/28(火) 22:30:36
>>643
inst.instance_eval{initialize} じゃダメ?

651 :デフォルトの名無しさん:2009/04/28(火) 22:35:42
さすが マーチンファウラーお気に入りのベストパートナー
世界に羽ばたく
Ruby on Railsオフショアアジャイル開発
http://www.tech-arts.co.jp/news-and-topics/press-releases/20090427.html


652 :デフォルトの名無しさん:2009/04/28(火) 23:17:58
てか self.class.new でダメなことって少ないよな

653 :デフォルトの名無しさん:2009/04/29(水) 00:17:47
今まで数年間、テキストエディタのみでプログラミングしていたのですが
そろそろIDEにも、試しに手を出してみようかと考えています

Rubyに対応したIDEを探してみると、RDEの他には
Aptana Rails、NetBeans、Eclipse DLTKが見つかったのですが
これらの中で「これがオススメ」というものはありますか?
シンプルで理解が難しくないものを求めているのですが……

654 :デフォルトの名無しさん:2009/04/29(水) 00:44:01
特にありません

655 :デフォルトの名無しさん:2009/04/29(水) 01:02:37
テキストエディタのみとかおれには考えられん
環境がなかった昔はもちろんやってたけどな

656 :デフォルトの名無しさん:2009/04/29(水) 01:23:39
俺は今のところ IDE なしでもそんな不便はしてないかな
Cygwin + bash + vim + rake + 自作ツールっていう構成だけど

ただ、やってるうちに Rakefile がでっかくなっていくけどw

657 :デフォルトの名無しさん:2009/04/29(水) 02:02:23
テキストエディタのみって言っても
UNIX環境の支援のもとに emacs やら vim 使ってるのと
Windowsでメモ帳とか使ってるのとでは全然違うよな

658 :デフォルトの名無しさん:2009/04/29(水) 04:01:50
emacs + αで十分IDEチック

659 :デフォルトの名無しさん:2009/04/29(水) 06:02:34
メモ帳はまさにメモ帳であって。

emacsはフルカスタマイズ可能!ってか。
変態的な操作方法をもちょっと控えて、GUIベースのタブでバッファを切り替えるような
ものなら、もうちょっとご新規さんにもアピールするかと思うんだが。

660 :639:2009/04/29(水) 09:15:30
>>642
そうなのかー。

>>644
バージョンごとにやってるんですか。うおすごいですね。
コンパイル自体は大変ではないみたいですね。
問題はバージョンアップかあ。
aptとかで入れれたらうpでとも自動化できるのになあ

っと思って検索していたら、8.10のパッケージを使って1.8.7を入れる方法を見つけました。
最近のUbuntu では Ruby 1.8.7が標準みたいですね
簡単そうなので、まずは、これから試してみたいと思います。

Installing ruby 1.8.7 (and guessnet) on Hardy ? vanutsteen.nl => nerds only
http://www.vanutsteen.nl/2008/06/29/installing-ruby-187-and-guessnet-on-hardy/


スレ違いそうな話題にレスしていただきありがとうございました。
とういか、Ubuntuスレに投下してたつもりでしたw

661 :デフォルトの名無しさん:2009/04/29(水) 09:26:19
>>659
(EmacsをEmacsとして理解できないものには)Emacsを使うのは難しい。

Aquamacsだとタブが出るけどな。

662 :デフォルトの名無しさん:2009/04/29(水) 11:35:56
>>643
たぶん普通は

require 'singleton'
class C
include Singleton
def initialize
@i = nil
end
attr_accessor :i
def self.init(i)
c = self.instance
c.i = 1
c
end
end

p C.instance #=> #<C:0xb7d853e4 @i=nil>
p C.init(1) #=> #<C:0xb7d853e4 @i=1>
p C.instance #=> #<C:0xb7d853e4 @i=1>


663 :デフォルトの名無しさん:2009/04/29(水) 12:08:41
>>662
それを許すんならもはや定数に代入した普通のオブジェクトと変わらない気が

664 :デフォルトの名無しさん:2009/04/29(水) 12:24:00
ていうか、読みにくい

665 :635:2009/04/29(水) 15:10:47
みなさんレスありがとうございます。

>>650
> >>643
> inst.instance_eval{initialize} じゃダメ?

それでよさそうですね。初めて知りました。


もともと>>635と書いたのは、「引数を渡したいのは初期化の時だけだが、一度instanceしてから
値を渡すのが面倒」というのがあったからなので、>>662のやり方が簡単で良さそうです。

>>662の中の
> c.i = 1

> c.i = i
ですよね。

結局自分もsingletonにする意味あんまりないなと思い始めてしまってますが、最初の動機がたいした
ことじゃなかったということですね。

666 :デフォルトの名無しさん:2009/04/29(水) 15:44:41
ruby-pg-0.8.0ってPGresultのresultって使えますか?
num_tuplesとかは正常なのにresultとかstatusだとNoMethodErrorになります。
今までずっと古いやつを使っていたんですがメソッド名が変わったりとかしたんですかね?

667 :デフォルトの名無しさん:2009/04/29(水) 18:01:56
>>666
おお!俺も数日前にそれで困ってましたw

俺がしたこと
1) requireの置き換え
require "pg" # require "postgres"

2) resultメソッドの置き換え
res.map {|rowmap| res.fields.map {|f| rowmap[f]}} # return res.result

resultが無くなったのか、名前が変わったのかは知りません。
statusのほうは使ったことがありませんのであしからず。

668 :666:2009/04/29(水) 18:39:50
>>667
ありがとうございます!取得できるようになりました!

根本的な原因は気になりますが、
とりあえず動くようになったのでよしとします。

669 :653:2009/04/29(水) 18:58:20
いろいろなご意見ありがとうございます!
基本的にエディタ派の方が多いようですね
ただ、655さんの環境も気になります

>>657
Windows環境で、主にNotepad++を使ってスクリプトを書いております
コマンドライン環境はNYAOS+GnuWin32の構成です

670 :デフォルトの名無しさん:2009/04/30(木) 12:34:03
>>669
>>625-627から上の流れも参照してくれ

671 :デフォルトの名無しさん:2009/04/30(木) 18:29:51
VRFormってどこにあるの?rubyのフォルダを検索しても見つからない。
ほとんどのコントロールはvrcontrol.rbにあるのに。

672 :デフォルトの名無しさん:2009/05/01(金) 09:25:00
Array同士を簡単に同じでない行を調べることってできませんでしょうか?
a - a2みたいだと、差分という感じではない気がします。
通常のdiffツールだと、出力結果が上から調べるので順番に依存してしまいます(´・ω・`)

673 :デフォルトの名無しさん:2009/05/01(金) 09:26:40
>>672
あああああ、
pp (a2 - a)
pp (a - a2)
とお互い引けば、いいのかw

書いて気づいた
同じでない行ではあるか

674 :デフォルトの名無しさん:2009/05/01(金) 09:44:33
メソッド呼び出しにおいて、メソッド名と引数を囲む括弧の間には、
スペースを入れないことをおすすめする。

675 :デフォルトの名無しさん:2009/05/01(金) 17:16:25
排他的論理和は (a|a2) - (a&a2) でも

676 :デフォルトの名無しさん:2009/05/02(土) 17:32:42
エクスクルゥーシブー・オアッ!!

677 :デフォルトの名無しさん:2009/05/02(土) 19:53:16
勉強始めたらいきなりこんなもん見つけたんですけど。
バグでしょ?
#ruby 1.8.7p72 mswin32
module A
def f()
print "test ok!\n"
end
end
#include A
A::f()

test.rb:7: undefined method `f' for A:Module (NoMethodError)
ちゃうか〜

678 :デフォルトの名無しさん:2009/05/02(土) 19:57:48
>>677
ttp://www.ruby-lang.org/ja/man/html/Module.html#module_function
素のままだと「Aというオブジェクト」がもってるメソッドじゃないし。

679 :デフォルトの名無しさん:2009/05/02(土) 19:58:24
Rubyに限らないけど、まず自分のプログラムに問題がないか考えた方がいいよ。
2〜3回くらい恥をかけば直るんだけどね。最初からかかないことにこしたことはない。

680 :デフォルトの名無しさん:2009/05/02(土) 19:59:58
Rubyのめんどくさいところにいきなりぶつかるセンスは賞賛に値すると思う

681 :デフォルトの名無しさん:2009/05/02(土) 20:17:12
そっか、バグじゃないかぁ
コメントアウトしてあるinclue Aを生かすと、動作しちゃうんですけど。
変じゃね?

682 :デフォルトの名無しさん:2009/05/02(土) 20:19:44
>>681
どうしてコメントをはずすの?
なんのためにコメントをはずすの?

683 :677:2009/05/02(土) 20:32:47
なんのためにといわれても...
テストプログラムだからいろんなケースを比較して、
変じゃないかなと

684 :デフォルトの名無しさん:2009/05/02(土) 20:39:47
つまり、意味もわからずincludeしたりしなかったりを試していると。


685 :677:2009/05/02(土) 20:56:15
print Math::PIは動くね。
もっとも、Mathはrubyインタープリターによって
特別待遇を受けているだろうから、あまり比較にはならんだろうけど。


686 :デフォルトの名無しさん:2009/05/02(土) 21:18:41
>>685
>>681は目の付け所いいなと思ったけど・・・
Module#module_functionは読んだ?

687 :677:2009/05/02(土) 21:37:08
なるほど、すくなくとも仕様であることは、理解しました。
どうもありがとうございます。
しかし、なんとも不可解に見える仕様。でも、理由があるんでしょう。
勉強します。

688 :デフォルトの名無しさん:2009/05/02(土) 21:37:55
>>683
ちゃんと理由を考えながらテストしないと、あまり意味がないぞ

結論から言うと理解を間違えている
A::f() の形でメソッドを呼びたいなら、次のような方法を使うべき
(他にも特異クラスを使った方法とかあるけど、ここでは省略)

1.
def A.f()
end

2.
module A
 module_function

 def f()
 end
end

689 :デフォルトの名無しさん:2009/05/02(土) 22:54:31
module_functionというのは知らなかったので試してみた。
折角なので張っておく。 これで>>677の疑問も解けるとよいけど。
irb(main):001:0> module M
irb(main):002:1> def self.f() [:module, self] end
irb(main):003:1> def f() [:instance, self] end
irb(main):004:1> module_function
irb(main):005:1> def mf; [:module_function, self] end
irb(main):006:1> end
irb(main):007:0> class C
irb(main):008:1> include M
irb(main):009:1> def cmf() mf end
irb(main):010:1> end
irb(main):011:0> c = C.new
=> #<C:0x28de620>
irb(main):013:0* M.f
=> [:module, M]
irb(main):014:0> C.f
NoMethodError: undefined method `f' for C:Class
irb(main):015:0> c.f
=> [:instance, #<C:0x28de620>]
irb(main):016:0> M.mf
=> [:module_function, M]
irb(main):017:0> C.mf
NoMethodError: undefined method `mf' for C:Class
irb(main):018:0> c.mf
NoMethodError: private method `mf' called for #<C:0x28de620>
irb(main):019:0> c.cmf
=> [:module_function, #<C:0x28de620>]
irb(main):020:0> include M
=> Object
irb(main):021:0> mf
=> [:module_function, main]

690 :デフォルトの名無しさん:2009/05/02(土) 23:12:33
さっきのを書いている間に生じた疑問がひとつ。
親クラスのクラスメソッドは継承されるけど、
インクルードしたモジュールのクラスメソッド(?)は継承されない。
module_functionのクラスメソッド側もやはり同じ。

いったいどういう理由でこうなっているの?

irb(main):001:0> module M
irb(main):002:1> def self.f() [:module, self] end
irb(main):003:1> module_function
irb(main):004:1> def mf() [:module_function, self] end
irb(main):005:1> end
irb(main):006:0> class C0
irb(main):007:1> def self.cf() [:class, self] end
irb(main):008:1> end
irb(main):009:0> class C < C0; include M end

irb(main):010:0> C.f
NoMethodError: undefined method `f' for C:Class
irb(main):011:0> C.cf
=> [:class, C]
irb(main):012:0> C.mf
NoMethodError: undefined method `mf' for C:Class
irb(main):013:0> C.new.mf
NoMethodError: private method `mf' called for #<C:0x28d636c>

691 :デフォルトの名無しさん:2009/05/03(日) 08:53:23
実はrubyにはクラス(モジュール)メソッドという仕組みはなくて、クラスに定義された
特異メソッドが他の言語のクラスメソッドと同じように使えるだけ(と思ってる)
クラスの継承で特異メソッドが継承され、includeでは無視されるのは仕様としか
大体「クラスメソッド」として使うんだから「クラス名.メソッド名(引数)」の
クラス名にはメソッドが定義されているクラスを使うべきだろう

692 :デフォルトの名無しさん:2009/05/03(日) 13:01:17
継承してないから継承されない
じゃ駄目かね

693 :デフォルトの名無しさん:2009/05/03(日) 13:25:37
Mix-inてのは親子関係が木構造になるように制限をした多重継承だと
理解していたんだけど、Rubyのモジュールはちょっと違うということかな。

上のコードでいうと、c is_a M だけど C is_a M ではなかったから、一瞬
そういうものかと思ったものの、 C is_a C0 というわけでもなかったぜ。
うーん、いまいち腑に落ちないな。


694 :デフォルトの名無しさん:2009/05/03(日) 20:27:14
>>690
メソッドを継承すると遮蔽定義によって、メソッドの動作を変更できてしまう
からじゃね?
モジュールは多重にインクルードできるから、継承経路によって、
振る舞いが変わる可能性があるので、そういう仕様になってるんじゃねえかなぁ
よくわからんけど

695 :デフォルトの名無しさん:2009/05/03(日) 21:57:18
>>690
>親クラスのクラスメソッドは継承されるけど、
>インクルードしたモジュールのクラスメソッド(?)は継承されない。
>module_functionのクラスメソッド側もやはり同じ。
>いったいどういう理由でこうなっているの?

そういう仕様だから。
もちょっというと、includeはメタクラスには影響を与えないから。
自分で調べるなら「Ruby クラス階層図」でぐぐるといいかも。

696 :デフォルトの名無しさん:2009/05/03(日) 22:56:40
あの辺の理論はこんがらがる
Class.class => Classって辺りで混乱が最高潮

697 :デフォルトの名無しさん:2009/05/03(日) 23:53:39
弾幕シューティングのやり過ぎで >>690-691 の irb が、全部敵弾に見える

698 :デフォルトの名無しさん:2009/05/04(月) 00:47:42
>>697の気持ちは残念ながらわかってやれないが
整形されてないとここまで読む気が失せるものだと再認識させられた

699 :デフォルトの名無しさん:2009/05/04(月) 00:51:52
Linux 版のデフォルト設定の irb は死ぬほど見づらい
デフォルトで行番号表示つけるならもっと履歴を使いやすくしろ
っていうか irb で出る例外の 99 パーセントは直前行だろ需要考えろよ

700 :デフォルトの名無しさん:2009/05/04(月) 00:58:40
そういや、irb使ってるとき、ついシェル感覚で !10 とかタイプ
してしまう。そして
=> false
という出力をみてはじめて気付く。

!p
=> true
とやってしまったときは、何がおきたか一瞬わからなかった。




701 :デフォルトの名無しさん:2009/05/04(月) 02:42:13
wirbleかutility_belt使ったらどうだろう。
utility_beltはWindowsだとダメポだったけど

702 :デフォルトの名無しさん:2009/05/04(月) 11:21:11
~/.irbrcに最低これくらいは書いとくよね

# vim:ft=ruby
require 'irb/completion'
__history__ = File.expand_path('~/.irb_history')
File.foreach(__history__) {|line| Readline::HISTORY.push(line.chomp) }
END { File.open(__history__, 'w') {|f| f.puts Readline::HISTORY.to_a.join("\n") } }
IRB.conf[:PROMPT_MODE] = :SIMPLE


703 :デフォルトの名無しさん:2009/05/04(月) 11:34:09
あーいるよな、デフォルト設定の話してるときに「カスタマイズすればいい」とか脳のとろけた話する奴

704 :デフォルトの名無しさん:2009/05/04(月) 12:06:20
もんだいはどちらがコストが低いかと言う話になる。
この場合、カスタマイズの例を実際に >>702が出してくれたので、
irb本体に手を入れるよりよほど簡単である。

許されてもよいのではないか。

RubyGemsで一発で解決することに対して、数行のモンキーパッチで解決するならまだしも、
長々とスクリプトを書くのであれば、どちらがコストが低いかは自明

705 :デフォルトの名無しさん:2009/05/04(月) 12:20:13
自演乙

706 :デフォルトの名無しさん:2009/05/04(月) 14:09:22
まあそのへんは果てしなくどうでもいい

707 :デフォルトの名無しさん:2009/05/04(月) 14:53:41
自分用のスクリプトで引数にキーワードハッシュでも文字列ハッシュでも通常引数でも動作するようにしたり
クラスメソッドでparseみたいな総合一連動作メソッドを作りまくったりしてると
YAGNIということばを思い出す

オチはとくにない

708 :デフォルトの名無しさん:2009/05/04(月) 17:18:06
標準入力から読み込んだ画像を表示するビューアを探しているのですが、探す暇もない(面倒)なので
自分で簡単なビューアを作ろうとruby-gtk2のリファレンス読んでいたのですが...
(まあこんな感じ cat image.jpg | imageviewer)

Gtk::Imageをざっと目を通したところ、画像ファイルの名前を指定するようですが
$stdin.read とか指定できませんかね?

709 :デフォルトの名無しさん:2009/05/04(月) 17:50:50
あのへんはRuby関係ないからなー

710 :デフォルトの名無しさん:2009/05/04(月) 17:55:29
708だけど、imagemagickで実現できたわ(^^
$ cat image.jpg | display でおk。

まあimagemagickも/tmp/magick-Xxxxのような一時ファイルを作成しているから
同じようにすればいいのかな。。

711 :デフォルトの名無しさん:2009/05/04(月) 18:35:20
>>709
2ch は、7割が脱線で出来ています。

712 :デフォルトの名無しさん:2009/05/04(月) 20:05:28
>>708
前に画像ビューア作ってたとき、漏れはこんな感じで
PixbufLoaderとcairo使ってごにょごにょやってた

require "gtk2"

ploader = Gdk::PixbufLoader.new
ploader.write($stdin.read)
ploader.close

drawing_area = Gtk::DrawingArea.new
window = Gtk::Window.new
window.signal_connect("destroy") do
Gtk.main_quit
false
end

drawing_area.signal_connect("expose-event") do |w, e|
context = w.window.create_cairo_context
context.save do
context.set_source_pixbuf(ploader.pixbuf)
context.paint
end
true
end

window.add(drawing_area)
window.show_all
Gtk.main

713 :デフォルトの名無しさん:2009/05/04(月) 20:29:24
なんでRubyでそういうの作ろうと思うのかね
もしかしてRubyしか使えないとか?

714 :デフォルトの名無しさん:2009/05/04(月) 20:34:41
Rubyからアクセスすれば簡単手軽に作れるからだろ


実際問題として簡単でも手軽でもないような気もするがまあそれはそれで

715 :デフォルトの名無しさん:2009/05/04(月) 20:41:59
楽だから

716 :デフォルトの名無しさん:2009/05/04(月) 20:44:45
Rubyで書くと おちんちんきもちいいお(´;ω;`) だから

717 :デフォルトの名無しさん:2009/05/04(月) 22:25:51
708でも712でも無いけど、どうしても速度が欲しければjavaかCで書く
でも普段はそんなん必要ないから楽ちんなrubyで書く
>>713なら何で書くのさ?アセンブラ?まさかマシン語とか?

718 :デフォルトの名無しさん:2009/05/05(火) 00:39:46
vistaのローカルにいれているRubyの1.86を
1.9xにアップグレードしたいのですが
インスト方法どこかに書いてありますか?


719 :デフォルトの名無しさん:2009/05/05(火) 00:58:12
それはアップグレードではなくアンインストール後の新規インストールになるな

720 :デフォルトの名無しさん:2009/05/05(火) 01:18:23
>>718
あなたは、1.9x を使う要件を満たしません。
1.8x を使い続けてください。

721 :デフォルトの名無しさん:2009/05/05(火) 01:20:10
まだヘソ曲げてんのかよw

722 :718:2009/05/05(火) 01:57:45
できました。
1.86アンインスト

1.9x解凍、C:\に置く

windowsのシステム環境変数書き換え

でしたね、できました。
複数バージョン置けたんですかね。
記法が変わりすぎで1.9xの中心にしか
覚えませんが。。

723 :デフォルトの名無しさん:2009/05/05(火) 16:05:42
RDEを使いたいと考えて、インストールして、実行してるんだけど
以下のコードを書いたらエラーっぽいメッセージがRDEから出でる。

----------------------
a = []
a.each do |x|
x.
----------------------

メッセージ
Access violation ta address 004B0137 in module 'rde.exe'.Read of address 00000015.

x.の"."を打ったところで出るので、オブジェクトのメソッドを取得しようとして失敗しでもしてるのだろうか?
エラーメッセージをとりあえず無視してるのだけど、気味が悪いので、対策知ってる人がいたら教えてください。



724 :デフォルトの名無しさん:2009/05/05(火) 19:19:30
    || 時刻1 | 時刻2 | 時刻3 | …
------------------------------
分類1 || d_1_1 | d_1_2 | d_1_3 |
分類2 || d_2_1 | d_2_2 | d_2_3 |
分類3
  :

というスプレッドシートっぽい概念がしっくり来るデータがあります
(実際は2系統が直接関連付けられてないバラバラなハッシュです)

データ.category("分類1") とすると [d1_1, d1_2, d1_3, ...] というようにす

725 :デフォルトの名無しさん:2009/05/05(火) 19:21:48
…悩んでたら途中で送っちゃった
こんなごっつい構造のデータでなくてもいいような気がさっきからずっとしてるので
とりあえずキャンセルしますごめんね

726 :デフォルトの名無しさん:2009/05/05(火) 19:51:04
キャンセル吹いたw

727 :受付嬢:2009/05/05(火) 21:45:30
また、いらしてください

728 :デフォルトの名無しさん:2009/05/05(火) 22:36:29
以前から不思議だったんだが
RDEはなぜこれほどまでにバグだらけなのだろう
何か理由があるのだろうか

729 :デフォルトの名無しさん:2009/05/05(火) 22:39:43
マジレスすると玄人が使わないからバグ報告が少ないとかじゃないか

730 :デフォルトの名無しさん:2009/05/05(火) 22:53:24
どこからかだったか忘れたけど

require 'irb/completion'
require 'irb/ext/save-history'
IRB.conf[:SAVE_HISTORY] = 99999
IRB.conf[:PROMPT_MODE] = :XMP
require 'pathname'
require 'fileutils'
require 'uri'
require 'pp'


731 :デフォルトの名無しさん:2009/05/05(火) 22:55:50
使われない→バグが取れない→使われない・・・・の
負のスパイラルに陥ってる可能性が

732 :デフォルトの名無しさん:2009/05/05(火) 23:31:59
剰余の挙動が意味不明で躓きそう
http://0xcc.net/blog/archives/000083.html
こんなもんなんすか?

733 :デフォルトの名無しさん:2009/05/05(火) 23:50:54
>>732
スレタイのRuby初心者となんの関係もない話題だが、
Division and Modulus for Computer Scientists でも読んでみたら?

734 :デフォルトの名無しさん:2009/05/06(水) 00:55:50
>>733
ttp://research.microsoft.com/en-us/um/people/daan/download/papers/divmodnote-letter.pdf#search=%27Division%20and%20Modulus%20for%20Computer%20Scientists%27
Floored divisionってくだりですね。
剰余と除数の符号が揃うまで
試行する。。なるほど。。

Web業界とはいえ企画職で
文系には小一時間かかりました(笑
ありがとうございます。

735 :デフォルトの名無しさん:2009/05/06(水) 07:14:15
>>732
おいおいスクリプト言語ぜいが全然周りと違ってて吹いた。
下手するとハマるね、これは。
こういうのって何かで規定されてないのかね…。

AA化してみた

負の剰余

       C   Java   PHP  Emacs Ruby Python Perl
      (GCC (Sun JDK 4.3.10 22.0.50.2 1.8.2  2.3.5  5.8.4
      3.3.5) 1.5.0_05)   -16
 -3 % 5  -3   -3     -3   -3    2     2    2
.  3 % -5   3    3     3    3    -2   -2  -2
 -3 % -5  -3   -3     -3   -3    -3   -3  -3

こんなプログラムはいやだ: 負の剰余 - bkブログ
http://0xcc.net/blog/archives/000083.html

736 :デフォルトの名無しさん:2009/05/06(水) 08:03:39
個人的にはスクリプト言語勢の振る舞いがしっくり来るなあ。
しかし数学的な定義はないのか?ありそうだが。

737 :デフォルトの名無しさん:2009/05/06(水) 08:16:14
定義されてるよ。

「 A mod B は "AをBで割った余り"」だから「B と商 x をかけて剰余を足すと A に戻る」でいいよな?

-3 mod 5 = -3 だとする場合 (C言語)
 5 と 商 0 をかけて剰余 -3 を足すと 5 * 0 + (-3) = -3 に戻る…正解
-3 mod 5 = 2 だとする場合 (スクリプト言語)
 5 と 商 -1 をかけて剰余 2 を足すと 5 * (-1) + 2 = -3 に戻る…正解

ということで、そもそも2通りあるから、「どっちでもいい」。
手計算の世界では「剰余は商より小さい正の整数」という条件がついてたりするんだけど
(「10割る3」は「商3余り1」であるべきで、「商4余り-2」ではないと習ったはず)
C言語は「割られる数が負なら絶対値で計算して結果を負に変換する」という流儀に従ってる。
まあ、剰余に関しては言語のマニュアル必ず読めって感じだな。

738 :デフォルトの名無しさん:2009/05/06(水) 08:41:01
CやC++なんかの仕様では
  「割る数と割られる数の両方が正である場合は商と剰余は必ず正であるが、
  少なくともどちらかが負である場合は定義しないので処理系が得意なように作れ」
とかヤな感じに丸投げなことが書いてあったはず

739 :デフォルトの名無しさん:2009/05/06(水) 08:50:02
>>738
CやC++の場合は、コンパイラが、「俺は知ったこっちゃねぇ。CPUに任せる」という
コード生成ができるという利点がある。

740 :デフォルトの名無しさん:2009/05/06(水) 08:57:32
ってことは正確を期したいならどんな言語使うにせよ
正負の確認処理を挟むべきってことか

741 :デフォルトの名無しさん:2009/05/06(水) 09:00:49
負の除算は意図をもって行われるべきだってことだね
まあ、コンピュータにおける除算自体がそもそも日常視点では怪しさのカタマリだから慎重になるべきなんだけどさ

742 :デフォルトの名無しさん:2009/05/06(水) 09:02:23
>>740
確認したってどうせ一つしか結果は出てこないんだから、
それなら最初から自分で関数組んだ方がw

743 :デフォルトの名無しさん:2009/05/06(水) 09:09:01
一般的用途においては割る数と割られる数の両方を事前に絶対値とって使うべきかね
剰余を使う機会で負になるのはたいてい割られる数だし

744 :デフォルトの名無しさん:2009/05/06(水) 09:26:39
>>723
http://hpcgi2.nifty.com/sakazuki/forum/wwwforum.cgi?id=1&az=thread&number=250
自分の場合、ここを参考にver1.0.1をインストールした後にver1.1.1を上書きインストールしたら
エラーが出なくなった。

745 :デフォルトの名無しさん:2009/05/06(水) 10:09:29
>>744
ありがと!
足りないファイルを1.0.1からコピーしたらエラーでなくなったよ

746 :デフォルトの名無しさん:2009/05/06(水) 10:23:58
>>735
>>736

数学的にどうこうってのは737の書いたとおりで
http://en.wikipedia.org/wiki/Modulo_operation
に、いろんなプログラミング言語でどっちなのかまとめている表があるよ。

両方持ってる奴もあるんだなw


747 :デフォルトの名無しさん:2009/05/06(水) 17:37:44
rspec 使って遊んでます

「大量のファイルやら外部参照やらがあり、きちんと動作することが現状
 おおむねわかりきってるひとまとまりの部分のテスト」

「今テストしたい部分を繰り返しテストして試す」
という行為にちょっとジャマ(処理に時間かかるし、ファイルアクセスがなんとなく無駄)です

if false # 終わったので一旦スルー
 …
end

で囲うというのも考えたんですが、なんかこうスマートな考え方はないもんでしょうか?

748 :デフォルトの名無しさん:2009/05/06(水) 18:02:36
>>747
つ pending

外部と接続する部分は、mockがうまく利用できる形に持っていくのもよい。


749 :デフォルトの名無しさん:2009/05/06(水) 18:38:14
>>747
スペックファイルを分割すればいいのでは?

750 :デフォルトの名無しさん:2009/05/06(水) 18:44:56
ネットからファイルを取得する処理のあるスクリプトなんかは困るよね
specコマンド連打するたびにGETが大量に起こったり

751 :デフォルトの名無しさん:2009/05/06(水) 19:25:25
そんなの、specファイルの中でメソッド再定義すればいいじゃん
サーバへアクセスしてる部分を事前に保存しておいたローカルのファイルを読むように書き換えればいい

752 :デフォルトの名無しさん:2009/05/06(水) 19:32:53
specファイルの中でオリジナル書き換えたらオリジナルのテストになんねえよ

753 :デフォルトの名無しさん:2009/05/06(水) 19:35:55
なんという正論

754 :デフォルトの名無しさん:2009/05/06(水) 19:39:41
>>752
そのメソッドをテストするときだけオリジナルの動作になれば問題ないだろ
html = $TEST_HOGE ? File.read("local.html") : open(uri).read

755 :デフォルトの名無しさん:2009/05/06(水) 19:43:27
「実際にネットワークからモノを取ってくるオブジェクトX」自体
のテストではネットワークを使わざるをえないが、それのテストが
十分出来ているなら、Xの利用者をテストする際には、Xはmockで
代用できる。






756 :デフォルトの名無しさん:2009/05/06(水) 19:50:49
>>754
実質的な動作は同じだしな
テストできないで終わるよりずっとマシ

757 :デフォルトの名無しさん:2009/05/06(水) 20:12:53
>>754
だからこうするんだってば
def get(uri)
 return uri.read
end
  ↓
def get(uri)
 return File.read('local.html')
end


758 :デフォルトの名無しさん:2009/05/06(水) 20:21:04
>>757
微妙・・・
テスト内の複合バグとかさくさく作り込みそうに見える。
元のコードがみんなシンプルなものならいいかもしれないけど。
mockとかstubってのはそういう書き換えをしなくていいためにあるんじゃないの?

ttp://www.ibm.com/developerworks/jp/web/library/wa-mockrails/
とか
ttp://d.hatena.ne.jp/takihiro/20081023/1224762895
とか読んでも全く使い方はわからんかったが

759 :デフォルトの名無しさん:2009/05/06(水) 20:27:58
コストのかかる部分を全部メソッドとして吐き出せるようにクラスを作る
そうすればその部分のメソッド定義を書き換えるだけでテストが書きやすい

760 :デフォルトの名無しさん:2009/05/06(水) 20:30:49
インスタンス変数をメソッド内で利用するとテストで条件変えたときに書き換えられないから、
全部引数で渡すようにするのがポイント

761 :デフォルトの名無しさん:2009/05/06(水) 20:33:50
RSpecのテストに対応させてスクリプトを作ると諸記述が2ランクくらい退化するというのはよくある

巷のRSpecの解説は一番大事なことをあえてすっ飛ばしてると思うんだ

762 :デフォルトの名無しさん:2009/05/06(水) 20:35:00
>>759
なるほど

>>760
こっちは・・・どうなんだろう。

いずれにせよ、テストしやすい書き方も大事ってことか。

763 :デフォルトの名無しさん:2009/05/06(水) 20:39:02
>>761
describe と before と it と should と eql しか使わせる気がなさそうな説明はいくつか…
これしか使わなくてもテストは書けるのでタチが悪い
これ以上のことを説明する気がないのならむしろRSpecを使わせないほうが効率も能率も高い

764 :デフォルトの名無しさん:2009/05/06(水) 20:41:20
>>763
なにそのるびま

765 :デフォルトの名無しさん:2009/05/06(水) 21:11:43
rspec といえば、あれって「○○と表示されること」をテストするのってどうするん?

766 :デフォルトの名無しさん:2009/05/06(水) 21:40:48
>>764
素晴らしい先駆者であるがゆえに失速の影響が…


えー、「内部の○○メソッドを今は動作したことにしたい」というカジュアルな用途には、stub! が使えると思われ

require 'spec'; require 'open-uri'
class Hoge
def get(uri); open(uri).read; end
def pick_title(uri); get(uri).scan(/<title>(.+?)<\/title>/).to_s; end
def main
pick_title('http://www.example.com/')
end
end
# -----------------------
describe Hoge do
before :all do
@hoge = Hoge.new
end
describe "#main: サーバからHTMLを取得してタイトルを表示する" do
it "たいとる!" do
@hoge.stub!(:get).and_return('<html><title>たいとる!</title></html>')
@hoge.main.should eql('たいとる!')
end
end
end

「@hoge の get メソッドが呼ばれたときは処理を横取りして and_return の引数を代わりに返すようにする」という記述
あんま小難しいこと考えなくていいのでとっても便利

767 :デフォルトの名無しさん:2009/05/06(水) 22:23:06
…これはこれで stub! ばかりになりそうw

768 :デフォルトの名無しさん:2009/05/07(木) 03:40:20
rspecにはTest::Unitの-nオプションみたいにテストを限定する方法はないの?

769 :デフォルトの名無しさん:2009/05/07(木) 05:45:40
>>750
つ FakeWeb

外部URLを偽装するテスト用ライブラリ「FakeWeb」
http://doruby.kbmj.com/x5r_on_rails/20090427/_URL_FakeWeb_1

MOONGIFT: ≫ Web API/Mashup開発者に必須!オフラインでも外部アクセスをテストできる「FakeWeb」:オープンソースを毎日紹介
http://www.moongift.jp/2009/04/fakeweb/

まあ、こういうのをスタブ?っちゅーらしいが

770 :デフォルトの名無しさん:2009/05/08(金) 00:15:40
str = String.new
p str << 84 << 85 << 75 << 65 << 82 << 69 << 84 << 65

#ふー。。。

771 :デフォルトの名無しさん:2009/05/08(金) 11:35:21
require 'pstore'
h = Hash.new{|h, k| h[k] = Array.new}
h[0] << 'a' << 'b' << 'c'
PStore.new('_hoge_.pstore').transaction{|pstore| pstore[1] = h}

これを実行すると
/usr/lib/ruby/1.8/pstore.rb:349:in `dump': can't dump hash with default proc (TypeError)
と言われます。
既存のハッシュを「無難な」ハッシュに変換してそれをまた戻す方法とかないもんでしょうか

772 :デフォルトの名無しさん:2009/05/08(金) 11:46:17
うわー
それじゃデフォルト値つきの配列やハッシュって駄目じゃん
普通の配列やハッシュのつもりで誰がMarshalするかわからないんだし怖くて使えん

773 :デフォルトの名無しさん:2009/05/08(金) 11:48:31
hh = Hash[h] ではどう?

774 :デフォルトの名無しさん:2009/05/08(金) 11:51:42
>>772
Proc つきのまま外に出すなってことなんだと思う
デフォルト値つきのハッシュはデータ製作用の仮形態のみにしておく

require 'pstore'
def makedata
h = Hash.new{|h, k| h[k] = Array.new}
h[0] << 'a' << 'b' << 'c'
return Hash.new.merge(h)
end
h = makedata
PStore.new('_hoge_.pstore').transaction{|pstore| pstore[1] = h}

これなら動作する
開発者側が気を遣えってことなんだろうな

既存の誰かが作った(そしてどこに初期値つきハッシュが使われてるのかよくわからん)データを
マーシャル可能な形態に変換する方法は知らん

775 :デフォルトの名無しさん:2009/05/08(金) 12:01:39
>>771
いっそのことYAMLにしてしまうとか
require 'pp'
require 'yaml'

#h = {0 => Array.new}
h = Hash.new{|h, k| h[k] = Array.new}
h[0] << 'A' << 'B' << 'C'
h["mage"] << '100' << 1234.56 << :hage

pp h
puts

y = h.to_yaml
puts y
puts

new_h = YAML.load(y)
pp new_h

pp h == new_h

776 :デフォルトの名無しさん:2009/05/08(金) 12:05:25
わざわざ PStore するってことはオブジェクトとして一時保管したいのだろう
YAML ではどうにもならん気もする

777 :デフォルトの名無しさん:2009/05/08(金) 12:06:03
では、yaml/storeで

#!ruby -Ku
$KCODE='u'

require 'pp'
require 'yaml/store'
#require 'pstore'

h = Hash.new{|h, k| h[k] = Array.new}
h[0] << 'a' << 'b' << 'c'
YAML::Store.new('_hoge_.pstore').transaction{|pstore| pstore[1] = h}

778 :デフォルトの名無しさん:2009/05/08(金) 12:06:48
あああ、てか、procごと保存して復元したいってことなのか?PStoreってそこまで対応しとるノン?

779 :デフォルトの名無しさん:2009/05/08(金) 12:11:50
Rubyist Magazine - 標準添付ライブラリ紹介 【第 9 回】 PStore
http://jp.rubyist.net/magazine/?0016-BundledLibraries

> IO や Proc などの Marshal.dump が出来ないオブジェクトは保存することが出来ませんが、
> Marshal.dump 出来るオブジェクトなら何でも保存できて、Marshal.load 出来るものは何でも読み込めます。

駄目なんすね・・・まあ普通考えたらそうか

procで詰まるってことは、後でevalれるコードを格納できるように、
って難しく考えないで、1個1個個別対処しかないんじゃないのかなあ。
復元時にprocを戻すようにというか、Hash.new{|h, k| h[k] = Array.new} 生成して再代入と言うか

780 :デフォルトの名無しさん:2009/05/08(金) 12:19:55
一応>>774が答ではあるのだろう
出しっぱなしにならないようにクラス製作者に気をつけてもらうしかなさそうだ
デフォルト値の動作が重要な代入可能な配列なんかを提供する場合は
Procつき配列をそのまま出すのではなくそういうデフォルト動作をするメソッドを自力で作れと

781 :デフォルトの名無しさん:2009/05/08(金) 12:22:55
めんどいな

782 :デフォルトの名無しさん:2009/05/08(金) 15:34:57
class MyHash < Hash
def initialize(*args)
super {|h, k| h[k] = []}
end
def marshal_dump
Hash.new.update(self)
end
def marshal_load(data)
update(data)
end
end


783 :デフォルトの名無しさん:2009/05/08(金) 17:43:17
マニュアルのとこにちょろっと書いておいてくれるとよかったのにね
「ただし、ブロックは Proc なのでこのままではオブジェクトを Marshal することができません。Hash#merge して下さい」とか

784 :753:2009/05/08(金) 17:49:20
>>728
同じ事を考えたんだけどmarshal_loadしたオブジェクトは
initializeされてないからdefault_procが再設定されてないのよ

h = MyHash.new
h[0] << 'a' << 'b' << 'c'
h = Marshal.load(Marshal.dump(h))
h[1] << 'a' << 'b' << 'c'
#=> undefined method `<<' for nil:NilClass (NoMethodError)

initialize以外でdefault_procは設定出来ないしどうしたもんかね

785 :784:2009/05/08(金) 17:51:39
名前欄は無視してくだしあ

786 :デフォルトの名無しさん:2009/05/08(金) 19:52:10
>>770
>p str << 84 << 85 << 75 << 65 << 82 << 69 << 84 << 65

これって fusiあな、、?

787 :デフォルトの名無しさん:2009/05/08(金) 20:39:17
TSUKARETA

788 :デフォルトの名無しさん:2009/05/08(金) 20:39:48
$ irb1.8
irb(main):001:0> str = String.new
=> ""
irb(main):002:0> p str << 84 << 85 << 75 << 65 << 82 << 69 << 84 << 65
"TUKARETA"
=> nil
irb(main):003:0>


789 :デフォルトの名無しさん:2009/05/08(金) 21:21:55
String.new << e

は、e.to_s した結果を末尾に追加するべきだと思う

790 :デフォルトの名無しさん:2009/05/08(金) 21:26:18
まあ ASCII コードの取り扱いのへんはいろいろシガラミがあってだな

791 :デフォルトの名無しさん:2009/05/08(金) 23:26:20
Rubyユーザとは思えない>>772のレスのせいで初心者が混乱しかねないので、
一応言っとく。

○デフォルト値はあってもMarshalできる(もちろんpstoreも)

h = Hash.new(1)
h = Marshal.load(Marshal.dump(h))
p h[:foo] #=> 1

○ダメなのはdefault_proc

h = Hash.new {}
Marshal.dump(h) #=> can't dump hash with default proc (TypeError)

○default_procはHash#default=で消せる

h = Hash.new {}
h.default = nil
h = Marshal.load(Marshal.dump(h))
p h #=> {}

○配列にデフォルト値などない

a = []
a.default = 1 #=> undefined method `default=' for []:Array (NoMethodError)

792 :デフォルトの名無しさん:2009/05/08(金) 23:31:13
>>784
Hash#default_proc=

793 :デフォルトの名無しさん:2009/05/09(土) 01:38:12
>>792
このスレでは1.9をデフォと思わないほうがいい。


794 :784:2009/05/09(土) 01:46:48
>>792
1.8.7だと undefined method になっちゃう(1.8.8とかで取り込んで欲しいな)
てかinitialize呼んじゃってもいいのね
def marshal_load(data)
 update(data)
 initialize {|h,k| h[k] = Array.new }
end

# あとアンカも間違えてた ×>>728>>782

795 :デフォルトの名無しさん:2009/05/09(土) 02:43:48
http://asobi.sqweebs.com/learn/1.php

Rubyではこんなの、作れないっしょ!

796 :デフォルトの名無しさん:2009/05/09(土) 05:34:28
てか、自分でクラス作ってるならこんな面倒なことしなくても
「該当部分の見当つくんだから空のハッシュとマージさせとけ今からやれ」で終了なわけで
ソース読むのめんどいくらいの他人様のライブラリを仮定してると思われる以上
そこで「1.9ならできる」というのはいささか的外れな気もする

797 :デフォルトの名無しさん:2009/05/09(土) 07:48:41
>>791
こういうのまとめたwikiが欲しいな…
RubyのFAQ用のwikiみたいなのってなかったけ?

798 :デフォルトの名無しさん:2009/05/09(土) 08:40:47
>>797
マニュアル嫁

799 :デフォルトの名無しさん:2009/05/09(土) 08:43:37
>>797
WikiのURLがいつのまにかテンプレから外されてるな
どっちも更新少ないから無理もないが

■ちょっと前にできたWiki
Ruby 初心者スレッド Hiki
http://starlet.s145.xrea.com/ruby/hiki/
Ruby Portal
http://ruby.morphball.net/portal/

800 :デフォルトの名無しさん:2009/05/09(土) 09:19:06
>>791
Ruby 初心者スレッド Hiki - PStore、Marshal関係
http://starlet.s145.xrea.com/ruby/hiki/index.cgi?PStore

転記しておいた

801 :デフォルトの名無しさん:2009/05/09(土) 09:59:13
質問です
オブジェクトが、あるモジュールに含まれるクラス群のインスタンスであるかどうかを
調べる簡単な方法はありますか?

現在、
obj.class.to_s =~ /MyModule/

みたいな判定の仕方をしているのですが、こういうことに正規表現マッチを
使うのも大げさな気がします。もっと簡潔なやり方はないでしょうか。

802 :デフォルトの名無しさん:2009/05/09(土) 10:15:23
obj.is_a?(MyModule) で用が済まなくなったらまた来てくれ

803 :デフォルトの名無しさん:2009/05/09(土) 10:30:33
>>802
済まないと思う

obj = MyModule::KlassA::Sub.new
obj = MyModule::KlassB::Sub.new

という可能性があるときにたとえば

if class_include_klassA(obj) then
 # obj が MyModule::KlassA::Sub だと期待した処理
elsif class_include_klassB(obj) then
 # obj が MyModule::KlassB::Sub だと期待した処理
...

というようにしたいのだろう
そうすること自体がなんか方向性間違ってるような気もするが

804 :801:2009/05/09(土) 10:52:24
>>802
すいません。言葉足らずでした。
MyModule はトップレベルに include されているため、コアクラスもみな
is_a? に対し true を返すという状況です。




805 :デフォルトの名無しさん:2009/05/09(土) 10:55:06
ん?

806 :デフォルトの名無しさん:2009/05/09(土) 11:05:52
>>801
あるモジュールに含まれるクラスのサブクラスのインスタンスの時はどうするの?
module Mymod
 class A
  # あるモジュールに含まれるクラスのインスタンスか調べるメソッド(仮)
  def nesting?(mod) ; self.class.name =~ /#{mod}/ ; end # その一
  def nesting?(mod) ; Class.nesting.include?(mod) ; end # その二
 end
end
class B < Mymod::A ; end
Mymod::A.new.nesting?(Mymod) #=> 0(true)/true
B.new.nesting?(Mymod) #=> false/true

807 :801:2009/05/09(土) 11:36:19
皆さんレスありがとうございます。
インターフェースを揃えてそもそも処理を分けないで済む方法で自己解決しました。
お騒がせしました。

>>806
モジュールの外で継承されることが完全に抜け落ちてました(汗)
自分がやりたかったのは Class.nesting を使ってる方です。
勉強になりました。ありがとうございます。

808 :デフォルトの名無しさん:2009/05/09(土) 15:27:32
質問

 my/main.rb
 my/mod.rb

というディレクトリ構成で、main.rb に
 require 'mod'
と書いてあるとします

これ、カレントディレクトリがたとえば HOME だったりすると $LOAD_PATH の "." が HOME になって
HOME/mod.rb を探してしまって希望通りに動作しませんよね
「自分が存在するディレクトリにある自分用ファイルを require する」ということをさせたい場合の
決まった書き方はありますか?

809 :デフォルトの名無しさん:2009/05/09(土) 15:28:32
require fine.join(__FILE__, $0)

810 :デフォルトの名無しさん:2009/05/09(土) 15:34:30
>>808
どうするのが定石が知らんが、gemsとかのspecファイルとか見てると、

$:.unshift(File.dirname(__FILE__))

してから、require するか、

require File.join(File.dirname(__FILE__), 'spec_helper.rb')

という感じだな。

811 :デフォルトの名無しさん:2009/05/09(土) 15:37:35
>>808
わかりやすいとこで

#!/usr/local/bin/ruby -Ku
$LOAD_PATH.unshift(File.dirname(File.expand_path(__FILE__)))
require 'mod'
...

require は引数をフルパスにしても動作保証がなかったはずだし Ruby のめんどくさいとこだな

812 :デフォルトの名無しさん:2009/05/09(土) 15:42:21
そうそう、ファイルを2つに分けただけなのに $LOAD_PATH とかいじらないと動作しないというのはどうにも
カレントディレクトリをデフォで追加しようとか考えた奴はお花畑だと思う

813 :デフォルトの名無しさん:2009/05/09(土) 15:45:13
…そこまで言わんでも

1.9 でこっそり追加されてるとかそういうことはないかしら

814 :デフォルトの名無しさん:2009/05/09(土) 15:55:39
まあ、めんどっちいな
何が面倒かっていうと cron とかそういう絶対パスで動作させるような環境にたまたま持っていったときに
その cron の内部でだけよくわからんエラーになって露見するのが嫌
「っかしーなー動くよなー mod.rb もあるしなー」と(当該ディレクトリ内で相対パスで)スクリプト動かして首捻るわけだ

815 :デフォルトの名無しさん:2009/05/09(土) 18:03:59
rubyに限ったことじゃないような。

Windowsのソフトでも作業ディレクトリ(カレントディレクトリ)をexeと同じにしないと、
まともに動かないのはザラだからな。
何がいいたいかというと、カレントディレクトリ依存とかはプログラマの仕事でもあり、
そうじゃなかったらユーザーが気を配る話でもある。
(Windowsはショートカットだとカレントディレクトリは最初自動で設定してくれるが、
バッチ処理とか、コマンドラインから起動したりするととたんに>>814みたいなことになるんだよな)

まあ、自動的に解決してくれる言語仕様ならそれにこしたことはないけど。
どんな仕様だったらいいものなのかね?

816 :デフォルトの名無しさん:2009/05/09(土) 18:12:25
Rubyとずれるが、Windowsでゲーム作って公開したときに、
エクスプローラーから実行すると動かないという意味不明な問い合わせがきてだな、
アドレスバーに直接exeのフルパス打ち込むと、カレントディレクトリがアプリのディレクトリと異なるのでうごかない
という現象に遭遇して、
結局、アドホックに"起動直後にexeのディレクトリをカレントディレクトリに設定"などという処理を入れて、
回避したんだよ。

Rubyだったら、最初に起動するスクリプトで

 Dir.chdir(File.dirname(__FILE__))

なんかだせえw

817 :デフォルトの名無しさん:2009/05/09(土) 20:40:33
>>811
> require は引数をフルパスにしても動作保証がなかったはずだし
してるよ。

818 :デフォルトの名無しさん:2009/05/09(土) 21:08:02
1.9ならrequire_relativeってのが有る
ttp://doc.loveruby.net/refm/api/view/method/Kernel/m/require_relative

819 :デフォルトの名無しさん:2009/05/09(土) 21:58:40
作者がウィンドウズ使ってない弊害だろう。リナックス使ってるのだっけか。

820 :デフォルトの名無しさん:2009/05/09(土) 22:12:14
>require_relative
いつのまにこんな便利メソッドが!

Ruby 1.9.x で追加されたけど、あまり表舞台にあがってないメソッドっていろいろあるよね
CHANGELOGとか見返せば分かるのかな

821 :デフォルトの名無しさん:2009/05/09(土) 22:18:07
rubyにスパイウェア仕込んでメソッドの呼び出し状況を収集して
ruby-lang.orgに送信して使われてないメソッドのプロモーションとかすればいいのに

822 :デフォルトの名無しさん:2009/05/09(土) 22:30:06
推奨プラットフォームがLinuxだっけか。

823 :デフォルトの名無しさん:2009/05/09(土) 23:31:32
*Supported* なのは唯一Debianのみ。
Supportedの意味はサイト参照。


824 :デフォルトの名無しさん:2009/05/10(日) 01:37:26
デビアン使ってない信者は負け組だな。

825 :デフォルトの名無しさん:2009/05/10(日) 08:41:33
http://www.infoq.com/jp/news/2007/09/ruby-shoes
のサンプルコードの一文
l = text "0"
のtextとはどういう意味でしょうか?

826 :デフォルトの名無しさん:2009/05/10(日) 09:03:25
l = text("0")

メソッド text に引数 "0" を渡してるだけ
スニペットってことはモジュール使用例の一部分だけを抜き出してるからこんな見かけなのだろう

827 :デフォルトの名無しさん:2009/05/10(日) 10:22:26
("0") < オハヨウ!

828 :デフォルトの名無しさん:2009/05/10(日) 13:00:48
Rubyの場合、コーディングでの改行は必須なのでしょうか?
(言語によっては、改行は実質無視されるものもあります)

例えば、対話環境 irb で
$ irb
irb(main):001:0> print "Hello world\n"
Hello world
=> nil
irb(main):002:0>



$ irb irb(main):001:0> print "Hello world\n" Hello world => nil irb(main):002:0>
と書くのは不可でしょうか?


829 :デフォルトの名無しさん:2009/05/10(日) 13:03:26
>>828
区切りに改行か ; が必要。

>$ irb irb(main):001:0> print "Hello world\n" Hello world => nil irb(main):002:0>
・・・書かなくていいところまで書くなよw

830 :デフォルトの名無しさん:2009/05/10(日) 13:40:31
>>828
irbに対するprint1つじゃ改行もへったくれもないぞ 。


831 :デフォルトの名無しさん:2009/05/10(日) 21:53:32
>>828
何の釣りだよw

832 :デフォルトの名無しさん:2009/05/11(月) 12:28:03
>>828
      ___   ━┓  ___    ━┓
     / ―  \  ┏┛/ ―\   ┏┛
    /  (●)  \ヽ ・. /ノ  (●)\  ・
  /   (⌒  (●) /. | (●)   ⌒)\
  /      ̄ヽ__) /   |   (__ノ ̄  |
/´     ___/     \        /
|        \          \     _ノ
|        |          /´     `\

833 :デフォルトの名無しさん:2009/05/11(月) 19:33:10
ファイルの個数を拡張子ごとに数えるもっとシンプルな書き方ないですか?
exts = v.inject(Hash.new(0)){|r,x| r[x['Path'][/[^\.]+?$/]] += 1; r }

ちなみに、File.extname() を使っていないのはバグがあったからです。


834 :デフォルトの名無しさん:2009/05/11(月) 19:37:40
>>833
なんかイラっとくる。いや俺も初心者だけど。vって何?

835 :デフォルトの名無しさん:2009/05/11(月) 20:01:54
counts = Hash.new{|h, k| h[k] = 0}
Dir.glob('*').each do |path|
next if File.directory?(path)
counts[File.extname(path)] += 1
end
counts = Hash.new.update(counts)


836 :デフォルトの名無しさん:2009/05/11(月) 20:02:45
extnameとしてくくり出す以外やること無いと思う

837 :デフォルトの名無しさん:2009/05/11(月) 20:08:30
バグなら報告すればいいだろ

838 :デフォルトの名無しさん:2009/05/11(月) 20:11:34
1.8.7以降だとこうも書けるかな
Hash[Dir.entries('.').group_by{|n|File.extname(n)}.map{|k,v|[k,v.size]}]

839 :デフォルトの名無しさん:2009/05/11(月) 20:11:51
97パーセントくらいまで「ディレクトリを除外しないバグ」だと思う

840 :デフォルトの名無しさん:2009/05/11(月) 20:17:02
結局>>835が一番シンプルで一番正確な動きをするというRubyらしい結果に


841 :デフォルトの名無しさん:2009/05/11(月) 20:24:34
まあ人に想像させるというか、空気を読ませる時点で「シンプル」ではないわな。
そういう意味では>>835

842 :デフォルトの名無しさん:2009/05/11(月) 20:31:55
俺は838の方がいいけどなぁ
ま、人それぞれだな

843 :デフォルトの名無しさん:2009/05/11(月) 20:43:21
>>838はディレクトリ数えるぞ

844 :デフォルトの名無しさん:2009/05/11(月) 20:45:06
>exts = v.inject(Hash.new(0)){|r,x| r[x['Path'][/[^\.]+?$/]] += 1; r }
Ruby初心者で疑問なんですが、
injectブロックの|r,x|が何であるかとか、どこでどうやって決めているんですか?
例えばCだと、ヘッダに関数の宣言があってそれを見ればいい訳ですが。


845 :デフォルトの名無しさん:2009/05/11(月) 20:45:33
というか、each 系ブロックに渡すファイル一覧として Dir.entries を使う時点でけっこうアレだ

846 :デフォルトの名無しさん:2009/05/11(月) 20:48:20
>>844
vが何であるかで決まる、と思う

847 :デフォルトの名無しさん:2009/05/11(月) 20:48:44
>>844
ただのブロック用の仮引数(ローカル変数)に過ぎない
each do |引数| で x を使うか e を使うかどうするか程度

848 :デフォルトの名無しさん:2009/05/11(月) 20:49:25
> injectブロックの|r,x|が何であるかとか、どこでどうやって決めているんですか?

ソースコード的には、yieldに渡す値で決まる。

> 例えばCだと、ヘッダに関数の宣言があってそれを見ればいい訳ですが。

プログラミング時にどうしたらいいか、ということなら、リファレンスマニュアルを見る。

849 :デフォルトの名無しさん:2009/05/11(月) 20:55:32
foreachの方がいいのかと思ったけどDir.foreachだと別に変数用意してやらなかったりしてショボーン

850 :デフォルトの名無しさん:2009/05/11(月) 21:21:15
>>844に挑戦しようとして挫折w

a.inject(Hash.new(0)){|r,x| 〜 += 1; r }
のinjectで+=1; rってね。これね。
今まで俺もひたすらこういう書き方してきたけど、
injectにおける; r部分はいつももやもやする。

851 :デフォルトの名無しさん:2009/05/11(月) 22:39:34
最近のruby-1.9.2 headはsolarisでビルドすると Dir.glob("/**/")で死ぬから困る

852 :デフォルトの名無しさん:2009/05/12(火) 05:48:28
(敢えて聞きます)
Rubyの弱点て何ですか? Webで調べても長所しかないので。


853 :デフォルトの名無しさん:2009/05/12(火) 05:52:01
> Webで調べても長所しかないので
そんなあなたには使えそうもないところです

854 :デフォルトの名無しさん:2009/05/12(火) 06:06:06
てか「Ruby 短所|デメリット」あたりで検索すればウンコみたく出てくると思うんだが

855 :デフォルトの名無しさん:2009/05/12(火) 06:37:32
今のRuby自体はそれほど問題ないよね
用途に合わない使い方をすると果てしなく糞だというだけで

856 :デフォルトの名無しさん:2009/05/12(火) 06:45:36
Windowsでは使いづらいことが多い。
ユニコードファイル名でファイルアクセスさせてくれ。

857 :デフォルトの名無しさん:2009/05/12(火) 06:50:55
用途に合わない使い方をするから…

858 :デフォルトの名無しさん:2009/05/12(火) 06:51:16
Windows使う奴は情弱

859 :デフォルトの名無しさん:2009/05/12(火) 06:53:13
Windows上でRuby使う奴はアホ
というかrequireが激遅な環境があるのをとっとと改善しろ

860 :デフォルトの名無しさん:2009/05/12(火) 07:33:40
プログラマにとっても、posix環境を対象とする方が精神的にいいのかもな。
ライブラリなんかを見てもwinのための特別なコードを目にするし。

861 :デフォルトの名無しさん:2009/05/12(火) 07:39:09
異なるOSを跨ぐソフトはどこもそんなもんだと思う
Linux <=> FreeBSD <=> Solaris もそれなりに汚い

862 :デフォルトの名無しさん:2009/05/12(火) 09:00:24
>>852
858や859のように、Windowsをバカにする人間が一定の割合いることが悪い点
あとは……プリコンパイルができないことぐらいかな

863 :デフォルトの名無しさん:2009/05/12(火) 10:02:09
windowsをバカにされてムキムキする奴は情報処理から手を引いた方がいいよ

864 :デフォルトの名無しさん:2009/05/12(火) 10:15:29
CUIからアプローチしたWindowsはヘボいという事実を認められない人はいないほうが平和だったりする

865 :デフォルトの名無しさん:2009/05/12(火) 10:20:32
WindowsでRuby使う人は言語のためにOS選んでるわけじゃない
逆に特定の言語使うためにプラットフォームを選択しろとか理解しがたい

866 :デフォルトの名無しさん:2009/05/12(火) 10:31:32
Windows使いたかったらPython行け

867 :デフォルトの名無しさん:2009/05/12(火) 10:46:12
そのへん Java は使いやすいと思う

c:\\ とか c:/ とか書いても動くし、/usr/local/hoge みたいなファイルを開くと、
勝手が c: だったら、c:\usr\local\hoge を開いてくれるし。

868 :デフォルトの名無しさん:2009/05/12(火) 11:34:38
>>867
同じ事できたよ ruby 1.8.6 (2008-03-03 patchlevel 114) [i386-mswin32]

puts File.read('/cygwin/home/myname/test.txt')
#=> テキストの内容が出力される

869 :デフォルトの名無しさん:2009/05/12(火) 11:47:27
>>851
> 最近のruby-1.9.2 headはsolarisでビルドすると Dir.glob("/**/")で死ぬから困る
kwsk

870 :852:2009/05/12(火) 12:59:47
なんかRubyって、Winsowsと相性が悪いみたいですね。
というか、Win7が出るのでさらに混沌とするのかな。


871 :デフォルトの名無しさん:2009/05/12(火) 13:20:10
でも個人的には、Windows XPでRuby使ってて>>862以外に困ったことはないなー
今はパスの問題だってそうそう起きないし
(Vistaではまた違うのかもしれないが)

>>868
知らなかった……いつから絶対パス指定ができるようになってたんだ

872 :デフォルトの名無しさん:2009/05/12(火) 13:35:29
>>871
> 知らなかった……いつから絶対パス指定ができるようになってたんだ
大昔からできるよ。
そもそもruby内部で/と\を変換したりしてるわけじゃなくて、元々APIレベルでは
どちらでもアクセスできる。


873 :デフォルトの名無しさん:2009/05/12(火) 13:41:07
WindowsはPowerShellがあるからな。
Rubyの出番はもうない。

874 :デフォルトの名無しさん:2009/05/12(火) 13:48:59
kogaidan 「ご愁傷さまです。UNIXなどを知ってしまうと、あまりにムカつくことが多いよ。
タダならともかく、Windowsを使うくらいなら、Mac OS XやUbuntuでもいいんじゃないのかな。」

875 :デフォルトの名無しさん:2009/05/12(火) 15:04:25
PHP を使えば大丈夫

876 :デフォルトの名無しさん:2009/05/12(火) 20:06:11
LinuxのGUIはWindowsのCUIと同じくらいむかつくのは事実

877 :デフォルトの名無しさん:2009/05/12(火) 20:47:02
めんどくさかったので spec から書かずに従来どおりにスクリプト作ったら、
ある時期からスクリプトがどんな構造してるのかさっぱしわからなくなった

878 :デフォルトの名無しさん:2009/05/12(火) 21:09:17
>>876
LinuxのGUIはWindowsのCUIと同じくらいオマケ機能と思えばどうということはない

879 :デフォルトの名無しさん:2009/05/12(火) 21:23:16
Fusion楽しめればそれでいい

880 :デフォルトの名無しさん:2009/05/12(火) 21:25:46
今日もキューブをまわすお( ^ω^)

881 :デフォルトの名無しさん:2009/05/12(火) 21:34:26
>>871
> 今はパスの問題だってそうそう起きないし
ファイル名に♥とか特殊な文字が入ってなきゃおきないけど、問題に直面したら現状回避不可能なのは問題だ。
結局このためだけにPython使ったりとか、悲しいじゃないか。

882 :デフォルトの名無しさん:2009/05/12(火) 21:43:24
というか、なんで Windows で無理して Ruby 使うんだろ。
適材適所という言葉を知らんのじゃないか?

883 :デフォルトの名無しさん:2009/05/12(火) 21:47:07
かといってPowerShellをわざわざ憶えるのはまんどくせ
Pythonだって別にベストフィットってわけでもなかろうし

884 :デフォルトの名無しさん:2009/05/12(火) 21:51:39
だが現役シェルの中でPowerShovelが一番最強!(たぶん・・・)

885 :デフォルトの名無しさん:2009/05/12(火) 21:52:38
そこでIronPythonですよ

886 :デフォルトの名無しさん:2009/05/12(火) 21:52:47
Linux なり何なりをメインに使っていて、たまに Windows を使うというのなら、
他の言語を覚えるのは「まんどくせ」なのだろうが、Windows を使う機会の方
が多いんだったら、Ruby 以外を覚えて使ったほうがいいと思うけどね。

887 :デフォルトの名無しさん:2009/05/12(火) 21:55:47
どのOSでも使えるのがスクリプトのメリットだろ

888 :デフォルトの名無しさん:2009/05/12(火) 21:57:39

> どのOSでも使えるのがスクリプトのメリットだろ
> どのOSでも使えるのがスクリプトのメリットだろ
> どのOSでも使えるのがスクリプトのメリットだろ
> どのOSでも使えるのがスクリプトのメリットだろ


889 :デフォルトの名無しさん:2009/05/12(火) 21:59:15
・・・w

890 :デフォルトの名無しさん:2009/05/12(火) 22:00:19
そんなメリットは聞いたことがないわ

891 :デフォルトの名無しさん:2009/05/12(火) 22:01:14
俺、北千住で聞いたことあるよ

892 :デフォルトの名無しさん:2009/05/12(火) 22:06:14
Windowsしか使わないならVisualBasicがおすすめ
VisualStudio,MS-Office,WSH,etcetc
VBが役に立たない場所は無い
逆にプラットホーム非依存なら日本語の扱いが楽な言語がいい
個人的にはjava,rubyがおすすめ

893 :デフォルトの名無しさん:2009/05/12(火) 22:09:12
なんでいまさらVB・・・C#でいいじゃん

894 :デフォルトの名無しさん:2009/05/12(火) 22:11:03
必要があってならともかく無理してまでプラットホーム非依存なんてことを
考える必要なんてないじゃん、という話の流れだと思うけどね。


895 :デフォルトの名無しさん:2009/05/12(火) 22:11:42
コンパイルやらポリシーやらXMLやらでいきなりやる気90%減

896 :デフォルトの名無しさん:2009/05/12(火) 22:23:04
なんかくだらない
RubyやPythonやってるのにプラットフォーム気にすること自体ナンセンスだと思う

897 :デフォルトの名無しさん:2009/05/12(火) 22:25:16
しかし全くプラットフォームを意識せずにプログラミングできるかというと、そうでもない。

898 :デフォルトの名無しさん:2009/05/12(火) 22:29:44
どうせ依存しなけらばならないのなら,
より適したものを使おうというのは自然な発想

899 :デフォルトの名無しさん:2009/05/12(火) 22:44:23
>>882
そりゃLinux文化から生まれた言語だし、Windowsが二の次なのは分かってるよ。でも
> なんで Windows で無理して Ruby 使うんだろ
とか本気で言ってるのか?
WindowsユーザーがRubyを好きで、できるだけ楽しくプログラミングしたいと思うのは
そんなに奇妙なことなのか?

900 :デフォルトの名無しさん:2009/05/12(火) 22:49:46
本人が好きで楽しいと思ってるんだったら使えばいいんじゃないの?

滝に打たれる苦行を楽しいと思い、喜んでやる人もいるわけで。
そんなのその人の勝手。

その姿を見て、変なやつ、と思い感想を述べるのは見てる人の勝手。

901 :デフォルトの名無しさん:2009/05/12(火) 22:55:51
compizこそおまけ機能。OSインストールしたら速攻オフだろ、jk

>>899
禿堂

902 :デフォルトの名無しさん:2009/05/12(火) 23:46:05
何故にこの流れの中で compiz?
素でわからん。

903 :デフォルトの名無しさん:2009/05/12(火) 23:47:47
WindowsでRuby使っているが、ファイル名以外はそんなに困らんような…。
(webアプリはテストだけで、デプロイは動かすLinux鯖だったりするし…)

>>899
不用意に煽ってるだけだから、つられなさんな

Linux板とかmac板とか見ればわかるけど、不用意にWindowsユーザーを煽るというか、
何故か選民意識みたいなものがあるみたいなのでスルー推奨

904 :デフォルトの名無しさん:2009/05/13(水) 00:14:16
>>835
いまさらだけどHash#defaultを使って欲しかったので…
path = './'
counts = {}
counts.default = 0
Dir.foreach(path) do |filename|
  counts[$1] += 1 if filename =~ /\.([^.]+?)$/
end
p counts


905 :デフォルトの名無しさん:2009/05/13(水) 06:21:06
教祖がデビアン使いの時点で選民思想だしなあ。
大多数が使ってるウィンドウズは非サポート。
マクは論外。あそこの教祖は癌らしいから余命わずかでしょ。

javaも漢字コードとか環境依存だからなんとも。おらに買収されちゃったし。

906 :デフォルトの名無しさん:2009/05/13(水) 08:00:00
おらって書かれるとオライリーに思える

907 :デフォルトの名無しさん:2009/05/13(水) 09:31:48
>>884
http://www.powershovel.co.jp/

908 :デフォルトの名無しさん:2009/05/13(水) 10:56:57
>>837
> バグなら報告すればいいだろ
http://redmine.ruby-lang.org/issues/show/1168
これのことかも

909 :デフォルトの名無しさん:2009/05/13(水) 13:33:07
rubyなんて所詮は新興宗教の公用語。
教祖の気まぐれで仕様が変わる。

付き合ってらんねー。

910 :デフォルトの名無しさん:2009/05/13(水) 14:57:37
>>909
公開されてから仕様が追加、修正、廃止されなかった言語ってのを挙げてくれよ
今日中で頼む、知名度の低い言語はカンベンな

911 :デフォルトの名無しさん:2009/05/13(水) 15:34:14
909 じゃないけど、
Java の JCP や Python の PEP みたいなのあってもいいかもなーと思うときがある。
個人的に Ruby は不要だけど Rails にはほしいかも。

912 :デフォルトの名無しさん:2009/05/13(水) 15:53:27
RCRというのもあったぞ。
今ならredmine.ruby-lang.org経由で[Feature]かな。

913 :デフォルトの名無しさん:2009/05/13(水) 18:48:08
rspecで「この describe を一時的にテストから外す」ってできない?
重いテストや遅いテストがあって、そこは一旦外しておきたいんだけれども

914 :デフォルトの名無しさん:2009/05/13(水) 19:54:45
Rubyは仕様が文書化されておらず、
「ときどき各処理系の開発者がメーリングリストで
まつもとさんに確認している状態」(前田氏)という。
またバグか仕様かはまつもと氏にしか分からないこともあり、
「しかも言ってることが時々変わっている(笑)」という。
前田氏は「ソースコードがドキュメントだ。バグも 完全に記述されている」
というまつもと氏のハッカーらしい発言を引用して苦笑いする。

ttp://www.atmarkit.co.jp/news/200809/11/ruby.html

915 :デフォルトの名無しさん:2009/05/13(水) 21:52:36
>>913
つ pending
と思ったが、example(it)じゃなくてexample group(describe)のほうかぁ。

https://rspec.lighthouseapp.com/projects/5645/tickets/790-add-pending-group-support

まだないみたいだねぇ。


916 :デフォルトの名無しさん:2009/05/14(木) 01:08:13
WinXPでruby1.8.6を使っています。

ファイルを開くときの File.open('out.txt', 'w') {|f| の
|f| はどういう意味なのでしょうか?
調べましたが分かりませんでした。


917 :デフォルトの名無しさん:2009/05/14(木) 01:30:07
>>916
ブロックの仮引数。

def callback(f)
のみたいなもん。

918 :デフォルトの名無しさん:2009/05/14(木) 02:19:22
>>917
さんきゅう。


919 :デフォルトの名無しさん:2009/05/14(木) 02:28:53
いかん・・・Ageてしまった。


920 :デフォルトの名無しさん:2009/05/14(木) 03:43:12
質問です。
Rubyでミリ秒単位の値は得られないのでしょうか?
ttp://www.namaraii.com/rubytips/ などでも秒までです。

0.01秒単位のストップウォッチはRubyでは無理なのでしょうか?


921 :デフォルトの名無しさん:2009/05/14(木) 04:04:25
Time オブジェクトを to_f すればとりあえず用は済むと思われる
irb> Time.now.to_f
1242241404.3147
irb> t = Time.now; puts t.strftime("%Y年%m月%d日 %H時%M分%S秒#{t.usec}")
2009年05月14日 04時03分25秒893515

ただ、ごく一般論としては、スクリプトでミリ秒を計るのはあまり意義のあることではないんじゃないかな

1000.times {|n| print "\r残り時間:%3i/1000"%n; $stdout.flush; sleep 0.01 }


922 :デフォルトの名無しさん:2009/05/14(木) 06:40:42
処理系依存だしなあ。厳密じゃないし。

923 :デフォルトの名無しさん:2009/05/14(木) 08:53:51
かなりどうでもいいんだけども、個々のデータ data の内容を適切にまとめてあるハッシュ results があって、
それに新規の key => value を1ペア追加するてきとーなメソッドを作りたいんよ

def new(data)
 …
 return {key => value}
end

results.update(new(data))



def add_to(h, data)
 …
 h[key] = value
end

add_to(result, data)

ってどっちがフツーっぽいかな

924 :デフォルトの名無しさん:2009/05/14(木) 09:01:06
そもそも

 change_obj(obj, data)

はあまり好きじゃない

 obj = obj + scan_new(data)

の返り値再代入(に準ずるように見える処理)が好みだ
ということで前者おすすめ
キーを指定する形式に比べたら明らかに処理が遅いはずだが気にしたら駄目だ

925 :デフォルトの名無しさん:2009/05/14(木) 09:25:25
resultsをハッシュじゃなくResultsとか新しいクラスにしちゃって
Results#[]=でペア追加するのがRubyっぽい気がする
使うときにはto_hash

926 :デフォルトの名無しさん:2009/05/14(木) 11:45:23
多少のことではそういうことをしなくて済むように組み込みコレクションが機能的なのがRubyのいいとこなんじゃないのか
や、もしかしたらあちこちで使い倒されまくるハッシュでクラスにするのが妥当なのかもしれないが、
普通はハッシュで済むならハッシュのままだろ

927 :デフォルトの名無しさん:2009/05/14(木) 12:45:57
ini.path = "c:/test"
p ini.path

を内部的に
ini.write("settings", "path", "c:/test")
p ini.read("settings", "path")

に置き換えるようなのって出来ますかね。
メソッド名がなかったらコールバック的に呼ばれる機能があったようななかったような。

928 :デフォルトの名無しさん:2009/05/14(木) 13:25:53
そう動作するように書けばいいじゃん

def path=(s)
 write('settings', 'path', s)
end
def path
 read('settings', 'path')
end


929 :デフォルトの名無しさん:2009/05/14(木) 13:29:20
> メソッド名がなかったらコールバック的に呼ばれる機能があったようななかったような。

method_missing

930 :デフォルトの名無しさん:2009/05/14(木) 13:35:23
WinXPでruby1.8.6を使っています。
文字列中の『:』(コロン)の扱いで質問です。

tag0 = "<parm xmlns="http://ruby_xyz">\n" を実行したときコロンの箇所で 
 syntax error, unexpected tIDENTIFIER, expecting $end

というエラーが出ます。どうしたらよいでしょうか?
目的はtag0と他の文字列Aを組み合わせてできる文字列Bの生成です。


931 :デフォルトの名無しさん:2009/05/14(木) 13:43:14
>>921-922
どうも。一応は出来るみたいですね。
ただ、Javaでも他の言語でも、ミリ秒計測は普通にできるものかと思っていましたので。


932 :デフォルトの名無しさん:2009/05/14(木) 13:50:01
> 文字列中の『:』(コロン)の扱いで質問です。
違います

どの解説にもこれのやり方は載ってるはずなんだが、載ってない解説とかがあったら即晒せ
ダブルクォート「"」を含む文字列を表現するには " の直前に \ を置く

tag0 = "<parm xmlns=\"http://ruby_xyz\">\n"


933 :デフォルトの名無しさん:2009/05/14(木) 13:52:55
>>930
初心者らしい質問でなぜか安心した

エスケープしない限り「"」が次に出た所で文字列の終わりとみなされるので
tag0 = "<parm xmlns="http://ruby_xyz">\n"
と書くと,
tag0 = "<parm xmlns=" http://ruby_xyz ">\n"
と書いてるのと大差無い

エスケープして書くならこうすればいい
tag0 = "<parm xmlns=\"http://ruby_xyz\">\n"

「"」をエスケープするのが面倒なら %Q を使って
tag0 = %Q!<parm xmlns="http://ruby_xyz">\n!
とかも書ける 詳しくはマニュアルなど参照のこと

> 目的はtag0と他の文字列Aを組み合わせてできる文字列Bの生成です。
の意味がよくわからないけど,これで解決しただろうか

934 :デフォルトの名無しさん:2009/05/14(木) 15:08:03
>>931
言語に関係なくミリ秒の計測はソフトウェア上では正確にはできません
ハードウェアによる直接のサポートがどうしても必要

935 :デフォルトの名無しさん:2009/05/14(木) 15:14:15
>>932,933
有難うございます。エスケープ文字列の問題だったのですね。
エラーの指摘箇所がコロンのところだったので、てっきりこの文字が原因だと思っていました。


936 :デフォルトの名無しさん:2009/05/14(木) 15:43:30
>>935
エラーメッセージが教えてくれるのは転んだ場所でしかなくて
躓いたりぶつかったりの転ぶ原因は大抵別の場所にある。

遠く離れた場所で怪我してたから転んだなんてこともあるぐらい。
ありがちなのは想定外のオブジェクトに化けているパターン。
obj = ["hello,", "world"]
obj = "!" # 本当は obj << "!"

puts obj.join # ここでNoMethodError

937 :デフォルトの名無しさん:2009/05/14(木) 16:08:18
文字列処理で質問です(ruby1.8.6)

日付と時刻を文字列化し、その末尾を2桁づつ抽出したいのですが、
片方で4桁になってしまいます。

nowTime = Time.now.strftime("%Y%m%d_%H%M%S") # 現在の日付と時刻
timeLen = nowTime.split(//).size # 上の長さ
value01 = nowTime[timeLen-4, timeLen-3] # nowTimeの末尾4文字目と3文字目 ← ※4桁になる
value02 = nowTime[timeLen-2, timeLen-1] # 同様に1文字目と2文字目
p value01+", "+value02 # 2桁づつで表示 ← 実行すると4桁と2桁

どうすべきでしょうか?


938 :デフォルトの名無しさん:2009/05/14(木) 16:17:15
『まつもとゆきひろ コードの世界~スーパー・プログラマになる14の掟』

スーパー・プログラマってのが厨臭いなあ。書き下ろしだそうだから買っちゃうかもしれないけど。

939 :デフォルトの名無しさん:2009/05/14(木) 16:28:51
>>937
そんなんTimeオブジェクトのメソッドで時間とか分とか出せばいいじゃん、というのはとりあえず置いておく
nowTime = Time.now.strftime("%Y%m%d_%H%M%S")
mm = nowTime[-4, 2]
ss = nowTime[-2,2]
puts "#{mm}, #{ss}"


940 :デフォルトの名無しさん:2009/05/14(木) 16:37:47
>>937
最終的に欲しいのは YYYYMMDD_HHMMSS の中の DDSS なんだよな?
リファレンスマニュアルで Time#strftime とついでに String#size,String#[] を調べてこい

941 :デフォルトの名無しさん:2009/05/14(木) 16:43:54
>>939-940
ゴメンなさーい(泣


942 :デフォルトの名無しさん:2009/05/14(木) 18:24:50
>>938
宣伝乙

943 :デフォルトの名無しさん:2009/05/14(木) 18:44:39
open-uri で each_line のように一行ずつではなく、
取得した内容全部を一気にごそっと変数に入れるにはどうしたらいいでしょうか

944 :デフォルトの名無しさん:2009/05/14(木) 18:49:24
readで全部読む

945 :デフォルトの名無しさん:2009/05/14(木) 18:51:52
っていうかread以外用途ないよね

946 :デフォルトの名無しさん:2009/05/14(木) 20:13:36
この質問、よくみるね。
http://www.ruby-lang.org/ja/man/html/open_uri.html
に書き込める人、サンプルよろしく。

947 :デフォルトの名無しさん:2009/05/14(木) 20:15:20
サーバ側がchunkedでだらだら送ってくるのをeach_lineでだらだら処理、とか
できるようになって...るんだろうか?

948 :デフォルトの名無しさん:2009/05/14(木) 20:28:48
>>947



949 :デフォルトの名無しさん:2009/05/14(木) 21:01:35
>>946
そのマニュアル、もう凍結されてるよ
今はるりまに移行してる

950 :デフォルトの名無しさん:2009/05/14(木) 22:25:28
>>914
> ドキュメント
> Document

>   matzの苦手なもの。彼は普段から「ソースがドキュメントだ。
>   バグも完全に記述されている」と主張しているが、誰も受け入れない。当り前だ。

・・・w

951 :デフォルトの名無しさん:2009/05/15(金) 07:25:41
>>942
ageてるお前が宣伝マン。

952 :デフォルトの名無しさん:2009/05/15(金) 08:02:23
>>951
宣伝乙

953 :デフォルトの名無しさん:2009/05/15(金) 09:34:05
>>949
Google の検索では凍結されたページが上位に来るのは問題だね。
るりまに転送とかできないのかな。

954 :デフォルトの名無しさん:2009/05/15(金) 09:34:45
Googleさんに菓子折でも持って行けばやってくれるんじゃね?

955 :デフォルトの名無しさん:2009/05/15(金) 09:47:06
単純にリダイレクトしたら。

956 :デフォルトの名無しさん:2009/05/15(金) 10:51:57
ここにいる全員のドキュメント嫌いも相当なものですな

957 :デフォルトの名無しさん:2009/05/15(金) 11:08:32
ソースがドキュメントでテストが仕様書

958 :デフォルトの名無しさん:2009/05/15(金) 12:00:13
>>953
そういうこと言うとRubyユーザーはHTTPも知らないとか思われそうなのでやめてくれ

959 :デフォルトの名無しさん:2009/05/15(金) 13:35:24
sinatra で

require 'rubygems'
require 'sinatra'

get '/' do
"hello"
end

とだけの場合、/test や /xxx みたいに定義されていない URL を叩かれるとエラーになるけど、
その場合は「ページが存在しないよ」と出すにはどうしたらいいでしょうか。


960 :デフォルトの名無しさん:2009/05/15(金) 15:36:26
>>959
これぐらい見ろよw
http://www.sinatrarb.com/intro.html

961 :デフォルトの名無しさん:2009/05/15(金) 16:25:23
>>959

Not Found

When a Sinatra::NotFound exception is raised, or the response’s status code is 404, the not_found handler is invoked:

not_found do
'This is nowhere to be found'
end

とあるね。

962 :デフォルトの名無しさん:2009/05/15(金) 16:29:18
WinXPでruby1.8.6を使っています。
一定間隔で動作するオシレーターはどう書けばよいのでしょうか?

調べましたが差分を求める説明が見つからず、下記の記述も未だ理解できないレベルです。
ttp://archive.mag2.com/0000267290/20080803070000000.html

単純に、例えば3秒間隔で「3sec」と出力されるものを先ず作りたいと思っています。
よろしく願います。


963 :デフォルトの名無しさん:2009/05/15(金) 16:38:08
>>962
そのリンク先の
>○シンプルタイマー(ソースコード)
がほぼそのまんま答えなんだけどな。

というか「作りたいと思っています」なら、動かないものでいいからコード書いてみ。
添削はするし、わからない部分は具体的に聞いてくれれば答えるから。
ちなみに4行で書ける。

964 :デフォルトの名無しさん:2009/05/15(金) 16:49:05
>>962
猫のモフモフ・・・

965 :962:2009/05/15(金) 17:08:54
>>963
レス有難うございます。
直後に時刻のエポック秒変換の記述を手元の本で見つけましたので
なんとか動作するコードは書けました(下記)。

# OSC01.rb
count = 0
time0 = Time.now.to_i
while true
if time0 +3 == Time.now.to_i
puts "3sec"
time0 = Time.now.to_i
count+=1
end
#
if count>10
break # 11回以上でwhileループをBreak
end
end

・・・明らかに4行は超えてますw


966 :デフォルトの名無しさん:2009/05/15(金) 17:21:23
>>965
何回で止めるっていう条件が出てなかったしね。
while
sleep 3
puts "3sec"
end

ちなみに分岐が一文だけならこういう書き方もできることを覚えておいて。
break if count > 10


967 :962&965:2009/05/15(金) 17:32:02
>>966
有難うございます。
sleepってメソッドだったのですね。


968 :デフォルトの名無しさん:2009/05/15(金) 19:43:00
>>956
書くのも読むのも好きですが何か

969 :デフォルトの名無しさん:2009/05/15(金) 19:58:36
CRubyがMRIだから松本さんが開発されたのかと思ったのですが、
検索でトップにくるのはGCを作成している方です。
Rubyの開発とはGCを開発することなのでしょうか?

970 :デフォルトの名無しさん:2009/05/15(金) 20:03:02
最近の言語全般で強ち間違ってないような気もするが、多分そういう話でもないんだろうな

971 :デフォルトの名無しさん:2009/05/15(金) 20:09:51
loop {break if count > 10}

上にあるこういう書き方ってRuby的にどうなの?
Integer#timesを使わない理由って何?

972 :デフォルトの名無しさん:2009/05/15(金) 20:16:29
countが不規則に増えるとか

973 :デフォルトの名無しさん:2009/05/15(金) 20:19:12
初心者の書いたコードになに嫌味つけてんのw

974 :デフォルトの名無しさん:2009/05/15(金) 20:26:07
>>971
よう初心者

975 :デフォルトの名無しさん:2009/05/15(金) 20:26:08
>>969
マジレスすると、一般的にCRubyとは言わず、単にrubyと呼ぶことの方が多いからそうなる

976 :デフォルトの名無しさん:2009/05/15(金) 20:27:08
モノ教えるのに幾許かでも慣れてないとこういう時困るよな

977 :デフォルトの名無しさん:2009/05/15(金) 20:32:11
まあ少子化だしな

関係ねえか

978 :デフォルトの名無しさん:2009/05/15(金) 20:38:50
>>966 == >>973 == >>974
よう初心者!

979 :デフォルトの名無しさん:2009/05/15(金) 20:59:28
すみませんでした。

980 :デフォルトの名無しさん:2009/05/15(金) 20:59:52
めんどくせえ

>>1-1000
よう初心者!!

981 :デフォルトの名無しさん:2009/05/15(金) 21:02:24
次スレ立てろよカス

982 :デフォルトの名無しさん:2009/05/16(土) 04:43:41
ruby1.8.6です。
ファイルアクセスが他のソフトとぶつかる場合で質問です。

Rubyで周期的にXMLファイルを上書きしていますが、この上書きのタイミングと
他のソフトによるXML読み込みが衝突した場合(と思われる時)、
 in 'initialize': Permission denied - new XML.xml (Errno::EACCES)

というエラーメッセージが出ます。
そこでRubyの振る舞いとして、他のソフトがファイルアクセス中は上書きを延期するか、
あるいは別の方法で衝突を回避したく思います。
何か良い方法はありますでしょうか?

なお別のソフト側で衝突回避を試みましたが、上手くいかないためRubyに望みを
託すことにしました。


983 :デフォルトの名無しさん:2009/05/16(土) 04:59:41
Rubyあんま関係ないな
ファイルロック(またはロックファイル)でぐぐれ

たいていの場合両方のソフトが対応してないといけないが、
たいていの場合相手のソフトはそんなもん作ってない

なお、直接

 File.open(path,'w'){|f| f.write(data)}

するのではなく

 File.open(path_v,'w'){|f| f.write(data)}
 File.rename(path_v, path)

と、ファイル移動をOS任せにしたほうがファイル書き込みアクセス衝突の可能性自体は減る
ただし、これだと rename でファイルを掴むまでに起こったディスク上の変更を検知できない

このへんの衝突可能性に気を遣ってるソフトはあらゆる永続的データ保存に「別名保存→名前変更」のプロセスを使ってるので
そのソフトの使ってる別名保存名がわかればもしかしたらロックファイルのように使えるかもしれない

984 :デフォルトの名無しさん:2009/05/16(土) 09:47:20
Rubyで次のコードが何故かできません。
超初心者です。

http://codepad.org/BEAGq3lE


985 :デフォルトの名無しさん:2009/05/16(土) 09:54:12
>>984
Rubyに関するまとまった初心者向けの解説サイトまたは書籍を通読しろ
単に基礎知識が足りない

986 :デフォルトの名無しさん:2009/05/16(土) 09:57:09
わかりました。ありがとうございます。

987 :デフォルトの名無しさん:2009/05/16(土) 09:57:16
Rubyだけに関する知識じゃなくて、
もっと一般的にプログラミングで使用される基礎的な概念に関する知識だな。


988 :デフォルトの名無しさん:2009/05/16(土) 10:03:46
>>984
グローバル変数は $x と書く。

989 :デフォルトの名無しさん:2009/05/16(土) 10:11:32
Ruby 初心者スレッド Part 28
http://pc12.2ch.net/test/read.cgi/tech/1242436010/


990 :デフォルトの名無しさん:2009/05/16(土) 10:13:56
999

991 :デフォルトの名無しさん:2009/05/16(土) 10:15:22
1000!

992 :デフォルトの名無しさん:2009/05/16(土) 10:57:49
いやそこまでギリギリじゃないから

993 :デフォルトの名無しさん:2009/05/16(土) 11:17:41
あれw
1000!にだまされた

994 :デフォルトの名無しさん:2009/05/16(土) 13:57:06
1000なら今年Ruby2.0

995 :デフォルトの名無しさん:2009/05/16(土) 14:02:46
こんなスローなスレでそんなことしてもw

996 :デフォルトの名無しさん:2009/05/16(土) 14:08:34
1000ならRubyは俺のもの

997 :デフォルトの名無しさん:2009/05/16(土) 14:15:50
エッチでリッチなかーちゃん、Rubyをせしめてフランスへ。

998 :デフォルトの名無しさん:2009/05/16(土) 14:38:42
とうきょう ルビルビ リズム ルビルビ
心ズキズキわくわくー

999 :デフォルトの名無しさん:2009/05/16(土) 16:00:01
>>1000なら今のシステムをSinatraで置き換える

1000 :デフォルトの名無しさん:2009/05/16(土) 16:02:22
10^3

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

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

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