[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 2chのread.cgiへ]
Update time : 05/09 14:42 / Filesize : 176 KB / Number-of Response : 723
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

Ruby 初心者スレッド Part 34



1 名前:デフォルトの名無しさん mailto:sage [2010/01/28(木) 08:39:14 ]
プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。

★注意★ Ruby 1.9.1 は初心者にはまだ時期早尚です。初心者には Ruby 1.8.7 を強くお勧めします。
   (理由:現時点では多くの有名ライブラリやアプリが 1.9.1 に完全対応していないためです。)
 1.8.7 でも 1.9 系に導入された新機能のいくつかが利用可能なため、1.8.7 を習得すれば将来スムーズに 1.9 系に移行できるでしょう。

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

■質問する人へ
質問する前に次の3つをすること。ここで回答を待つよりそのほうが早い。
 ・モジュール名やエラーメッセージでググる
 ・マニュアルで引っかかったクラスの記述を探す www.ruby-lang.org/ja/man/
 ・FAQを一応読む www.ruby-lang.org/ja/man/?cmd=view;name=Ruby+FAQ
質問には以下を書くこと。へたくそな質問は再提出を要求される。
 ・詳しい内容(「動きません」「うまくできません」では回答しようがない)
 ・エラーメッセージ(自力で訳さずなるべくそのままで)
 ・実行環境(OS名、Rubyのバージョン(ruby -v でわかる))
 ・最終的にやりたいこと(もっとよい方法がある場合が多いので)
回答してくれた人には「ありがとう」のひとことをいってあげて。

■回答する人へ
相手は初心者、根気よく育てるつもりで。質問がへたくそなのも大目にみてあげる。
それができないならこないこと(だって初心者スレだもん)。
 ・既出な質問やFAQは「XXXを読め」でいいので、叩かない&怖がらせない。
 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。

