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


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

Ruby 初心者スレッド Part 33



1 名前:デフォルトの名無しさん mailto:sage [2009/12/05(土) 14:21:25 ]
プログラミング言語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を読め」でいいので、叩かない&怖がらせない。
 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。

2 名前:デフォルトの名無しさん mailto:sage [2009/12/05(土) 14:22:09 ]
【よくあるしつもん】
Q:
いちからRubyを始める初心者向けのRuby入門書は何がありますか?

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

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

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

3 名前:デフォルトの名無しさん mailto:sage [2009/12/05(土) 14:22:49 ]
Ruby 公式・非公式便利サイト2009

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

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

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

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

4 名前:デフォルトの名無しさん mailto:sage [2009/12/05(土) 14:24:09 ]
関連スレ
・Rubyについて Part 38
 pc12.2ch.net/test/read.cgi/tech/1257079004/

アンチスレ
・Rubyについて(アンチ専用) Part004
 pc12.2ch.net/test/read.cgi/tech/1249737531/

Railsスレ
・【Ruby】Ruby on Rails Part8
 pc11.2ch.net/test/read.cgi/php/1252842574/

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

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

5 名前:デフォルトの名無しさん mailto:sage [2009/12/05(土) 14:24:50 ]
前スレ

Ruby 初心者スレッド Part 32
pc12.2ch.net/test/read.cgi/tech/1256332692/

Ruby 初心者スレッド Part 31
pc12.2ch.net/test/read.cgi/tech/1253176267/

6 名前:デフォルトの名無しさん mailto:sage [2009/12/05(土) 14:25:32 ]
バージョンに関するよくある質問

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

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

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

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

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

7 名前:デフォルトの名無しさん mailto:sage [2009/12/05(土) 15:33:07 ]
前すれ >>999
確かにこれでもいいが、メソッドチェーンできねえからな・・・

p {"a" => 1, "b" => 2, "c" => 3}.map{|x|x[1]}
SyntaxError: compile error

>999 名前:デフォルトの名無しさん[sage] 投稿日:2009/12/05(土) 14:16:08
>>>989
>中カッコを外すとかは?
>
>p "a" => 1, "b" => 2, "c" => 3

8 名前:デフォルトの名無しさん mailto:sage [2009/12/05(土) 15:46:49 ]
おまけ

・Rubygem 0.x
 極悪動作をすることで有名なRuby外部ライブラリ利用サポートプログラム群のバージョン
 このバージョンしかパッケージが存在しないUNIX系ディストリビューションがあって結構問題に
 しかも「rubygem本体の自己更新機能は殺してるのでパッケージから入れてね」とかほざきやがる
 パッケージがバージョン 1 より前のものしかない場合はソースからインストールするとよい
 Rubygem は 1.0 も 1.1 も 1.2 も肝心なとこにバグ持ちなので極力 1.3 などの最新を使うこと

9 名前:デフォルトの名無しさん mailto:sage [2009/12/05(土) 15:51:54 ]
>>8
Ubuntu 9.xxでもaptで入れるとbinにパス通ってなかったり、どうしてこうなった?なことになってる
謎過ぎる。

10 名前:デフォルトの名無しさん mailto:sage [2009/12/05(土) 16:02:10 ]
>>9
pkg-ruby-extras.alioth.debian.org/index.html
このへん? よく読んでないけど。




11 名前:デフォルトの名無しさん [2009/12/05(土) 17:32:12 ]
a = 82.30
b = 80.20

print a - b, "\n" ←こうやると誤差がでますが

printf("%.2f\n", a - b) ←修正はこれでいいですか?もっといい方法あります?

12 名前:デフォルトの名無しさん mailto:sage [2009/12/05(土) 17:44:41 ]
irb> a = 82.30
82.3
irb> b = 80.20
80.2
irb> p a-b
2.09999999999999
irb> require 'bigdecimal'
irb> a = BigDecimal.new('82.30')
irb> b = BigDecimal.new('80.20')
irb> puts a-b
0.21E1
nil
irb> puts (a-b).to_f
2.1


13 名前:デフォルトの名無しさん mailto:sage [2009/12/05(土) 18:17:21 ]
>>12
なるほど。BigDecimalですか。
そっちの方が推奨されるやり方なんでしょうか?

例えば以下の様な方法だと何か問題はありますか?

a = 82.30
b = 80.20
c = nil

c = sprintf("%.2f", a - b).to_f

14 名前:デフォルトの名無しさん mailto:sage [2009/12/05(土) 19:00:05 ]
>>13
それで問題があるかどうかはその数値の使われ方を知っている君が知ってるはず

15 名前:デフォルトの名無しさん mailto:sage [2009/12/05(土) 20:02:12 ]
>>14
という事は単純な桁数指定と切り上げ処理に限っていえば
この方法でも問題ないという事ですね?

16 名前:デフォルトの名無しさん [2009/12/06(日) 01:38:06 ]
character = Array.new
character << {alph => "a", hiragana => "あ"}

上記のようなコードを書いた後に、katakana => "ア" を、
配列 character の中のハッシュの末尾に追加するには、どうすればよいでしょう
character[[alph => "a", kana => "あ",        ]]
                   ^^^^^^^^^^^^^^^
                   ここに katakana => "ア" を追加したい。

17 名前:デフォルトの名無しさん mailto:sage [2009/12/06(日) 01:46:15 ]
>>16
alphaとかhiraganaというのはローカル変数なのか、
シンボルの記述ミスなのか
# あまり本質的ではないけど一応確認。

character[-1].update(katakana => 'ア')

character[-1]で配列の最後の要素にアクセスできる。
返ってくるのは該当要素それ自体(コピーではなく)
これに破壊的メソッドを作用させればよい。

これ、ハッシュの「最後」に追加されるかどうかはバージョンによる。
MRIの1.9ではキーの追加順になるけど、ハッシュの本義に照らせば
どこに追加されるかは仮定できない。


18 名前:デフォルトの名無しさん [2009/12/06(日) 01:53:27 ]
>>17
> alphaとかhiraganaというのはローカル変数なのか、
> シンボルの記述ミスなのか

記述ミスです。。。

ありがとうございます!できました。

19 名前:デフォルトの名無しさん [2009/12/06(日) 02:19:04 ]
なにこのキモいスレ

20 名前:デフォルトの名無しさん mailto:sage [2009/12/06(日) 08:05:03 ]
YARVの1.9からはハッシュの順番が保証されてるんだっけ?



21 名前:デフォルトの名無しさん mailto:sage [2009/12/06(日) 08:12:15 ]
なんか微妙な表現だがおおむねYESだ
それがなくなることもない

22 名前:デフォルトの名無しさん mailto:sage [2009/12/06(日) 14:05:43 ]
injectが遅いんですが何のためにあるとですか?
>> RUBY_DESCRIPTION
=> "ruby 1.8.7 (2008-08-11 patchlevel 72) [universal-darwin10.0]"
>> Benchmark.realtime{Array.new(1_000_000).inject(0){|r,|r+0}}
=> 1.62985396385193
>> Benchmark.realtime{sum=0; 1_000_000.times{sum+=0}}
=> 0.377360105514526


23 名前:デフォルトの名無しさん mailto:sage [2009/12/06(日) 16:11:36 ]
速くしたいなら速いほうで書けばいいじゃん

24 名前:デフォルトの名無しさん mailto:sage [2009/12/06(日) 18:27:10 ]
>>23
真理だな

25 名前:デフォルトの名無しさん mailto:sage [2009/12/06(日) 18:31:49 ]
(キリッ

26 名前:デフォルトの名無しさん mailto:sage [2009/12/06(日) 19:42:32 ]
>>22
injectは遅いし分かりにくいので、使わずに済むなら使わない方がいいと思う。
1.9にしたらけっこう速くなるけど。

27 名前:デフォルトの名無しさん mailto:sage [2009/12/06(日) 21:53:15 ]
分かりにくいんじゃなくて、慣れていないだけでは。
なれれば、すぐ読めるよ。

injectは式一個でかけるし、メソッドチェーンも作れるってのがいいんじゃないかな。

28 名前:デフォルトの名無しさん mailto:sage [2009/12/06(日) 22:50:01 ]
>>22
injectは遅いけど、比較のしかたが違ってるんじゃ?
injectを使うってことは配列とかをイテレートしたいってことだろうから
require 'benchmark'
hoge = Array.new(1_000_000)
a = Benchmark.realtime{sum = hoge.inject(0){|r,e|r+0}}
b = Benchmark.realtime{sum=0;hoge.each{|e|sum+=0}}
print "#{a} / #{b} = #{'%1.5f'%[a/b]}"
くらいが比較なんじゃないだろうか

ruby 1.8.7 (2009-06-12 patchlevel 174) [i386-mingw32]
2.03125 / 0.21875 = 9.28571

ruby 1.9.1p243 (2009-07-16 revision 24175) [i386-mingw32]
0.15625 / 0.078125 = 2.00000

1.8だと9倍おそいけど 1.9だと2倍のコスト
しかも1.9のinjectの方が 1.8のeachより速い


29 名前:デフォルトの名無しさん mailto:sage [2009/12/06(日) 22:51:50 ]
ためしに配列を5倍にしたら
ruby 1.8.7 (2009-06-12 patchlevel 174) [i386-mingw32]
34.421875 / 1.109375 = 31.02817
ruby 1.9.1p243 (2009-07-16 revision 24175) [i386-mingw32]
0.640625 / 0.359375 = 1.78261
1.8のinjectがすごく遅くなった


30 名前:デフォルトの名無しさん mailto:sage [2009/12/06(日) 22:58:04 ]
さらに1.9だと
p が引数をそっくり返り値にするので 前スレの
[1,2,3,4,5].inject(0) {|result, item| p result += item }
はそのままで動く

puts とかprintfみたいに値を返さないメソッド使いたい場合
破壊的変更が出来るのなら each_with_object も使える
[1,2,3,4,5].each_with_object('') {|item,result| printf("%10s\n",result << item.to_s) }
injectと違い最後にresultを返り値に置かなくてもいい
でも数値だと破壊的変更が出来ないので普通にinjectを使うしかないような




31 名前:デフォルトの名無しさん mailto:sage [2009/12/06(日) 23:02:50 ]
なんだかパッとしないな < each_with_object

32 名前:デフォルトの名無しさん mailto:sage [2009/12/07(月) 00:00:35 ]
hs = (0..5).map do |n| (0..5).map do |m| 0 end end
二次元配列を生成する方法にこんなものを知ったんですが
もっと短くかけないんでしょうか?

33 名前:デフォルトの名無しさん mailto:sage [2009/12/07(月) 00:04:21 ]
多次元配列というものは Ruby にはそもそもない
つまり、ネストした配列で代用するしかない

map でもいいんじゃね

34 名前:デフォルトの名無しさん mailto:sage [2009/12/07(月) 01:29:14 ]
hs = Array.new(6){Array.new(6){0}}
hs = (0..5).map{|n|(0..5).map{|m|0}}
hs = (0..5).map{(0..5).map{0}}

35 名前:デフォルトの名無しさん mailto:sage [2009/12/07(月) 02:33:01 ]
理解困難

>> a1=Array.new(2)
=> [nil, nil]
>> a1.map{|e|e.object_id}
=> [4, 4]
>> a1[0]=:test
=> :test
>> a1
=> [:test, nil]

>> a2=Array.new(2,Array.new(2))
=> [[nil, nil], [nil, nil]]
>> a2.map{|e|e.map{e.object_id}}
=> [[2983450, 2983450], [2983450, 2983450]]
>> a2[0][0]=:test
=> :test
>> a2.map{|e|e.map{e.object_id}}
=> [[2983450, 2983450], [2983450, 2983450]]
>> a2
=> [[:test, nil], [:test, nil]]

36 名前:デフォルトの名無しさん mailto:sage [2009/12/07(月) 02:49:23 ]
>>33-34
そうですかぁ
残念です

37 名前:デフォルトの名無しさん mailto:sage [2009/12/07(月) 02:53:32 ]
>>35
× a2.map{|e|e.map{e.object_id}}
○ a2.map{|e| e.map{|e| e.object_id}}

38 名前:デフォルトの名無しさん mailto:sage [2009/12/07(月) 03:01:59 ]
把握

39 名前:デフォルトの名無しさん mailto:sage [2009/12/07(月) 03:52:50 ]
s = "aaa bbb ccc:ddd eee"
if s =~ /ccc:(\S+)/
   t = $1
   s.gsub!(/ccc:(\S+)/, "") # この二度手間な記述をもっと簡潔に書くやり方はないですか?
end
p s # "aaa bbb eee"
p t # "ddd"


40 名前:デフォルトの名無しさん mailto:sage [2009/12/07(月) 05:06:06 ]
こう?

s = "aaa bbb ccc:ddd eee"
t = s.gsub!(/ccc:(\S+)/, '') ? $~[1] : ''




41 名前:デフォルトの名無しさん mailto:sage [2009/12/07(月) 05:10:30 ]
>>39
これくらいしか思い付かん
s = "aaa bbb ccc:ddd eee"
t = s[/ccc:(\S+)/,1]
s.gsub!(/ccc:(\S+)/,"")
又は
s,t = "aaa bbb ccc:ddd eee"
s.gsub!(/ccc:(\S+)/) { t = $1 ; "" }
もしくは
s = "aaa bbb ccc:ddd eee"
s,t = $`+$',$1 if s =~ /ccc:(\S+)/

42 名前:デフォルトの名無しさん mailto:sage [2009/12/07(月) 05:12:15 ]
>>40
ここで $1 ではなく $~[1] を使う理由はある?

43 名前:デフォルトの名無しさん mailto:sage [2009/12/07(月) 10:18:05 ]
というか特段二度手間でもない
簡潔でわかりやすくていいじゃん

44 名前:デフォルトの名無しさん mailto:sage [2009/12/07(月) 11:08:35 ]
attr_* をそのままライブラリ外に公開する理由ってたいていの場合薄いよね?

45 名前:デフォルトの名無しさん mailto:sage [2009/12/07(月) 11:16:10 ]
>>44
そういう考え方もある
内部変数名と同じ名前のpublicなメソッドを外部提供する理由は本来無い
ユーザーに提供されるべきは、もっと一段上の名称&機能なメソッドであるべき

 attr_writer :username, :password

ではなく

 def user_info(h={})
  @username, @password = h[:username], h[:password]
 end

とかのほうがいいんじゃね、みたいな考え

オープンクラスだし堅いこと言うなJava使えJavaって感じではあるが

46 名前:デフォルトの名無しさん mailto:sage [2009/12/07(月) 16:30:36 ]
>>39
gsub!を使うということは複数回の置換が想定されるのか?
tの値は置換が起こらなければ保存しておきたいのか?

置換でも$1は得られるので
複数回の置換がおこなわれるうちの最後の$1が取れればいいだけなら
>>40 でいい
置換が起こらなければtを変更したくないのならば
t = $1 if s.gsub!(/ccc:(\S+)/, '')
とか、置換が起こらなければt=nilになってもいいのなら
t = s.gsub!(/ccc:(\S+)/, '') && $1

複数回置換のうちの最初の $1 が得たいのなら
置換が起こらなければt=nilになりますが >>41 の二番目をちょっと変えた
t = nil
s.gsub!(/ccc:(\S+)/) { t ||= $1 ; "" }
とか
t = nil
t ||= $1 while s.sub!(/ccc:(\S+)/,'') #gsub!と違って置換した結果をさらに置換していくので結果が変わることもある
とかですかね
でも、巨大文字列内の大量置換を一気にやり、なおかつ最初の$1を得たいのなら>>39が一番速いかな
>>41の最初のでもいいけど tが変更されるし>>39の方がわかりやすい


47 名前:デフォルトの名無しさん mailto:sage [2009/12/07(月) 19:14:47 ]
ttp://itpro.nikkeibp.co.jp/article/Interview/20090106/322300/
今年はじめのこんな記事を見つけたんだけど、仕様書草案ってもうどこかで見られる?

48 名前:デフォルトの名無しさん mailto:sage [2009/12/07(月) 19:19:46 ]
RubySpecかな

49 名前:デフォルトの名無しさん mailto:sage [2009/12/07(月) 19:31:48 ]
>>47

Rubyについて Part 38
pc12.2ch.net/test/read.cgi/tech/1257079004/

261 名前: デフォルトの名無しさん Mail: sage 投稿日: 2009/12/01(火) 19:36:45
ruby-std.netlab.jp/


50 名前:デフォルトの名無しさん mailto:sage [2009/12/07(月) 19:39:59 ]
ddd! ありがとうございます!



51 名前:デフォルトの名無しさん mailto:sage [2009/12/07(月) 21:34:59 ]
Rubyのテスト用フレームワークっていくつかあるみたいですが何がいいでしょうか?
場合による、という結論かもしれませんが
みなさんは何を使ってますか?

52 名前:デフォルトの名無しさん mailto:sage [2009/12/07(月) 21:45:45 ]
目的によるし、おおむね目的ごとに分かれてると思う
自分で使ってテストの方向性に合うものを選択するといい
テストフレームワークを1種類しか使えない、という人は少ない

よーわからんがテストってあると便利そうじゃね、というのなら RSpec から始めるといいんじゃね

53 名前:デフォルトの名無しさん mailto:sage [2009/12/07(月) 22:19:44 ]
よーわからんがテストってあると便利そうじゃね、というレベルなら、
標準添付のtest/unitがいいんじゃね

54 名前:デフォルトの名無しさん mailto:sage [2009/12/07(月) 22:34:53 ]
テストっちゃ、「ファイルに保存されたかどうか」のテストってどうやるん

55 名前:デフォルトの名無しさん mailto:sage [2009/12/07(月) 22:44:51 ]
>>52-53
アドバイスありがとうございます
そうですね、もう少し調べたりいろいろ使ってみて決めたいと思います

56 名前:デフォルトの名無しさん mailto:sage [2009/12/07(月) 22:47:08 ]
・ 書き出し先ファイルがあれば削除
・ ファイル保存を含んだメソッドを実行
・ 例外が起こらないことをテスト
・ ファイルの中身が期待通りであることをテスト
・ 書き出し先ファイルがあれば削除

書き出すファイルを削除できないという場合は知らん
「きっと保存されるはず」みたいなテストするしかなくね

57 名前:デフォルトの名無しさん mailto:sage [2009/12/08(火) 03:20:32 ]
最終手段的には、事前にFile.openやFile#writeをフックとか・・・

58 名前:デフォルトの名無しさん [2009/12/08(火) 11:45:06 ]
FTPでディレクトリの更新日時が知りたいのですが取れません
一般的に、FTPではLSコマンドの結果を解釈するしかないのでしょうか?
(net/ftpを利用してます)

59 名前:デフォルトの名無しさん mailto:sage [2009/12/08(火) 11:55:44 ]
MLSDとか送ればいいんじゃないの

60 名前:デフォルトの名無しさん mailto:sage [2009/12/08(火) 13:17:10 ]
>>58
一般には自力で解析するしかない。
MDTMというコマンドもあるがすべてのftpサーバが実装しているわけではない。




61 名前:デフォルトの名無しさん mailto:sage [2009/12/08(火) 14:02:01 ]
>>54
class Publisher
def initialize(p)
@text, @from, @to, @path = p[:text], p[:from], p[:to], p[:path]
end
def publish
output = replace(@text, @from, @to)
save(output, @path)
end
def replace(text, from, to); text.gsub(/#{from}/){to}; end
def save(str, path); File.open(path, 'wb'){|f| f.print(str)}; end
end

# Publisher.new(:text => 'ruby大好き!', :from => 'ruby', :to => 'オブジェクト指向スクリプト言語Ruby',
# :path=> 'ruby_love.txt').publish #=> "オブジェクト指向スクリプト言語Ruby大好き!"

これの Publisher#save をテストしたいとかそんなの?

62 名前:デフォルトの名無しさん mailto:sage [2009/12/08(火) 14:29:56 ]
>>61
こう囁く
「なー、そのsaveするときの文字列がクラス本体にpとか追記せずに画面に表示できたら便利だと思わね?」
そしてこうする

class Publisher
def initialize(p)
@text, @from, @to, @path = p[:text], p[:from], p[:to], p[:path]
end
def publish
output = replace(@text, @from, @to)
save(io, output)
end
def io
case @path
when IO, File then @path
when "$stdout", nil then $stdout
when "$stderr" then $stderr
else File.open(@path, 'wb')
end
end
def replace(text, from, to); text.gsub(/#{from}/){to}; end
def save(io, str); io.print(str); io.close if io.kind_of?(File); end
end

Publisher.new(:text => 'ruby大好き!', :from => 'ruby', :to => 'オブジェクト指向スクリプト言語Ruby', :path=> $stdout).publish

これなら Publisher#save に StringIO を渡せばテストできるはず
保存時ファイル操作のエラーのときに独自処理したい場合はこれでは駄目だけど

63 名前:デフォルトの名無しさん mailto:sage [2009/12/08(火) 16:17:20 ]
JRubyとRubyの違いについて調べてみたのですが、
いまいちわからなかったのでここで質問してみます。
JRubyはコーディングの仕方が、Rubyと同じなだけであり、
それ以外の部分は全く別なものという解釈でいいのかな?

根本は全く違うものではあるが、コードレベルでは
同じ内容で動くものなので、移植する場合は、
コードのコピペでおk・・・かな?

64 名前:デフォルトの名無しさん mailto:sage [2009/12/08(火) 17:29:49 ]
>>59, 60
ありがとうございました

65 名前:デフォルトの名無しさん mailto:sage [2009/12/08(火) 19:03:00 ]
>>63
普通のRubyはCで書いてある
Cで書いてあるので拡張ライブラリはCで作るとよく動く
現在のCのバイナリはだいたい同じように動作することが期待できるのでRubyスクリプトを一度書けばどこでも動く

JRubyはJavaで書いてあるというかJavaで動くというかJava仮想マシンJVM上で動作する
Javaで書いてあるので拡張ライブラリはJavaで作ると普通に動く
おまけにJavaプログラムの一部として埋め込むことも実行することもJavaのライブラリを呼ぶこともできる
通常のRuby(Cで書かれているので区別のためにCRubyと呼ぶ)と同じように動作するように作ってあるものの
たまーに動作が違う部分が混じってることもないわけではないんだが
いちいちスクリプトレベルで対処するのも面倒だしそれこそ煩雑なので無視

本質的にはJVMのぶんだけJRubyのほうが遅い
ただ、JVMを常に起動してる場合は遜色ないか、JRubyのほうが処理が速いこともある

66 名前:デフォルトの名無しさん mailto:sage [2009/12/09(水) 06:11:28 ]
      ,―ヽ____、―
   ,/  ノ       ヽ  ~\
  /   ノ   IPA    ヽ   ~\
/   ノ           ヽ、  `ヽ
|    ノ / ̄\   / ̄~ヽ ヽ    i
|   ノ              |  ノ
\  |  <●>  <●>  (  )
 \ |      | |       i /
    |      /  ヽ       レ
   i     (●_●)      /  
    i、    ,-――-、   ・ /
    i、  <(EEEEE)> ∵/    まピョーん☆ IPA Rubyをこれからもよろしく
      i、   \___/  _/
       \       ,ノ       
  ,,.....イ.ヽヽ、ー-―一ノ゙-、.
  :   |  '; \_____ ノ.| ヽ i
      |  \/゙(__)\,|  i |
      >   ヽ. ハ  |   ||

67 名前:デフォルトの名無しさん mailto:sage [2009/12/09(水) 10:43:59 ]
おまえら1.9.1更新しろー
ttp://sourceforge.jp/magazine/09/12/08/1011230
と思ったがインストーラつきを公開してる人はまだいないのね

68 名前:デフォルトの名無しさん mailto:sage [2009/12/09(水) 10:47:19 ]
みんなに広まってからアップグレードする
どうせチェックにしか使ってないし、自分だけ「みんなと違って最新」だと意味ないし

69 名前:デフォルトの名無しさん mailto:sage [2009/12/09(水) 11:01:47 ]
>>68
安心しろ
1.9.1を普段使ってる奴は普通にアップグレードするし、
1.9.1を自分のスクリプト用のチェックにしか使ってない奴は
「この人のスクリプト俺の1.9.1-p0(しかもmswin32)だと動かないんすけどー」とか言ってきたりはしない
とっととアップグレードすれ

70 名前:デフォルトの名無しさん mailto:sage [2009/12/09(水) 11:14:16 ]
head使いには関係ないしな。




71 名前:デフォルトの名無しさん mailto:sage [2009/12/09(水) 11:19:29 ]
というか、パッチレベル0を鬱陶しいと思ってる人にこそ、
「1.9.1は最新版でしかチェックしてません」と公言するのをお勧め
そうしないといつまでたってもだらだら残るぞ
自分のサイトに最新版へのリンクでも張っとけ

72 名前:デフォルトの名無しさん mailto:sage [2009/12/09(水) 11:25:34 ]
~/work/source/ruby-1.9.1-p243$ make uninstall
make: *** ターゲット `uninstall' を make するルールがありません. 中止.

ぬう
てか前回のconfigureにどんなオプションつけたか忘れたしどこにインストールされたか調べるのめどい

73 名前:デフォルトの名無しさん mailto:sage [2009/12/09(水) 11:45:58 ]
「引数はHashの入ったArrayにしろ」って英語の警告でどう言えばいい?

74 名前:デフォルトの名無しさん mailto:sage [2009/12/09(水) 11:54:23 ]
raise ArgumentError, "invalid argument, RTFM"

75 名前:デフォルトの名無しさん mailto:sage [2009/12/09(水) 12:12:55 ]
ArgumentError を出したなら「引数が不正です」は言う必要なくね

76 名前:デフォルトの名無しさん [2009/12/09(水) 12:35:33 ]
>>73
スレ違い。 このへんで聞け。
pc12.2ch.net/test/read.cgi/tech/1193554741/

77 名前:デフォルトの名無しさん mailto:sage [2009/12/09(水) 12:37:03 ]
URLを間違えた。こっちだ。
pc12.2ch.net/test/read.cgi/tech/1224696505/

78 名前:デフォルトの名無しさん mailto:sage [2009/12/09(水) 12:44:01 ]
>>73
Hashを要素にしたArrayって英語でなんて言うんだろうね
よく使われるんだから呼び名がありそうだけど

79 名前:デフォルトの名無しさん mailto:sage [2009/12/09(水) 12:45:27 ]
>>78
Hashを要素にしたArrayって日本語でなんて言うんだろうね
よく使われるんだから呼び名がありそうだけど


80 名前:デフォルトの名無しさん mailto:sage [2009/12/09(水) 12:55:43 ]
>>78
Hashed Array



81 名前:デフォルトの名無しさん mailto:sage [2009/12/09(水) 13:25:14 ]
初心者以前の入門者の質問で申し訳ないのですが
Rubyの絵本で勉強を始めましたところ
「配列要素の代入と参照」の項のサンプルコードで躓きました。

n cats = [] = 1
cats[0] = "Kuro"
cats[1] = "Tama"
cats[2] = "Mike"
cats[3] = "Tora"
puts cats[n]
cats[0] = "Shiro"

このサンプルの1行目で以下のようなエラーが出てしまいます

hello.rb:1: syntax error
n cats = [] = 1
^
ググりまして「syntax error」が文法だということは分かりましたが
文法はまだ「文字列表示」と「変数」と「文字列」しか学習出来ていません
本の通りに入力しただけで、この1行目について本には一切説明がないので
どのように文法が違うのかも分からない状態です
この1行目がどのような意味なのか教えていただけないでしょうか
よろしくお願いいたします

環境
CentOS 5.3
ruby 1.8.5 (2006-08-25) [x86_64-linux]


82 名前:81 mailto:sage [2009/12/09(水) 13:28:11 ]
>n cats = [] = 1
>^
スペースが省略されて「^」の位置がずれてしまいました
「^」は=と1の間にあるスペース部分を指しています

83 名前:デフォルトの名無しさん mailto:sage [2009/12/09(水) 13:31:59 ]
本書くとき間違えたんだろうな
売れてないのか何なのか正誤表にはとくに載ってない
おそらくこれが正しい

n = 1
cats = []
cats[0] = "Kuro"
cats[1] = "Tama"
cats[2] = "Mike"
cats[3] = "Tora"
puts cats[n]
cats[0] = "Shiro"

putsでは cats[1] の Tama が表示されるはず

84 名前:デフォルトの名無しさん [2009/12/09(水) 13:38:25 ]
質問
メソッドの中から、そのメソッドを呼び出しているメソッドの名前を知りたいのですが、
Kernel#caller以外の方法はありますか?

現在、caller が返す配列の中身に大してパターンマッチングを行って
メソッド名を切り出しているのですが、もっとよい方法がありそうな気がしまして

85 名前:デフォルトの名無しさん mailto:sage [2009/12/09(水) 13:42:44 ]
個人的には、空の配列に添え字代入のサンプルを書く本はあんまし好きじゃない
せっかくのRubyなんだからもっとコレクションとしての扱い方から見せたほうがいいと思うなあ

cats = []
cats << "Kuro"
cats << "Tama"
cats << "Mike"
cats << "Tora"
p cats
puts cats[1]
cats[1] = "Shiro"
p cats

こっちのほうがきっと驚いてもらえるぞ
「配列ってなんかざくざく入るんだね!」みたいな

86 名前:81 mailto:sage [2009/12/09(水) 13:43:10 ]
>>83
ありがとうございます
無事Tamaを表示することができました。

87 名前:デフォルトの名無しさん mailto:sage [2009/12/09(水) 13:58:35 ]
>>80
うそをいうな。

88 名前:デフォルトの名無しさん mailto:sage [2009/12/09(水) 14:02:07 ]
>>87
では真実を

89 名前:デフォルトの名無しさん mailto:sage [2009/12/09(水) 14:20:00 ]
Hashed Array = Associative Array = rubyのHash

90 名前:デフォルトの名無しさん mailto:sage [2009/12/09(水) 14:20:08 ]
array of hashes じゃないの?



91 名前:デフォルトの名無しさん mailto:sage [2009/12/09(水) 14:57:30 ]
array containing hash

92 名前:デフォルトの名無しさん mailto:sage [2009/12/09(水) 14:59:57 ]
泣きながらF5連打してたらこまるので

>>84
それが普通の手段

93 名前:デフォルトの名無しさん mailto:sage [2009/12/09(水) 15:03:04 ]
>>84,92
1.8.7以降を使ってるなら、__method__で。

94 名前:93 mailto:sage [2009/12/09(水) 15:04:07 ]
あ、ごめん、見間違えた。
呼び出し元を知るには、当然callerですね。

95 名前:デフォルトの名無しさん mailto:sage [2009/12/10(木) 05:12:13 ]
独習Rubyってどうよ?

96 名前:デフォルトの名無しさん [2009/12/10(木) 08:41:52 ]
Googったんですけどわかんなかったんで教えてくださいおながいします。

「AはBクラスのインスタンスである」ってのは A === B って書きますが、「AはBクラスの
インスタンスでない」ってのはどう書けばいいでしょうか?

97 名前:デフォルトの名無しさん mailto:sage [2009/12/10(木) 09:16:33 ]
=== の否定はないから全体を !

98 名前:デフォルトの名無しさん mailto:sage [2009/12/10(木) 09:20:24 ]
> 「AはBクラスのインスタンスである」ってのは A === B って書きますが
いいえ

a.kind_of?(B)

とでも書いてください
特定クラスのインスタンスでないということをチェックしたい場合は

unless a.kind_of?(B)

と書くか、または

if !a.kind_of?(B)

と書きます

99 名前:デフォルトの名無しさん mailto:sage [2009/12/10(木) 09:22:57 ]
>>96
A === B というのはA(レシーバ)の持つ===というメソッドに引数としてBを渡すということ(A.===(B)と同じ)
メソッド===はレシーバのクラスによって意味が違う
ttp://www.ruby-lang.org/ja/man/html/Object.html#self.3d.3d.3d

Classクラス(の親クラスであるModuleクラス)の===メソッドは以下の意味
ttp://www.ruby-lang.org/ja/man/html/Module.html#self.20.3d.3d.3d.20obj

だから「AはBクラスのインスタンスである」を書くとするならBのメソッドなので B === A としなければならない

目的のはinstance_of?の否定かkind_of?の否定か
ttp://www.ruby-lang.org/ja/man/html/Object.html#instance_of.3f



100 名前:デフォルトの名無しさん mailto:sage [2009/12/10(木) 09:37:35 ]
>>99
初心者に instance_of? を勧めるのは正直あまりお勧めしない

irb> p 12.instance_of?(Integer)
false
irb> p 12.instance_of?(Fixnum)
true
irb> p 10000000000.instance_of?(Fixnum)
false
irb> p 10000000000.instance_of?(Bignum)
true

irb> require 'uri'
irb> p URI.parse("example.com/").instance_of?(URI)
false
irb> p URI.parse("example.com/").instance_of?(URI::HTTP)
true

間違ってないけどー
動作合ってるけどー
でもー



101 名前:96 [2009/12/10(木) 09:50:45 ]
みなさんありがとう。Googり方が悪いんだよカス!とか言われると思ってました。

102 名前:デフォルトの名無しさん mailto:sage [2009/12/10(木) 09:52:57 ]
=== が検索できるようになってたら罵倒されたと思う

103 名前:デフォルトの名無しさん mailto:sage [2009/12/10(木) 09:53:39 ]
>>101
いちいちスレあげんなカス!

104 名前:デフォルトの名無しさん mailto:sage [2009/12/10(木) 09:57:37 ]
>>65
分かりやすい解説ありがとうございました。
イメージがつきました。

105 名前:デフォルトの名無しさん [2009/12/10(木) 14:00:10 ]
>>103
うるせーバカ

106 名前:デフォルトの名無しさん mailto:sage [2009/12/10(木) 16:30:19 ]
2chブラウザ使っている人で、スレッドの位置を気にしている人はいるの?
俺は履歴とかブックマークからスレッドにたどり着いているので、板一覧とか
見ていないし、スレッドの位置も特に気にしていない。

そもそも、こういう掲示板のage/sageって自由であるべきで
他人が強制するものではないと思う。

107 名前:デフォルトの名無しさん [2009/12/10(木) 19:27:14 ]
aというハッシュのキーにclassがあったらその値に " button"を追加して、なかったら"button"だけ、という記述を
下記のように書いたのですが、
もうちょっといい書き方ないもんでしょうか?

[{}, {:class => "hoge"}].each do |a|
  a[:class] = (a[:class] ? a[:class] + " ": "") + "button" #←ここをなんとかしたい
  p a
end

108 名前:デフォルトの名無しさん mailto:sage [2009/12/10(木) 19:48:10 ]
マジレス
if a[:class]
 a[:class] += ": button"
else
 a[:class] = "button"
end

ネタレス
a[:class] = [a[:class], "button"].compact.join(": ")

109 名前:デフォルトの名無しさん mailto:sage [2009/12/10(木) 21:16:51 ]
デフォルト値が設定されてるとおかしなことになりそうな気が…

110 名前:デフォルトの名無しさん mailto:sage [2009/12/10(木) 21:19:23 ]
デフォルト値を設定すること自体がおかしいだろ



111 名前:デフォルトの名無しさん mailto:sage [2009/12/10(木) 21:27:35 ]
二時間近く>>108に突っ込む奴がいないわけだが
年末でいつもの人は忙しいのかw

112 名前:デフォルトの名無しさん mailto:sage [2009/12/10(木) 21:53:53 ]
デフォルト値は設定しちゃダメなの?

113 名前:デフォルトの名無しさん mailto:sage [2009/12/10(木) 23:00:34 ]
配列aとbが対等な関係にある場合に、
a.zip(b)
とするのは対称でなくて見た目が悪いと思うのですが、どう思いますか?

114 名前:デフォルトの名無しさん mailto:sage [2009/12/10(木) 23:03:00 ]
それ感じたことがある。けれど代替案が見つからない。

115 名前:デフォルトの名無しさん mailto:sage [2009/12/10(木) 23:03:18 ]
別にどうも思いませんが
まあ気になるならArrayクラスのクラスメソッドにでもしてしまうとよろし
Array.zip(a, b) みたいなのなら問題あんめえ

116 名前:デフォルトの名無しさん mailto:sage [2009/12/10(木) 23:04:58 ]
>>115
それいいね。それなら、3項間以上でもすっきりかけるね。

117 名前:デフォルトの名無しさん mailto:sage [2009/12/10(木) 23:05:20 ]
Array.zip(a, b)
みたいな形だとどう?

118 名前:デフォルトの名無しさん mailto:sage [2009/12/10(木) 23:05:42 ]
ついでにEnumeratorを返すようにしてほしいと思いませんか?

119 名前:デフォルトの名無しさん mailto:sage [2009/12/10(木) 23:08:22 ]
つーとむしろ
Enumerator.zip(a,b)
なんか変か?

120 名前:デフォルトの名無しさん mailto:sage [2009/12/10(木) 23:34:04 ]
>>107

[{}, {:class => "hoge"}].each do |a|
a[:class] &&= a[:class]+" button"
a[:class] ||= "button"
p a
end

[{}, {:class => "hoge"}].each do |a|
begin
a[:class] += " button"
rescue
a[:class] = "button"
end
p a
end

def space_add h,s
return nil if h.nil?
h.replace( h+" "+s )
end
[{}, {:class => "hoge"}].each do |a|
space_add(a[:class],"buttom") || a[:class] = "button"
p a
end




121 名前:デフォルトの名無しさん mailto:sage [2009/12/10(木) 23:53:39 ]
>>113
ですが、新しいメソッド付加するほどでもないと思っていたら困ったことに・・・
ちなみに本当にほしいものは、長いほうに合わせて
[[3, 1], [4, 2], [5, 2], [6, 2]]
です。メソッド追加しないと無理ですかね?
################################

irb(main):005:0> a = [1,2]
=> [1, 2]
irb(main):006:0> b = [3,4,5,6]
=> [3, 4, 5, 6]
irb(main):007:0> a.zip(b)
=> [[1, 3], [2, 4]]
irb(main):008:0> b.zip(a)
=> [[3, 1], [4, 2], [5, nil], [6, nil]]

122 名前:デフォルトの名無しさん mailto:sage [2009/12/11(金) 00:02:14 ]
追伸:
しかも欲しいものは配列じゃなくてEnumeratorです。
> zip(a,b).each{|e| p e}
[1,3]
[2,4]
[2,5]
[2,6]

みたいに。

123 名前:デフォルトの名無しさん mailto:sage [2009/12/11(金) 00:08:32 ]
twitterとかで、投稿時刻を HH:MM:SS ではなく、「約15分前」「約2時間前」というふうに表示してますけど、
これをやってくれるRubyのライブラリはありますか。
ついでにJavaScriptのライブラリもあるとうれしいです。

124 名前:デフォルトの名無しさん mailto:sage [2009/12/11(金) 00:35:15 ]
ありません。自分で書いてください。

(Time.now.to_i - time.to_i) を適当に加工したらできるし。

125 名前:デフォルトの名無しさん mailto:sage [2009/12/11(金) 00:45:02 ]
railsならdistance_of_time_in_words

126 名前:デフォルトの名無しさん mailto:sage [2009/12/11(金) 01:57:30 ]
>>125
>distance_of_time_in_words

Thank you very much!

>>124
F***!

127 名前:デフォルトの名無しさん mailto:sage [2009/12/11(金) 06:25:36 ]
RubyはLispの替わりで使えるのか?

128 名前:デフォルトの名無しさん mailto:sage [2009/12/11(金) 07:49:58 ]
文法が全然違うからLispのソースはまず動かないよ

129 名前:デフォルトの名無しさん mailto:sage [2009/12/11(金) 08:25:43 ]
>>126
Railsならそう言えよ。


130 名前:デフォルトの名無しさん [2009/12/11(金) 12:04:28 ]
>>125-126
RailsのActionPackのActionViewっぽいね。これだけ使えないのかな



131 名前:デフォルトの名無しさん mailto:sage [2009/12/11(金) 12:27:45 ]
RailsはRailsで

132 名前:デフォルトの名無しさん mailto:sage [2009/12/11(金) 13:40:27 ]
>>130
require 'active_support'
require 'action_view/helpers/date_helper'
include ActionView::Helpers::DateHelper

あー、あとI18n関係の設定がいるかな。以外と面倒かも。



133 名前:デフォルトの名無しさん mailto:sage [2009/12/11(金) 13:57:40 ]
そもそも単独で使うようにできてないからな
たった一つの処理のために本質でないファイルをウンコのごとく読まなきゃならんし割に合わん

134 名前:デフォルトの名無しさん mailto:sage [2009/12/11(金) 14:46:29 ]
>>133
「ウンコのごとく読む」っていう比喩がわかんない。
どんな風に読むことを「ウンコのごとく」って言うの?

135 名前:デフォルトの名無しさん mailto:sage [2009/12/11(金) 17:58:38 ]
>>129
Railsだと分かっていたら答えられたとでもいうのかよwwww

136 名前:デフォルトの名無しさん mailto:sage [2009/12/11(金) 18:23:13 ]
たぶんYESなんじゃないかな

137 名前:デフォルトの名無しさん mailto:sage [2009/12/11(金) 19:21:02 ]
      ,―ヽ____、―
   ,/  ノ       ヽ  ~\
  /   ノ   Ruby    ヽ   ~\
/   ノ           ヽ、  `ヽ
|    ノ / ̄\   / ̄~ヽ ヽ    i
|   ノ              |  ノ
\  |  <●>  <●>  (  )
 \ |      | |       i /
    |      /  ヽ       レ
   i     (●_●)      /  
    i、    ,-――-、   ・ /
    i、  <(EEEEE)> ∵/    楽しいプログラミング言語はIPA Rubyだけ
      i、   \___/  _/
       \       ,ノ       
  ,,.....イ.ヽヽ、ー-―一ノ゙-、.
  :   |  '; \_____ ノ.| ヽ i
      |  \/゙(__)\,|  i |
      >   ヽ. ハ  |   ||

138 名前:デフォルトの名無しさん mailto:sage [2009/12/11(金) 21:48:40 ]
モジュールの定義の有無を確認する方法ってありますか?
method_defined?のモジュール版みたいなのを探しているのですが・・・

139 名前:デフォルトの名無しさん mailto:sage [2009/12/11(金) 21:57:29 ]
>>138
require 'net/http'
Object.const_defined?(:Net) #=> true
Net.const_defined?(:HTTP) #=> true

140 名前:デフォルトの名無しさん mailto:sage [2009/12/12(土) 23:46:17 ]
メソッド中で変数を書き換えられる場合と書き換えられない場合の区別がいまだに分からないのですが、
X=[1,2,3]
def f X[1]=4 end
大文字(const配列?)のくせにこれは書き換え成功する。

x = 1
def g x=2 end
これはスコープ内で局所変数と解釈されて、書き換えられない。

Y=1
def h Y=2 end
これは定数書き換えが不正と解釈されて通らない。

h()は仕方ないとしても、g()と同じ動作は欲しいので、どう実現すればいいか教えてください。
ポインタっぽいのがあると一番いいのですが・・・。



141 名前:デフォルトの名無しさん mailto:sage [2009/12/12(土) 23:49:33 ]
>>140
>X=[1,2,3]
>def f X[1]=4 end
>大文字(const配列?)のくせにこれは書き換え成功する。

前後にX.object_idを表示してみると、「同じオブジェクト」を
指したままであることが確認できるはず。

配列のような内部に状態を持つオブジェクトの状態を変更することは
定数という観点でいうと「書き換え」ではない。

>x = 1
>def g x=2 end
>これはスコープ内で局所変数と解釈されて、書き換えられない。

>h()は仕方ないとしても、g()と同じ動作は欲しいので、どう実現すればいいか教えてください。
>ポインタっぽいのがあると一番いいのですが・・・。

オブジェクトと変数の区別を理解してから出直しておいで。


142 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 00:07:05 ]
返信ありがとうございます。
オブジェクトと変数の区別があるのは分かりますが、
X = Integer(1)

