Ruby 初心者スレッド Part 27

このエントリーをはてなブックマークに追加
421デフォルトの名無しさん
>>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
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
> 基本的に変数はすべて参照になっているって事でいいのかな。
いいと思うけど、俺にアンカーつける必要なくない?
他にもいい人はたくさんいるよ
428422: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だって止まるよ
444440: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に修正してみれば分かるよ
447426: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= みたいなメソッドも引数を返す
478472: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.

だって。
480472: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
519517: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は、つぎの入力文字を視覚的に表示する機能では?
526521: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
となってしまい、うまくコネクトできません。ドライバはインストールしたつもりなのですが、
何か間違ってるでしょうか?
528527:2009/04/19(日) 02:50:31
mysql-ruby-2.8.1.tar.gz
をインストールしたらできました。
DBIだけじゃなくて、Ruby/Mysqlのドライバもインストールしないとだめなんですね。
失礼しやした。
529464: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?とか適当なメソッドを定義すればいい
表面上スマートに見えても内部は泥臭いなんて当たり前
545530: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 というのがあるらしい。
マニュアルは読んでみるものですね。
549464: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]
550549: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個に対応するような使い方をしてると引数とかで正直非常にめんどい
558549: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 で参照するという形ではダメなん?
590588: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))
634632: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 です
641635: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
649647: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ベースのタブでバッファを切り替えるような
ものなら、もうちょっとご新規さんにもアピールするかと思うんだが。
660639: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
ていうか、読みにくい
665635: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のほうは使ったことがありませんのであしからず。
668666:2009/04/29(水) 18:39:50
>>667
ありがとうございます!取得できるようになりました!

根本的な原因は気になりますが、
とりあえず動くようになったのでよしとします。
669653: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
どうしてコメントをはずすの?
なんのためにコメントをはずすの?
683677:2009/05/02(土) 20:32:47
なんのためにといわれても...
テストプログラムだからいろんなケースを比較して、
変じゃないかなと
684デフォルトの名無しさん:2009/05/02(土) 20:39:47
つまり、意味もわからずincludeしたりしなかったりを試していると。
685677:2009/05/02(土) 20:56:15
print Math::PIは動くね。
もっとも、Mathはrubyインタープリターによって
特別待遇を受けているだろうから、あまり比較にはならんだろうけど。
686デフォルトの名無しさん:2009/05/02(土) 21:18:41
>>685
>>681は目の付け所いいなと思ったけど・・・
Module#module_functionは読んだ?
687677: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
722718: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 して下さい」とか
784753: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は設定出来ないしどうしたもんかね
785784: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をデフォと思わないほうがいい。
794784: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 だと期待した処理
...

というようにしたいのだろう
そうすること自体がなんか方向性間違ってるような気もするが
804801: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
807801: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
870852: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
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
猫のモフモフ・・・
965962: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
967962&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
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。