65 名前:デフォルトの名無しさん mailto:sage [2010/01/29(金) 21:45:46 ]
%wじゃむりじゃね?
大文字の方なら
p %W[hoge fuga #{nil} ] #=>["hoge", "fuga", ""]

66 名前:デフォルトの名無しさん mailto:sage [2010/01/29(金) 21:53:29 ]
式展開じゃないとダメか
#{nil}はnilになるのかと思ったら""なのね。何で? nil要素は作れない?


67 名前:デフォルトの名無しさん mailto:sage [2010/01/29(金) 21:57:08 ]
要素が文字列である配列を作る記法だからでしょう
またレスかぶりそう

68 名前:デフォルトの名無しさん mailto:sage [2010/01/29(金) 22:05:56 ]
了解。みんなありがと

69 名前:デフォルトの名無しさん mailto:sage [2010/01/29(金) 22:11:45 ]
>>66
irb(main)> "#{nil}"
=> ""

70 名前:デフォルトの名無しさん mailto:sage [2010/01/29(金) 22:25:58 ]
>>58
いろいろあったんだが、Windowsの場合は自分だけMinGW32にしても意味がない、という結論に至った
配布されてるバイナリのバージョンと揃えておいて、同じようにエラー出したり同じように変な動きしたりするほうがいい

71 名前:デフォルトの名無しさん mailto:sage [2010/01/29(金) 22:30:02 ]
普段CをMinGWでコンパイルしていて
Rubyの拡張ライブラリもMinGWでコンパイルしたいんだもん
という人がRubyをMinGWでコンパイルしているんだと思う。
あとメンテナか。

72 名前:デフォルトの名無しさん mailto:sage [2010/01/29(金) 22:36:41 ]
これからMinGWにしてこうぜー、という動きがあるのはある気がするが
「よくわかんないいっぱんゆーざー」がわざわざコンパイルしてまで使用するようなもんでもない

ただしMinGWの知識がある人はどんどん使って色々言ってくれ

73 名前:デフォルトの名無しさん mailto:sage [2010/01/29(金) 23:09:14 ]
class NiseArray < Array; end

a = NiseArray.new
p a.class #=> NiseArray

b = a.map{}
p b.class #=> Array

bがワナビーNiseArrayなんだがドゥーしたらいいんだ?
オレにティーチしてくれよ。



74 名前:デフォルトの名無しさん mailto:sage [2010/01/29(金) 23:25:11 ]
セルフのクラスのオブジェクトをリターンするようにデファインされてないんだよな
継承を考慮してないもともとのクラスのデザインのミステイクではある

75 名前:デフォルトの名無しさん mailto:sage [2010/01/29(金) 23:31:20 ]
Enumerableはeachさえあれば配列じゃなかろうと動くようにしてあるんだから仕方ない
ArrayのメソッドならちゃんとNiseArrayが返すはず

76 名前:デフォルトの名無しさん mailto:sage [2010/01/29(金) 23:36:39 ]
ビルトインクラスは普通のオブジェクトと微妙に構造が違うから継承すんなボケ、
っつーかお前のそのクラスはビルトインクラスを継承するだけの動作をするのか、あー? という怖い感じのが一応スタンス

メソッドが欲しいだけなら普通は委譲を使う

77 名前:デフォルトの名無しさん mailto:sage [2010/01/29(金) 23:39:33 ]
委譲遅いじゃん
はい論破

78 名前:デフォルトの名無しさん mailto:sage [2010/01/29(金) 23:41:22 ]
委譲とかあのへんは遅いよね
継承を使いたくなるくらい遅いというのは実効上の説得力がない

79 名前:デフォルトの名無しさん mailto:sage [2010/01/29(金) 23:41:44 ]
この例に限って言えば dup/clone してから map! すりゃいいんじゃね

80 名前:デフォルトの名無しさん mailto:sage [2010/01/29(金) 23:44:04 ]
>>78
ディスパッチテーブルを
もう一回引く程度のコストが許容できないなら
その問題にRubyは使えないんじゃないかね

81 名前:73 mailto:sage [2010/01/30(土) 00:17:48 ]
Arrayオリジナルのメソッドでcollect/mapとselectはNiseArrayではなくArrayを返す。
ほかはNiseArrayを返す。
あとEnumerableは基本的にArrayを返す。
これらは継承では全滅ということでOKですか?

delegateに馴染みがないので軽いサンプルをいただけると助かります。
もちろん自分でリファレンスマニュアルを読んでみます。

82 名前:デフォルトの名無しさん mailto:sage [2010/01/30(土) 01:32:52 ]
>>81
自作ライブラリのコード漁ってたらこんなの出てきた
でも、正直これは設計ミスだったと思ってる

%w{ find_all reject select sort sort_by }.each do |method|
class_eval %{
def #{method}
self.class.new(super)
end
}
end
%w{ & * + - grep }.each do |method|
class_eval %{
def #{method}(arg)
self.class.new(super)
end
}
end


83 名前:82 mailto:sage [2010/01/30(土) 06:10:54 ]
話の流れ上 delegate のサンプルを貼るべきところだったな、ごめんw
継承するとこうなるぞってことで



84 名前:73 mailto:sage [2010/01/30(土) 10:50:29 ]
#-----hoge1.rb
class NiseArray < Array
instance_methods.each do |method|
define_method(method) do |*args, &block|
result = super(*args, &block)
result.class == Array ? NiseArray.new(result) : result
end
end
end
p NiseArray.new.map{}.class #=> NiseArray

#-----hoge2.rb
require 'delegate'
class NiseArray < DelegateClass(Array)
def initialize
super(Array.new)
end
end
p NiseArray.new.map{}.class #=> Array

#なんでノットNiseArrayなのかミーにはホワイなんです><

85 名前:デフォルトの名無しさん mailto:sage [2010/01/30(土) 14:01:51 ]
class A
def initialize(a=Array.new); @a=a; end
def method_missing(*arg, &block); A.new(@a.__send__(*arg, &block)); end
def to_a; @a; end
def to_ary; @a; end
end

irb> a = A.new([1, 2, 3, 4, 5])
irb> a.delete(5)
irb> p a
#<A:0xb7cf21c0 @a=[1, 2, 3, 4]>
irb> p a.map{|e| e*2}
#<A:0xb7cecb30 @a=[2, 4, 6, 8]>
irb> p a.class
A
irb> p a.to_a
[1, 2, 3, 4]
irb> p Hash[*a]
{1=>2, 3=>4}


86 名前:73 mailto:sage [2010/01/30(土) 14:46:42 ]
おおお素晴らしい
鮮やかに委譲してますね。
しかも直感的でわかりやすい。

#all?など返り値が委譲先のオブジェクトでないメソッドも少し手直しすれば動きそうです。
勉強になりました。参考にさせてもらいます。


87 名前:デフォルトの名無しさん mailto:sage [2010/01/30(土) 17:55:24 ]
$KCODE='u'
'あ' =~ /\xe3/ #=> 0
'あ' =~ /[\xe3]/ #=> nil

となります。

$KCODEを指定しないとどちらも同じ挙動になるんですが。

これは意図した動作なんでしょうか。

手元の環境は
ruby 1.8.7 (2008-08-11 patchlevel 72) [i486-linux]
です。

88 名前:デフォルトの名無しさん [2010/01/30(土) 18:58:31 ]
$KCODEのデフォルトは n なので、
$KCODE を設定しないということは
'あ' はただのバイト列として 0xe3 と比較される。


89 名前:デフォルトの名無しさん [2010/01/30(土) 19:11:04 ]
おや、'u'のとき前者がマッチするのか…


90 名前:デフォルトの名無しさん mailto:sage [2010/01/30(土) 22:20:20 ]
p BasicObject === BasicObject #=> true
p Class === Class #=> true
p Module === Module #=> true
p Object === Object #=> true

p String === String #=> false
p Array === Array #=> false

p BasicObject.class #=> Class
p Array.class #=> Class

p Kernel === Kernel #=> true
p Enumerable === Enumerable #=>false

p Kernel.class #=> Module
p Enumerable.class #=> Module

なんで?教えてえらい人!

91 名前:デフォルトの名無しさん mailto:sage [2010/01/30(土) 22:52:30 ]
>>90
Module#===の定義をリファレンスで読むといいよ
selfがモジュールとすると「obj.kind_of?(self) が true の場合、 true を返します」だとさ

92 名前:デフォルトの名無しさん mailto:sage [2010/01/30(土) 23:00:03 ]
驚き最小!

93 名前:デフォルトの名無しさん mailto:sage [2010/01/30(土) 23:21:41 ]
>>90
===



94 名前:デフォルトの名無しさん mailto:sage [2010/01/30(土) 23:22:47 ]
ミスったw
=== が再定義されているから

case value
when Integer
when String
end

みたいに書けるんじゃないか

95 名前:デフォルトの名無しさん [2010/01/31(日) 00:08:03 ]
Proc#===の定義は見ただけでは何を意図したものか分からなかったな…


96 名前:デフォルトの名無しさん mailto:sage [2010/01/31(日) 07:39:30 ]
||= って何なんでしょう?
代入文みたいに a ||= {} 使うみたいな
辞書の割り当てとかでしょうか?

97 名前:デフォルトの名無しさん [2010/01/31(日) 07:55:53 ]
Marshal.dumpでsingleton can't be dumpedというエラーになって悩んでます
objの中身はライブラリから返されたもので詳細はわかりません

p obj.class #=> Hash
p obj.is_a? Singleton #=> false
Marshal.dump(obj) #=> TypeError: singleton can't be dumped

以下はエラーになりませんでした
obj.each {|k,v| Marshal.dump([k,v])} #=>エラーなし

98 名前:デフォルトの名無しさん mailto:sage [2010/01/31(日) 08:13:23 ]
>>97
そのエラー分かりにくいよね
特異メソッド(およびそれが定義されているオブジェクト)はダンプできませんよって意味
dupしたものをダンプするようにするか、自分で言ってるように中身だけ出すのが正解

99 名前:デフォルトの名無しさん mailto:sage [2010/01/31(日) 08:40:37 ]
>>96
これ書いてる解説少ないんだよな

a がNameErrorを返すか、変数 a が存在して偽を返す場合、 a = {} を実行する

という程度の意味
実際のスクリプトでは大量に使われているが、初心者用文法解説ではほとんど言及されていない謎の記述

100 名前:デフォルトの名無しさん mailto:sage [2010/01/31(日) 09:18:07 ]
>>96
a += 1
a = a + 1

a ||= {}
a = a || {}

a が偽と評価される場合に限り a = {} となり、それ以外のときは a = a
変数の初期化を保証するために使われることが多い

101 名前:デフォルトの名無しさん mailto:sage [2010/01/31(日) 09:23:09 ]
>>100
だいたいの意味はそうだからいいんだけど、厳密には
a || (a = b)
ってことになる
||= と &&= だけちょっと特殊

ってようなのをどっかで見た

102 名前:デフォルトの名無しさん mailto:sage [2010/01/31(日) 11:13:45 ]
>>101
doc.okkez.net/187/view/spec/operator#selfassign

まあobj.foo = obj.fooに副作用がある設計のほうがどうかと思うけどな

103 名前:デフォルトの名無しさん [2010/01/31(日) 14:11:36 ]
>>98
ありがとうございます
objは再帰的なHashなようでdumpできないオブジェクトが入っている場所は一定ではないようです
またTrueClassなどdupできないものも含まれているようです
一気に特異メソッドを取り除いてdumpする方法はないでしょうか?



104 名前:デフォルトの名無しさん mailto:sage [2010/01/31(日) 14:26:44 ]
初めてRubyいじる必要が出てきて,このスレに来てみたが
ここ初心者レベルじゃないね。
初心者抜け出して中級者に手が届こうとしてる人たち向けの
初心者脱出スレだな。

105 名前:デフォルトの名無しさん mailto:sage [2010/01/31(日) 14:29:35 ]
>>104
いや別に

puts と p はどう使い分けるんですかみたいな質問でも構わないよ
全く知らないと小難しそうな領域に踏み込めるようになるまでの時間が短い言語だとでも思ってくれ

実行速度がスクリプト言語として普通なレベル(つまり速いわけではない)という点以外は初心者にやさしいほうだと思うけどね

106 名前:デフォルトの名無しさん mailto:sage [2010/01/31(日) 14:41:46 ]
初心者の質問にでも
初心者抜け出して中級者に手が届こうとしてる人たちも含めていろんな人が答えるスレでしょ
初心者の質問がなけりゃそのちょっと上の会話になるさ

107 名前:デフォルトの名無しさん mailto:sage [2010/01/31(日) 14:44:02 ]
>>103
ライブラリ提供者が提供してないのなら目視で取り除くしかないよ
普通は dump というメソッドを作ってあったりするもんなんだけどね

108 名前:デフォルトの名無しさん mailto:sage [2010/01/31(日) 15:15:55 ]
>>104
大丈夫、そういう場合は自分のような脱初心者(+ニート)が回答するから。
ただ、2chだから超初心者質問には悪態をつく人間がいることは覚悟しておいたほうがいいかも。

109 名前:デフォルトの名無しさん mailto:sage [2010/01/31(日) 16:12:23 ]
相手は人間だから、あんまり馬鹿っぽい質問じゃねえ。
それなりに調べて来ないと駄目でしょ。

思考停止して単位欲しいとかなら

pc12.2ch.net/test/read.cgi/tech/1200175247/
Rubyの宿題教えてください。2限目

とか。

110 名前:デフォルトの名無しさん mailto:sage [2010/01/31(日) 16:22:38 ]
自分の質問が馬鹿っぽいかどうかが分かるなら、
既にそいつは上級者だろw
まあ確かに、自力で最低限ぐぐるくらいのことはしてほしいとは思う

111 名前:デフォルトの名無しさん mailto:sage [2010/01/31(日) 16:26:38 ]
最近の質問はちょっとレベル高かったからなー
むしろ私にも答えられるような初歩的な質問キボンヌ

112 名前:デフォルトの名無しさん mailto:sage [2010/01/31(日) 16:33:04 ]
>>103
Marshalじゃなくてyamlか何かでダンプするようにするのが一番楽

113 名前:デフォルトの名無しさん [2010/01/31(日) 18:48:05 ]
オブジェクトの中身をろがーに吐かせたいんだけど
inspectじゃなくてppみたいに見やすく文字列化してくれるやつない?



114 名前:デフォルトの名無しさん mailto:sage [2010/01/31(日) 19:23:46 ]
>>113
require 'StringIO'
require 'pp'

h = { 1=> '1234567890'*5, 2=> '1234567890'*5 }
sio = StringIO.new
PP.pp(h, sio, 79) # 79文字までは改行しない
sio.rewind
puts '========================'
puts sio.read


puts で表示されてるのがわかるかと思う

115 名前:デフォルトの名無しさん [2010/01/31(日) 19:28:48 ]
pretty_inspect

116 名前:デフォルトの名無しさん mailto:sage [2010/02/01(月) 05:34:01 ]
Rubyは今後10年使われますか?

117 名前:デフォルトの名無しさん mailto:sage [2010/02/01(月) 06:17:43 ]
>>111
てかRuby初心者スレは実質「Ruby質問スレ」と言ってもいい
超初心者からRubistまで、幅広く質問を受け付けるスレって感じがする

…てか、もうスレタイ変えちゃって良いんじゃないか、ここ…?

118 名前:デフォルトの名無しさん mailto:sage [2010/02/01(月) 11:38:19 ]
変えた途端に>>117が業務上のプログラムの質問する事にでもなるのか?

119 名前:デフォルトの名無しさん mailto:sage [2010/02/01(月) 11:43:54 ]
アホが暴れたら高度な話題は本スレでと誘導できるからこのままでいいんだよ

120 名前:デフォルトの名無しさん mailto:sage [2010/02/01(月) 20:18:47 ]
超初心者〜中級にちょっと届かない初心者
ぐらいしか質問してないだろう

121 名前:デフォルトの名無しさん mailto:sage [2010/02/01(月) 20:38:06 ]
人の振り見て我が振り直せ。

122 名前:デフォルトの名無しさん mailto:sage [2010/02/01(月) 21:02:33 ]
Rubyっぽくして

def sum
 key = nil
 sum = 0
 while line = gets
  a = line.split(",")
  if key !=a[0]
   if key
    print "#{key} #{sum}\n"
   end
   key = a[0]
   sum = 0
  end
  sum += a[2].to_i
 end
 print "#{key} #{sum}\n"
end


123 名前:デフォルトの名無しさん mailto:sage [2010/02/01(月) 22:15:25 ]
1時間経ってもスルーされてた理由をなんとなく理解



124 名前:デフォルトの名無しさん [2010/02/01(月) 22:56:47 ]
>>123
たぶんその理解は間違い。


125 名前:デフォルトの名無しさん mailto:sage [2010/02/01(月) 23:02:24 ]
実際に試した人→>>123
実際に手を動かさなかった人→>>124

126 名前:デフォルトの名無しさん [2010/02/01(月) 23:06:22 ]
こういうのはRubyっぽいのか??

$stdin.lines.map {|l|l.chomp.split(/,/).values_at(0,2)}.
group_by(&:first).
each {|k,a|puts"#{k} #{a.map(&:last).map(&:to_i).inject(&:+)}"}

>>123 がソート済みかどうかを考慮しているのかどうか疑問が残る。

127 名前:デフォルトの名無しさん mailto:sage [2010/02/01(月) 23:45:31 ]
group_by初めて知った。旧リファレンスに無くて悲しくなった。
メモリ喰いっすね

128 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 00:10:11 ]
Ruby/GTK2 でグラフをプロットするアプリケーションを作りたいと考えています。
ruby-gnome2.sourceforge.jp/ja/hiki.cgi?gtk2-tut-itemfactory-example
ここにあるようなメニューとウィンドウを作ることはできたのですが、例えば
month = [1, 2, 3, 4, 5, 6, 7, 8, 9 ,10, 11, 12]
temp = [6.8, 7.8, 10.0, 15.7, 20.1, 22.5, 26.3, 26.6, 23.0, 19.0, 13.5, 9.0]
というデータがあったときに、横軸に month を縦軸に temp をとったグラフをウィンドウの中に、直接表示するためにはどうすればよいのでしょうか?