Y = [1,2,3]
はどちらも
定数=「オブジェクトのインスタンス」
に見えるのですが。

143 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 00:12:11 ]
irb(main):001:0> CONS = [0, 1, 2]
=> [0, 1, 2]
irb(main):002:0> CONS = ["A", "B", "C"]
(irb):2: warning: already initialized constant CONS
=> ["A", "B", "C"]

144 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 00:12:28 ]
定数は参照の付け替えが出来ないだけで
参照先のオブジェクトが内部状態を変えることには関知しない

145 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 00:18:59 ]
では
class Integer
def f
self = 8
end
end
X = Integer(3)
X.f()
p X
みたいな感じで内部状態を変えることは原理的には可能でしょうか?

146 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 00:23:02 ]
>>145
オブジェクトと変数の区別を理解してから出直しておいで。

147 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 00:25:02 ]
いや、もちろん
@なんとか=8
でしょうけど。

148 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 00:29:09 ]
オブジェクトと変数の区別を理解したいので
質問を続けます。

149 名前:デフォルトの名無しさん [2009/12/13(日) 00:29:25 ]
>>145
Integerのような組み込みのクラスだとそれできないから、i++とかインクリメンタル演算子が実装できないんだよね・・・

150 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 00:31:32 ]
>>149
selfを変更できるクラスはRubyにはないぞ
データ格納領域がRuby的に保護されてて触れない



151 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 00:36:43 ]
selfはたんに気分で書いてしまったので気にしないでください。
(私のミスです)

自分で定義したクラスなら
class MyInt
def initialize(i)
@i=i
end
def ++() # 前置演算子の定義の仕方はしらないですが・・・
@i+=1
end
end
でいいわけですよね。


152 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 00:36:49 ]
もとのxの件はオブジェクトと変数の違いではなく
ローカル変数のスコープの問題だねえ。

153 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 00:38:42 ]
>>152
そうですね。本当はそれが知りたかったわけですが・・・。
グローバル変数にすればいいんだけど、なんか気持ち悪い。

154 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 00:41:31 ]
なんか引数で参照渡して、それを書き換えればいいんだよ〜
みたいなのはないんでしょうか?

・・・たぶんないんでしょうね

155 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 00:44:42 ]
引数で渡していいならArrayみたいな内部状態を持つオブジェクトに包んで
渡すくらいかね。


156 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 00:48:32 ]
初心者なんで間違っているかもだけど、参照渡しだから引数に渡された
オブジェクト自体を書き換えることはできるよね?

def method(str) {str.gsub! /a/, '!'}

x = "katakana"
puts x #=> "katakana"
method x
puts x #=> "k!t!k!n!"

157 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 00:48:47 ]
やっぱそれですか。
議論によって問題の所在がはっきりしてきました。
おつきあいありがとうございます。

158 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 00:51:40 ]
>>156
それはたぶん文字の配列わたしてるですね。

159 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 00:53:10 ]
えっ?

160 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 00:53:23 ]
そうだ、eval使おうか(笑)!



161 名前:156 mailto:sage [2009/12/13(日) 00:54:39 ]
>>158
Ruby のStringオブジェクトの内部ってArrayで表現されていたんですか?
知りませんでした。><
C言語みたいですね。

162 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 00:56:25 ]
158ですが、私も初心者なので、フォローお願いします。
普通の言語なら文字列の扱いはそうなってるんじゃないかなぁ?

163 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 01:06:12 ]
何の意味があるか分からない思いつきだけど通りました。
X='12'
def f
X.gsub!('12','2')
end
f()
p eval(X)

164 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 01:22:35 ]
>>162
文字列がイミュータブル(変更不可)な言語は普通にあるよ
Pythonなんかもそう

>>> s = 'abc'
>>> s[0] = 'A'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment

上のごちゃっとしたところをまとめると
* 変数はオブジェクトに付けられた矢印(あるいはラベル)。例: a = [1,2,3]
* 変数を通じてオブジェクトを操作することが出来る。例: a[0], a[1]
* Rubyの文字列はミュータブル(変更可能)なので
 変数が指すオブジェクトの中身を書き換えることができる。例: a[1] = 20 # [1,20,3]

165 名前:156 mailto:sage [2009/12/13(日) 01:24:26 ]
>>162
自分なりに調べてみました。

def method(obj)
 obj.object_id
end
str = "katakana"
p str.object_id #=> 69877275538400
p method str #=> 69877275538400

この結果から分かりますが、上記の変数 str と obj は同一のオブジェクトを指しています。
したがって、変数 obj に対して破壊的なメソッド(オブジェクト自体を変更するメソッド)を使うと
str が指しているオブジェクトも同一ですから、objに対して行った操作が反映されている、というわけですね。
あってますか?

あと、Stringオブジェクトの内部表現については詳しくしりません。
Rubyのソースを読んでみればわかると思うのですが、まだそこまでのレベルではないので...
スレ汚し失礼しましたです。

166 名前:164 mailto:sage [2009/12/13(日) 01:27:10 ]
例が文字列じゃなく配列になってた。それぞれ以下に読み替えて

例: s = '123' # sは文字列 '123' を指す
例: s[0], s[1] # sの一文字(バイト)目と二文字目を取得
例: s[1] = '5' # sの一文字目を '5' に変更

>>165
あってるお
内部表現なんて実装次第なんだから
出来ることを正確に把握するほうが大切

167 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 01:32:12 ]
カビの生えた例だけどこんなのも貼っとく

a = [0, 1, 2]
b = a
b[1] = 10

これでaが何になるのかわからなかった人は横着しないで入門書嫁

168 名前:140 mailto:sage [2009/12/13(日) 08:24:28 ]
昨日の者ですが、
結局クラスでラップする感じになるのかなぁ。
下は意図した通りに動きます。

def State(val)
Monad.new(val)
end
class Monad
def initialize(val)
@val=val
end
attr_accessor :val
end
def f(st)
st.val += 1
end

X = State 1
f(X)
p X.val

169 名前:140 mailto:sage [2009/12/13(日) 08:30:00 ]
なるほどRubyって関数型言語だったのか!

170 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 08:33:09 ]
Dir.globが探索するファイル/ディレクトリの条件って何ですか?

i=0
Dir.chdir("C:\\"){Dir.glob('**/*'){i+=1}}
p i
=>150660

dir c:\ /s /b /a|find /c /v ""
=>154483

C:\の全ファイルを選択→プロパティのファイル数+フォルダ数
=>153390

1〜2違うどころではないんだが・・・('A`)



171 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 09:22:12 ]
>>170
DOSのコマンドを知らないから憶測だけど、
"."と".."を含めてる含めてないとか?

172 名前:デフォルトの名無しさん [2009/12/13(日) 09:40:23 ]
>>170
日本語ファイル名が膨らまれているとか

173 名前:デフォルトの名無しさん [2009/12/13(日) 11:00:49 ]
るびまのページいま停止中?

174 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 11:22:02 ]




175 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 11:44:38 ]
p "あ"

とすると、

"\202\240"

8進数で返ってくるのでわかりにくいです。
16進数で帰ってきて欲しいのですが、どうすればいいのでしょうか?

176 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 12:05:56 ]
String#inspect の定義を変更すれば良い。
class String; def inspect; "\""+ self.each_byte.map{|c| "\\x%02x" % c }.join + "\""; end; end

177 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 12:15:41 ]
0x20...0x80はそのままにした方が目に優しそうだ
あと?\と?"は別扱いでとか考え出したら面倒くせええ

178 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 12:17:32 ]
>>176
それ、他のオブジェクトをinspectするときに影響が出ちゃわない?

179 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 13:03:51 ]
8進表記されてるのだけ、16進に直すのはどう?

class String
 alias _inspect inspect

 def inspect
  self._inspect.gsub(/\\(\d+)/){ "\\x{%02x}" % $1.oct }
 end
end

180 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 13:06:37 ]
文字列を16進表記にする関数的メソッドを定義するべきだと思うなあ



181 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 13:40:29 ]
直前の式の返り血が入ってる組み込み変数とかってないですか?
Rubyを関数電卓代わりに使いたいんですけど

182 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 13:44:29 ]
>>181
irb でよければ _ だと思う

183 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 13:44:54 ]
>>181
irb

irb> 1+2
3
irb> _ +4
7

まあ返り値ならなんでもいいんだけど

irb> Time.now
Sun Dec 13 13:40:19 +0900 2009
irb> _.year
2009

184 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 13:48:02 ]
ありがとうございます
できればirbじゃなくても使いたいんですが無いですか

185 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 13:52:21 ]
関数の戻り値は最後の参照みてるんだし
@かなにかに保持してくれるといいと祈り続けて早10年

186 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 14:08:15 ]
>>179
俺もそれ考えたけど"\\1000"とかで困る

187 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 15:24:26 ]
>>180
こうするのが一般的?

p "あ".unpack("H*")

188 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 18:12:58 ]
PHPのcall_user_funcにあたる機能はRubyでも実現できますか?
実行時に呼び出すメソッドを切り替えたいのです。

189 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 18:15:34 ]
>>188
send, evalなど

190 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 18:24:48 ]
>>188
ありがとうございます。



191 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 18:25:33 ]
間違えた…>>189でした

192 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 18:49:28 ]
異なる文字コードの文字列を同時に出力するとかじゃない限り
適切に漢字コードを指定しておけばちゃんと日本語表示されるんじゃないの?
$KCODE = 'S'
p "あ"
> "あ"

文字じゃないバイナリ列とか表示させるときに16進文字列がいいのなら
そういう出力メソッドを作るなりすれば


193 名前:デフォルトの名無しさん mailto:sage [2009/12/13(日) 19:07:54 ]
1.9 なら encoding を文字列が持ってるからできるが、1.8 なら無理だね。
あと $KCODE は 1.9 じゃ廃止だ


194 名前:デフォルトの名無しさん mailto:sage [2009/12/14(月) 01:00:47 ]
module Hoge
def f1 end
def f2 end
・・・ってかんじでメソッドがたくさんあったときに
module_function :f1,:f2,...
って全部書くしか、外からアクセスする方法はないでしょうか?
end

195 名前:デフォルトの名無しさん mailto:sage [2009/12/14(月) 01:05:21 ]
include Hoge で f1 や f2 を取り込めるよ

196 名前:デフォルトの名無しさん mailto:sage [2009/12/14(月) 01:12:46 ]
名前空間は汚染したくないので
Hoge::f1
というアクセスだけ許したいのですが・・・
いちいち書くのは保守が面倒だと思ったので。

いま考えてるのは
module_function self.methods.join(' ') #未完成
みたいな怪しい方法です。

197 名前:デフォルトの名無しさん mailto:sage [2009/12/14(月) 01:20:55 ]
module M
def m1; "m1"; end
extend M
end
M.m1 #=> "m1"

198 名前:デフォルトの名無しさん mailto:sage [2009/12/14(月) 01:22:36 ]
どんぴしゃです!
ありがとうございます。

199 名前:デフォルトの名無しさん mailto:sage [2009/12/14(月) 05:51:45 ]
メイン関数は書いた方が良いのでしょうか?

200 名前:デフォルトの名無しさん mailto:sage [2009/12/14(月) 06:07:46 ]
>>198
リファレンスより
If used with no arguments,
subsequently defined methods become module functions.

モジュール定義の頭に module_function と引数なしで書いておけば
以後に定義するメソッドにはすべて module_function が適用される。

public, private とかと同じだよ。



201 名前:デフォルトの名無しさん mailto:sage [2009/12/14(月) 06:28:54 ]
>>199
メイン関数って
スクリプトを実行した時に処理系が最初に呼び出すメソッド、という意味?

そういう意味なら、書けない、でFA
そんな取り決めないし

202 名前:デフォルトの名無しさん mailto:sage [2009/12/14(月) 07:36:02 ]
>>199
def main() しとけばRubyがエントリポイントとして呼んでくれる、とかいうことはないよ
ただ if __FILE__ == $0 ... って常套句を使って少し似たようなことはできる

203 名前:デフォルトの名無しさん mailto:sage [2009/12/14(月) 08:32:24 ]
>>199
ruby -e 'p self'

204 名前:デフォルトの名無しさん mailto:sage [2009/12/14(月) 08:53:07 ]
俺最初なんとなくmainてメソッド書いて
if __FILE__ == $0
main
end
って書いてたな

205 名前:デフォルトの名無しさん mailto:sage [2009/12/14(月) 11:18:57 ]
>>200
これでもいいなぁ。
ttp://ruby-doc.org/core/classes/Module.html#M001642
ですね。

初心者はドキュメントのどこを見ればいいかも分からないので、とても助かります。

206 名前:デフォルトの名無しさん [2009/12/14(月) 11:43:32 ]
>>199
いろんなソース読んだ限り、
Rubyではこんな感じで書いている人が多い。俺も習ってる

class Application
  def initialize
  end
  def run
    # ここにメイン処理
  end
end

if __FILE__ == $0
  Application.new.run
end

207 名前:デフォルトの名無しさん mailto:sage [2009/12/14(月) 13:15:18 ]
待て、$0って廃止予定じゃなかったか

208 名前:デフォルトの名無しさん mailto:sage [2009/12/14(月) 13:29:31 ]
心配なら$PROGRAM_NAMEを使っておけ。


209 名前:デフォルトの名無しさん mailto:sage [2009/12/14(月) 13:30:08 ]
あと10年は1.8使い続けるから無問題

210 名前:デフォルトの名無しさん mailto:sage [2009/12/14(月) 13:33:57 ]
まあ、$0 が動かなくなる頃にはそのスクリプト本体もどっか手入れしないと動作しないとは思う
そのときにその人に直してもらうことにして $0 は使ってもよし
$PROGRAM_NAME はバージョンによらず使えるんだっけ?



211 名前:デフォルトの名無しさん mailto:sage [2009/12/14(月) 13:38:35 ]
質問が有ります。

引数があれば引数で指定したファイルに
引数がなければ標準出力(もしくはエラー出力)に文字列を出したい場合はどのように書いたものでしょうか?

212 名前:デフォルトの名無しさん mailto:sage [2009/12/14(月) 13:46:34 ]
そのまんま if とかで書けばいいと思うよ!

213 名前:デフォルトの名無しさん mailto:sage [2009/12/14(月) 13:48:20 ]
if (ARGV[0])
$stdout = File.open ARGV[0]
end

こんな感じニカ ?

214 名前:デフォルトの名無しさん mailto:sage [2009/12/14(月) 13:51:15 ]
こんな感じか
if ARGV.length > 0
   f = open(ARGV[0], "w")
else
   f = $stdout
end
f.write "hello"


215 名前:デフォルトの名無しさん mailto:sage [2009/12/14(月) 13:52:13 ]
>>211
def output
 if filename = ARGV[0]
  File.open(filename, "w"){|f| yield f }
 else
  yield $stdout
 end
end
output{|io| io.write "a"}

closeめんどくせえ

216 名前:デフォルトの名無しさん mailto:sage [2009/12/14(月) 13:55:43 ]
> closeめんどくせえ
うむ
$stdout.close がIOError で拒否られたときは軽く眩暈がした