Windows XP ActiveScriptRuby環境です
最終的にはもっと長い(1000-10000点ほど)データがプロットしたいと考えています

129 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 00:37:22 ]
>>128
良く使われる手法は
1.グラフ画像を生成してウインドウに貼る
2.描画可能なコンポーネントにプログラムで描画する
の二つ

1.のグラフ画像生成は、画像処理ライブラリを使って自力でグラフを書くか
グラフ生成ライブラリを使うかする

2.はruby/gtk使った事無いからリンク先から関係ありそうなところ
> ttp://ruby-gnome2.sourceforge.jp/hiki.cgi?Gtk%3A%3ADrawingArea
> ttp://ruby-gnome2.sourceforge.jp/hiki.cgi?Gdk%3A%3ADrawable

130 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 00:41:47 ]
Tkの知識はあるんだよね

131 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 00:43:29 ]
TkじゃなかったGTKだた
どっちにしても指示をRuby上からやる、という以上のものではないんで
GUIパーツの使い倒し方を知ってるのがけっこう前提

132 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 00:58:08 ]
>>129
ありがとうございます
素人考えですがポイント数が増えると 2. の方がいいのかなという気がするので、リンク先を読んでみます

>>130
Tk もわかりません…

133 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 01:05:03 ]
グラフはQwtがマジおすすめ
qwt.sourceforge.net/

RubyのQtバインディングがあればRubyからも使えるはず

俺はPyQtからしか使った事ないが



134 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 01:27:16 ]
>>129-131

128 です
ウインドウへの直接描画 - Gdk::Drawable
ruby-gnome2.sourceforge.jp/ja/hiki.cgi?%A5%A6%A5%A4%A5%F3%A5%C9%A5%A6%A4%D8%A4%CE%C4%BE%C0%DC%C9%C1%B2%E8%282%29+-+Gdk%3A%3ADrawable
こちらを見落としていたようで、先ほどのリンクと一緒に参照しながらやっていきたいと思います

確かに gtk そのものを学ぶ必要があるのだろうとは感じています。ありがとうございました

>>133

ありがとうございます
Qwt のスクリーンショットはかなりイメージに近いです

135 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 02:28:19 ]
irb の文字入力が悲しいくらい重いです
カーソル移動は問題ないです
irb --noreadline とすると入力は普通になりますが使いにくいです
ruby 1.8.6 (2009-08-04 patchlevel 383) [i386-mingw32]


136 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 04:15:30 ]
PCのスペックは?それ書いてくれないと判断できないのだが

137 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 08:07:16 ]
プロッターを1から作るのは全くおすすめできない
133のQwtであればAPIで簡単に実現可能な
描画領域の拡大・縮小やドラッグ、凡例表示なんかを実装するのは
よっぽどモチベーションが高くないと無理