217 名前:デフォルトの名無しさん mailto:sage [2009/12/14(月) 17:25:48 ]
>>211
個々のプログラムでそういうことをするより
シェルのリダイレクトやパイプを使いなさいと言いたいのだが

出力先をプログラムの引数として受け取らなければならない理由はなんだろう?

218 名前:デフォルトの名無しさん mailto:sage [2009/12/14(月) 18:09:37 ]
STDOUT にログ出力をするタイプのプログラムはたいてい引数指定
たとえば wget

219 名前:211 mailto:sage [2009/12/14(月) 19:36:53 ]
>>212-215
ありがとうございます、ありがとうございます
いろいろ方法ありますね。

>>217
事の発端は、最初は標準出力に出してリダイレクト(?でしたっけ)でファイルに書いていたのですが、
ファイルには出したくないBenchmarkとかで計測した結果も表示したくなってそうすると、
どうしたものかって感じになりました。

こういう時って計測結果などはエラーに出せばいいもんですかね?エラーに出していいものかどうか。

>>218
wgetは引数でファイル指定でしたっけ

220 名前:デフォルトの名無しさん mailto:sage [2009/12/14(月) 20:14:48 ]
wget -O



221 名前:デフォルトの名無しさん mailto:sage [2009/12/14(月) 20:19:22 ]
質問です。

時間の計算するにはどのクラスを使えばいいでしょうか?
具体的には時間の差分を加算したりしたいのです。

例えば、
elapsed_time += Time.local(2008,12,14,1,50,10) - Time.local(2008,12,10,1,50,10)
のような感じ(実際にはTime.localの中身は可変)

elapsed_timeをTimeにする場合だと初期化にTime.at(0)しても Thu Jan 01 09:00:00 0900 1970 になったり、
0からの時間を考えられていないようなのです。

222 名前:デフォルトの名無しさん mailto:sage [2009/12/14(月) 20:24:17 ]
>>221
基本的には「ない」
61s が 1m1s になるような、秒数のみを表すクラスというようなのは標準では存在しない

223 名前:デフォルトの名無しさん mailto:sage [2009/12/14(月) 20:25:23 ]
>>221
Time.at(0).to_i

224 名前:デフォルトの名無しさん mailto:sage [2009/12/14(月) 20:26:07 ]
>>222
そういうことか、>>223は忘れて

225 名前:221 mailto:sage [2009/12/14(月) 20:35:18 ]
ありがとうです

ないですかー。
何が困るかというと、加算した差分の時間を例えば書式で出力するときにstrftimeみたいなのを自前で書かないといけないってことですよね。

誰かそういうの作ってないか探してみたんですがどうも無いようで・・・。
active_supportとかの日付の拡張あたりでなんとかならないもんですかね。

226 名前:デフォルトの名無しさん mailto:sage [2009/12/14(月) 20:49:16 ]
time = 100000
sec = time % 60
min = (time / 60) % 60
hour = (time / (60 * 60)) % 24
day = time / (24 * 60 * 60)
puts "%dday %d:%d:%d" % [day, hour, min, sec]

こんなんでいいか?

227 名前:221 mailto:sage [2009/12/14(月) 21:01:02 ]
>>226
ずばりそのまま書いてくださってありがとうさんです。

使わせていだきます。
ActiveSupport使ってもこんな感じですか。かわらないやw

time = 100000
sec = time % 60
min = (time / 1.minute) % 60
hour = (time / 1.hour) % 24
day = time / 1.day
puts "%dday %d:%d:%d" % [day, hour, min, sec]

228 名前:デフォルトの名無しさん mailto:sage [2009/12/14(月) 22:30:38 ]
二年ほど前にdevでTimeSpanというクラスが提案されたことはあるみたいだねー。
立ち消えしてるのかな、これは。


229 名前:デフォルトの名無しさん mailto:sage [2009/12/14(月) 22:34:40 ]
.NETからそのままいろんなクラスパクってくりゃいいのに

230 名前:デフォルトの名無しさん mailto:sage [2009/12/14(月) 22:36:53 ]
やだあんな使いにくいAPI
.NET好きな人はIronRuby使ったらいい



231 名前:デフォルトの名無しさん mailto:sage [2009/12/15(火) 00:52:12 ]
数値積分や微分できるようなライブラリとかってないですか?
Rubyを関数電卓代わりに使いたいんですけど

232 名前:デフォルトの名無しさん mailto:sage [2009/12/15(火) 00:58:10 ]
パッチレベル上がったのにmingwでmake通らん

233 名前:デフォルトの名無しさん mailto:sage [2009/12/15(火) 01:01:41 ]
>>231
よくわからんけど「Ruby 数値積分 微分」でぐぐってみた
ttp://jp.rubyist.net/magazine/?0006-RLR
こっちは結構すごそうだぞ
ttp://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/39950

234 名前:デフォルトの名無しさん mailto:sage [2009/12/15(火) 01:01:55 ]
GSL(GNU Scientific Library)のRubyバインドがあるようだ。
詳しくは見ていないけど、数値積分や微分はあるみたい。
ただし、最後のリリースが約2年前というのが気掛かり。
十分枯れているのだろうけれど、新しめのRubyで動くかは不明。

ところで、本格的な数式処理なら、Maximaとか使ったほうがいいんじゃない?


235 名前:デフォルトの名無しさん mailto:sage [2009/12/15(火) 01:05:33 ]
かぶりんこ。


236 名前:デフォルトの名無しさん mailto:sage [2009/12/15(火) 01:43:08 ]
ありがとうございます
導入めんどくさそうですけど頑張ってみます

237 名前:デフォルトの名無しさん mailto:sage [2009/12/15(火) 02:03:40 ]
数値積分や微分できるような関数電卓を持っていたら、それを使う。
でなければ、カシオの計算センターとか。
自前のコードからコールしたいなら、ついでにそっちも自分で書いてしまう。
てのは、いかがでしょう。

238 名前:デフォルトの名無しさん mailto:sage [2009/12/15(火) 06:35:31 ]
>>219
> ファイルには出したくないBenchmarkとかで計測した結果も表示したくなって

標準ライブラリの Logger を使ってみるというのは?
jp.rubyist.net/magazine/?0008-BundledLibraries

239 名前:デフォルトの名無しさん mailto:sage [2009/12/15(火) 09:20:54 ]
いわゆる数値計算には向かないよね、Ruby

240 名前:デフォルトの名無しさん mailto:sage [2009/12/15(火) 09:53:38 ]
しかし、「5分で作って5秒で実行させる」ような、「計算機なんだから計算できてもいいんじゃね」という
カジュアルなデータ計算をさせることが期待されるプログラミング言語のトップグループにいることは間違いない
専門数値計算ソフトやC(やJava)を持ち出さなくてもいい程度の計算なら、もっと気楽にできてもいい
高校や大学1年教養の宿題をうっかり解けてしまうような、そんな用途があってもいいはず



241 名前:デフォルトの名無しさん mailto:sage [2009/12/15(火) 10:06:28 ]
そういう用途ならあるげぶらーじゃね

242 名前:デフォルトの名無しさん mailto:sage [2009/12/15(火) 10:09:15 ]
Rでもいいしますまてぃか覚えるのでもいいしいっそExcelでも充分使える範囲である可能性も高いな

243 名前:デフォルトの名無しさん mailto:sage [2009/12/15(火) 10:20:55 ]
カタカナでおk

244 名前:デフォルトの名無しさん mailto:sage [2009/12/15(火) 10:28:35 ]
アールやエクセルってなんか変だろ

245 名前:221 mailto:sage [2009/12/15(火) 15:52:28 ]
>>238
ああ、その手もありました!その名のとおりログのこりますしLoggerいいですねw

246 名前:デフォルトの名無しさん mailto:sage [2009/12/15(火) 15:56:00 ]
数値計算したいんなら構文的にPython+numpyのほうがいいよ。Rubyには不向き。

247 名前:デフォルトの名無しさん mailto:sage [2009/12/15(火) 18:38:35 ]
>>221
ワンライナーで時間の計算をする時に24時間以内なら
ruby -rtime -e "a=Time.parse('09:08:20')-Time.parse('01:40:02');puts Time.at(a).utc.strftime('%H:%M:%S')"
とかしたりしますな


248 名前:デフォルトの名無しさん mailto:sage [2009/12/15(火) 18:47:01 ]
ていうか、やろうと思えば結構できるんだよ
でも自己責任の域を出れない

249 名前:デフォルトの名無しさん mailto:sage [2009/12/15(火) 18:54:35 ]
name=gets
puts "私は#{name}です"

nameに日本語を入力するとエラーが出てしまいます
C:/My Documents/g/Ruby/test.rb:4:in `<main>': incompatible character encodings: ASCII-8BIT and
Windows-31J (Encoding::CompatibilityError)
これはどういったエラーなんでしょうか?

250 名前:デフォルトの名無しさん mailto:sage [2009/12/15(火) 19:03:50 ]
>>249
初心者は Ruby1.9 使うなってこれだけ言われてるのになんでわからんのだエラー



251 名前:デフォルトの名無しさん mailto:sage [2009/12/15(火) 19:08:17 ]
それってスクリプトつーか内部文字列がWindows-31Jで標準入力がASCII-8BITってこと?
Windows-31Jがロードできたら標準入力もそっち使うようになってなかったっけ
どういうときにそんなことになりえるのか知りたい、誰か教えて

252 名前:デフォルトの名無しさん mailto:sage [2009/12/15(火) 19:08:20 ]
スレタイに【1.9】 【使うな】っていれとけよ

253 名前:デフォルトの名無しさん mailto:sage [2009/12/15(火) 19:21:35 ]
【Windows】【使うな】とか


254 名前:デフォルトの名無しさん mailto:sage [2009/12/15(火) 19:36:02 ]
順番からいって標準入力がWindows-31Jか、なんでスクリプトがASCII-8BITになったんだろう?
とりあえず>>249は1.9使い続ける気ならマジックコメントを使えるようになるべき

255 名前:デフォルトの名無しさん mailto:sage [2009/12/15(火) 19:38:08 ]
MCって一番やっちゃいけないタイプの変更だよな

256 名前:デフォルトの名無しさん mailto:sage [2009/12/15(火) 19:50:04 ]
スレチだが微積やってくれて感動した
www.wolframalpha.com/

257 名前:デフォルトの名無しさん mailto:sage [2009/12/15(火) 19:52:31 ]
>>252
>>1

258 名前:デフォルトの名無しさん mailto:sage [2009/12/15(火) 20:10:57 ]
>>255
じゃあファイルごとに違う文字エンコーディングをインタプリタに知らせる方法を考えてくれ

259 名前:デフォルトの名無しさん mailto:sage [2009/12/15(火) 20:18:58 ]
いいこと考えた、ファイルは全部ASCII-8BIT相当にするってのはどう

260 名前:デフォルトの名無しさん mailto:sage [2009/12/15(火) 20:25:36 ]
これでますますPythonへの移行が加速しちゃうな。
マイナー環境に媚びすぎるあまり全員が等しくLoseしちゃうなんてあまりにも悲しい。



261 名前:デフォルトの名無しさん mailto:sage [2009/12/15(火) 20:27:49 ]
>>259
それ 1.8 じゃん…

262 名前:デフォルトの名無しさん mailto:sage [2009/12/15(火) 20:29:51 ]
やっぱ今からでもせめてデフォルトUTF-8に

263 名前:デフォルトの名無しさん mailto:sage [2009/12/15(火) 20:32:17 ]
>>262
マッキン使えマッキン

264 名前:デフォルトの名無しさん mailto:sage [2009/12/15(火) 20:36:27 ]
UTF-8-MACはUTF-8じゃありませんっていうか今すぐ滅びてくださいお願いします

265 名前:デフォルトの名無しさん mailto:sage [2009/12/15(火) 22:35:13 ]
>>264
Pythonはもろそれにぶつかったな。よくそれではまったよ。

あのさ、require 'foo' したときの、foo.rb または foo.so の在処をしるにはどうしたらいいんだっけ。
よく聞かれる質問だと思うけど、だれか教えて。

266 名前:デフォルトの名無しさん mailto:sage [2009/12/15(火) 22:44:32 ]
1.8.6と1.8.7の違いってどこかにまとめられてますか?

267 名前:デフォルトの名無しさん mailto:sage [2009/12/15(火) 22:47:55 ]
>>265
前スレでみたのは
gem which foo

268 名前:デフォルトの名無しさん mailto:sage [2009/12/15(火) 22:57:27 ]
$" または $LOADED_FEATURES

269 名前:デフォルトの名無しさん mailto:sage [2009/12/15(火) 23:04:43 ]
>>267
それは求めるものじゃないなー

>>268
それはファイル名だけだよね。ディレクトリ名も含めたパスが欲しい。


270 名前:デフォルトの名無しさん mailto:sage [2009/12/15(火) 23:10:31 ]
それは提供されてない



271 名前:デフォルトの名無しさん mailto:sage [2009/12/15(火) 23:10:37 ]
>>265
結局こうしました
$ ruby -r nkf -e 'puts $:.map {|x| Dir.glob("#{x}/nkf*") }.flatten'
/usr/local/lib/ruby/1.8/i686-darwin10.0.0/nkf.bundle



272 名前:デフォルトの名無しさん mailto:sage [2009/12/15(火) 23:45:36 ]
>>266
svn.ruby-lang.org/repos/ruby/tags/v1_8_7/NEWS

273 名前:デフォルトの名無しさん mailto:sage [2009/12/15(火) 23:59:23 ]
>>272
Thanks.

わーおEnglishじゃん!開発者は日本人が多いのに、ぷんぷん!

274 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 00:05:46 ]
>>272
ていうか、これ読んで分かるの開発陣だけだから。
Ruby利用者がよんでもわけわからん。

275 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 00:12:20 ]
これを元にした噛み砕いたユーザー向け解説というのを誰か第三者が作ってきちんとフォローすべきなんだ
でも、Ruby(特に日本の)ではそういうのが特にないんだよね
商売っけがないというか、目立ちたがり屋がいないというか

ちなみにオフィシャルの仕事ではないのでこれ以上は望んじゃ駄目よ
取り巻きの役目

276 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 00:15:59 ]
user visible feature changes と書いてあるんだが…


277 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 00:18:07 ]
これとRubyリファレンスマニュアルを併用すればきっと・・!

278 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 00:18:17 ]
るびきち氏の日記に載ってたのはリリース当時欲紹介されてた気がする。
ttp://d.hatena.ne.jp/rubikitch/20080508/ruby187

279 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 00:31:54 ]
>>278
神いわゆるゴッド

280 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 01:55:08 ]
>>275
>ちなみにオフィシャルの仕事ではないのでこれ以上は望んじゃ駄目よ

なんで?

ちなみにPythonはα版でもこれだけの出来。
ttp://docs.python.org/dev/whatsnew/2.7.html

これだけの差がありながら、「Rubyはドキュメントが揃ってる」とぬかす古参上級者がほんとジャマ。





281 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 02:03:55 ]
Andrew Kuchlingは取り巻きどころかPythonの主要開発者だな
Python3.0のWhat's newはGuido書き下ろしだし
ドキュメントは取り巻きに任せろってのはガンかもしれないね

でもこれ本スレでやったらいいよ
初心者にはいい迷惑だ

282 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 02:11:24 ]
>>280
人材が究極的に少ないから
現状に加えて一般向けにドキュメント揃えろなんて言ったらどんどんリリースが遅くなる
当事者だからという理由だけでできない人に無理やりやらせる理由はない
得意な人に任せておけばいい

まあ初心者スレ向けでないのとドキュメント揃ってるほうだと言ってる人間が障害になってるのには同意

283 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 10:33:28 ]
rubyの勉強をしろと言われ、perlのプログラムを渡された
雰囲気は似てるからrubyに書き換えて動作させてみろという
perlもrubyもほとんど触ったことない俺にどうしろっていうんですか…
書き換え方にコツとかあるんでしょうか?元のperlプログラムにはサブルーチンにハッシュやら配列やらが結構混ざって泣きそう

284 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 10:43:08 ]
>>283
とりあえず元のプログラムが何をするものなのか理解しないことには
始まらないと思われ

285 名前:221 mailto:sage [2009/12/16(水) 11:02:32 ]
>>247
ありがとう。24時間は超えてしまうのでTimeはやはり使わない方向でいきます

286 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 11:06:02 ]
質問です。
Rubyで簡単なGUIアプリを作ろうとしているのですが、現在何がオススメでしょうか?
環境は、Ruby 1.8.7、Windowsです。

できれば、あくまでできればですが、実行環境では追加のリソース(ランタイム)が必要ないものがよいのですが…
例えばexeに固めれば単体で実行できる、もしくはRubyとそのライブラリがあれば動くと言ったようなものです。

下記サイトでは、shose(why氏とともにサイト死んでる?)、Ruby-GNOME2、wxRubyがよく使われているとありますが、
みなさんは何を使われてますか?
Ruby GUI調査2008
www.pressure.to/ruby_gui_survey/index-ja.html

287 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 11:14:52 ]
>>286
> Rubyで簡単なGUIアプリを作ろうとしているのですが、現在何がオススメでしょうか?
RubyではGUIアプリケーションは作らない

288 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 11:15:28 ]
Windowsで1.8でexe単体なら自分だったらvruby+Exerb+UPX
でも上の縛りがなければwxRuby+Ocra
あとやったことないけどWebアプリ+RubyStationも面白そう

289 名前:286 mailto:sage [2009/12/16(水) 11:24:17 ]
shoesはgithubにありましたけど、Javaのprocessingみたいな感じなんですね。ちょっと用途が違うとおもた
samples at master from shoes's shoes - GitHub
github.com/shoes/shoes/tree/master/samples/


>>287
(´;ω;`)ブワッ
昔Delphi使ってたんでそっちでもいいんですが、できれば最近なれたRubyでGUI作れたらなとか思うわけですよ…

>>288
必ずしもexe単体でなくてもいいです。

webアプリは面白そうなんですが、とりあえず、vrubyとwxRuby試してみます

290 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 11:26:15 ]
たぶん、GUIというイベントドリブンな概念とRubyの記法が合わないんだと思う



291 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 11:28:25 ]
イベントハンドラにprocオブジェクトを登録することがごく自然に出来るわけで。


292 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 11:31:44 ]
実装の便利度に差がありすぎるんだよな
中にはHSPからシェル経由でスクリプト呼んで引数連携させたほうがマシといゲフンゲフン

293 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 11:43:07 ]
>>271
パスに{}[]が含まれると良くない

294 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 11:51:03 ]
>>293
一般に使ってもらうならともかく、自分の用が果たせたならそれでいいんじゃないか?


295 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 13:56:13 ]
wxRubyをgemで入れてみたのですが、wxruby-2.0.1-x86-mswin32-60がインストールされたのですが、
これて古くないんでしょうか?wxWidgetの0.6.0だったりしませんか?

ruby -v #=> ruby 1.8.7 (2008-06-20 patchlevel 22) [i386-mswin32] 古いな…

296 名前:uy ◆e6.oHu1j.o mailto:sage [2009/12/16(水) 17:55:27 ]
純粋にrubyのレベルをあげたいです
小さなツールとWebアプリケーションとGUIゲームくらいならrubyで作れるようになったんですが
ルビリストと呼ばれるようになる為の次のステップ教えてください

297 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 18:05:30 ]
いろいろな言語を使う。
とくにRubyのバックグラウンドを育んだLispやSmalltalkを。


298 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 18:09:09 ]
Lispやれ(EmacsLisp以外ならなんでもいい)
PerlがまだならPerlも齧れ
オブジェクト指向の関係でJavaもできるといいんだが

299 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 18:12:54 ]
>>296
もの凄い勢いでRuby初心者スレ/本スレ/ruby-list等
あらゆるサイトの質問にコテハンで答えまくる
質の高い回答が数千溜まるとGoogleに雇ってもらえる

300 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 18:14:14 ]
ルビリストってなんですか?



301 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 18:27:26 ]
googleって実際優秀な人材だけってわけじゃないんだよねぇ
広告塔の人間もたくさんいるし

302 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 18:47:10 ]
>>296
>ルビリストと呼ばれるようになる為の次のステップ教えてください

るびまの添削記事を読むのがいいと思う。
ttp://jp.rubyist.net/magazine/?0010-CodeReview
ttp://jp.rubyist.net/magazine/?0011-CodeReview
ttp://jp.rubyist.net/magazine/?0013-CodeReview
ttp://jp.rubyist.net/magazine/?0015-CodeReview
ttp://jp.rubyist.net/magazine/?0017-CodeReview


303 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 18:51:14 ]
>>282
>人材が究極的に少ないから
>現状に加えて一般向けにドキュメント揃えろなんて言ったらどんどんリリースが遅くなる
>当事者だからという理由だけでできない人に無理やりやらせる理由はない
>得意な人に任せておけばいい

ばかをいえ、ChangeLogやNEW FEATURESなんて、開発当事者ぐらいしか詳しくは知らないんだから
開発当事者が書くべきだろ。
こんなことすらも嫌がる開発陣ってなんなの?

どうせ開発リソースが増えたところで、ドキュメントに回すつもりないんだろ。

304 名前:283 mailto:sage [2009/12/16(水) 19:00:12 ]
昼間は無事だったのに規制が…
283です。
>>284
jcorrectとかいうやつだったかな
プログラムを実行して文章を入力すると、cabochaの解析結果と一緒に文章の校正を促すメッセージが出た
これを実行するためにcabochaとかいろいろ入れてた
プログラムを読んでいると、サブルーチンから値を順に渡していたり$foo->{$var}->とか見たことないのがいっぱいでなんかもうキーーーーってなったんだ…

305 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 19:06:54 ]
>>303
言ってること自体には賛同できるけどそういうのは本スレでどうぞ

306 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 23:36:21 ]
質問です。
実行環境:Xubuntu9.10、Ruby1.9.1
使用ライブラリ:tk、pty、expect
やりたいことは、外部プログラム(対話型のCUIプログラム)をRubyスクリプト内から実行する際に、
外部プログラムの実行結果(標準出力。エラーが発生して終了したならその時のエラー出力)
を取得したいのですが、何か方法はあるでしょうか。
ネットを見るとsshやtelnetのサンプルが転がってますが、
sshやtelnetが出力するメッセージ自体やエラー文(はあるのかな?)を処理するようなものがなく、
どうするんだーと悩んでます。

307 名前:デフォルトの名無しさん mailto:sage [2009/12/16(水) 23:43:41 ]
シェルからパイプでつなぐ
` ... ` (バッククォート)でコマンド実行して出力取る
手の込んだことがしたければ require 'open3'

308 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 00:23:55 ]
wxRubyとかGUIアプリの話がでたついでに聞きたいんですけど、
↓みたいにマニフェストをruby/bin/において、Windows XP移行のLuna(?)風のUIにする方法があるんですが、
Ruby on Windows: Windows XP Visual Style Controls with wxRuby
rubyonwindows.blogspot.com/2007/10/windows-xp-visual-style-controls-with.html

…うまくいきません。
古いルックアンドフィールのままになります。
上記サイトのxmlをファイルをruby.exe.manifestとrubyw.exe.manifestに新規作成してコピペして、
ruby/binに放りこめばいいんですよね?

309 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 00:38:30 ]
>>307
ありがとうございます。
標準出力と標準エラー出力に違いがあるのを知らなかったですorz
open3は標準入力・出力・エラー出力のみ対応という形だったので、
except実行→出力結果を一時ファイルに出力→実行元プログラムでopen
という形で無事結果を得られるようになりました。

PTYがttyを別個に作ってそっちで実行させるっぽいのでバッククォート使えない(のかなぁ……)

310 名前:245 mailto:sage [2009/12/17(木) 11:43:14 ]
logger使ってみているのですが、
Benchmarkの出力結果が余計な改行が入るのですが、これってこんなもん?

time = Benchmark.measure do
:(略)
end
logger.debug Benchmark::CAPTION
logger.debug time.to_s



311 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 12:21:56 ]
そんなの logger は与り知らんよ
logger は対象のオブジェクトを to_s しての末尾に改行つけて書き出してるに過ぎない
何か問題あるならそのオブジェクトの to_s 調べれ

312 名前:245 mailto:sage [2009/12/17(木) 13:01:09 ]
>>311
舌足らずでごめんなさい。
puts Benchmark::CAPTION
puts time.to_s
だと改行の問題ないんです。気味が悪いんですが、何でなんでしょ

313 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 13:10:17 ]
>>312
改行が問題になるときの検証に puts 使ったら駄目
puts は文字列末尾に改行があったら自前で改行をつけない

というかこれはそのまんまで

irb> require 'benchmark'
irb> p Benchmark::CAPTION
" user system total real\n"

そもそも改行が末尾に入ってる
気になるなら Benchmark::CAPTION.chomp を logger に渡す

314 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 18:13:47 ]
> puts は文字列末尾に改行があったら自前で改行をつけない
漏れは大変なことを知ってしまった
近いうちに消されるかもしれない

315 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 18:18:58 ]
xpathって難しい。もっと簡単にできるか?
id('Layer3')//td[
following-sibling::td//a[contains(@href,
'money.www.infoseek.co.jp/MnStock')]]/b//font[@color]

316 名前:sage [2009/12/17(木) 21:38:37 ]
>>228
trunk には Date::Delta ってのが入ってるよ

317 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 22:32:29 ]
RSpecの用語について質問。
describe ... や it .... で書いたひとまとまりを、なんて呼ぶの?
たとえば Test::Unit なら
class FooTestCase < Test::Unit::TestCase ← これはテストクラス
 def test_equal       ← これはテストケース
  assert_equal(2, 1+1)
 end
end
のような呼び方をしてると思うんですけど、RSpecの場合は何と呼ぶのかわからないので、教えてください。


318 名前:デフォルトの名無しさん mailto:sage [2009/12/17(木) 23:36:33 ]
現在β版のRSpec本によれば、
We use the describe( ) method to define an example group.
The it( ) method defines a code example.

なお、
describe(および別名のcontext)メソッドが作るのは
Spec::Example::ExampleGroupのサブクラス
it(および別名のexample)メソッドが作るのは
それのインスタンスメソッド
になる


319 名前:デフォルトの名無しさん mailto:sage [2009/12/18(金) 06:03:22 ]
質問です。
001
002
のような、3桁の連番を表示したいんですが、どうやればいいんですか。
for i in 001..100
だと
1
2
になるんですが。

320 名前:デフォルトの名無しさん mailto:sage [2009/12/18(金) 06:18:23 ]
Rubyらしい書き方ではないかもだが

for i in 1..100
 p '%03d' % i
end

数字の頭に0がつくとRubyでは8進数って意味になるので注意



321 名前:デフォルトの名無しさん [2009/12/18(金) 06:23:07 ]
('001'..'100').each{|s| puts s}

322 名前:デフォルトの名無しさん mailto:sage [2009/12/18(金) 06:25:56 ]
>>320
見事にできました。
素早い回答どうもありがとうございました。

323 名前:デフォルトの名無しさん mailto:sage [2009/12/18(金) 10:03:11 ]
WEBrickで、
・Basic認証またはDigest認証
・IPアドレスによるアクセス制限
を実現したいのですが、サンプルとか参考になるページがあれば教えてください。
「WEBrick IPアドレス 制限」とかでぐぐったけど、それらしいのはヒットしませんでした。

324 名前:デフォルトの名無しさん mailto:sage [2009/12/18(金) 10:32:21 ]
追記。
ちなみに、今使っているサンプルはこんなのです。
require 'webrick'
server = WEBrick::HTTPServer.new({
:DocumentRoot => '.',
#:BindAddress => '127.0.0.1',
:Port => 3000,
})
Signal.trap('INT') { server.shutdown }
Signal.trap('TERM'){ server.shutdown }
server.start

325 名前:デフォルトの名無しさん mailto:sage [2009/12/18(金) 11:10:43 ]
認証
WEBrick::HTTPAuth::BasicAuth
WEBrick::HTTPAuth::DigestAuth

IPアドレスでの制御は HTTPRequest#addr あたりを見て403を返せばいいんじゃない?



326 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 12:18:34 ]
{1=>[2]}となる事を期待したけど、この方法では駄目みたいですね。

% irb1.9.1
irb(main):001:0> h=Hash.new([])
=> {}
irb(main):002:0> h
=> {}
irb(main):003:0> h[1]
=> []
irb(main):004:0> h[3]
=> []
irb(main):005:0> h[1] << 2
=> [2]
irb(main):006:0> h
=> {}
irb(main):007:0> h[1]
=> [2]
irb(main):008:0> h[3]
=> [2]


327 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 12:29:26 ]
>>326
www.ruby-lang.org/ja/man/html/trap_Hash.html

ぶっちゃけRubyの怪しげな機能は使わないほうがいいと思う

328 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 12:32:18 ]
>>326
そりゃArrayやHashの初期値つきnewは毎回初期値のオブジェクトを生成するからな

irb> p h[2].object_id == h[2].object_id
false

irb> h=Hash.new([])
{}
irb> h[1]=[2]
[2]
irb> h
{1=>[2]}

329 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 12:39:22 ]
>>328
> p h[2].object_id == h[2].object_id
これうち(1.8.7cygwin)でやるとtrueになるんだが1.9で変わったとか?

330 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 12:42:53 ]
>>326
それだとh[1]の参照先(初期値オブジェクト[])に2を入れてることにしかならない

h[1] = ほげほげ
としない限り
{1=>ほげほげ}にはならない