138 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 10:52:05 ]
>>136
単なるローカルエコーであるはずのirbでの文字入力だけが重くなるという時点で
スペックとか関係ない問題だと思う…

139 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 15:08:41 ]
「単なる」っておまえReadlineを知らんのだろ

140 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 17:42:37 ]
io = File.open 'text.gz' #俺様専用!

gz = Zlib::GzipReader.new io
gz.close
io.closed? # しまった!

IOクラスのインスタンスを要求するライブラリで、closeを呼ぶと
上流のIOがcloseされてしまう仕様は、何か理由があるのですか?

内部でIOを複製してそれを使えばいいじゃないですか、と思うのですが。

141 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 18:33:36 ]
>>140
一緒に閉じたほうが使いやすいから

Zlib::GzipReader の close 時に io を一緒に閉じて欲しくないのなら Zlib::GzipReader#finish を使う
これだと wrap 使ってブロックで書ける

File.open('text.gz'){|f|
Zlib::GzipReader.wrap(f){|gz|
# なんか
gz.finish
}
p f.closed? #=> false
}

142 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 18:36:10 ]
>>141
ホントだ。
何か技術的な理由でそのような仕様になっているのかと思った。

どうもありがとう。

143 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 18:43:30 ]
と思ったら、IOストリームの位置が進められているよ。
やっぱり内部で複製していないのか。