331 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 13:35:34 ]
$ rvm use system
<i> Now using system ruby. </i>
$ irb --prompt simple
>> RUBY_DESCRIPTION
=> "ruby 1.8.7 (2008-08-11 patchlevel 72) [universal-darwin10.0]"
>> h = Hash.new([])
=> {}
>> [h.default, h[0], h[1]].map(&:object_id)
=> [2156963800, 2156963800, 2156963800]

$ rvm use 1.9.1-head
<i> Now using ruby 1.9.1 head </i>
$ irb --prompt simple
>> RUBY_DESCRIPTION
=> "ruby 1.9.2dev (2009-12-11 trunk 26067) [x86_64-darwin10.2.0]"
ruby-1.9.1-head > h = Hash.new([])
=> {}
>> [h.default, h[0], h[1]].map(&:object_id)
=> [2151892720, 2151892720, 2151892720]


332 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 15:45:53 ]
>>331みたいな人ってソース中のコメントもほぼかかなそうだよな

333 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 16:35:24 ]
>>332は初心者

334 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 16:59:49 ]
まあ初心者スレだしな

335 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 17:53:52 ]
結局>>328は間違ってるということかい?

336 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 18:26:49 ]
new(初期値)で生成されたハッシュに存在しないキーでアクセスした場合の挙動は、
同じオブジェクトが返るというのが正しく、
毎回異なるオブジェクトが返るというのは誤り。


337 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 18:37:34 ]
質問するならリファレンスマニュアルくらい読んでからこい

338 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 18:47:27 ]
初心者スレ的には
「マニュアルのここ読めわかりやすくて疑問の余地無し氏ね」
と言える環境を揃えるほうが先な気もする

339 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 23:53:39 ]
>>328
それは初期値じゃなくて初期ブロックじゃないのか?

h = Hash.new{|hash,key| [] }
p h[2].object_id == h[2].object_id # => false

未設定のキーを指定された時に、そのつどブロックを実行した結果を返す
よって同じキーでも毎回違うArrayが帰ってくる


340 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 01:14:37 ]
>>338
ようやくたどり着いたと思ったら、

xxxx()
執筆者を募集中

おい、コードを書いたのはどこに行ったの?
採用した人は?

なので、動かないものは、自分で書き直すことにしてる。
一から一人でするより、ちょっと近道。



341 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 05:46:41 ]
>>337
>質問するならリファレンスマニュアルくらい読んでからこい
おまえは書き込むまえに>>1を読んでこい

342 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 06:50:04 ]
>>341
おまえは書き込むまえに>>1を読んでこい

343 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 07:39:01 ]
そんなことより俺のIDを見てくれ。どう思う?

344 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 09:13:46 ]
見えない

345 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 10:15:45 ]
>>344はバカ

346 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 10:27:17 ]
まあバカスレだしな

347 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 12:45:29 ]
教えてください
Hpricotで日本語テキストのリンク検索が上手く動きません
どうすればNokogiriと同じ動きになるのでしょうか

#!ruby -Ku
require 'hpricot'
require 'nokogiri'

html = "<html><a>りんく1</a><a>りんく2</a><a>りんく3</a></html>"
doc = Hpricot(html)
print doc.at("a[text()*='りんく2']"); # エラー発生

doc = Nokogiri(html)
print doc.at("a[text()*='りんく2']"); # こちらは正しく動く

エラー内容
/usr/local/lib/ruby/gems/1.9.1/gems/hpricot-0.8.2/lib/hpricot/elements.rb:486:in `index':
incompatible character encodings: ASCII-8BIT and UTF-8 (Encoding::CompatibilityError)



348 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 12:48:10 ]
>>347
初心者は Ruby1.9 使うなってこれだけ言われてるのになんでわからんのだエラー

349 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 12:54:16 ]
>>348が FA なのだが

というか何もわからず動かしていることが原因で、
Nokogiri が動いたのはただの偶然に過ぎない
むしろ「Nokogiri が動いたのは何故ですか」という質問になるべき事象

無理しないで Ruby 1.8.7 使え
1.8.7 を理解したあとで差分学習で 1.9.1 を習得するのが一番早い

350 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 12:57:10 ]
了承、1.8.7にする



351 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 12:59:15 ]
hpricotはコンパイルが通る程度に1.9対応されてるだけ。
作者の _why the lucky stiff はネット上から失踪しているので、事実上塩漬け状態。


352 名前:デフォルトの名無しさん [2009/12/20(日) 16:02:52 ]
質問
rdoc が生成する HTML について、特定の要素(例えば <pre>タグ)のスタイルだけ
いじりたいという場合はどうしたらいいのでしょうか?

353 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 16:27:02 ]
>>352
ちょっと見た感じでは rdoc に --template オプションで
自作のテンプレートを指定してやればいいんじゃまいか

既存のテンプレが rdoc/genarators/template/html に入ってるから
それを部分的に書き換えて使えばよさそう

354 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 19:17:36 ]
whyさん死んじゃったからNokogiri推奨だと思うけど、
>>347がhpricot使いたいと思った理由はなんだろ

355 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 19:20:40 ]
え、whyって死んじゃったの?
もしそうならHpricotきめえとかdisるのやめて冥福を祈る

356 名前:352 mailto:sage [2009/12/20(日) 19:31:28 ]
>>353
ありがとうございます。
ベースになるテンプレートを選んで、それに改変を加えたものを使おうと思います。

357 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 20:19:30 ]
ネットワーク的に、ね。
自分できれいさっぱり痕跡を消していった。


358 名前:352 mailto:sage [2009/12/21(月) 15:57:51 ]
追記
rdoc の --style オプションにスタイルシートのパスを渡すことで
HTML生成時に自前のスタイルシートを読み込ませることができました。

テンプレから CSS の部分だけ切り出して編集して、
rdoc --style=path_to/hoge.css

でうまくいきました。
というか、manページに普通に書いてあったorz

359 名前:デフォルトの名無しさん mailto:sage [2009/12/21(月) 22:18:49 ]
hpricot でも nokogiri でもいいんですが、

doc = Hpricot(open(uri).read)
(doc/:a).each do | link |
 if link[:href] == '#'
  p "設定し忘れ => #{link[:lineno]}"
 end
end

みたいに、行番号を取得することって出来ませんか?

360 名前:デフォルトの名無しさん mailto:sage [2009/12/21(月) 22:21:13 ]
行番号というメタ情報があれば取得できるよ
ないならできない
自分で行番号だと思うものを作って数えるしかない



361 名前:デフォルトの名無しさん mailto:sage [2009/12/22(火) 09:38:58 ]
>>359
その程度なら普通に正規表現でよさそうだね。

File.open(filename) do |f|
 i = 0
 f.each_line do |line|
  i += 1
  puts "#{filename}:#{i}: 設定し忘れ" if /href=("¥#"|'¥#¥')/
 end
end

362 名前:デフォルトの名無しさん mailto:sage [2009/12/22(火) 09:39:08 ]
jrubyでmechanize使えている人います?hpricotのjava版使うしかないんでしょうか?

363 名前:デフォルトの名無しさん mailto:sage [2009/12/22(火) 09:45:49 ]
>>361みたいに例示依存の回答する人なんなの

364 名前:デフォルトの名無しさん mailto:sage [2009/12/22(火) 10:39:36 ]
>>361 欲しいのは行番号であって、例文なんかどうでもいいんだが

365 名前:デフォルトの名無しさん mailto:sage [2009/12/22(火) 11:00:20 ]
例題コードを添削するのはどうかとw

366 名前:デフォルトの名無しさん mailto:sage [2009/12/22(火) 11:10:57 ]
作業ディレクトリの変更って出来ませんか?
./data/a.rb
./data/1.txt
./main.rb
ってあったときに
main.rbからa.rbをrequireするんですけど
a.rbは
open("1.txt","r") これで読めるようにしたいです

367 名前:デフォルトの名無しさん mailto:sage [2009/12/22(火) 11:21:49 ]
save = Dir.pwd
Dir.chdir "./data"
# 作業
Dir.chdir save
とかかな

同じディレクトリにあるファイルを使うってことなら
open(File.dirname(__FILE__)+"/1.txt")
でもいいかも

368 名前:デフォルトの名無しさん mailto:sage [2009/12/22(火) 11:34:12 ]
Pythonのdirみたいに、あるオブジェクトが持ってるメソッドと変数を一覧するものってありますか?

369 名前:デフォルトの名無しさん mailto:sage [2009/12/22(火) 11:36:29 ]
>>367
それでいけそうです
ありがとうございます

370 名前:デフォルトの名無しさん mailto:sage [2009/12/22(火) 11:37:30 ]
puts Object.methods

ソートするとなおみやすい
puts Object.methods.sort



371 名前:デフォルトの名無しさん mailto:sage [2009/12/22(火) 11:41:30 ]
Object#methods
Object#instance_variables

372 名前:デフォルトの名無しさん mailto:sage [2009/12/22(火) 12:00:57 ]
>>370-371 ありがとうございます!
これが欲しかった。

373 名前:デフォルトの名無しさん mailto:sage [2009/12/22(火) 12:36:02 ]
>>359
Nokogiriの要素は #line メソッドがあるはず。


374 名前:デフォルトの名無しさん mailto:sage [2009/12/22(火) 14:41:59 ]
>>367
Dir.chdir "./data" do
# 作業
end

でもいけるよ。

375 名前:デフォルトの名無しさん mailto:sage [2009/12/22(火) 14:46:45 ]
>>374
おお知らなかった
もっかいリファレンス見直すことにしよう

376 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 10:27:52 ]
ねー、

hoge/lib/  ← 自作ライブラリの rb ファイル
hoge/test/ ← lib のファイルに対応するテストスクリプト

という一般的なディレクトリ構成で test/test_hoge.rb を実行する場合、どうするのが「ふつう」なんだ?

:~/hoge$ ruby test/test_hoge.rb

:~/hoge/test$ ruby test_hoge.rb

:~/hoge$ testrb test/test_hoge.rb

:~/hoge/test$ testrb test_hoge.rb

377 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 11:29:21 ]
コマンド直叩きするときは ruby -Ilib test/test_xxx.rb とする気がするが、
普段はrakeのTestTask任せだから、どうやってるか意識してないわ。

TestTaskの中をみてみたけど、testrbを使うことも使わないことも可能みたい。
(デフォルトはrakeのライブラリ内の機能を使う)

なお、rakeの場合、test/ の中で起動しても、ディレクトリを遡ってRakefileを
探して、見つかったディレクトリで動くので、hoge/Rakefileとして置いている
場合は、実質的には hoge直下でやってることになるはず。


378 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 11:52:34 ]
ruby test/test_hoge.rb とかやりたいなあ
テストするためだけに test/ に降りてしまうのは、どうも…

379 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 11:54:14 ]
そのへんは、helper.rb をどうやって読むかの一点にかかってる気がしてならない

380 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 11:55:55 ]
ファイルいっこテストするだけなのにrakeはないわー



381 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 12:04:42 ]
rake test TEST=test/test_hoge.rb でファイル一個か。

382 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 13:39:33 ]
テスト実行するのにコマンド売ってるのかよ。
autotestでファイル保存と同時に自動でテスト実行だろJK

383 名前:362 mailto:sage [2009/12/23(水) 13:40:52 ]
JRuby 1.4でNokogiri対応になったみたいですね。失礼しました。

384 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 13:52:22 ]
>>382
テストが通らないタイミングでファイルを保存したりしないの?
というか編集途中で保存し辛くなりじゃん

385 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 13:54:01 ]
なるじゃん

386 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 14:12:02 ]
ファイルいっこのテスト方法がないわけじゃなかろう
autotestを使うかどうかとはまた別の議論だと思う

387 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 15:17:10 ]
>>382
コードを保存したいタイミングと、テストを走らせたいタイミングは別じゃね?
エディタからテストを実行させられればそれでいいけどなあ。
わざわざ保存したときに勝手にテストが走ってほしくないよ。

388 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 18:03:22 ]
かりに毎回毎回コマンドラインからテストするとしても
シェルの履歴ぐらい使うだろう。


389 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 18:27:27 ]
秀丸とかサクラエディタとか外部コマンドを
実行できるテキストエディタを使うがよろし。
俺はVim使ってるけど。

390 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 18:36:19 ]
俺はタブ機能付きの端末エミュレータ使って
右端のタブをテスト用に使ってる
タブ切り替えにキーを割り当ててやるとかなり快適だ

同じ用途で GNU Screen とか使ってる人もいるのでは?



391 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 19:41:16 ]
auto-save-buffersつかってるとautotestは使えない

392 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 21:51:25 ]
>>387
そうかー、その品は人それぞれだな。

autotest連携で結果をSnarl(今ならGrawlか?)で通知出したり、サウンド出したりしてるけど
けっこう快適よ?
ただ、coLinuxで動かすとその辺の連携がしにくくて困る

さらに、AutoHotKeyで保存キー入力と同時にブラウザリロードとかもやってる。

393 名前:デフォルトの名無しさん mailto:sage [2009/12/24(木) 01:40:48 ]
自動保存+すきあらば無意識で手動保存してるから、
保存とか意識したことがないなー。


394 名前:デフォルトの名無しさん mailto:sage [2009/12/24(木) 09:39:55 ]
warning: Insecure world writable dir /home in PATH, mode 040777
という警告がでて困ってます。
この警告だけを出さないようにする方法があれば教えてください。

home のパーミッションが 777 なのがおかしい!といわれればそうなんですけど、
下請けにはそんなことすら変更する権限がないんです。



395 名前:デフォルトの名無しさん mailto:sage [2009/12/24(木) 09:47:09 ]
>>394
知らんよ
RailsはRailsスレで

396 名前:デフォルトの名無しさん mailto:sage [2009/12/24(木) 10:47:41 ]
>>394
環境を詳しく

もしRailsなら権限くれっていえ。まともに開発できんから

397 名前:デフォルトの名無しさん mailto:sage [2009/12/24(木) 11:31:38 ]
>>394
ENV['PATH']から /home を抜け。


398 名前:デフォルトの名無しさん mailto:sage [2009/12/24(木) 11:33:56 ]
ENV['PATH']つーか、rubyを実行する前だからシェルの環境変数PATHね。


399 名前:デフォルトの名無しさん mailto:sage [2009/12/24(木) 11:52:12 ]
>>395
なぜRails?

>>396
環境はlinux 2.6.9-89.EL, ruby 1.8.7-p174です

>>397
$PATHには/homeがないけど、/home/username/binがあります。
これを除くことはできないので、どうしたもんか困ってます。



400 名前:デフォルトの名無しさん mailto:sage [2009/12/24(木) 12:28:44 ]
フルパスで実行するようにすれば除けるんじゃないの?




401 名前:デフォルトの名無しさん mailto:sage [2009/12/24(木) 12:32:16 ]
あくまでrubyに伝わるPATHだけ変わればいいので、

* コマンドの環境だけ変える。
PATH=/usr/bin:/bin(などなど) ruby 引数
とか

* 一度変えて戻す
OLD_PATH=$PATH
PATH=/usr/bin:/bin(などなど)
ruby 引数
PATH=$OLD_PATH
とか

* サブシェル内で変える
(
PATH=....
ruby
)

とかでもいい。


402 名前:デフォルトの名無しさん mailto:sage [2009/12/24(木) 16:39:54 ]
RubyGemsで依存関係を調べる方法ないですか?
gem dependency を使ってみているんですがうまくいきません。

$ gem dependency mechanize -v "0.9.3" --remote
Gem mechanize-0.9.3
nokogiri (>= 1.2.1, runtime)
hoe (>= 1.12.2, development)

$ gem dependency mechanize -v "0.9.0" --remote
No gems found matching mechanize (= 0.9.0)

$ gem dependency mechanize -v "<0.9.0" --remote
Gem mechanized_session-0.0.2
mechanize (>= 0.9.3, runtime)
hoe (>= 2.3.3, development)

何がやりたいかというとmechanizeでnokogiri非依存のバージョンを探したいのです。

403 名前:デフォルトの名無しさん mailto:sage [2009/12/24(木) 16:56:21 ]
>>402
WWW::Mechanize.html_parser = Hpricot

404 名前:デフォルトの名無しさん mailto:sage [2009/12/24(木) 17:04:10 ]
>>402
libxml2 に依存したくないというのなら>>403
Nokogiri のインストール自体を dependency 経由で行って欲しくないというのなら、Mechanize 0.8.4 かそれ以前が必要

405 名前:402 mailto:sage [2009/12/24(木) 17:13:20 ]
即レスありがとうございます。

>>403
あー、いや、Bundlerで利用しようとしておりまして、
実行環境ではNokogiriが動かないため依存段階そのものから外したいのです。

# 実際はappengine-jrubyでmechanizeを使いたいという難儀なアレなのです
# jruby版Nokogiriはffi依存のせいでappengineでは動かんのですわ・・・
appengine-jruby - Project Hosting on Google Code
code.google.com/p/appengine-jruby/

>>404
ありがたい
0.8.4ですね、試してみます。

後学のために聞きたいのですが、こういうのってどうやって調べられるもんなんでしょうか?
以前はgemコマンドでgemのパッケージ時の設定を見る方法があったような気がしたのですが、どこいったんでしょう?

406 名前:402 mailto:sage [2009/12/24(木) 17:16:34 ]
>>405 の前半の説明が足りないので補足。
mechanize 0.9.3では >>403したいところなんですが、
require 'mechanize'
するだけでffiねーぞゴラァ(appengine版のjrubyでは含まれてないためらしいです。pure java版Nokogiriが望まれます)
のエラーがでてしまうのです。

407 名前:デフォルトの名無しさん mailto:sage [2009/12/24(木) 17:20:09 ]
>>405
何もしてない
賞味3分の力技
add_dependency から Nokogiri が消えるまで mechanize.gemspec の github 履歴を直接調べて遡った

408 名前:デフォルトの名無しさん [2009/12/24(木) 18:55:35 ]
参考までに聞きたいのですが、
長くなり過ぎたメソッドチェーンの途中に改行を入れる場合、
皆さんはどこで改行するのが適切だと思いますか?

1) ピリオドの後に \
value = this.is.a.\
very.long.method.chain

2) ピリオドの前に \
value = this.is.a\
.very.long.method.chain

3) そもそも途中で改行しない

value = this.is.a
value = value.very.long.method.chain


409 名前:デフォルトの名無しさん mailto:sage [2009/12/24(木) 19:03:30 ]
>>408
長くなりすぎたと感じる時点で「よくないコードの匂い」なので、リファクタリング開始

410 名前:デフォルトの名無しさん mailto:sage [2009/12/24(木) 19:13:53 ]
>>408
メソッドチェーンでは改行は入れない
今更80文字制限などとは言わないが、メソッドチェーンで長い場合は途中変数で分ける
該当するとすれば3



411 名前:408 mailto:sage [2009/12/24(木) 19:16:52 ]
>>409
長くなり過ぎた場合という表現にちょっと語弊があったかも知れません。
実際にはメソッドのブロック付き呼び出しが2〜3続くような場合で
どうしても1行には収まらない場合、です。例をあげると

files = Dir.glob("**/*.rb").select {|file| ... }.reject {|file| ... }.map {|file| ... }

のようなパターンです。


412 名前:402 mailto:sage [2009/12/24(木) 19:18:31 ]
>>407
ΩΩΩな、なんだってー。恐れ入りました。そんな手がw

gem dependencyやgem specコマンドは--remoteのときには最新版からしかとれないんですね。
一旦gemをインスコしたらOK見られるようですが・・・

413 名前:デフォルトの名無しさん mailto:sage [2009/12/24(木) 19:19:43 ]
>>408 >>411
files = Dir.glob("**/*.rb").select {|file| ... }.
    reject {|file| ... }.map {|file| ... }

って俺はやってるな

414 名前:デフォルトの名無しさん mailto:sage [2009/12/24(木) 19:20:46 ]
>>410
> メソッドチェーンでは改行は入れない

>>411 であげたようなパターンでもそうなのですか?
自分はああいうパターンだとピリオドの後で改行しちゃうのですが、
一般的には推奨されない(マナーの悪い)書き方なのでしょうか


415 名前:408 mailto:sage [2009/12/24(木) 19:24:34 ]
>>413
ピリオドの後は \ なくてもいいんですよね。
自分の場合意図的な改行であることを明示するために \ を付けてます。

というか、>>411 の例は最後の map が意味的におかしいですね、しまったorz

416 名前:デフォルトの名無しさん mailto:sage [2009/12/24(木) 19:29:58 ]
files = Dir.glob("**/*.rb").select{|file|
      ...
    }.reject{|file|
      ...
    }.map{|file|
      ...
    }

417 名前:デフォルトの名無しさん mailto:sage [2009/12/24(木) 21:32:51 ]
ワンライナー書いてるならともかく、どっかで区切れよと
なぜそんなにつなぎまくるのかと

418 名前:デフォルトの名無しさん mailto:sage [2009/12/24(木) 22:41:13 ]
>>417
自分の場合はつなぐというより、
つながっていくという感じでついつい長くなってしまうw
返値を無駄にしたくないというか

変数の名前を processed_values とかにした場合も名前に引きずられて
途中の状態を入れたくないという雑念が生じ、無理してでも一連のチェーンで書いちゃう


419 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 01:09:13 ]
Ping打ちたいんだけどどう書くの?

420 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 01:25:21 ]
>>419
ttp://www.sakalab.net/prog-ruby/ruby-man-html-20080121/ping.html



421 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 01:35:21 ]
俺もそれ出そうかと思ったけど、ICMP使わないんだよな

422 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 01:38:51 ]
わかりやすくていいじゃん

423 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 05:59:43 ]
files = Dir.glob("**/*.rb")
files.reject! {|file| ... }
files.map! {|file| ... }

424 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 09:08:05 ]
>>423みたいに例示依存の回答する人なんなの

425 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 09:21:57 ]
実際には存在しないメソッドを使って質問したほうがいいな

426 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 09:54:59 ]
別にいいんじゃない?
破壊的メソッドが使える状況なのに気づかなかった初心者がいてもおかしくないし
役に立たないならスルーすればいい
回答者にエスパーを要求するっていうのはそういうことだと思う

427 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 12:03:27 ]
1.9 だと メソッドのピリオド前でも改行できるようになった
複数行のメソッドチェーンのピリオド位置をそろえられるらしい

if とか class とか直後に識別子や式が必須のところは改行しても行が継続するとか
そういう行継続のルールってマニュアルあるの?


428 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 12:16:41 ]
従来のルール
「改行までの箇所を読んで完結していると見なされる(パースできる)ことがないなら改行OK」
に追加されたのは「メソッド呼び出しのピリオドの前もOK」だけのはず。



429 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 12:18:40 ]
あれ、>>428 のルールだけでは
class Hoge
で改行が許されるのは説明できないのか。


430 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 15:44:18 ]
>>429
ん? 説明できてるように思うけど
class Hoge って end で閉じるまで完結しないでしょ



431 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 16:16:30 ]
1.8.7p174

puts 1+
2
これは3と出る。+がまだ完結していないから2までがまとまって解釈される。

puts(1+
+2)
同じく3。

puts 1
+2
これは1までで完結しているから1と出て、+2は単項演算して捨てられる。

puts(1
+2)
これは unexpected tINTEGER, expecting ')'
次の行まで見て完結させてくれないのはどうして?




432 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 16:22:47 ]
パーサをそんなにいじめるなよ

433 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 16:57:33 ]
>>431
パーサには puts (1 2) と見えてる(+ は単項演算子と解釈されてる)

puts (1
+ 2)
だといけるかなと思ったが syntax error, unexpected '+', expecting ')' だった
ruby 1.8.7 (2009-06-12 patchlevel 174) [i486-linux]


434 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 19:49:28 ]
> puts 1
> +2
> これは1までで完結しているから1と出て、+2は単項演算して捨てられる。

↑ここまできたら

> puts(1
> +2)

これは駄目ってわかりそうなもんだろw

435 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 20:00:39 ]
>>434
kwsk

436 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 20:05:56 ]
puts(1\
+2)

437 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 20:08:58 ]
>>434
どうして?
>>436
解決法を求めてるわけじゃないぜ。


438 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 20:30:44 ]
()の構文は(式)。
(1 と書くと1は完結した式と解釈され、次の行には残りの)しか書けない
ってことでok?

439 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 20:42:13 ]
ずいぶんしみったれてるな。
'('が出て来たら')'の直前までを式と解釈してくれても良さそうなもんだが

440 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 21:15:20 ]
Rubyのパーサは(人間にすると)曖昧な解釈だからなw

>>437
puts 1
+2
が駄目なので、演算子を行末におかない場合は次行と連結されないため、式として認識しない、までは認識できるだろう。

なので、次の
puts (1
の時点で次行とは連結されないでその行までで解釈される、と考えられるので、
閉じ括弧がその行にないのでエラーとなる、と

そういうふうに頭がさっと回らない、ということならばあなたがRubyに慣れていないか、
もしくは俺が長い行を複数行に分割するのに慣れすぎているのでそう感じてしまうだけかw



441 名前:デフォルトの名無しさん [2009/12/25(金) 21:24:09 ]
puts((3
+ 4)) # => 4
とかRubyって面白いね

442 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 21:29:45 ]
もろくも崩れ去った俺(=>>438)の推理orz
>>441はどういうことなの?


443 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 21:42:32 ]
えっ?
ここ初心者スレなんですけど

444 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 23:05:02 ]
>>443
初心者にも有益な話題じゃない?
式が完結してしまうところで不用意に改行して構文エラーも出なくて
なんでうまく動かないんだみたいな落とし穴を回避するにはこういう知識も必要

445 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 23:06:30 ]
バッドノウハウに近いと思う
改行が有効な個々の場合を記憶する理由はない

446 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 23:08:31 ]
初心者は構文解析何それおいしいのだし
妙なところで改行打つような真似もしないだろう

447 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 23:12:13 ]
結論 とても長い式文でもない限り途中で改行すると見づらいし誤作動の原因になりかねないからやめれ。

448 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 23:14:12 ]
メソッドチェーンはとても長い式文に入りますか?

449 名前:デフォルトの名無しさん [2009/12/25(金) 23:54:41 ]
>>441
puts((3;+4))
と同じ

450 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 00:29:37 ]
>>444
>>443>>440に対して
初心者スレで何で
>そういうふうに頭がさっと回らない、ということならばあなたがRubyに慣れていないか、
なこと言うのってことだ



451 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 00:34:38 ]
puts (3;+4) はエラーで
puts((3;+4))は通るのは何で?

452 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 02:20:30 ]
前者、おそらく”(”がメソッド引数の括弧だと読まれている
引数部に”;”があるのはおかしいからエラー

後者、(3;+4)は4に等しいから、
puts(4)と同じ。もちろん文法的に正しい

453 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 02:43:20 ]
なぜこんな仕様にしたし

454 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 04:56:34 ]
括弧の省略を可能にするため、とマジレス

455 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 07:52:07 ]
>>451
引数を括る括弧と、式としての括弧は別

456 名前:デフォルトの名無しさん [2009/12/26(土) 21:00:18 ]
質問です。
include して使われることが想定されているモジュールを書いているのですが
非公開の下請けメソッドの扱いについて悩んでいます。
include先で名前の衝突が起こらないようにするため、以下の方法を考えたのですが……

1、適当な接頭辞をつける → 衝突はしにくくなるけどしないとは言えないw
2、モジュールメソッドにしちゃう → 非公開じゃなくなるw
3、モジュール内部に Privateモジュールを作り、Private.method でアクセス
→ Privateモジュール自体は非公開にできないけど、includeする側からアクセス
されることはまずないだろう

他にもっとよい方法というか、こういう場合のイディオム、定石のようなものが
あったら教えて欲しいです。

457 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 22:19:29 ]
>>456
実用上は
>1、適当な接頭辞をつける → 衝突はしにくくなるけどしないとは言えないw
で十分。それでも心配なら接尾辞もつけるといい。
(もちろん衝突しやすい接頭辞は避けてね)

458 名前:456 mailto:sage [2009/12/27(日) 08:57:11 ]
>>457
わかりました。接頭辞をつけておくことにします。
あまり長すぎるとうるさくなるんで、
アンダースコア+モジュール名を3文字くらいに圧縮したもの ぐらいでいいかな。

459 名前:デフォルトの名無しさん mailto:sage [2009/12/27(日) 09:43:27 ]
インスタンスメソッドである必要がないなら非公開にする必要もないと思うんだけど
個人的には3かな、Hoge::Utilsとか

460 名前:デフォルトの名無しさん mailto:sage [2009/12/27(日) 11:37:54 ]
>>456
>1、適当な接頭辞をつける → 衝突はしにくくなるけどしないとは言えないw

スクリプト言語は変数の型についてはいいかげんだし、カプセル化についてだけ厳密性を求めてもしょうがないと思う。
もともとそういう言語じゃないんだよ、スクリプト言語は。
接頭辞や接尾辞をつけるだけでは衝突する可能性はゼロにできないけど、実用上は問題ないから、それでよしとしてください。



461 名前:456 mailto:sage [2009/12/27(日) 17:37:52 ]
>>459
> インスタンスメソッドである必要がないなら非公開にする必要もないと思うんだけど
> 個人的には3かな、Hoge::Utilsとか

Helpers とかもそうですね。
外部から利用しても役に立ちそうなメソッドなら積極的にそうすべきかも

>>460
> カプセル化についてだけ厳密性を求めてもしょうがないと思う。
> もともとそういう言語じゃないんだよ、スクリプト言語は。

そういうもんですか。
サブクラスに対して閉じるアクセス制御って今後もできないんですかね

462 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 01:40:43 ]
>>461
たぶんRubyでのprivateを勘違いしている。
Javaと違うから、マニュアルを読むことをお勧めする。

463 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 04:42:17 ]
可視性メモ
ttp://www.rubyist.net/~matz/20070208.html#p04

464 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 06:26:05 ]
>>462
名前の衝突を懸念している時点で勘違いはしてないと思うのだが

465 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 12:17:10 ]
>>464
「サブクラスに対して閉じるアクセス制御」と言ってる時点で勘違いしてると思う。

466 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 12:41:29 ]
あればいいのにって話だろ

467 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 12:45:35 ]
Rubyではアクセス制御はそもそもできない
可視性を決めるだけ

468 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 16:09:11 ]
>>466
不要です。
以上。
↓はい次の方。

469 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 16:12:49 ]
↓    本質的にはオープンクラスを諦めないといけない
↓    再オープンできる時点で制御も何もねえよ


470 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 18:21:24 ]
本質的にはMatzの設計次第



471 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 20:04:43 ]
サブクラスに上書きされない為にどうしたらいいかって質問なのに
勘違いしてるとか不要とか諦めろとかどーゆー事よ
質問者の方がよっぽどrubyの事を理解してると思うわ

472 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 20:07:14 ]
Matzに聞いたら、
サブクラスで気をつけれ
っていうに決まってそう

473 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 20:15:49 ]
>>471
だからシステム的にできねえって
新しいRuby実装を自分で作れば無論可能だが、そういう回答を求めているわけではあるまい

474 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 20:18:15 ]
>>471
じゃあ、おまいが答えれ

475 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 20:57:46 ]

set_position x, y, z
get_positionX

みたいなget,set関数を作りました。
setはともかくgetはつけずに

positionX

の方が良いですか。どちらがよりRubyっぽいか教えてください


476 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 21:00:26 ]
x メソッドや y= メソッドだと都合が悪い?

477 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 21:06:09 ]
ziki.position = [x,y,z]
puts ziki.position_x

ですか???
そっちの方がRubyっぽいならそれでも良いです

478 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 21:20:17 ]
混乱してきたので質問を変えます。
AとBについてどちらが良いですか?

A:
(1) my.position = [1,2,3]
(2) my.set_position 1, 2, 3

B:
(1) puts my.position // 配列
(2) puts my.position_x

479 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 21:39:37 ]
>>478
[x, y, z] の組が頻出なら Struct を使ってもいいかも
Point = Struct.new(:x, :y, :z)
my.position = Point.new(x, y, z)
my.position.x

480 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 21:48:58 ]
>>478
attr_accessor, attr_writer, attr_reader とかは知ってる?



481 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 22:07:20 ]
>>479のPointを使って
class My
 attr_reader :position
 def initialize ; @position = Point.new ; end
 def position=(xyz)
  @position.x,@position.y,@position.z = xyz # 要引数チェック
 end
end

my = My.new
my.position = [0,0,0]
pos = my.position
my.position.x = pos.x + 1

482 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 22:09:56 ]
初心者スレでStruct使うアホは即爆発していいよ

483 名前:478 mailto:sage [2009/12/28(月) 22:11:56 ]
そんな難しい文法使わないでください。
初心者には理解できません。

484 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 22:15:23 ]
>>482
お前は永遠に配列の添字アクセスでもやってろ

485 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 22:23:19 ]
ハッシュで複雑なデータ構造を表現するのは悪らしい。。

486 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 22:27:43 ]
>>483
>>481 を見て具体的に何が理解できないか書いた方がよいと思われ

487 名前:デフォルトの名無しさん mailto:sage [2009/12/29(火) 08:24:31 ]
>>485
Javaの人は引数にハッシュを使うことを理解できません
Struct使う人間の95%がRubyをJavaと勘違いして使っています

488 名前:デフォルトの名無しさん mailto:sage [2009/12/29(火) 08:53:28 ]
質問です
[1,2,3] * [2,2,2] = [2,4,6] と書ける裏技無いですか。
ようは2つの配列を要素毎掛け合わせて欲しい

489 名前:デフォルトの名無しさん mailto:sage [2009/12/29(火) 09:02:39 ]
>>488
とくにないです

require 'enumerator'
a1 = [1, 2, 3]
a2 = [10, 20, 30]
p a1.enum_with_index.map{|e,i| e*a2[i]} #=> [10, 40, 90]


490 名前:デフォルトの名無しさん mailto:sage [2009/12/29(火) 09:04:25 ]
>>488
class Array
 def * other
  m = []
  each_index{|i| m << self[i] * other[i]}
  m
 end
end

裏技だからね。既存の Array#* を使ってるコードがどっかにあって
何が起きても知らないよ。



491 名前:デフォルトの名無しさん mailto:sage [2009/12/29(火) 09:36:10 ]
>>487 は x, y, z の組をどう扱うの?


492 名前:488 mailto:sage [2009/12/29(火) 09:38:30 ]
>>490
いやそれはちょっと……

>>489
うーん、やっぱり無理そうですね。
C++みたいに Array& operator* (const Array& a1, const Array& a2) が定義できると便利なのに

493 名前:デフォルトの名無しさん mailto:sage [2009/12/29(火) 12:49:27 ]
a1 = [1, 2, 3]
a2 = [10, 20, 30]

p a1.zip(a2).inject([]){|r,(x,y)| r << x*y}
とか


494 名前:デフォルトの名無しさん mailto:sage [2009/12/29(火) 12:53:15 ]
>>491
配列とかでいいんじゃねえの

組として外部に持ち出さなければならないなら
クラスか何か作って名前付けることをそのときに考える

495 名前:デフォルトの名無しさん mailto:sage [2009/12/29(火) 16:42:10 ]
eclipseで開発できますか?

496 名前:デフォルトの名無しさん mailto:sage [2009/12/29(火) 16:44:38 ]
>>495
そらできる。

497 名前:デフォルトの名無しさん mailto:sage [2009/12/29(火) 16:45:55 ]
def foo=
end

と同様に

def foo<<
end

を定義するとコンパイルエラーになるのですが、もしかしてこれはダメなんでしょうか。
その場合はどうすれば???

498 名前:デフォルトの名無しさん mailto:sage [2009/12/29(火) 17:07:16 ]
foo= のようなメソッド名は、
obj.foo = ...
のような式のために特別に許されている。
(foo に代入するためには、obj.foo ではなく obj そのものを呼び出す必要があるため)

obj.foo << のような式は、obj.foo の << の呼び出しと解釈されるので、
そういうようなメソッド名はない。

ていうかどういうことがしたいわけ?

499 名前:デフォルトの名無しさん mailto:sage [2009/12/29(火) 18:15:34 ]
obj.foo = # 代入
obj.foo << # 追加
がやりたいです。
fooは仮想的な配列でメンバー変数ではありません。

500 名前:デフォルトの名無しさん mailto:sage [2009/12/29(火) 18:22:31 ]
Ruby ではオブジェクトの外からインスタンス変数を直接参照したりはできません。
obj.foo は obj.foo() というメソッド呼び出し(が返す値の参照)です。

obj.foo() を定義して、それが返すオブジェクトの << メソッドでなんとかするしかないと思います。



501 名前:デフォルトの名無しさん mailto:sage [2009/12/29(火) 18:41:19 ]
あーなるほどそういうふうに見えるのか

502 名前:デフォルトの名無しさん mailto:sage [2009/12/29(火) 19:17:45 ]
この場合は変数操作でこの場合変数に偽装したメソッド呼び出し
みたいな使い分けで引っかかるのは理解する

>>495
あまり楽しくない

503 名前:デフォルトの名無しさん mailto:sage [2009/12/29(火) 19:22:20 ]
eclipseで開発したとして、実行はどうするんだろうね
Runとかやって、スクリプトが動いても
なんかな、って感じになりそう

504 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 02:54:55 ]
>>495
もしかして: Aptana

505 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 11:17:47 ]
<<を定義して配列のように見せかけている例としてはRailsの
ActiveRecordのhas_many関連がありますな。
.classですらArrayと返ってくる徹底ぶり。


506 名前:デフォルトの名無しさん [2009/12/30(水) 15:20:41 ]
def foo= x, y, z
end
を定義して
bar.foo = 1,2,3
と呼び出すと
./main.rb:25:in `foo=': wrong number of arguments (1 for 3) (ArgumentError)
というエラーが出るのですが、なぜ引数3つで呼び出しているのに引数の数が間違えている(1?)とか
うちのRuby様はふざけた事を言い出すのでしょうか

507 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 17:09:05 ]
bar.foo = a, b, c は bar.foo=([a, b, c]) だからです。
bar.foo=(a, b, c) で呼び出してください。

508 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 17:12:48 ]
syntax error, unexpected ',', expecting ')'
bar.foo=(1, 2, 3)

末尾= の場合は引数1つに限定かしらね?

bar.foo=[1, 2, 3]は
wrong number of arguments (1 for 3) (ArgumentError)


509 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 17:49:08 ]
>507 それウソ

たぶん>>508が言うように末尾=の場合は引数1個限定だと思う
けど自信ない

510 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 21:46:36 ]
puts RUBY_DESCRIPTION #=> ruby 1.9.1p376 (2009-12-07 revision 26041) [i386-mingw32]
plus = "a".method(:+) #=> #<Method: String#+>
p plus.("b") #=> "ab"

この3行目のシンタックスについてparse.y以外でどこかにドキュメントありませんか?
Method.instance_methodsにそれらしきメソッドが見当たらないのですが,Methodオブジェクトに特有なものなのでしょうか?



511 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 22:47:00 ]
foo.(arg) とすると foo.call(arg) の意味ということになった。

ttp://jp.rubyist.net/?NEWS-1.9.1.ja の「言語の中核部分」→「新しい文法と意味論」
「.()で#callや#[]を使わずにProcなどを呼べる」

512 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 22:47:50 ]
メソッドじゃなく、文法(構文)の範囲だから instance_methods では出てこないよ。
Procでも使える。


513 名前:デフォルトの名無しさん mailto:sage [2009/12/31(木) 01:32:23 ]
>>509
やはり、呼び出すときには引数が一つしか取れないのだろうか?
でも、定義では3つの引数が必要なので、引数の数が合わないと怒られる

bar.send( :foo=, 1,2,3 )
で、引数三つ与えて呼び出せないこともないけど
なんだか、無意味な感じ


514 名前:デフォルトの名無しさん [2009/12/31(木) 06:56:22 ]
dhh

@37signals is already running a few minor apps on Rails 3. We've just started playing w/ porting Basecamp. Exciting times!
twitter.com/dhh/status/7208264678

Very tentative target date for Rails 3 beta is end of January. But core is staffed with volunteers, so very much subject to change.
twitter.com/dhh/status/7107817801

515 名前:デフォルトの名無しさん [2009/12/31(木) 08:32:35 ]
Very tentative target date for Rails 3 beta is end of January. But core is staffed with volunteers, so very much subject to change.
twitter.com/dhh/status/7208225785
dhh

516 名前:デフォルトの名無しさん mailto:sage [2009/12/31(木) 09:12:32 ]
>>511 >>512
なるほど。
指摘していただいたドキュメントも拝見いたしました。
#callをできるだけ通常のメソッド呼び出しの記法に近づけるため
#[]をオーバーライドするといった努力をしているというのは
耳にしたことがあったのですが,.()もその一環のようですね。

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

517 名前:デフォルトの名無しさん mailto:sage [2009/12/31(木) 22:42:29 ]
Ruby1.9で正規表現のエンコーディングにShift_jisを指定するには
どうすればいいんでしたっけ?

オプションでsを指定すればよかったような気がしたのですが、
p /hogehoge/s.encoding
で#<Encoding:Windows-31J>が帰ってきます。

WindowsXPで
ruby 1.9.1p376 (2009-12-07 revision 26041) [i386-mswin32]
です。
よろしくお願いします。