とりあえず io.rewind で戻せるからいいけどさ。。



144 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 18:52:49 ]
>>143
gz.rewind で GzipReader オブジェクトが作成された時点のファイルポインタ位置に戻せるよ
自動でやらないのは細かい制御したいときに込み込みでやられると発狂するからだと思う

File.open('text.gz'){|f|
Zlib::GzipReader.wrap(f){|gz|
# なんか
gz.rewind
gz.finish
}
p f.closed? #=> false
}

IO オブジェクトを複製しない理由はなんか偉い人が教えてくれるんじゃないかな

145 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 19:34:14 ]
>>143
f = File.open file
f.read
f.dup.seek 0
f.pos

そもそも副作用の代表格であるIOにまともな複製なんて不可能じゃない?

146 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 21:02:46 ]
IOのeachとlinesってまったく同じ?

147 名前:デフォルトの名無しさん mailto:sage [2010/02/02(火) 22:41:29 ]
同じ

148 名前:デフォルトの名無しさん [2010/02/03(水) 06:52:22 ]

Ruby on Rails 3.0 Release Notes
guides.rails.info/3_0_release_notes.html

149 名前:デフォルトの名無しさん mailto:sage [2010/02/03(水) 10:23:18 ]
>>138
Windows版Rubyはirb立ち上げておくとなんか変なプロセスが一緒に走って重いよ。
デュアルコアならさして問題ないが1コア占有するんでね。
csrss.exeだったかな。システム絡みのが。

いつまで立っても直らないのは、CPU占有率を常に見ている人が少ないのと、
誰も公式に言わないからだろうと

150 名前:149 mailto:sage [2010/02/03(水) 10:27:00 ]
今試したら、
クアッドコアのマシンでruby 15%、csrss 8%ぐらい合わせて1コア分くらいだな。
ちょっと違ってたスマソ
とりあえず、Windowsではirb重い。
少なくとも開発中に立ち上げっぱなしはムリポw

俺はcoLinuxとかで立ち上げるからさして問題ないけど

151 名前:デフォルトの名無しさん mailto:sage [2010/02/03(水) 10:29:19 ]
えっ
BusyLoopなの?

152 名前:デフォルトの名無しさん mailto:sage [2010/02/03(水) 10:36:22 ]
今しばらくmswin32版rubyのirbで色々やってみてるけど
触らなければCPU0%だなあ
もっと時間かけると占有するようになる?

153 名前:デフォルトの名無しさん mailto:sage [2010/02/03(水) 10:38:15 ]
ruby 1.8.6 (2009-08-04 patchlevel 383) [i386-mingw32]



154 名前:デフォルトの名無しさん mailto:sage [2010/02/03(水) 10:39:56 ]
お、mingwの話かスマソ

155 名前:デフォルトの名無しさん mailto:sage [2010/02/03(水) 13:11:46 ]
教祖がウィンドウズ使ってないから仕様。

156 名前:デフォルトの名無しさん mailto:sage [2010/02/03(水) 14:50:51 ]
パッチレベルをp388に上げてみるとか
Readlineのdllを最新のものにしてみるとか

ちなみに
ruby 1.9.1p378 (2010-01-10 revision 26273) [i386-mingw32]
のirbは軽い
csrss.exeの占有率はせいぜい0%~1%くらいか。
CPUはPentium M 1GH

ttp://gnuwin32.sourceforge.net/packages/readline.htm


157 名前:デフォルトの名無しさん [2010/02/03(水) 15:20:42 ]
Windows上でMechanizeを使おうと考えており下記のスクリプトを試しましたが下記のような結果となりました
何がおかしいのか見当つかないのでどなたかアドバイスいただけないでしょうかよろしくお願いいたします

* 環境
>ruby -v
ruby 1.8.7 (2009-06-12 patchlevel 174) [i386-mswin32]
>gem list
*** LOCAL GEMS ***
hpricot (0.8.2)
mechanize (0.9.3)
nokogiri (1.4.1)

* テストスクリプト
require 'rubygems'
require 'mechanize'
agent = WWW::Mechanize.new
page = agent.get('www.google.com/')
puts page.forms
puts page.forms.with