518 名前:デフォルトの名無しさん mailto:sage [2009/12/31(木) 23:39:43 ]
Regexp.new('あ.い.う.え.お’.encode('Shift_JIS')) かなあ。


519 名前:デフォルトの名無しさん mailto:sage [2010/01/01(金) 07:30:44 ]
明けましておめでとうございます。

>>518
/\p{ASCII}/ という表現を使いたいのでその手法は難しいんです。
今回は関係ありませんが/\x82\xA0/
という表現もその手法だと難しいですね。

マジコメでソースエンコーディングをsjisに指定するって手もあるのですが、
大人の事情でこの手法も避けたいのです。

ハチドリ本を読み返したのですが、p.335には"SJISは、s"って書いてありますね。
なんだかなぁ。

引き続きよろしくお願いします。

520 名前:デフォルトの名無しさん mailto:sage [2010/01/01(金) 08:14:35 ]
失礼しました、>>518さんの方法でできますね。
もっとスマートな方法があればいいと思うのですが、とりあえず解決です。

お騒がせしました。



521 名前:デフォルトの名無しさん [2010/01/01(金) 14:23:19 ]
SJISのデータを一度読み込んでUTF-8に変換してごにょごにょ
が一番綺麗だと思う。
SJISでしないといけない理由は実はなかったりしないかい?

522 名前:デフォルトの名無しさん mailto:sage [2010/01/01(金) 21:58:59 ]
rubyのアンインストール方法ってどうするんでしょうか。
./configure --prefix=/usr/local
make
sudo make install
でインストールしたのを、事情によりきれいさっぱり削除したいです。


523 名前:デフォルトの名無しさん mailto:sage [2010/01/01(金) 22:45:28 ]
>>522
特に手段は用意されてない
make -n installでファイルリストを作ってぶん回すぐらいしか思いつかないな

524 名前:デフォルトの名無しさん [2010/01/02(土) 02:18:44 ]
標準ストリームに対する文字コードについて教えて下さい。
まだRubyの問題なのか、OSの問題なのかも上手く切り分け出来ていません。 m(__)m

TCPでクライアントと通信するプログラムを作っています。
環境はサーバー側(作っている側)がDebian Lenny(5.03)で、文字コードはUTF-8です。
クライアントはWindows2000のマシンで、文字コードはShift JISです。

コードは次のような感じです。
他にも色々な処理が入っていますが、話を簡単にするため、コードを思いっきり削っています。

> hoge.rb

#! /usr/bin/ruby -Ku

while receive = STDIN.gets

# コマンドを受信した

msg = "受信しました" # UTF-8

# 送信処理
# STDOUT.puts( NKF.nkf('-Ws', msg)) # これだとWindows側にパケットが全く返らない
STDOUT.puts( msg) # これだとWindows側で漢字は化けるけどパケットは返る
end

というような感じです。
何かパケットが来たら、メッセージを返すものです。
(実際にはPostgreSQLを呼び出し、コマンドの結果を得て返しています。)

525 名前:524 [2010/01/02(土) 02:19:24 ]
このコードはinetdから起動されます。

inetd.confはこんな感じ。

4142 stream tcp nowait root /usr/sbin/tcpd /usr/local/bin/hoge.rb

Rubyで扱っているUTF-8の日本語文字列を、標準ストリームにShift JISで流したいだけなのですが、上手くいきません。
Shift JISで出力しようとすると、STDOUTするところで、何事も無かったかのようにパケットが送信されません。
Rubyはエラーにもならず、その行を飛ばしたかのような挙動になります。

UTF-8のままでSTDOUTへ出力すると、Windows側で文字化けしますが、パケットは返ります。

事情により、Windows側のプログラムには手を入れられません。
どこらあたりから、見直していけば良いでしょうか?

この件の調査修正で、お正月休みも返上です。(TT)
よろしくお願いします。

526 名前:524 [2010/01/02(土) 02:48:40 ]
あ、ごめんなさい、すっかり書き忘れていました。
Rubyのバージョンは1.8.7です。
よろしくお願いします。

527 名前:デフォルトの名無しさん [2010/01/02(土) 04:37:19 ]
require 'kconv'

STDOUT.puts(msg.tosjis)

528 名前:524 [2010/01/02(土) 12:29:54 ]
>>527
ありがとうございます、しかし状況変わらずです。
NKFとkconvは、挙動が違うのでしょうか??

529 名前:524 [2010/01/02(土) 12:53:11 ]
>>527
再び524です。

申し訳ありません、確認が足りませんでした。

このmsgには”人の名 ”(漢字3文字+空白14)というように、
ASCIIで20Byte毎に区切って送るという仕様です。
ですが、Windows側には”人の名 ”(漢字3文字+空白11文字)として
届いていて構文チェックで跳ねられていました。

ちょうど空白が漢字の文字数分足りません。

UTF-8からShift JISに変換する時に、漢字とスペースの扱いはどうなるのでしょうか?
何か、特別な処理が必要でしょうか?
以前、EUC-JPとShiftJISでやったときは、問題無かったのですが。

なんとなく光が見えてきました、引き続きよろしくお願いします。

530 名前:デフォルトの名無しさん mailto:sage [2010/01/02(土) 13:25:36 ]
どっかに全部コード貼ってから来なさい



531 名前:デフォルトの名無しさん [2010/01/02(土) 15:32:50 ]
>>529
utf8では漢字は2バイトではなく3バイト。
ja.wikipedia.org/wiki/UTF-8

532 名前:524 mailto:sage [2010/01/02(土) 17:35:34 ]
>>531
ありがとうございます、解決しました。
結局、SJISに変換してから加工するようにコードを変えました。
UTF-8では、漢字は3バイトなんですね。
勉強になりました。

お騒がせしました。

533 名前:524 mailto:sage [2010/01/02(土) 22:50:27 ]
>>530
524です、今、デバッグを終えて、正常動作を確認しました。
決め手は>>532さんの「漢字は3バイト」でしたが、結構ポカミスもしてまして、今まで掛かりました。

ごめんね、プロジェクトの規模が大きすぎて、コードは晒せないの…
某自動車会社で、国土交通省に提出する書類を作成するためのシステムです。
Rubyの案件としては、中くらいの規模なんじゃないかな。
わりと重要なシステムで、止まると車が作れません。
Rubyはミッションクリティカルでも大丈夫、信頼が置けます。

pgsqlだったかな、DBIになる前の古いやつ。
それからDBIへの移植だったのですが、なかなか…
pgsqlでEUC-JPだから動いてたっていうコードが結構あって、
思っていたより全然はまりました。

何処へ質問を投げようかと思案したのですが、おまいらに聞くのが一番良い気がして
ここに書かせて貰いました。

あとは1月4日の総合テストを待つのみです。
実際に車を測定する設備が無いので、うちの社内では完全なテストは出来ないんですよ。

何はともあれ、おまいらのお陰で解決しました。
本当にありがとう。

それでは、名無しに戻ります。 m(__)m

534 名前:デフォルトの名無しさん mailto:sage [2010/01/03(日) 00:12:17 ]
>>533
身元と案件を特定出来る情報を2chに書くなよ・・・

535 名前:531 mailto:sage [2010/01/03(日) 00:20:53 ]
>>533
いまのご時勢でRuby/DBIを選択しちゃうセンスは大いに疑問だが、問題が解決してよかったね。

536 名前:デフォルトの名無しさん mailto:sage [2010/01/03(日) 00:25:56 ]
> いまのご時勢でRuby/DBIを選択しちゃうセンスは大いに疑問だが

kwsk

537 名前:デフォルトの名無しさん mailto:sage [2010/01/03(日) 02:32:44 ]
通報。

538 名前:デフォルトの名無しさん mailto:sage [2010/01/03(日) 04:20:45 ]
HTTPProxyを作りたいので
WEBrickでプロキシサーバを作って遊ぶ
ttp://jp.rubyist.net/magazine/?0002-WEBrickProxy
を参考に

require 'webrick'
require 'webrick/httpproxy'

s = WEBrick::HTTPProxyServer.new(
:BindAddress => '127.0.0.1',
:Port => 8080,
:Logger => WEBrick::Log::new(nil, WEBrick::Log::DEBUG),
:ProxyVia => false
)

Signal.trap('INT') do
s.shutdown
end

s.start

と書いて実験してみたところ
リモートからのデータをいったんメモリに貯めてからクライアントへ渡す動作をするようです
この場合巨大なファイル(結構大きいファイルを扱うProxyを作る予定です)を通したときにメモリ消費が
洒落にならないので、読み込んだデータから逐次クライアントへ渡すような動作にしたいのですが
そのような設定は可能ですか?可能であればその方法を教えてください。よろしくお願いします

539 名前:デフォルトの名無しさん mailto:sage [2010/01/03(日) 04:50:47 ]
以前、どこかのスレで
python -i
と同じことをする方法を見たのですが、どうやるんでしたっけ?

540 名前:デフォルトの名無しさん mailto:sage [2010/01/03(日) 04:57:19 ]
$ irb



541 名前:デフォルトの名無しさん mailto:sage [2010/01/03(日) 05:17:07 ]
>>540
違う。

542 名前:デフォルトの名無しさん mailto:sage [2010/01/03(日) 09:50:24 ]
ver #=> Microsoft Windows XP [Version 5.1.2600]
ruby -v #=> ruby 1.9.1p376 (2009-12-07 revision 26041) [i386-mingw32]

以下の簡易wget風ワンライナをより短くできませんか?

ruby -ropen-uri -e"$><<URI(*$*).read" www.example.com/>output
ruby -ropen-uri -e"$>.binmode<<URI(*$*).read" www.example.com/hoge.zip>output

短くならなければ「短くならないよ」というご意見や
よりスマートな代替案もいただけたら幸いです。

543 名前:デフォルトの名無しさん mailto:sage [2010/01/03(日) 10:07:26 ]
>>542
代替案ということはワンライナにこだわらなくていいんだよね?
若干強引だけどlib/site_rubyにwget.rbライブラリを作ってそのなかに処理書いちゃうとか
ruby -rwget www.example.com/ > output
irb.batのようにbinにbat置いてスクリプト実行するとか
rwget www.example.com/ > output

544 名前:デフォルトの名無しさん mailto:sage [2010/01/03(日) 10:20:40 ]
>>543
早速のレスありがとうございます。
ライブラリ案・バッチ案は個人で使う分にはアリですね。
コマンドもすっきりしますし。

個人的には何もライブラリやファイルをインストール(作成)せずに
Ruby単体で簡易wgetを実現できればいいなと思っています。
あまり実用的な場面はありませんが ^^;

545 名前:デフォルトの名無しさん mailto:sage [2010/01/03(日) 10:44:08 ]
>>538
データをストリーミング中継したいということでしょうか?

私はネットワークプログラミングに詳しいわけではないのでアドバイスはできませんが,
googleで "webrick ストリーミング" で検索してみてください。
1件目のブログが参考になるかもしれません。

546 名前:デフォルトの名無しさん mailto:sage [2010/01/03(日) 12:22:32 ]
>>539
対話型debugが目的なら -rdebug

対話型インターフェイスが目的なら
while true
print ">"
input = $stdin.gets.rstrip
break if input == "\x04" # ^D
puts input
end

もしくは(GNU Readlineが必要)
require "readline"
while input = Readline.readline(">")
puts input
end

pythonなんて知らんよ

547 名前:デフォルトの名無しさん mailto:sage [2010/01/03(日) 13:21:29 ]
OpenGLってDirectXに比べるとプリミティブすぎるというか機能足り無くない?
標準のシーングラフとかあっても良いと思うのだが……
何か無いですか?

548 名前:538 mailto:sage [2010/01/03(日) 13:46:23 ]
>>545
レスありがとうございます
探していた情報はまさにそれです、ストリーミングも含めて考えていました
逐次転送するような動作は不可ですか・・・(´・ω・`)

以前にsocketで似たような物を実装しようとしたことがあったけどリクエスト/レスポンスの
終了を検出する方法が判らなくて断念・・・il||li ○| ̄|_

549 名前:デフォルトの名無しさん mailto:sage [2010/01/03(日) 15:32:50 ]
>>548
webrickを改造する場合にはリファレンスの以下の項が参考になるかもしれません。
Net::HTTPResponse#read_body {|str| .... }
「エンティティボディを少しづつ取得して順次ブロックに与えます。」

TCPSocketを使う場合でも
socket.gets until $_ == CRLF
でヘッダを切り離して
while data = socket.gets
...dataを料理...
end
ではダメですか?
Rubyで終端を気にする必要はなかったように思います。
他に思いつくにはヘッダのContent-Lengthを信用してそのバイト数だけ読み込むとか。
TCP/IPの規格に詳しくないので当てずっぽうですが。

550 名前:デフォルトの名無しさん mailto:sage [2010/01/04(月) 01:49:17 ]
windows機でタイマーを実装しようとしてます。
マルチスケジューリングなキッチンタイマーのようなものです。

問題がありまして、
例えば60分後にアラームを鳴らせるというタイマーのプログラムを行ったときに
やっぱりその30分前にもう一個のプログラムを追加したいと思ってもそれを行うためには
常に入力待ち状態である必要があります。
その一方で常に出力待ち状態でないと指定時刻にタイマーを実行することができません。

今は
タイマー入力(空入力も化)待機モード→
1分間のタイマー実行待機モード→
その1分の間に起こるべきイベントがあれば指定時刻にイベントを起こす→
またタイマー入力待機モードに戻る→
以下ループ

というようにユーザに入力によって待機モードを切り替えることでそれらしい動作をさせています。
どのようにすればもっとスマートにこのタイマーを実装できるでしょうか?

一つのスマートじゃない方法はテキストエディタと外部ファイルを使ってこのタイマー入力を行うことかなと思うんですが。(非排他モードでファイルの書き込み読み取りする)
forkがwindows rubyでは使えなくて、そもそも子プロセスを使ったことがないので悩んでいます。



551 名前:デフォルトの名無しさん mailto:sage [2010/01/04(月) 01:57:34 ]
www1.axfc.net/uploader/Sc/so/70232.txt

しょーもないソースコードですが、文章で書くより伝わりやすいと思うので
よろしくお願いします。

552 名前:538 mailto:sage [2010/01/04(月) 03:29:30 ]
>>549
レスありがとうございます
WEBrickはソースコードを理解するだけで時間が相当かかりそうな感じなので
改造はあきらめます・・・

バイナリデータをgetsで読み出そうとすると最悪の場合、最後まで読み込んで
しまうように思いますが・・・
Socketの終了が判らない件ですがノンブロックモードで読み出す方法
(sysreadを使う。getsが使えなくなるけど・・・)が判ったのでひとまず解消しました
普通にreadを使うとブロックモードなんで帰ってこない・・・(TT

しかし1セッションに複数のホストへのリクエストとかマンドクセ(´・ω・`)

553 名前:デフォルトの名無しさん mailto:sage [2010/01/04(月) 05:32:35 ]
>552
getsはバイト列に$/(普通は0x0A)がでてこなければ
最後まで読み込んでしまうけれど、その確率は気にするほどのものかな
ミッションクリティカルなアプリケーションならしかたないとは思うけど

554 名前:デフォルトの名無しさん mailto:sage [2010/01/04(月) 06:17:44 ]
>>550
つ Thread & ConditionVariable

555 名前:デフォルトの名無しさん mailto:sage [2010/01/04(月) 12:40:48 ]
あるURLから特定のURLのみを抽出するにはどうしたらいいでしょうか?
例えばmenu.2ch.net/bbsmenu.htmlから"pc11"が含まれるURLを抽出したいです。

require "open-uri"
url = ARGV[0] || "menu.2ch.net/bbsmenu.html"
uri = open(url).read
URI.extract(uri, ['http']){
|uri|
puts uri
}

URL自体を抜き出すのは比較的簡単に出来たのですが、特定のURLを抜き出すのってこの状態からどうしたらいいでしょうか?
宜しくお願いします。

556 名前:デフォルトの名無しさん mailto:sage [2010/01/04(月) 13:03:47 ]
puts uri if /pc11/ =~ uri.to_s

557 名前:デフォルトの名無しさん mailto:sage [2010/01/04(月) 13:05:12 ]
>>555
URI.extract の返値(URI の配列)に対し find_all でいいんじゃない?

str = open(url).read
URI.extract(str, ['http']).find_all {|uri| uri =~ /pc11/ }

正規表現マッチの部分はもう少し厳密にした方がいいと思うので適当に

558 名前:557 mailto:sage [2010/01/04(月) 13:13:58 ]
返値を変数に格納するの忘れてたw

559 名前:デフォルトの名無しさん mailto:sage [2010/01/04(月) 13:20:49 ]
str = open(url).read
URI.extract(str, ['http']).grep(/pc11/)

560 名前:デフォルトの名無しさん mailto:sage [2010/01/04(月) 20:31:50 ]
「特定のURLを抜き出す機能」と考えるからわからなくなるんだと思う

配列から特定の条件を満たす要素を抜き出す方法とか
URIオブジェクトのURI構成要素を返すメソッドは何かとか
そういうの調べていったほうがたぶん早い



561 名前:デフォルトの名無しさん mailto:sage [2010/01/04(月) 20:41:17 ]
御託はいいから妥当解とっとと出せカス

562 名前:デフォルトの名無しさん mailto:sage [2010/01/04(月) 20:43:13 ]
「手抜き」じゃね?
いつ動かなくなるのか不安だ。。

563 名前:デフォルトの名無しさん mailto:sage [2010/01/04(月) 20:51:14 ]
どうでもいいけど、
普通はstr = open(url).{|io|io.read}じゃね?
それかstr = URI(uri).readか。

564 名前:デフォルトの名無しさん mailto:sage [2010/01/04(月) 20:54:18 ]
>>561
require 'open-uri'
url = "menu.2ch.net/bbsmenu.html"
purls = URI.extract(open(url).read, ['http'])
uris = purls.map{|url| URI.parse(url)}.find_all{|uri| /\Apc11\.2ch\.net\Z/ =~ uri.host}

ただ、
 「URLを抽出したあとそれに対して何をしたいのか」
 「本当に抽出したいのは本文のURLではなくて<a href>のリンクなのではないか」
 「貴様は次のレスで「あっあとttp://も抽出したいです」と言うッ!」
とかいうような危惧がないわけでもない

普通にHTMLパーサ通したほうが近道だったり
一般的な適当範囲の正規表現を通したほうがマシな処理だったりしなくもなくもないかも

565 名前:デフォルトの名無しさん mailto:sage [2010/01/04(月) 20:56:56 ]
関係ないけど、2chのAPIは糞。

566 名前:デフォルトの名無しさん mailto:sage [2010/01/04(月) 21:00:02 ]
そりゃ急いで突貫工事したものをずっと継ぎ接ぎで使ってるからな

これがめちゃくちゃ洗練されて、2chアクセス者全員にdat直読みだけをされるようになっても
本当は運営的にはちょっと困るのよ

567 名前:デフォルトの名無しさん mailto:sage [2010/01/04(月) 21:03:29 ]
datはまぁ良いとして、bbsmenu.htmlだけはどうにかして欲しいな。

568 名前:デフォルトの名無しさん mailto:sage [2010/01/04(月) 21:03:47 ]
>>566
APIが洗練されたとしても利用者全員がdat読みすることなんてありえんから
後半は全然関係ないだろw

569 名前:デフォルトの名無しさん mailto:sage [2010/01/04(月) 21:10:00 ]
>>568
本当に洗練されたWeb経由APIはJavaScriptのみでの実装を許す
API経由で広告を見せて有効に動作させるロジックはまだ発明されていない
今の2chから広告収入外されたら傾くぞ

なんかこう物理的にナナメに傾くだけで済む気もするのがなんか謎な収益だが

570 名前:デフォルトの名無しさん mailto:sage [2010/01/04(月) 21:29:00 ]
>>563
まあなんか非常にめんどくさいのだけど

open(path).read は close 忘れが多いので推奨されない書き方
(open(path){|f| f.read} を強く推奨、File.read(path) は Windows のバイナリスイッチが入らなので非推奨)
ただ、open-uri を読み込んだ URL や URI に限っては、
open(uri).read は IO#close 相当を必要としないので妥当安全にたまたま動作する

いや、ブロックつきで書いてもいいけど
っていうかレスしてて気づいたけど本当にたまたま動くんだなこれ

ローカルのファイルを読むことがなくて、簡便な HTTP アクセサとしてしか使用しないのなら
あなたの言うように URI.parse(url).read するのがいちばんではあるっていうかお前ら初心者スレで手を抜くな



571 名前:デフォルトの名無しさん mailto:sage [2010/01/04(月) 22:11:39 ]
>>570
手を抜くな、と言われましても、2chの手抜きAPIに対して
真面目にプログラミングする気がしませんん。

572 名前:デフォルトの名無しさん mailto:sage [2010/01/04(月) 22:16:54 ]
手抜きAPIを調教して俺色に染めてやんよ

573 名前:デフォルトの名無しさん mailto:sage [2010/01/04(月) 22:19:33 ]
そもそも2ちゃんのそれはAPIなんかじゃない無いだろw
一時期XML吐こうぜみたいな動きがあったみたいだけど、
「やっぱだりぃわ」で自然消滅した?w

574 名前:デフォルトの名無しさん mailto:sage [2010/01/04(月) 22:23:55 ]
>>571
URLにアクセスしてHTMLを取得するという根幹部分すらまともに書けませんと素直に言ったら

575 名前:デフォルトの名無しさん mailto:sage [2010/01/04(月) 22:30:23 ]
>>574
は?HTTPのライブラリぐらい作ったことあるから w

576 名前:デフォルトの名無しさん mailto:sage [2010/01/04(月) 22:40:14 ]
しっかし、open-uriって、
open(path)ってしただけでゴリゴリとTempfileをディスクに書いちゃうのね。
大量のURIを扱うならopenは使うべきじゃないな。

577 名前:デフォルトの名無しさん mailto:sage [2010/01/05(火) 04:26:10 ]
>>571のような open(file).read と open(file){|f| f.read} の違いがわからないような人間にはなりたくないと思う

578 名前:デフォルトの名無しさん mailto:sage [2010/01/05(火) 05:17:44 ]
>>576
f = open(uri) が open として何を返すべきかを考えたら、
StringIO が返ってくる低サイズ帯のほうがむしろ特殊というか変

579 名前:デフォルトの名無しさん mailto:sage [2010/01/05(火) 15:25:56 ]
無圧縮のzipを作成したいのですが
ziprubyもrubyzipも無圧縮オプションが見当たりません
この2つは無圧縮zipの作成をサポートしていないのでしょうか?
あるいはlibtarで作成すれば無圧縮zipと同じものが出来ますか?


580 名前:デフォルトの名無しさん mailto:sage [2010/01/05(火) 19:57:04 ]
open-uriだけでよくここまで話せるな



581 名前:デフォルトの名無しさん mailto:sage [2010/01/05(火) 22:54:32 ]
>>579
ヒント
Zlib::NO_COMPRESSION

582 名前:デフォルトの名無しさん mailto:sage [2010/01/06(水) 05:24:47 ]
>>579
オレも気になったので調べてみたけど見当たらないね、実装されてないのかな?
おそらくPKZIP形式を求めていると思ったので
偽Zip32J.DLLてのを使ってやってみた

require 'dl/win32'
zip = Win32API.new("Zip32J.DLL","Zip","lppl","l")
p zip.call(0,"-q -0 out.zip 1.txt 2.txt", "" , 0)

拘り無いならtarでいいと思う

583 名前:デフォルトの名無しさん mailto:sage [2010/01/06(水) 07:15:17 ]
rubyzipのZip::ZipOutputStream#put_next_entry見ろよ。
どこ見てんのよ。

584 名前:デフォルトの名無しさん mailto:sage [2010/01/06(水) 12:31:59 ]
a='/'
a.sub!(/\//, "\\")
p a

これで出力は \ 1個を期待したのだけど
\\ 2個になってしまう

a.sub!(/\//, "\")
こうすると怒られるし
どうしたらいい?



585 名前:デフォルトの名無しさん mailto:sage [2010/01/06(水) 12:36:25 ]
>>584
irbでinspectの結果を見てないか?


586 名前:デフォルトの名無しさん mailto:sage [2010/01/06(水) 12:37:22 ]
ごめん、pか。
pはinspectの結果を出すので、そうなって当然。
putsせよ。


587 名前:デフォルトの名無しさん mailto:sage [2010/01/06(水) 12:40:36 ]
ttp://doc.okkez.net/187/view/method/Kernel/m/p
ttp://doc.okkez.net/187/view/method/String/i/inspect

588 名前:デフォルトの名無しさん mailto:sage [2010/01/06(水) 14:25:27 ]
subとgsubはブロックを使えと先生から習わなかったか

589 名前:デフォルトの名無しさん mailto:sage [2010/01/06(水) 14:38:24 ]
しかしそれ以前の問題だからのう。

どうでもいいけど、個人的には正規表現に / が入るときは %r が見やすい

590 名前:584 mailto:sage [2010/01/06(水) 14:48:46 ]
>>585-589
あざーした!
pの方が短くてうちやすいので
ついputs代わりに使ってました
今度から気をつけます!




591 名前:デフォルトの名無しさん mailto:sage [2010/01/07(木) 15:03:29 ]
exerb 使う時って open-uri 使っちゃいけないの?

592 名前:デフォルトの名無しさん mailto:sage [2010/01/08(金) 20:42:04 ]
こんなのあったのね。テンプレに入れとけばどうか。まーActiveScriptRubyでもいいけどw

窓の杜 - 【REVIEW】Windowsでスクリプト言語“Ruby”を導入するための和製インストーラー「Rumix」
www.forest.impress.co.jp/docs/review/20100106_340742.html

593 名前:デフォルトの名無しさん mailto:sage [2010/01/08(金) 23:46:16 ]
WindowsでRubyを使うこと自体が既に初心者レベルを超えてる

594 名前:デフォルトの名無しさん mailto:sage [2010/01/08(金) 23:52:33 ]
いや、逆じゃないのか。。

595 名前:デフォルトの名無しさん mailto:sage [2010/01/09(土) 08:02:18 ]
RumixってOne-Click Installerとなにがちゃうんや!

596 名前:デフォルトの名無しさん mailto:sage [2010/01/09(土) 08:37:14 ]
One-Click Installer 海外版Windows向けRubyパッケージ(ただしRuby古い)
Rumix 日本語版Windows向けRubyパッケージ

597 名前:デフォルトの名無しさん [2010/01/09(土) 19:02:01 ]
rubyはメモリをたくさん食うと聞いたことがあるのですが解決方法などはありますでしょうか?

598 名前:デフォルトの名無しさん mailto:sage [2010/01/09(土) 19:04:58 ]
>>597
Rubyを使わない

Rubyはメモリを多めに使うことで、Rubyであるということの意味を保っている
(そもそも言語レベルでそのように作られている)
メモリを大量に消費するということがネックなのなら、その用途にRubyを選ぶべきではない

599 名前:デフォルトの名無しさん mailto:sage [2010/01/09(土) 19:20:43 ]
ほんとカス言語だな

600 名前:デフォルトの名無しさん mailto:sage [2010/01/09(土) 19:33:36 ]
>599 suck but ruby just sucks less.



601 名前:デフォルトの名無しさん mailto:sage [2010/01/09(土) 19:35:17 ]
sorry!! this site is japanese only!!

602 名前:デフォルトの名無しさん mailto:sage [2010/01/09(土) 19:44:52 ]
rubygemsの開始読み込みのへちょい構造はどうにかして欲しいと思うことがある
あれはRubyらしさとかそういうの抜きで単にミスだろう

603 名前:デフォルトの名無しさん mailto:sage [2010/01/09(土) 19:52:10 ]
メモリを大量に食うこと自体が設計ミス

604 名前:デフォルトの名無しさん mailto:sage [2010/01/09(土) 19:54:55 ]
>>603
お前気楽な人生送ってるな
反対のことだけ書いてりゃ爽快なんだもんな

605 名前:デフォルトの名無しさん mailto:sage [2010/01/09(土) 20:09:47 ]
CPU時間でQuotaや課金があるようなサービスがもうちょっと一般的になると
Rubyは再度日陰になるのかね
どっちにしても初心者スレの話題じゃねーな

606 名前:デフォルトの名無しさん mailto:sage [2010/01/09(土) 20:22:09 ]
Ruby1.8 for WinでインタプリタがCUIかGUIかを簡単に判別する方法ってありますか?
exerbでexeファイル化する予定なので出来れば自動で判別したいです

607 名前:デフォルトの名無しさん mailto:sage [2010/01/09(土) 20:26:19 ]
よくわからんがこのへんではだめなのか
ttp://exerb.sourceforge.jp/man/doc/core.ja.html

608 名前:デフォルトの名無しさん mailto:sage [2010/01/09(土) 21:14:09 ]
空間計算量と時間計算量を犠牲にしてMatz好みのOOとプログラマの幸せを手に入れたいらしい

609 名前:デフォルトの名無しさん [2010/01/10(日) 18:15:55 ]
rubyかpythonどちらを初めに勉強しようか悩んでます
どなたかアドバイスお願いします

610 名前:デフォルトの名無しさん mailto:sage [2010/01/10(日) 18:28:22 ]
はいはいpython、python
いいからさっさと消えてくれ。目障りだ



611 名前:sage [2010/01/10(日) 18:40:42 ]
rubython

612 名前:デフォルトの名無しさん mailto:sage [2010/01/10(日) 18:46:03 ]
Rubyを256倍使うための本ってどうですか?
オクにいくつかでてるんで、買おうか迷ってるので教えてください。


613 名前:デフォルトの名無しさん mailto:sage [2010/01/10(日) 18:50:05 ]
>>612
古書
Rubyの過去を知るために有意義

614 名前:デフォルトの名無しさん mailto:sage [2010/01/10(日) 21:30:35 ]
質問です。
hamlで以下のような定義のときに、ruby本体でどのようにしたらいいのか教えてください。

%table
!= header = capture_haml do
%tr
%th Name
%th TimelogUrl
%th Status
- @users.each do |u|
%tr
%td u.name
%td u.link
!= header
この中で、@usersをどのように定義したらいいのかが分かりません。

バージョンは以下のものを使っています。
ruby 1.9.1
haml 2.2.16

615 名前:デフォルトの名無しさん mailto:sage [2010/01/10(日) 23:05:34 ]
>>614
そのときのコンテキストにおける self に対して。
たとえば instance_eval { @users = ... }


616 名前:デフォルトの名無しさん mailto:sage [2010/01/10(日) 23:34:52 ]
>>615
レスありがとうございます。

すいません、もう少し詳しく教えてもらえると嬉しいです。
@users = [
[
name => "aaaa",
link => "link1"
],
[
name => "bbbb",
link => "link2"
]
]
こんな感じのを想定しているんですが、全く違うようなそうでないような・・・
そんなレベルです。すいませんorz


617 名前:デフォルトの名無しさん mailto:sage [2010/01/10(日) 23:43:00 ]
もしかしてRailsのビューにhamlを使ってみようとかそういう話?


618 名前:デフォルトの名無しさん mailto:sage [2010/01/11(月) 00:03:44 ]
あの〜、Rubyってブラウザ上で動くアプリは作れないのですか?

619 名前:デフォルトの名無しさん mailto:sage [2010/01/11(月) 00:16:32 ]
ブラウザ上で動くアプリってたとえばどんなんだ

HTMLと画像とJavaScriptで構成されているWebアプリケーションなら
サーバを用意してサーバ上でRubyを頑張って動かせば作れないわけでもない

Flashなどを利用するタイプのは、そりゃバックグラウンドサーバでRuby動かすことはできるけど
それより先にFlashで普通に作らないといけないぞ

何の話をしてるかわからないのなら、Webアプリケーションについての概略知識が足りない

620 名前:デフォルトの名無しさん mailto:sage [2010/01/11(月) 00:21:59 ]
>>617
先に書くべきだったでしょうか?

Sinatraを使ってPassenger経由で表示させようとしています。
index.hamlという名前でhamlを使って別ファイルに保存していて、それをstart.rbから読み込んで表示させようとしています。




621 名前:デフォルトの名無しさん mailto:sage [2010/01/11(月) 01:29:35 ]
>>620
このページは参考になるかな(2ページ目の@comment変数)
ttp://gihyo.jp/dev/serial/01/ruby/0009

622 名前:デフォルトの名無しさん mailto:sage [2010/01/11(月) 03:13:44 ]
>>621
はい。そのページは知ってるのですが、実際に定義する場合にどのようにしたらいいのか?
というところで悩んでます。
テストデータを仮に組もうとして、どう「書いたら」良いのか分からないという orz

623 名前:デフォルトの名無しさん mailto:sage [2010/01/11(月) 04:12:59 ]
>>622
こんな感じか
TestData = Struct.new(:name,:link)
@users = [ TestData['aaaaa','link1'], TestData['bbbbb','link2'] ]

624 名前:デフォルトの名無しさん mailto:sage [2010/01/11(月) 04:33:52 ]
>>623
ありがとうございます。
おかげさまで動きました。

ただ一つだけ修正が
>>614の所は
%td u.name
%td u.link

%td= u.name
%td= u.link
でしたorz

625 名前:デフォルトの名無しさん mailto:sage [2010/01/11(月) 07:46:02 ]
【レス抽出】
対象スレ:Ruby 初心者スレッド Part 33
キーワード:orz

抽出レス数:7

626 名前:デフォルトの名無しさん mailto:sage [2010/01/11(月) 10:39:52 ]
R Language
Ruby

627 名前:デフォルトの名無しさん mailto:sage [2010/01/11(月) 12:17:24 ]
Pで始まってLで終わる言語っていう表現があったな。
文脈によって指すものは変わる。


628 名前:デフォルトの名無しさん mailto:sage [2010/01/11(月) 17:22:46 ]
質問です
同じ名前のチェックボックスから複数の値をとりだすにはどうしたら
よいのでしょうか?
require "cgi"
cgi = CGI.new

check1 = cgi["check"][0]
とかで個別には取れますが、選択できる数が固定でない場合、
どのように書けばよいのでしょう?

配列の数さえわかればできるのですが
cgi["check"].lengthとかで配列の数がとれないようですし困っています。

629 名前:628 mailto:sage [2010/01/11(月) 17:58:49 ]
自己解決しました
くだらない質問してすみませんでした

630 名前:デフォルトの名無しさん mailto:sage [2010/01/12(火) 04:22:00 ]
cgiは残念だがゴミ。



631 名前:デフォルトの名無しさん mailto:sage [2010/01/12(火) 18:16:46 ]
zsh で rake を実行するときに、desc がある task だけしか、
task が補完されない。Rakefile 中の全 task を補完させたいのだけど、
どうしたらいい??

632 名前:デフォルトの名無しさん mailto:sage [2010/01/12(火) 18:27:46 ]
rubyはjis規格で規定されていますか?

633 名前:デフォルトの名無しさん mailto:sage [2010/01/12(火) 18:39:02 ]
>>631
zshの設定を変える
rake専用の補完関数を書けばいい
誰かが作ってるのではないかな

634 名前:デフォルトの名無しさん mailto:sage [2010/01/12(火) 18:45:55 ]
>>632
今ドラフト。


635 名前:デフォルトの名無しさん [2010/01/12(火) 22:17:37 ]
Ruby と IPA はどのような関係があるのですか?

636 名前:デフォルトの名無しさん mailto:sage [2010/01/12(火) 22:21:00 ]
>>635
マブダチ。

637 名前:デフォルトの名無しさん mailto:sage [2010/01/12(火) 23:35:30 ]
>>634
まじ?

638 名前:デフォルトの名無しさん mailto:sage [2010/01/12(火) 23:38:22 ]
情報処理技術者試験の午後問題になる日も近いな

639 名前:デフォルトの名無しさん mailto:sage [2010/01/12(火) 23:59:56 ]
Ruby Draft Specification
ruby-std.netlab.jp/

640 名前:デフォルトの名無しさん mailto:sage [2010/01/13(水) 00:11:14 ]
Ruby/GSL
rb-gsl.rubyforge.org/

のWindowsバイナリってないです?
gem install gslしようとしたら、native libraryでコンパイルしようと下ので、
VC++2008環境でやってみたんですが、エラー吐いてダメポです。
どなたかコンパイルしたバイナリか、コンパイルの仕方教えてください。
mingwとかでもコンパイルできますか?

C:\Program Files\Microsoft Visual Studio 9.0\VC>gem install gsl
Building native extensions. This could take a while...
ERROR: Error installing gsl:
ERROR: Failed to build gem native extension.

C:/ruby/bin/ruby.exe extconf.rb
checking for sys/types.h... yes
checking for u_int8_t... no
checking for int16_t... no
checking for int32_t... no
checking for u_int32_t... no
creating narray_config.h
creating Makefile

nmake

(つづく)



641 名前:デフォルトの名無しさん mailto:sage [2010/01/13(水) 00:12:02 ]
(つづき)

Microsoft(R) Program Maintenance Utility Version 9.00.21022.08
Copyright (C) Microsoft Corporation. All rights reserved.

cl -nologo -I. -I. -IC:/ruby/lib/ruby/1.8/i386-msw
in32 -I. -MD -Zi -O2b2xg- -G6 -DHAVE_SYS_TYPES_H -c -Tcnarray.c
cl : コマンド ライン warning D9035 : オプション 'Og-' の使用は現在推奨されていま
せん。今後のバージョンからは削除されます。
cl : コマンド ライン warning D9002 : 不明なオプション '-G6' を無視します
narray.c
c:\ruby\lib\ruby\1.8\i386-mswin32\config.h(2) : fatal erro
r C1189: #error : MSC version unmatch
NMAKE : fatal error U1077: '"C:\Program Files\Microsoft Visual Studio 9.0\VC\BIN
\cl.EXE"' : リターン コード '0x2'
Stop.

Gem files will remain installed in C:/ruby/lib/ruby/gems/1.8/gems/narray-0.5.9.7 for inspection.
Results logged to C:/ruby/lib/ruby/gems/1.8/gems/narray-0.5.9.7/src/gem_make.out

642 名前:デフォルトの名無しさん mailto:sage [2010/01/13(水) 00:27:46 ]
>>630

cgi.rbがゴミなのでしょうか?

他に使いやすいCGIライブラリってありますか?


643 名前:640 mailto:sage [2010/01/13(水) 00:32:06 ]
こういったライブラリはmingw32でコンパイルできるものなのでしょうか?

644 名前:デフォルトの名無しさん mailto:sage [2010/01/13(水) 00:49:49 ]
>>642
いまのところの本命はRackやRackに基づいたもの。


645 名前:デフォルトの名無しさん mailto:sage [2010/01/13(水) 01:03:24 ]
..           (.
.            )
      ,―ヽ__(__、―
   ,/  ノ       ヽ  ~\
  /   ノ   IPA    ヽ   ~\
/   ノ           ヽ、  `ヽ
|    ノ / ̄\   / ̄~ヽ ヽ    i
|   ノ              |  ノ
\  |  <●>  <●>  (  )
 \ |      | |       i /
    |      /  ヽ       レ
   i     (●_●)      /  
    i、    ,-――-、   ・ /
    i、  <(EEEEE)> ∵/    RubyはIPA Rubyになったピョん☆
      i、  \   ./  /
       \   ーー   ,ノ       
  ,,.....イ.ヽヽ、ー-―一ノ゙-、.
  :   |  '; \_____ ノ.| ヽ i
      |  \/゙(__)\,|  i |
      >   ヽ. ハ  |   ||

646 名前:デフォルトの名無しさん mailto:sage [2010/01/13(水) 01:24:34 ]
初心者には Ruby 1.8.7 を強くお勧めします。とありますが、
公式から初心者のためのRubyインストールガイドに飛んで、
<URL:rubyforge.org/projects/rubyinstaller/>でダウンロードできます。
に行ったところ、1.8.6と1.9.1しか見当たりません
ど初心者なので安心な公式からのリンクのインストーラを使っておきたいところなんですが
興味を持っていざ足を踏み入れてみたものの、いきなり迷子になってます

647 名前:デフォルトの名無しさん mailto:sage [2010/01/13(水) 01:29:31 ]
>>640
rubyをコンパイルしたのと違うバージョンのコンパイラを使うと
ランタイムライブラリが衝突する関係上、拡張ライブラリはコンパイルできない
ただしVC6とMinGWは同じランタイム使うのでそこの互換性はあり

つーことで、>>643はrubyがVC6かMinGWでコンパイルされている条件付でyes

648 名前:デフォルトの名無しさん mailto:sage [2010/01/13(水) 01:33:27 ]
>>646
そういえばOne-Click Installerって1.8.6までだったね
groups.google.co.jp/group/comp.lang.ruby/browse_thread/thread/3212e4e1a32d8526

>>592にあるRumixってのを試してみては
不安なら他の人のレスを待って

649 名前:デフォルトの名無しさん mailto:sage [2010/01/13(水) 01:43:57 ]
>>648
ありがとうございます
教えてもらったRumix - Ruby Starter Package with Installer
でインストールして初めてみたいと思います

650 名前:デフォルトの名無しさん mailto:sage [2010/01/13(水) 01:46:22 ]
>>646
とりあえず始めるにはRubyGemsつきの以下の2つをオススメしたいな

ActiveScriptRuby(ただし、少し古いので外部公開とかは注意)
COM Meets Ruby
arton.hp.infoseek.co.jp/indexj.html


か、>>592のRumixをどうぞ

Rumix - Ruby Starter Package with Installer
ruby.morphball.net/rumix/


Rumixの方は試してないからわからんが、コッチの方がRuby1.8.7でも新しい。



651 名前:640 mailto:sage [2010/01/13(水) 01:48:30 ]
ありがとうございます。
RubyはVC6版(ActiveScriptRubyのだと思う)のはずなので、MinGWでコンパイル試してみます。

652 名前:デフォルトの名無しさん mailto:sage [2010/01/13(水) 01:54:49 ]
>>650
わざわざありがとうございます
ActiveScriptRubyもチェックしてみたいと思います

653 名前:デフォルトの名無しさん mailto:sage [2010/01/13(水) 06:54:52 ]
環境によってrubygemsがアホみたいに遅くなるのはどのWindows版だっけ

654 名前:デフォルトの名無しさん mailto:sage [2010/01/13(水) 07:03:58 ]
>>653
mswin32が爆弾持ち

絶対にmingwもいれて比較すべき
遅く感じないならどっちでもいい
遅くない人もいるみたいだから

655 名前:デフォルトの名無しさん mailto:sage [2010/01/13(水) 07:34:04 ]
1.8.7のインストーラ用意してないのは、単なる手抜き?
まあ教祖自身がウィンドウズ使ってないから放置なんだろうけど。

656 名前:デフォルトの名無しさん mailto:sage [2010/01/13(水) 07:55:04 ]
マストでないので、やる人員が確保できなければ特段用意されない

657 名前:デフォルトの名無しさん mailto:sage [2010/01/13(水) 08:15:41 ]
マイクロソフトあたりが環境用意してくれるのはきっと大歓迎。


658 名前:デフォルトの名無しさん mailto:sage [2010/01/13(水) 09:20:36 ]
>>655自身が必要なら手を上げれば今なら英雄候補生

659 名前:デフォルトの名無しさん mailto:sage [2010/01/13(水) 10:52:00 ]
arr.insert(0, obj) ってなんか意味あんのかね
arr.unshift(obj) と一緒だよね
ただのデータ配列なのでキュー関連の物言いを嫌ったのかね

660 名前:デフォルトの名無しさん [2010/01/13(水) 16:12:42 ]
floatの内部表現を表す4バイトを指す文字列(ポインター)が欲しいのですが、どうすればいいのでしょうか
C言語で書くとこうなります。

float f[] = {1,2,3,4,5,6};
unsigned char* p = (unsigned char*)f;

OpenGLを使っていて頂点データをGPUに送るのに配列の生データが欲しいのですが……



661 名前:デフォルトの名無しさん mailto:sage [2010/01/13(水) 16:49:47 ]
>>660
pack調べろpack

662 名前:デフォルトの名無しさん [2010/01/13(水) 17:04:11 ]
>>661
.pack("f*")で出来た。まじサンクス。

@@vertices = [1,0,0, 0,1,0, -1,0,0].pack("f*")
@@indices = [0,1,2].pack("f*")


663 名前:デフォルトの名無しさん mailto:sage [2010/01/13(水) 19:37:31 ]
>>659
すまん。レスの趣旨がつかめん。
挿入位置によってメソッド使い分ければいいじゃんてことが言いたい?

664 名前:デフォルトの名無しさん mailto:sage [2010/01/14(木) 11:08:18 ]
スタックとみなしてる意図のメソッドと、キューとみなしてる意図のメソッドってあるよね

とかそんなことだと思う

665 名前:デフォルトの名無しさん mailto:sage [2010/01/14(木) 17:43:13 ]
たまたま何処かでそういうコードを見かけて、unshiftで事足りるのに
わざわざinsert使っているのは何故なんだっていうところだろうね。

666 名前:デフォルトの名無しさん mailto:sage [2010/01/14(木) 20:04:56 ]
バグを見つけたらどうしたらいいの?

667 名前:デフォルトの名無しさん mailto:sage [2010/01/14(木) 20:16:27 ]
[BUG] と出て落ちたとか Segmentation Fault したとかならまず検索かな
たいていは既に報告してて対処待ち

Rubygems みたいな外部ライブラリのバグっぽい感じのものならやっぱ過去の報告とか調べて
それでもなさそうなら Rubyforge や GitHub のページのバグ報告あたりに出すといい

ただ、断言してもいいけど6割はただの勘違いで、残りのうち3割5部は既に報告済みだと思う
どこのどのへんが怪しい動作と思えるのかここで言ってみ
報告のためにはそれなりに体裁とか前提条件とか洗い出さないと対処してもらいにくいけど
ここで何か言えばそのためのヒントくらいは出るかもよ

668 名前:デフォルトの名無しさん mailto:sage [2010/01/14(木) 20:20:12 ]
>>665
unshift と書いてあったら俺はキューのようなものだとみなす
キューでもないのに unshift と書いてあったらたぶんキレる
先頭に要素突っ込みたいなら insert 使え
最後に要素突っ込みたいなら << か push 使え

669 名前:デフォルトの名無しさん mailto:sage [2010/01/14(木) 20:27:34 ]
沸点低いなー

まあ確かに順番必要ないのにArray使ってる例というのは結構あって

670 名前:デフォルトの名無しさん mailto:sage [2010/01/14(木) 21:33:30 ]
バグの情報はどこにあるの?
Googleで4・50件ほど見たけど無かった。
win32でコマンドラインに特定の非ASCII文字を含むディレクトリ名を指定するとワイルドカードが展開されない



671 名前:デフォルトの名無しさん mailto:sage [2010/01/14(木) 21:35:23 ]
bugはここ
redmine.ruby-lang.org/projects/ruby/issues?set_filter=1&tracker_id=1
サンプルコード見せて

672 名前:デフォルトの名無しさん mailto:sage [2010/01/14(木) 22:16:49 ]
>>670
非ASCII文字の中に「表」とかの \ で終わる文字が入ってるんだろ

673 名前:デフォルトの名無しさん [2010/01/14(木) 23:06:29 ]
Do One Thing for Rails 3 on January 16th and 17th
railsbridge.org/news_items/10

674 名前:デフォルトの名無しさん [2010/01/14(木) 23:11:49 ]
Rubyでwebアプリ作るときはcgi使うのとERB使うのと
お作法的にはどっち?

675 名前:デフォルトの名無しさん mailto:sage [2010/01/14(木) 23:13:46 ]
どっちもつかわねー、というのが答ではあるが
初心者のうちは全部使って長所短所欠点体に刻んどけという気はする
どうせ外に出したりしないだろ

676 名前:デフォルトの名無しさん mailto:sage [2010/01/14(木) 23:15:09 ]
何使うの?

677 名前:デフォルトの名無しさん mailto:sage [2010/01/14(木) 23:15:28 ]
>>670
その「特定の非ASCII文字」が何かによって答えは変わる。
シフトJISにない文字なんじゃないかと思うが如何?

678 名前:デフォルトの名無しさん mailto:sage [2010/01/15(金) 00:13:11 ]
>>644
RackやRackに基づいたもので、普通のCGIは作れるのでしょうか?
調べてみても、mod_railsとかmongrelとかの環境を作らないと
動かせないように見えるのですが...

679 名前:デフォルトの名無しさん mailto:sage [2010/01/15(金) 00:20:18 ]
>>678
できる
できるが、rack/cgi はリリースされても全く動かなかったことがある
(つまり誰も本気でテストしてなかった)というヤな過去があって

つまり誰もやってないんだよね
理屈上はできるし理屈上はRackでやるとキレイなんだけど、
CGI作るということ自体がもうあまり流行らないから

680 名前:デフォルトの名無しさん mailto:sage [2010/01/15(金) 00:28:29 ]
>>671

D:\tmp\r>ruby -e "p ARGV" D:\tmp\r\本/*
["D:\\tmp\\r\\本/*"]

D:\tmp\r>ruby -e "p ARGV" D:\tmp\r\表/*
["D:\\tmp\\r\\表/*"]

D:\tmp\r>ruby -e "p ARGV" D:\tmp\r\漢/*
["D:/tmp/r/漢/新規テキスト ドキュメント.txt"]

漢字の2バイト目が\とか{とか



681 名前:デフォルトの名無しさん mailto:sage [2010/01/15(金) 02:40:12 ]
とりあえずバージョンを書いて
1.8.7p160だと問題なかった

pの出力で日本語が出てることをみると1.9系だと思うが
1.9.1p243だと >>680 と同じ状態

Dir.glob に渡した時はちゃんと展開されるが
コマンドライン引数を展開する時はダメなんだね
UNIXだとコマンドライン引数のワイルドカードはシェルが展開するから、開発者には気付かれにくいのだろう

昔の1.8は Dir.glob自体がSJISに完全対応してなくて、コマンドライン引数にも同様の不具合があったけど
今回のはコマンドライン引数の時だけの不具合なのか


682 名前:デフォルトの名無しさん mailto:sage [2010/01/15(金) 03:16:56 ]
def set_select_quests
for i in 0..9
quest_number = rand(10)
@select_quests |= quest_number.to_a if select_quests_flag(quest_number)
end
end

def select_quests_flag(index)
return false if @select_quests.include?(index) #・・・@
return true
end

@で@select_questsに同じ要素が入っている場合falseを返す様にしたいのですが
この場合include?(val)メソッドしかないですよね?
なんかうまく動かないんですがどこか間違ってますか?

683 名前:デフォルトの名無しさん mailto:sage [2010/01/15(金) 03:29:47 ]
>>682
@select_quests << quest_number if select_quests_flag(quest_number)
かな

684 名前:デフォルトの名無しさん mailto:sage [2010/01/15(金) 04:05:24 ]
>>654
え、うそ!!!1
RubyGemsが遅いのってmswin32版のせいなの???
くっそー今まで散々苦労してきたのにー
確かにcoLinuxとかだとめっちゃ早いと思ってたわ。
mingw版だと早い?、とか

685 名前:デフォルトの名無しさん mailto:sage [2010/01/15(金) 06:38:43 ]
とりあえずgemはバージョンが古かったら
サーバ側でバージョンが古いと怒って欲しい

686 名前:デフォルトの名無しさん mailto:sage [2010/01/15(金) 07:35:58 ]
>>685
おう、そういう機能入れたから、rubygem をアップデートしてくれ

というわけで鶏と卵だ

687 名前:デフォルトの名無しさん mailto:sage [2010/01/15(金) 07:43:14 ]
>>682
def initialize
@select_quests = Array.new
...
end

def set_select_quests
(0..9).each.do |i|
quest_number = rand(10)
# @select_quests に quests_number が含まれてなかった場合追加する
@select_quests << quest_number if @select_quests.include?(quest_number)
end
end

688 名前:デフォルトの名無しさん mailto:sage [2010/01/15(金) 08:06:58 ]
>>687のifはunlessの間違いだと思う冬の朝

689 名前:デフォルトの名無しさん mailto:sage [2010/01/15(金) 20:25:24 ]
rubyはwindowsで動かすとどうして遅いの?
ずーと前からみたいだけど直すきないの?

690 名前:デフォルトの名無しさん mailto:sage [2010/01/15(金) 20:28:45 ]
開発者がアウトオブ眼中だから



691 名前:デフォルトの名無しさん mailto:sage [2010/01/15(金) 20:29:00 ]
>>689
なんでWindozeを使ってるの?
LinuxやBSDやSolaris使えばいいだけじゃないの?
文句言ってるだけで何も行動しようとしないのはなんでなの?

692 名前:682 mailto:sage [2010/01/15(金) 20:46:00 ]
ありがとうございました
うまくいきました

693 名前:デフォルトの名無しさん mailto:sage [2010/01/15(金) 20:46:26 ]
>>689
めんどくさいから
いやマジで
誰にでも絶対に起こるなら直されると思うんだが実際はそうではない

694 名前:デフォルトの名無しさん [2010/01/15(金) 20:50:00 ]
>>689
>>691みたいな人ばっかりだから

695 名前:デフォルトの名無しさん mailto:sage [2010/01/15(金) 20:55:02 ]
>>693
だよね
むしろ嫌がらせっぽい

696 名前:デフォルトの名無しさん mailto:sage [2010/01/15(金) 21:26:17 ]
WindowsOSがやめられないので、ちょっとずつPythonに移行し始めたよ。
既存のクラスにメソッド追加したり、injectとかがちょっと使いづらい以外不満はない。

697 名前:sage [2010/01/15(金) 21:29:39 ]
Pythonたんは、純粋なオブジェクト指向じゃないよね。
len() とか気持ち悪い。

698 名前:デフォルトの名無しさん mailto:sage [2010/01/15(金) 21:37:14 ]
>>697
最初はそう思ってたけど慣れればそんなもんかって思えるよ。
あとは、三項演算子やcase文がないのがちょっと残念くらいなもんか。

699 名前:デフォルトの名無しさん mailto:sage [2010/01/15(金) 21:38:39 ]
>純粋なオブジェクト指向
Rubyも「+」とか「end」はオブジェクトじゃないよね

700 名前:デフォルトの名無しさん mailto:sage [2010/01/15(金) 21:41:20 ]
>699
不完全性定理というのがあってだな



701 名前:デフォルトの名無しさん mailto:sage [2010/01/15(金) 22:19:11 ]
文字列をn文字ずつ&1文字ずつに分割したいのですが
x = "ABCDEFGHIJKLMNOPQRSTUVWXY"
x = x.scan(/.{5}/)
x.collect!{|y|y.scan(/./)}
p x
=>[["A","B","C","D","E"],["F","G","H","I","J"],["K","L","M","N","O"],["P","Q","R","S","T"],["U","V","W","X","Y"]]
みたいに書くと都度、正規表現によるマッチが行われるので遅いです
もっと高速に実行する方法があったら教えてください。よろしくお願いします

702 名前:デフォルトの名無しさん mailto:sage [2010/01/15(金) 22:20:42 ]
まあ俺は自分の仕事が片付けばいいだけだから
オブジェクト指向の純粋さなんてどうでもいいわ


703 名前:デフォルトの名無しさん mailto:sage [2010/01/15(金) 22:31:44 ]
>>701
x.chars.each_slice(5).to_a とか。
Benchmark.bm で1万回ずつやった時間を比較したら半分弱の時間だった。


704 名前:デフォルトの名無しさん mailto:sage [2010/01/15(金) 22:37:37 ]
>>701
x.split(/.{5}/)
x.split(//)

がたぶん一番速い
これでも遅いという場合はそもそもそんな莫大な配列を文字から作る理由は何というとこから

705 名前:デフォルトの名無しさん mailto:sage [2010/01/15(金) 23:10:56 ]
>>704
そもそも要件を全然満たしてない件

706 名前:デフォルトの名無しさん mailto:sage [2010/01/15(金) 23:17:57 ]
enumeratorと配列の違いって何ですか?
なんとなく大体同じもののように思えるんですが

707 名前:デフォルトの名無しさん mailto:sage [2010/01/15(金) 23:42:36 ]
超巨大な集合から1つずつ取り出そうとしたとき、Enumeratorは全部を
覚えていなくてもいいぞ。
alphabets = %w(a b c d e f g h i j k l m n o p q r s t u v w x y z)

alphabets.combination(13).first(5) は造作もないが
alphabets.combination(13).to_a.first(5) はたぶんメモリ足りない。


708 名前:デフォルトの名無しさん mailto:sage [2010/01/16(土) 00:46:48 ]
>>706
数えられて、返ってくる順番が保証されないのがEnumerator
Enumeratorを継承してるので数えられて、しかも順番情報を保持するようにしたのがArray

こう考えるとSetの出番がないんだがまあ誰も覚えてないし誰も使ってないと思うので気にするな

709 名前:デフォルトの名無しさん mailto:sage [2010/01/16(土) 12:34:07 ]
>>701
シングルバイト文字限定でいいのかな?
であれば

x = "ABCDEFGHIJKLMNOPQRSTUVWXY"
res = [[]]
x.each_byte do |b|
if res[-1] < 5
res[-1] << b.chr
else
res << []
end
end

で,どうでしょう?

710 名前:デフォルトの名無しさん mailto:sage [2010/01/16(土) 14:39:59 ]
ruby1.9の正規表現で,\wがマルチバイト文字にヒットしてくれません。
以下のコードはなにか間違っていますでしょうか?

# coding: cp932
p "日本語" =~ /\w/s #=> nil

鬼車のドキュメントには\wは多バイト文字にマッチすると書かれているのですが。
ttp://www.geocities.jp/kosako3/oniguruma/HISTORY_5X.txt



711 名前:デフォルトの名無しさん mailto:sage [2010/01/16(土) 14:44:55 ]
\w は Ruby では元々 [0-9A-Za-z_] という意味のメタ文字だったので、
1.9 でもそうなってる。

712 名前:デフォルトの名無しさん mailto:sage [2010/01/16(土) 14:51:19 ]
>>711
Thanksです。
マルチバイト文字を含めた単語構成文字にマッチするナイスな正規表現ってありませんか?

あとドキュメントのURLが間違ってました。
ttp://www.geocities.jp/kosako3/oniguruma/doc/RE.ja.txt

713 名前:710 mailto:sage [2010/01/16(土) 14:58:14 ]
自己レスです

# coding: cp932
"日本語" =~ /\p{Word}/s

でいけました。

714 名前:デフォルトの名無しさん mailto:sage [2010/01/16(土) 15:02:56 ]
たしか ¥d が漢数字にマッチしてしまって使いにくくなってたので
その種のは使い分けるようになったんだっけ?


715 名前:デフォルトの名無しさん mailto:sage [2010/01/16(土) 17:22:03 ]
>>709
1.9系なら↓でマルチバイトもOK

x = 'あいうえおかきくけこさしすせそ'
res = []
x.each_char.each_slice(5){|a| res << a}

716 名前:デフォルトの名無しさん mailto:sage [2010/01/16(土) 17:29:26 ]
これでもできるな

x = 'あいうえおかきくけこさしすせそ'.each_char.each_slice(5).map{|a| a}

717 名前:デフォルトの名無しさん mailto:sage [2010/01/16(土) 17:32:17 ]
Windowsのユニコードのファイル名が扱えるライブラリはありますか?

718 名前:デフォルトの名無しさん mailto:sage [2010/01/16(土) 17:33:00 ]
>>717
ありません

719 名前:デフォルトの名無しさん mailto:sage [2010/01/16(土) 17:38:28 ]
いやいやいやいや、直接API呼べば問題ないからさ
そういうライブラリがrubygemsあたりにでもないかという話だろう

でもこれで困るの日本人とかだからなー

720 名前:701 mailto:sage [2010/01/16(土) 18:50:38 ]
レスありがとうございます
>>703の方法が一番早いようなのでこれを使わせてもらいます



721 名前:デフォルトの名無しさん [2010/01/17(日) 10:37:45 ]
皆さんはRubyのコードを何で書いてるのでしょう?
やっぱり、Emacs or vim?

補完が効くのが良いのですが・・・・


722 名前:デフォルトの名無しさん mailto:sage [2010/01/17(日) 10:48:27 ]
Emacsが無難ということに一応なってはいる

適当な統合環境が快適に動作する環境なのなら、エディタ部のコード書きの補完機能だけ使うのも悪くはない
Emacsを一度も使ったことがなくて基本キー操作から覚えなければならないというのだとすれば尚更

Emacsが好まれてるのはエディタの軽さの範疇を実際上は超えてないというのが大きい
もしEclipseやNetBeansが超サクサク動作だったならEmacsは時代遅れ度を2段階くらい上げていたはず

723 名前:デフォルトの名無しさん mailto:sage [2010/01/17(日) 11:02:32 ]
Emacsは現代的なIDEが提供するところの補完機能を厳密にはもってない
…まあ、実用上はそれほど困らないが

724 名前:デフォルトの名無しさん mailto:sage [2010/01/17(日) 11:35:27 ]
拙者は秀丸でござる。
感謝の意を込めてちゃんと送金したでござる。

725 名前:デフォルトの名無しさん mailto:sage [2010/01/17(日) 11:35:48 ]
Emacs で指がつったら vim も試してみてね by vim厨

726 名前:デフォルトの名無しさん mailto:sage [2010/01/17(日) 11:46:52 ]
>>721
主にNetBeans使ってる。IDE厨なのでw

ただし、NetBeansの最新の6.8はいろいろとバグが・・・

727 名前:デフォルトの名無しさん mailto:sage [2010/01/17(日) 11:57:45 ]
俺もいわゆるスクリプト程度しか書かないからEmacsで十分だな
でもたしかにIDEがエディタ同様に軽ければそっち使うかも

728 名前:デフォルトの名無しさん mailto:sage [2010/01/17(日) 12:36:38 ]
通常のエディタでは慣れてくると物足りない(プログラミング初心者は補完のないエディタでやること)
IDEはおおむね重いし遅いしプロジェクトとかそんなのが必要な大作ばかり作るわけじゃないから邪魔

というところにすこんと入るのがEmacs
全部できるが余分で煩雑で重い、というものを使うよりは、
やや足りなくて手作業が入るが軽快、のほうを選ぶ人は意外と多い

729 名前:デフォルトの名無しさん mailto:sage [2010/01/17(日) 13:17:32 ]
emacs自体あんまり使わないんだけど、ショートカットキー一発で
全体を整形&フィリング(emacsではこういうのかな)できる設定ないかしら。

730 名前:デフォルトの名無しさん mailto:sage [2010/01/17(日) 13:20:51 ]
あるお。
俺はCtrl-x hとかしたあと、Ctrl+Alt+\を押してる。
フィリング?は知らんけど。



731 名前:デフォルトの名無しさん mailto:sage [2010/01/17(日) 13:20:54 ]
結局>>717は無いの?

732 名前:デフォルトの名無しさん mailto:sage [2010/01/17(日) 13:21:05 ]
class C
 def hoge
  とても長いメソッド...
  local_var = value #<= ここだけを書き換えたい
  ...
 end
end

メソッド定義内のローカル変数たった一行を書き換えたいんです。
とても長いメソッドなので,class_eval{def...無意味なコピペ...end}をしたくありません。
スパッと書き換えることはできませんか?

とりあえずSCRIPT_LINES__とripperを使えば20行くらいでできるのですが,
もっとストレートな方法があるかもしれないと思い質問しました。
ちなみにbindingを使った実験には失敗しました。
よろしくお願いします。

733 名前:デフォルトの名無しさん mailto:sage [2010/01/17(日) 14:05:33 ]
>>731
本スレ行って聞いてみたら

734 名前:デフォルトの名無しさん mailto:sage [2010/01/17(日) 14:22:30 ]
Emacs が軽快とか隔世の感、とか言うのは多分年寄り。

735 名前:デフォルトの名無しさん mailto:sage [2010/01/17(日) 14:32:07 ]
今は通信速度が速いから、Emacs も簡単にダウンロードできる。
昔はフロッピーで小分けにして、配布してたな。

736 名前:デフォルトの名無しさん mailto:sage [2010/01/17(日) 14:36:14 ]
>>731
Perlの↓相当がgemにあればいいんだろうけど
perl-users.jp/articles/advent-calendar/2009/hacker/20.html
いまgemでサーチかけた感じだとなさそう

必要なら↑を参考にしてRubyにportしたら?

737 名前:デフォルトの名無しさん mailto:sage [2010/01/17(日) 14:46:29 ]
>>731
1.9.2で扱えるようになるかも、ってことらしい
blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/45826

738 名前:デフォルトの名無しさん mailto:sage [2010/01/17(日) 14:54:30 ]
>>731 >>736-737
あれ、WindowsだとUNICODEファイル名ダメだったのかー
gemでモンキパッチみたいに簡単にWindowsのときだけOKにできるのとかあったら便利そうだね。
システムの根底だから難しいのかね

739 名前:デフォルトの名無しさん mailto:sage [2010/01/17(日) 20:48:07 ]
>>736-738
ありがとう。だが初心者にはハードル高すぎ
1.9.2に期待しまつ。いつごろ出るんだろ?今年の春頃?


740 名前:デフォルトの名無しさん mailto:sage [2010/01/17(日) 20:52:56 ]
一応「もう出てる」レベルではあるんだが、Windowsでは自力でソースからコンパイルしないといかん
rubygemsとかも未対応で動作しない可能性も大きい
しばらく前の1.9.1状態

来年くらいには使える状態になってるんじゃないかなあ



741 名前:デフォルトの名無しさん mailto:sage [2010/01/17(日) 21:21:56 ]
なんか直接いじればどうにかなりそうな気はするんだけどねえ

742 名前:デフォルトの名無しさん mailto:sage [2010/01/17(日) 21:54:31 ]
すいません、これ↓を使いたいんですが、何から始めればいいのか教えてください。
ttp://gist.github.com/211635

743 名前:デフォルトの名無しさん mailto:sage [2010/01/17(日) 22:12:49 ]
>>730
フィリングってのはこういうの。文章の段落内でESC qでできる。
# ながーーーーーい説明文菜がーーー否がーーー否がーーーーーーーーーーーーーーーーーーーーい

# ながーーーーーい説明文菜がーーー
# 否がーーー否がーーーーーーーーー
# ーーーーーーーーーーーい

んで、ソースコード全体を一発で整形&フィリングしたいのんよ。ruby-modeで。

744 名前:デフォルトの名無しさん mailto:sage [2010/01/17(日) 22:20:06 ]
>>742
見てわからんのならスクリプトがすこし違って詰まったときの対処も自力で全然できないということだから
素直に Ruby の勉強を進めたほうがいいような気がしないでもない

前情報として、Ruby の知識が全然ないのなら使えないよ
MySync GoogleContacts でぐぐると唯一出てくるから、
これをしたい場合は Ruby 上でこれを動かすしかないわけだけど、
まったくの一見さんが使えるようなクオリティにはそもそもなってない

を踏まえて
Ruby を適当にインストール、URL の Download からダウンロードして展開して、
au2gcontact.rb をてきとうなとこにコピー
その後、au2gcontact.rb 自身のファイルの文字コードを Shift_JIS というか CP932 に変換
MySync が吐き出したエクスポートの CSV(Shift_JISに変換済)を第 1引数に、
GoogleContacts に食わせたいファイル名を第 2引数にして、
ruby au2gcontact.rb mysync.csv output.csv
と実行
output.csv は ShiftJIS(というかCP932)だが、
これがそのまま GoogleContacts にでインポートできるかどうかまでは知らない

745 名前:742 mailto:sage [2010/01/17(日) 22:53:26 ]
なんかよくわからんまま試行錯誤したら一応の目的は達しました。ありがとうございました。以下俺メモです。

rubyをインストール。
ソース(っていうのかな?)をメモ帳にコピペ。拡張子を.rbに変える。
au2gcontact.rbとaddress.csv(←LismoPortが吐き出すやつ)とgcontact.csvをC:\Documents and Settingsに置く。
コマンドプロンプトからruby au2gcontact.rb address.csv gcontact.csv
出てきたのをgmailにインポートでおk。

いやーすごいですね。感動しました。ほんとありがとうございました。

746 名前:デフォルトの名無しさん mailto:sage [2010/01/18(月) 01:19:39 ]
>>743
Emacs のスレで聞いたら adaptive-fill-mode の使い方なり filladapt.el の後継なり
何か情報が入るんでない?

747 名前:デフォルトの名無しさん mailto:sage [2010/01/18(月) 03:41:47 ]
乗り遅れた感あるけど

vim+neocomplcacheでやっとります。

748 名前:デフォルトの名無しさん mailto:sage [2010/01/18(月) 09:32:46 ]
> rubyはwindowsで動かすとどうして遅いの?
Ruby 1.8.7-p174 の select が遅かった話じゃなくて?
www.garbagecollect.jp/~usa/d/200909c.html
Ruby 1.8.7-p249 にすれば直るよ。

> たしか \d が漢数字にマッチしてしまって使いにくくなってたので
Ruby 1.9.1 の初期はそうだったんだけど、この挙動はバグ扱いされて修正されたので、
Ruby 1.9.1-p378 にすれば直るよ。

749 名前:742 mailto:sage [2010/01/18(月) 09:33:49 ]
追記。適当なソフトでau2gcontact.rbの文字コード変換をshift jisに変換。

750 名前:デフォルトの名無しさん mailto:sage [2010/01/18(月) 15:18:11 ]
puts "日本語".inspect
とすると、"¥123¥456" みたいな表示なりますけど、これを "日本語" のままで表示させることはできませんか。



751 名前:デフォルトの名無しさん mailto:sage [2010/01/18(月) 15:35:00 ]
1.8.7 mswin32の場合

irb(main):001:0> puts "日本語".inspect
"\223\372\226{\214\352"
=> nil
irb(main):002:0> $KCODE = "s"
=> "s"
irb(main):003:0> puts "日本語".inspect
"日本語"
=> nil


752 名前:デフォルトの名無しさん mailto:sage [2010/01/18(月) 15:37:06 ]
-Kオプションの方がわかりやすいかもしれないと思い直した

>ruby -Ks -e'puts "日本語".inspect'
"日本語"

753 名前:739 mailto:sage [2010/01/18(月) 18:25:32 ]
1.9.2 preview1で試してみたけどダメだった

754 名前:デフォルトの名無しさん mailto:sage [2010/01/18(月) 18:35:12 ]
だからそういうふうにそもそも作ってないんだから標準で用意されたメソッドをどう使おうと絶対に駄目だって

755 名前:デフォルトの名無しさん mailto:sage [2010/01/18(月) 19:39:35 ]
火急的に困ってる人がいないんだろうね
見なかったことにするわけにもいかんと思うんだが、代替手段は何なのだろう
そこだけRubyを使わない?

756 名前:デフォルトの名無しさん mailto:sage [2010/01/18(月) 19:58:33 ]
1.9.2で扱えるようになるかも、ってことらしかったんで

757 名前:デフォルトの名無しさん [2010/01/18(月) 20:21:42 ]
#!ruby -Ku
require 'win32ole'
WIN32OLE.codepage = WIN32OLE::CP_UTF8
fso = WIN32OLE.new('Scripting.FileSystemObject')
a = fso.CreateTextFile("♡♥♡♥.txt", true)
a.WriteLine("This is a test")
a.Close()

758 名前:デフォルトの名無しさん mailto:sage [2010/01/18(月) 20:35:46 ]
笙。笙・笙。笙・.txt というファイルができました先生

759 名前:デフォルトの名無しさん mailto:sage [2010/01/18(月) 20:39:55 ]
u

760 名前:デフォルトの名無しさん mailto:sage [2010/01/18(月) 21:01:23 ]
環境とエディタによってはこのへんきちんと動作するように保存するのは微妙に難しいぞ
慣れればどうということもないんだが



761 名前:デフォルトの名無しさん mailto:sage [2010/01/18(月) 21:11:27 ]
おお! できました!! ありがとうございます!!!
これどうすればIOやDirで扱えるんですか?

762 名前:デフォルトの名無しさん mailto:sage [2010/01/18(月) 21:20:06 ]
>>761
扱えない
全部 WIN32OLE 内で完結させる必要がある
必要なのは Ruby の知識じゃないね

763 名前:デフォルトの名無しさん mailto:sage [2010/01/18(月) 21:33:40 ]
ですよねー...

764 名前:デフォルトの名無しさん mailto:sage [2010/01/18(月) 21:35:43 ]
最初と最後にリネーム処理かませば Ruby から扱うのも不可能ではないと思う

765 名前:デフォルトの名無しさん mailto:sage [2010/01/18(月) 22:55:11 ]
先生質問だよ質問

data = {/key/ => lambda{|m| "<#{m}>"}}


data.each_pair do |re, p|
 file.gsub!(re){|m| p.call(m)}
end

p file #=> key が <key> になってる

というような、
{正規表現 => キーのマッチ結果を便利に利用した結果の返り値またはただの文字列}
というデータを用いた連続置換をしたいのです
それで、data は外部から自由に与えたいのです

でも、よく考えたら lambda を作った時点では gsub の $1 も \1 もまだ無いから利用できないわけで
なにかうまい方法ないですか
eval ならなんとかなると思ったんだけど普通の置換後に使いたいだけの文字列も eval してしまいます

766 名前:デフォルトの名無しさん mailto:sage [2010/01/18(月) 23:47:16 ]
>>765
m = Regexp.last_match
puts m[0]
とかでできないかな?

あと
data.each_pair do |re, p|
 file.gsub!(re, &p)
end
でいいような気がするけど試してはいない。


767 名前:デフォルトの名無しさん mailto:sage [2010/01/18(月) 23:55:48 ]
こういうことだろうか。

to = data.each_pair.inject(from) {|result, pair| result.gsub(pair[0], &pair[1]) }


768 名前:デフォルトの名無しさん mailto:sage [2010/01/18(月) 23:59:30 ]
これではどう?

a = 'abc def'
data = [['(\w+)', '<\1>'], ['(> <)', '> < \1 > <']]
data.each{|reg, rep| a.gsub!(/#{reg}/, rep)}
a => "<abc> < > < > <def>"



769 名前:デフォルトの名無しさん mailto:sage [2010/01/19(火) 00:09:09 ]
>>768
なにそのわかりやすくしようとする気概をぜんぜん感じない例

770 名前:デフォルトの名無しさん mailto:sage [2010/01/19(火) 00:10:57 ]
>>765

766-768が書いているようにgsub!の第2引数で置換パターンを書いたほうが
単なるstringでパターンを渡せるので簡単だと思う

766,767が書いてるパターンの前の '&' って
どういう意味?



771 名前:デフォルトの名無しさん mailto:sage [2010/01/19(火) 00:21:13 ]
>>770
ttp://www.ruby-lang.org/ja/man/html/_A5E1A5BDA5C3A5C9B8C6A4D3BDD0A4B7.html

772 名前:デフォルトの名無しさん mailto:sage [2010/01/19(火) 00:26:03 ]
なるほどProcを渡してるのねthx
俺には768の方がわかりやすいな、例は見づらいが

773 名前:デフォルトの名無しさん mailto:sage [2010/01/19(火) 00:42:38 ]
だって先生が gsub はブロック使えって言ったんだもん言ったんだもん言ったんだもん

>>766-768
irb> data = {/k1/ => 'v1', /k(2)/ => 'v\1', /k3/ => lambda{|m| m.sub(/k/,'v')}}
irb> str = 'k1, k2, k3'
irb> data.each_pair do |re, p| p.kind_of?(Proc) ? str.gsub!(re, &p) : str.gsub!(re, p) end
irb> p str
"v1, v2, v3"

思ったことに近いことができましたーうおー
助かりましたせんきゅうです

774 名前:デフォルトの名無しさん mailto:sage [2010/01/19(火) 03:46:28 ]
1byte文字以外をマッチする方法を教えてください
s="123123456456"
s.gsub!(/〜/){|c|
uni_enc(c)
}
p s
=>
123%uFF11%uFF12%uFF13456%uFF14%uFF15%uFF16
みたいに1byteじゃない文字だけ変換して置換したいです
よろしくお願いします

775 名前:デフォルトの名無しさん mailto:sage [2010/01/19(火) 06:56:24 ]
$KCODE='s'
s="123123456456"
s.gsub!(/./){ |ch|
(ch.length==2) ? "(#{ch})" : ch
}
puts s;

776 名前:デフォルトの名無しさん mailto:sage [2010/01/19(火) 07:36:20 ]
1バイトじゃない文字だって言ってるのにわざわざ2バイトをチェックするとはこれいかに

777 名前:デフォルトの名無しさん mailto:sage [2010/01/19(火) 14:27:57 ]
# coding: sjis
# Ruby1.9以降か正規表現エンジンに鬼車を使用

s="123123456456"
s.gsub!(/[^\p{ASCII}]/){|c|
"%u"+c.encode('utf-8').ord.to_s(16)
}
p s

778 名前:デフォルトの名無しさん mailto:sage [2010/01/19(火) 17:08:32 ]
test = {"うし"=>5, "うま"=>3, "うし"=>1, "うし"=>2, "うま"=>4}
test.each{|key, val|
}

これを実行したら最後二つの"うし"=>2と"うま"=>4しか処理が実行されないんですが
キーの要素が一緒だと前にある奴は消されてしまうんですか?
またこれをハッシュの数分だけ実行させることはできないんでしょうか?

779 名前:デフォルトの名無しさん mailto:sage [2010/01/19(火) 17:22:15 ]
>778
ハッシュの意味を勉強してこい

780 名前:デフォルトの名無しさん mailto:sage [2010/01/19(火) 17:30:11 ]
配列の配列を使う方法
test = [ ["うし", 5], ["うま", 3], ["うし", 1], ["うし", 2], ["うま", 4] ]
test.each {|k, v| use(k, v) }

値が配列になったハッシュを使う方法
test = {"うし"=>[5, 1, 2], "うま"=>[3, 4] }
test.each {|k, a| a.each {|v| use(k, v) } }




781 名前:デフォルトの名無しさん mailto:sage [2010/01/19(火) 17:44:49 ]
文字列
a0-0 a0-1 a0-2 a0-3
a1-0 a1-1 a1-2 a1-3
a2-0 a2-1 a2-2 a2-3

から任意が選ばれた配列a
a=["a0-0","a2-2","a2-3"]
より、
配列bを作成したいのですが、
なにか良い方法はないのでしょうか?

b=[[1,0,0,0],[0,0,0,0],[0,0,1,1]]


782 名前:デフォルトの名無しさん mailto:sage [2010/01/19(火) 17:51:33 ]
只今から上位エスパー召喚の儀を執り行う

783 名前:デフォルトの名無しさん mailto:sage [2010/01/19(火) 17:54:09 ]
"a0-0" → [1, 0, 0, 0]
"a2-2" → [0, 0, 0, 0]
"a2-3" → [0, 0, 1, 1]

という対応があるように見えるのだが、2つめは [0, 0, 1, 0] ではない?
どういうルール?



784 名前:デフォルトの名無しさん mailto:sage [2010/01/19(火) 17:55:50 ]
>>782
失敗してるぞw

785 名前:デフォルトの名無しさん mailto:sage [2010/01/19(火) 17:58:38 ]
こうだな

a=["a0-0","a2-2","a2-3"]

b = Array.new(3){ Array.new(4, 0) }
a.each do |x|
if /a(\d)-(\d)/ =~ x
b.push[$~[1].to_i][$~[2].to_i] = 1
end
end
p b #=> [[1, 0, 0, 0], [0, 0, 0, 0], [0, 0, 1, 1]]


786 名前:デフォルトの名無しさん mailto:sage [2010/01/19(火) 18:00:09 ]
>>782
成功したぞw

787 名前:785 mailto:sage [2010/01/19(火) 18:00:44 ]
ごめん。こうだったね。
> b.push[$~[1].to_i][$~[2].to_i] = 1
b[$~[1].to_i][$~[2].to_i] = 1


788 名前:デフォルトの名無しさん mailto:sage [2010/01/19(火) 18:02:57 ]
>>783
a0-0 は配列aにあるから 1
a0-1 はないから0
a0-2 はないから0
a0-3 はないから0
これにより[1,0,0,0]です。

a2-0 はないから0
a2-1 はないから0
a2-2 はあるから 1
a2-3 はあるから 1
これにより[0,0,1,1]です。

このようなルールです。

789 名前:デフォルトの名無しさん mailto:sage [2010/01/19(火) 18:26:34 ]
>>785
ありがとうございます。
この方法で問題なく解決しました。

790 名前:デフォルトの名無しさん mailto:sage [2010/01/19(火) 22:18:49 ]
こういう3択クイズで選んだ結果をファイルに出力して、解答ファイルと照らし合わせる場合
どうすればいいのでしょうか?

require 'cgi'
c = CGI..new
hoge = c["va"]
print "Content-type: text/html; charset=EUC-JP\n\n"
print "<html><head><title></title></head><body>\n"
print "<p>"
if hoge == 1
print "<p>問題1</p>\n"
print"<form method=\"POST\" action=\"./test.rb\">\n"
print"<input type=\"radio\" name=\"va\" value=\"2\">ア
print"<input type=\"radio\" name=\"va\" value=\"2\">イ
print"<input type=\"radio\" name=\"va\" value=\"2\">ウ
print"<input name=\"ok\" type=\"submit\" value=\"OK\">\n"
print"</form>\n"
elsif hoge == 2

end
print "</p></body></html>\n"



791 名前:デフォルトの名無しさん mailto:sage [2010/01/19(火) 22:32:03 ]
>>790
Rubyは基本、HTTPのクエリ文字列とかを隠蔽しない
そのときどんなデータがどのように送られてくるものなのか、HTTPの勉強をするといいぞ

792 名前:デフォルトの名無しさん mailto:sage [2010/01/19(火) 23:06:30 ]
>>791
ありがとうございます
勉強して何とかやってみます

793 名前:デフォルトの名無しさん mailto:sage [2010/01/20(水) 08:35:06 ]
>>791
事実だから仕方ないが、あんま威張ることじゃないけどねえ
Railsで作ってRailsで表示してRailsで受け取れば抽象度高くできそうだが、もうCGIではないな

794 名前:デフォルトの名無しさん mailto:sage [2010/01/20(水) 08:36:21 ]
そりゃ言語としてWEBだからって何かするのはPHPくらいだろう。


795 名前:デフォルトの名無しさん mailto:sage [2010/01/20(水) 08:49:20 ]
あほまるだし

796 名前:デフォルトの名無しさん mailto:sage [2010/01/20(水) 12:53:24 ]
質問です!
文字列を受け取ってスペースと記号を削除した文字列を返すメソッドを作りたいんですが
どうすればいいでしょうか?
ちなみに条件はgsubメソッドをつかうこと
記号は全角も半角も含む(","とか"。"とか"?"とか"?"とか)
どなたかお願いします


797 名前:デフォルトの名無しさん mailto:sage [2010/01/20(水) 12:56:49 ]
>>796
Rubyの宿題教えてください。2限目
pc12.2ch.net/test/read.cgi/tech/1200175247/

798 名前:デフォルトの名無しさん mailto:sage [2010/01/20(水) 13:10:06 ]
>>797
スレ違いでしたね
すいません
わざわざありがとうございます

799 名前:デフォルトの名無しさん mailto:sage [2010/01/20(水) 13:48:31 ]
RDEは軽いからお手軽なGUIのirbみたいなイメージで
自作メソッドとかの動作確認的な風に使うな

800 名前:デフォルトの名無しさん mailto:sage [2010/01/20(水) 14:45:43 ]
railsを勉強しようと思うんですが、初心者向けで
お勧めの本はありますか?あるいは、これは読んで
おくべき本でも構いません。

Webでいろいろ読んだのですが、modelのassociation
やAjaxが難しく感じました。




801 名前:デフォルトの名無しさん mailto:sage [2010/01/20(水) 14:50:41 ]
うむ、スレのテンプレすら読めんような注意力では何もかもが難しかろう

【Ruby】Ruby on Rails Part8
pc11.2ch.net/test/read.cgi/php/1252842574/

802 名前:デフォルトの名無しさん mailto:sage [2010/01/20(水) 14:53:24 ]
Railsの初心者スレってありそうでなさそうで需要ありそうだがやっぱめんどいからなしで

803 名前:デフォルトの名無しさん mailto:sage [2010/01/20(水) 16:16:05 ]
>>801
ありがとう。

804 名前:デフォルトの名無しさん mailto:sage [2010/01/20(水) 16:21:54 ]
>>800
初心者が最低限これだけあればまずはなんとかなる!って書籍を3つ。
というか俺が実際にRails初心者レベルで仕事で使った本

・RailsによるアジャイルWebアプリケーション開発
www.amazon.co.jp/dp/4274067858/

・Ruby on Rails 逆引きクイックリファレンス Rails 2.0対応
www.amazon.co.jp/dp/4839928266/

・Railsレシピブック 183の技
www.amazon.co.jp/dp/4797336625/

あとは、webサイトだけど公式のガイド。ちょっとしたわからんことはまずこれ見たら大体すむ
Ruby on Rails guides
guides.rubyonrails.org/

毎回聞かれてるんで、Railsスレテンプレに入れといていいと思うんだ・・・

805 名前:デフォルトの名無しさん mailto:sage [2010/01/20(水) 16:23:43 ]
質問いいでしょうか?
Ruby 1.8.7にて、ブロックつきメソッドの呼び出したブロックの返り値を得たいのですが、
ブロック内で
 return "UNKO!!"
すると、
 unexpected return (LocalJumpError)
と言われます。
 break "UNKO!!"
では問題ないようなのですが、これはこういうものなのでしょうか?

806 名前:デフォルトの名無しさん mailto:sage [2010/01/20(水) 17:03:26 ]
>>804
紹介ありがとう
とりあえずそれらと公式サイトで始めてみます

807 名前:デフォルトの名無しさん mailto:sage [2010/01/20(水) 17:04:09 ]
>>805
トップレベルでreturn使っていない?
def f(a)
a.each{ return 1 }
end

a = [1,2,3]
f(a) # これはだいじょうび
a.each{ return 1 } # でもこれはダメ


808 名前:805 mailto:sage [2010/01/20(水) 17:50:49 ]
>>807
ありがとうございます。
エラーでない方法をお聞きしたいというよりも、もう少し具体的に聞くべきでした。

こちらの期待する動作としては、
”UNKOoooooooOOOO!!”と”f is finisheeeeeeeedddddd!!111”ともに表示させたいのです。
breakの代わりにreturnだと”f is finisheeeeeeeedddddd!!111”が表示されませんよね・・・?(fから抜けてる?)

実際のコードではa.eachではなくeachの代わりに自分で定義したブロックを必要とするメソッドを呼び出してます

def f(a)
  puts a.each{ break "UNKOoooooooOOOO!!" }
  puts "f is finisheeeeeeeedddddd!!111"
end

a = [1,2,3]
f(a) # これはだいじょうび
#a.each{ return 1 } # でもこれはダメ

809 名前:デフォルトの名無しさん mailto:sage [2010/01/20(水) 18:01:04 ]
breakはブロックの脱出、returnはメソッドの脱出ってこと
だからそのfの中でretrunを使ったら内部ブロックでだろうとfを脱出する

同様にこれも無理
def f
 break
end
f

810 名前:デフォルトの名無しさん mailto:sage [2010/01/20(水) 18:09:10 ]
ある案件で始めてRubyをいらうことになったのですが、
訳がわからず困っています。

取り合えず、"RailsによるアジャイルWebアプリケーション開発”のT部
HelloWorldプログラムを作成して動かすまでを試してみて、
ああ、PHPでSmarty使ってMVCモデルで作成するのを自動、徹底
してる感じだなと思い、そのまま本チャンプログラムに挑みましたが・・・

・まず、.rhtmlがTopページしかなく、MVCとも.jsファイルばかり。
・ブラウザに表示してソースコードを見てみると、1万行近い
 ソースコードで表示と一致していない。
・ブラウザのURL表示がページ遷移しても常に一緒。

と、始めて見る構成でした。
私のRubyの理解が足りないと思い、U部以降を読み進めようと思いましたが
このプログラム構成が特殊だから、参考書読み進めても効果は薄く
それよりプログラムの解析を続けるべきでないかと思い直しました。

皆さんに質問ですが、こういった構成は一般的なのですか?
それなりにある手法ならば、読むべき参考書、検索のキーとなる
単語を教えていただけたらと思います。

要領得ない質問ですみませんがお願いします。。。



811 名前:デフォルトの名無しさん mailto:sage [2010/01/20(水) 18:17:27 ]
>>810
お前には絶対に無理だ

812 名前:sage [2010/01/20(水) 18:20:39 ]
せめて日本語で頼む。

813 名前:デフォルトの名無しさん mailto:sage [2010/01/20(水) 18:31:08 ]
>>804の罪は重い

814 名前:デフォルトの名無しさん mailto:sage [2010/01/20(水) 18:34:15 ]
これは俺でも煽る
直前読めずにスレのルールすら理解できないようでは駄目だろうな

815 名前:810 mailto:sage [2010/01/20(水) 18:51:22 ]
>>814
>関連スレやURLは>>2-5あたりを見てください。
>Ruby on Rails の質問は Webプログラミング板の Rails スレへ。

これですか?
もっと詳細に質問すべきだったのかもしれませんが、
個々のプログラムの質問以前に全体として???だったもんで。。。

>>810,813
つまり、初心者レベルでないから私には到底無理ってことですか?
それならそれで上にそう報告しますので助かります。
それでもやれって言われそうですが・・・。

逆に、参考書読んだらわかるようなことを質問するなというのであれば
すみません。
参考書、全部読んでみます。

取り合えず、初心者参考書レベルの問題なのかだけでも教えて下さい。

816 名前:デフォルトの名無しさん mailto:sage [2010/01/20(水) 19:11:01 ]
>>815
君が書いてる質問の中に、Rubyそのものに関する話題は一切ない。
Railsスレへ行きなされ。

>>813が書いてるのは、たぶん、Railsスレへ行けということが示されてるのに
わざわざ餌を撒いてここに君を留まらせた罪が重いってこと。

817 名前:810 mailto:sage [2010/01/20(水) 19:13:22 ]
>>816
そうですね。。。
すいません。

Railsスレにいきます。
スレ汚し失礼しました。

818 名前:デフォルトの名無しさん mailto:sage [2010/01/20(水) 19:21:36 ]
>>817
読んでないことを期待するが、40パーセントくらいしか悪くないのでそれほど謝る必要はない
残り40パーセントは>>804で、残り20パーセントはたまたま重なったタイミング

819 名前:デフォルトの名無しさん mailto:sage [2010/01/20(水) 19:39:51 ]
>>808
eachごとの結果がほしいのなら
ブロックの外で定義した配列に
欲しい結果を入れておく。
またはブロックのto_aとか

701へのレス703, 709参照。

820 名前:804 mailto:sage [2010/01/21(木) 10:54:34 ]
俺の名誉のために言っておくが、>>810の言っていることは、
"RailsによるアジャイルWebアプリケーション開発”のサンプルコードの話じゃなくて、
>>810が取り組んでる仕事のコードだと思うぞ



821 名前:804 mailto:sage [2010/01/21(木) 10:55:31 ]
ごめん >>816-818読んでなかった。餌まいてスマソ

822 名前:805 mailto:sage [2010/01/21(木) 10:56:56 ]
ありがとうございます!

>>809
> breakはブロックの脱出、returnはメソッドの脱出ってこと

ああ!それです。まさにその1行が聞きたかったのです。
俺はもっとよい聞き方を憶えないといけないな・・・

823 名前:デフォルトの名無しさん mailto:sage [2010/01/21(木) 11:43:10 ]
こうして>>804はプライドも外聞もズタズタになったのであった。

824 名前:デフォルトの名無しさん [2010/01/21(木) 12:57:39 ]
1. ruby -e 'puts ARGF.read' file.txt
2. ruby -e 'puts $<.read' file.txt

1.の文では正しくfile.txtの内容が表示されるのですが、
2.の文で「指定されたファイルが見つかりません。」と怒られます。
リファレンスマニュアルの$<の項には
 「つまり定数 ARGF の別名。 」
と書いてあるので、
1.と2.で同じ結果を期待したんですけど。
どこが間違ってるんでしょうか?

Ruby1.9.1でOSはWindowsXPです。
よろしくお願いします。

825 名前:デフォルトの名無しさん mailto:sage [2010/01/21(木) 13:06:28 ]
あ,自己解決しました。
Windowsの<とか>とかってエスケープするか
""で括らなきゃいけなかったんでした。

1. ruby -e "puts ARGF.read" file.txt
2. ruby -e "puts $<.read" file.txt
または
2. ruby -e 'puts $^<.read' file.txt
なら同じ結果になりますね。
スレ汚しスマソ。

826 名前:デフォルトの名無しさん mailto:sage [2010/01/21(木) 13:10:22 ]
>>824
「指定されたファイルが見つかりません。」を出してるのは実はcmd.exeだ
「<」を誤認識してる

ということで cmd.exe から < をエスケープすればよい
cmd.exe のエスケープ文字は ^ だから、

ruby -e 'puts $^<.read' file.txt

827 名前:816 mailto:sage [2010/01/21(木) 14:12:27 ]
別に810や804を責めたいわけでもないんだが、質問と回答は
適切な場所でやった方がいいよ、ってことで。

828 名前:デフォルトの名無しさん mailto:sage [2010/01/21(木) 14:15:52 ]
>>826
すみませんすみません
ありがとうございました。

829 名前:デフォルトの名無しさん mailto:sage [2010/01/21(木) 14:33:03 ]
>>810
>・まず、.rhtmlがTopページしかなく、MVCとも.jsファイルばかり。
>・ブラウザに表示してソースコードを見てみると、1万行近い
> ソースコードで表示と一致していない。
>・ブラウザのURL表示がページ遷移しても常に一緒。
> と、始めて見る構成でした。

これはAjaxでページを作ってるんだろう。Railsうんぬんはさほど関係ない。

> 私のRubyの理解が足りないと思い、

いや、JavaScriptやAjaxの知識が足りないだけだと思う。

830 名前:デフォルトの名無しさん mailto:sage [2010/01/21(木) 14:34:48 ]
>>801



831 名前:デフォルトの名無しさん mailto:sage [2010/01/22(金) 17:50:52 ]
riっていらないよね

832 名前:デフォルトの名無しさん mailto:sage [2010/01/22(金) 17:58:09 ]
rubygem パッケージマニュアルとしての ri に関しては、「とりあえず入れておく」というようなもんでもないな既に
現時点で ri を利用してないのなら、 --no-ri で飛ばしてOK
基本的にロクなこと書いてないしソースを grep したほうがおおむね速いので、rdoc もなくてもいい
rdoc がきっちりしているライブラリのみ、マニュアル読む機会があるときだけ rdoc コマンドで構成するか、
あるいはネットで公開されてる rdoc を読めばいい

833 名前:デフォルトの名無しさん mailto:sage [2010/01/22(金) 19:04:47 ]
refeはいるけど、riはいらない

834 名前:デフォルトの名無しさん mailto:sage [2010/01/22(金) 19:13:46 ]
デフォで--no-ri -no-rdocしても特にデメリットはないね
インストール速いしディスクアクセスも少なくて済むしいいことだらけ

835 名前:デフォルトの名無しさん mailto:sage [2010/01/22(金) 19:37:04 ]
俺は.gemrcに書いたが、デフォルトでそうであれ、とまでは思わない。


836 名前:デフォルトの名無しさん mailto:sage [2010/01/22(金) 19:41:39 ]
自分の作るライブラリにはRDocをていねいに書く
自分がインストールするライブラリではrdocは使わない

837 名前:デフォルトの名無しさん mailto:sage [2010/01/22(金) 19:46:04 ]
日本語でいいならコメント書くんですがー

838 名前:デフォルトの名無しさん mailto:sage [2010/01/22(金) 19:54:48 ]
>>837
あちらさんの使ってるフォント自体に日本語文字がないから、本気で表示が崩れるぞ
外国語の文字も適当に表示できるフォントの認知度が高いのは日本くらいだ

839 名前:デフォルトの名無しさん mailto:sage [2010/01/22(金) 19:59:50 ]
とりあえず日本語でコメントを書きまくり、英語の得意な人がプロジェクトに参加してくれることを祈るというのはどう
英語でコメント書くの大変だって言うような人が作るライブラリなんて、どうせ最初に使うのは日本人が主だろうしさ

840 名前:デフォルトの名無しさん mailto:sage [2010/01/22(金) 20:14:17 ]
そうだな、とりあえず日本人向けオンリーででもまず本体クオリティ上げるのが第一かもしらん
英語ドキュメント書けないからと言って諦めるのはもしかしたら勿体無さ過ぎるかもしれない



841 名前:デフォルトの名無しさん mailto:sage [2010/01/22(金) 22:08:16 ]
質問です。ある1つのディレクトリ内にあるファイルを更新時間順にソートしてファイル名を連番(数字のみ)にしようと以下のコードを書きました。


def consecutivenum(path)
i = 1
files = Dir.glob("#{path}/*").reject{|name| FileTest.directory?(name)}
files.sort{|a, b|
File.mtime(a) <=> File.mtime(b)
}.each{|name|
File.split(name)[1] =~ /.+(\..+)/
File.rename("#{name}", "#{File.split(name)[0]}/#{i}#{$1}")
i += 1
}
end

実行するとファイルが消去されたりコピーされたりしてしまいます。
試しにDir.glob(#{path}/*)だけを実行したところ、存在しないファイル名が混じっていました。
また、そのファイルをFileTest.exist?に送るとtrueが返ってきます。Windowsの隠しファイルでもありませんでした。
何がどうなっているのかさっぱりわかりません。OSはVistaでRubyのバージョンは1.8.7です。
ご助力よろしくお願いします。長々と失礼しました。

842 名前:デフォルトの名無しさん mailto:sage [2010/01/22(金) 22:40:56 ]
> 存在しないファイル名が混じっていました
存在します

または、UNICODEファイル名です
UNICODEファイル名だった場合、Rubyから扱うことはできません

843 名前:デフォルトの名無しさん mailto:sage [2010/01/22(金) 23:30:17 ]
てか存在しないファイル名とか教えてくれりゃ結構一発だったり

844 名前:デフォルトの名無しさん mailto:sage [2010/01/22(金) 23:33:11 ]
察してください、まで読んだ

845 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 00:28:53 ]
>>842
>>843

ファイル名ですが、エクスプローラーやコマンドプロンプトのdirで確認できずにrubyで検出されたのは

6.jpg
2.ini

の二つです。

846 名前:841 mailto:sage [2010/01/23(土) 00:29:59 ]
失礼
>>845の書き込みは>>841の者です。念のため。

847 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 00:59:11 ]
本当に存在しないファイルなの?
そのディレクトリで
system('start 6.jpg')
ってやればjpegに関連付けられたアプリで 6.jpg が開くから確かめてみたら?


848 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 01:01:01 ]
あとは

dir /x

とか

849 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 01:08:43 ]
>>847
6.jpgについてはエラーが出ましたが、2.iniは開かれました。

>>848
6.jpg、2.iniいずれも出ませんでした

850 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 01:16:26 ]
2.iniがでてきたってことは、ファイル自体はあるってことだよね?
でもdirでは出てこないのか・・・謎だ・・・

require 'win32ole'
fso = WIN32OLE.new('Scripting.FileSystemObject')
fso.GetAbsolutePathName('2.ini')

とかしてみたら?



851 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 01:27:40 ]
>>850
さきほどまでのフォルダではなくtempフォルダのパスが出ました。
今度はそのtempフォルダで start 2.ini を実行しましたが開かれず、dirでも見つかりませんでした

852 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 01:35:45 ]
とりあえずスクリプトに
$KCODE = 'SJIS'
を付けて実行してみるべき

FileSystemObjectで見えているパスはWindowsで見えているパスなので
fso経由で2.iniが見えているのにdirで見えないのは、ちょっと不思議


853 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 01:48:34 ]
$KCODE = "SJIS"を付けてみましたが特に変わりないようです
(ただ、コンソールの作動場所のせいかスクリプトの保存場所のせいかまた別のパスが返ってきましたが)

>>850のスクリプトはなにを意味するのですか?2.iniの代わりに適当な文字列を入れてもパスが返ってくるのですが・・・


854 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 02:49:29 ]
まだいるかな?
attrib *.*
はどう?

855 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 02:52:21 ]
なんかの拍子にシステムファイルになったんじゃない?
フォルダオプション→表示→保護されたオペレーティング〜
のチェック外してみ

856 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 14:46:40 ]
dir で出てこなくて dir /a で出てくるなら
存在はしてるけど何らかの属性がついてて、そのせいでエクスプローラーに表示されないだけだな

857 名前:デフォルトの名無しさん [2010/01/23(土) 15:10:59 ]
./hoge.rb を実行するときに例えば ./hoge.rb --debug のようにしてデバッグモードにして
そのときだけ状態メッセージを print するためにはどのようにするのは ruby 的にエレガントでしょうか?


858 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 15:12:05 ]
もはやRubyとは関係ないな

859 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 15:43:41 ]
>>857
読み手にとっていちばん妥当なもの

require 'logger'
@log = Logger.new(@logfile||$stdout)

@log.debug "debug log message" if @log

書く人が楽だがメソッド名に独り善がり感またはどや顔が滲み出たもの

def D(msg)
return unless @debug_output
@debug_output << msg
@debug_output << "\n"
end

@debug_output = $stderr
D "debug log message"


後者のタイプで def LOG(msg) を時々見る

860 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 17:54:08 ]
>>859
ありがとうございます!
後者のDをDoyagaoとして使いたいと思います(違)^A^K二つの視点から例を出していただきとても参考になりました!



861 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 18:59:49 ]
>>841です

>>854-856
2.iniがシステムファイルとして存在していました。相変わらず6.jpgは見つかりません。


862 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 19:46:16 ]
どこにだよ
tempか?
最初のフォルダの中のファイルは全部連番に変わったのか?
tempのファイルも全部か?

863 名前:デフォルトの名無しさん [2010/01/23(土) 21:43:18 ]
ブロックスペシャルファイル(readするとバイト列が得られます)の長さを
調べたいのですが、実際にreadすることなしにこれを実現する方法はありますか?

パッと思いついたのは、openしてからファイルの末尾にseekして
先頭からのpositionを得るという方法ですが、他にはありますか。

864 名前:863 [2010/01/23(土) 21:46:20 ]
例えばこんな感じです:

File.open("/dev/sda") do |io|
 io.seek 0, IO::SEEK_END
 io.pos # /dev/sda のバイト列の長さ
end

865 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 21:49:18 ]
関数の外で@も@@も付けずに定義した変数はいったいどこに保存されるのでしょうか?

x = 10
def func
x = 20
end
func
puts x #=>10
これがxが20にならないので、最初に定義したxはグローバルには見えないどこかに閉じ込められてるのかな。

866 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 21:50:04 ]
>>863
完全にUNIX/Linuxプログラミングの話題じゃまいか

867 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 21:51:41 ]
>>866
を、Rubyで実現するにはどうすればいいですかという話だろう

868 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 21:53:55 ]
>>865
変数のスコープという概念を勉強してくれ
ごく端的に説明すると消えるというか、スコープを抜けるとアクセス不可になって取り出す手段がなくなる
def の「中」のローカル変数は def の「外」からはアクセスできない
だからメソッドの引数で「中」に入れてメソッドの返り値で「外」に出す

869 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 21:57:27 ]
File.statでサイズ読めないかね

870 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 22:02:55 ]
俺もそうおもた



871 名前:863 [2010/01/23(土) 22:03:17 ]
>>869
やってみたのですが size = 0 になっています。
statコマンドで調べても0バイトになっています。

そもそも、ブロックスペシャルファイルのバイト列の長さって、デバイス依存な気がします。
つまり「ファイルサイズ=バイト列の長さ」は成り立たない、ということかも知れません。

872 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 22:03:31 ]
$ sudo ruby -e "p File.stat('/dev/sda')"
#<File::Stat dev=0xe, ino=5003, mode=060660, nlink=1, uid=0, gid=6, rdev=0x800,
size=0, blksize=4096, blocks=0, atime=Sat Jan 23 18:12:33 +0900 2010,
mtime=Sat Jan 23 18:12:33 +0900 2010, ctime=Sat Jan 23 18:12:55 +0900 2010>


873 名前:863 [2010/01/23(土) 22:06:31 ]
>>872
ふむ、、やっぱり size = 0 ですね。。

バイト列の長さがデバイス依存(つまり不定値)なのは、よく考えてみればわかります。
/dev/null は常に長さ0ですし、/dev/zero は無限大。
難しいです。。

874 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 22:11:19 ]
そもそもなににつかうん

875 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 22:12:16 ]
やっぱりUNIXスレで聞いたほうがいいと思うんだ

カーネルとファイルシステムの知識が必要だし
Ruby初心者スレで聞くような話題じゃないよ

876 名前:865 mailto:sage [2010/01/23(土) 22:18:31 ]
>>868
ありがとうございます。
ただ、自分が不思議に思ったのは、外から関数内の変数にアクセスできないことではなく、
関数の外の変数に内側からアクセスできてないことです。
一般的に内側から外側の変数にはアクセスできると思うので。
x=20の段階で、外側の変数に代入するのではなく、新しい変数を作ってしまっているのが不思議なんです。

877 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 22:18:59 ]
>>876
変数のスコープという概念を勉強してくれ

878 名前:863 [2010/01/23(土) 22:19:06 ]
>>874
LVM の論理ボリュームのスナップショットを自動で作成しようかと。
ただし、論理ボリュームの大きさが:
・Xバイト以下だったら、それと同じ大きさのスナップショットを作成
・Xバイトより大きければ、Xバイトのスナップショットを作成

という処理をしたかったのですが、論理ボリュームの大きさを調べるために
外部のコマンドに投げるのは嫌だったので、どうせならデバイスファイルの中身の大きさを調べちゃえ、みたいな感じです。

>>875
すみません、そうします。
カーネルの知識はありませんが。。

879 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 22:22:19 ]
はいさよなら






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

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

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