* 結果
>ruby -d hoge.rb
Exception `LoadError' at C:/PROGRA~1/ruby-1.8/lib/ruby/vendor_ruby/1.8/rubygems.rb:1112 - no such file to load -- rubygems/defaults/operating_system
Exception `NoMethodError' at C:/PROGRA~1/ruby-1.8/lib/ruby/1.8/rational.rb:78 -undefined method `gcd' for Rational(1, 2):Rational
Exception `LoadError' at C:/PROGRA~1/ruby-1.8/lib/ruby/vendor_ruby/1.8/rubygems/custom_require.rb:31 - no such file to load -- mechanize
#<WWW::Mechanize::Form:0x381a3a0>
Exception `NoMethodError' at C:/PROGRA~1/ruby-1.8/lib/ruby/1.8/pp.rb:214 - undefined method `with' for #<Array:0x381a4e0>
hoge.rb:7: undefined method `with' for #<Array:0x381a4e0> (NoMethodError)

158 名前:デフォルトの名無しさん mailto:sage [2010/02/03(水) 15:24:15 ]
>>157
Mechanizeのメソッドの使い方を単に間違ってる
ここ全部読め
ttp://d.hatena.ne.jp/kitamomonga/20081209/kaisetsu_for_ver_0_9_ruby_www_mechanize

159 名前:デフォルトの名無しさん [2010/02/03(水) 16:59:18 ]
puts ["hoge"][0]
とやると「hoge」が出力され、0以外だと「nil」が出力されるのですが
この構文自体がどういうものなのか分かりません。
なにかの省略形とかなのでしょうか?

160 名前:デフォルトの名無しさん mailto:sage [2010/02/03(水) 17:07:50 ]
>>159
そんなへちょい例文作ったとこどこよお母さん一言文句言っちゃるわ

a = ["hoge"]
puts a[0]

つまり配列の 0 要素目

161 名前:159 [2010/02/03(水) 17:14:43 ]
>>160
やはり配列でしたか…。こういう記述も許されるんですね。
ありがとうございます。

162 名前:デフォルトの名無しさん mailto:sage [2010/02/03(水) 17:16:58 ]
> こういう記述も許されるんですね。
というか配列リテラルで直接要素参照する意味はまずない
むしろ嫌がらせに近い

163 名前:デフォルトの名無しさん mailto:sage [2010/02/03(水) 17:28:30 ]
pc12.2ch.net/test/read.cgi/tech/1155031689/
661 デフォルトの名無しさん [sage] 2009/09/04(金) 08:12:26 ID: Be:
Windows用Rubyは MinGW版が速いと聞いてRuby on Railsで試してみた - yuum3のお仕事日記
d.hatena.ne.jp/yuum3/20090805/1249452345
antoniocangiano.com/wp-content/uploads/2009/08/mri_kri_total_runtime.png

mingw版のほうが速いんだってさ

664 デフォルトの名無しさん [sage] 2009/09/06(日) 21:15:00 ID: Be:
Rails遅いのかーバージョン下げるかなー

665 デフォルトの名無しさん [sage] 2009/09/06(日) 22:06:08 ID: Be:
913 nobodyさん [sage] Date:2009/09/06(日) 14:23:30 ID:??? Be:
>>905-907
本当だ。なんだこれ?
mswin32版のRuby 1.8.7-p160が遅すぎる件 - 那由多屋 開発日誌
d.hatena.ne.jp/nayutaya/20090601/1243848756
L'eclat des jours(2009-04-22)
www.artonx.org/diary/20090422.html
(コメ欄)

666 デフォルトの名無しさん [sage] 2009/09/06(日) 23:28:30 ID: Be:
何年も前から言われてることに反応して欲しいのかな

667 デフォルトの名無しさん [sage] 2009/09/06(日) 23:53:35 ID: Be:
何年も前じゃないだろ

670 デフォルトの名無しさん [sage] 2009/09/07(月) 06:40:46 ID: Be:
>>666-667
>>665がその前もコピペしないからわからないが、どうやら、p160にうpだてすると、
Railsのviewの処理が100倍遅くなるらしい。今年に入ってからの話。



164 名前:デフォルトの名無しさん [2010/02/03(水) 18:15:37 ]
>>158
どうもありがとうございました
このサンプルで動いている環境もあったので混乱していましたが
使っているバージョンが違っておりました

165 名前:デフォルトの名無しさん [2010/02/03(水) 22:07:55 ]
はてなブックマーク(エクスポートしたデータ)から
タグを指定して、一部を抽出するプログラムを書きたいです。

require 'rubygems'
require 'hpricot'
require 'open-uri'

doc = Hpricot(open("dump.htm"))

(doc/:a).each do |para|
if para.attributes['tags'] = "microsoft"
puts para
end

までは書いたのですが、別のファイルに保存する方法が分かりません。
よろしくお願いします。






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<176KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef