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


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

Ruby 初心者スレッド Part 18



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

   【Ruby1.9 は不安定な開発版であり初心者には全く向きません】
   【最新安定版の Ruby1.8.6 の使用を強くお勧めします】

関連スレやURLは>>2-8あたりを見てください。Ruby on Railsの質問は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 [2008/02/22(金) 14:36:38 ]
【よくあるしつもん】
Q:
いちからRubyを始める初心者向けのRuby入門書は何がおすすめでしょうか?

A:
プログラム作成の初心者だったら
「たのしいRuby 第2版 Rubyではじめる気軽なプログラミング」
www.amazon.co.jp/dp/4797336617/
他の言語経験があるんだったら
「プログラミングRuby 第2版 言語編」
www.amazon.co.jp/dp/4274066428/


3 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 14:39:10 ]
■前スレ
Ruby 初心者スレッド Part 17
pc11.2ch.net/test/read.cgi/tech/1200472887/

■関連スレ
Rubyについて Part 30
pc11.2ch.net/test/read.cgi/tech/1200106073/

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

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

Ruby on Rails
pc11.2ch.net/test/read.cgi/tech/1191381506/

Rubyについて(アンチ専用) Part002
pc11.2ch.net/test/read.cgi/tech/1200210768/

4 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 14:40:19 ]
■公式/非公式関連リンク
Ruby Home Page
www.ruby-lang.org/ja/

Rubyリファレンス(よくサーバーエラーになります)
www.ruby-lang.org/ja/man/
www.ruby-doc.org/ (英語)

リファレンスのHTMLヘルプ版配布
elbereth-hp.hp.infoseek.co.jp/ruby.html
# Windowsで便利

Ruby FAQ
ruby-lang.org/ja/man/?cmd=view;name=Ruby+FAQ

Programming Ruby - The Pragmatic Programmer's Guide
www.ruby-doc.org/docs/ProgrammingRuby/
# 好評書籍をWebで公開中、ただし英語

逆引きRuby
www.namaraii.com/rubytips/


5 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 14:41:17 ]
RAA - Ruby Application Archive
raa.ruby-lang.org/

RubyForge
www.rubyforge.org/
# Rubyのアプリやライブラリが検索できる

日本Rubyの会 公式Wiki
jp.rubyist.net/
# メニューに表示されていない埋もれた情報ページ多数

Rubyist Magazine - るびま
jp.rubyist.net/magazine/
# コードレビューが好評

Ruby hotlinks 五月雨版(日記やblogのアンテナ)
www.rubyist.net/~kazu/samidare/

Rubyの本一覧
www.ruby-lang.org/ja/man/index.cgi?cmd=view;name=Ruby%A4%CB%B4%D8%A4%B9%A4%EB%BD%F1%C0%D2

<rubyXML/>
www.rubyxml.com/

Matzにっき(Ruby作者の日記)
www.rubyist.net/~matz/

6 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 14:42:08 ]
■最近できたWiki
Ruby 初心者スレッド Hiki
starlet.s145.xrea.com/ruby/hiki/

Ruby Portal
ruby.morphball.net/portal/


7 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 14:51:23 ]

テンプレ終わり


8 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 15:04:01 ]
   _,,....,,_  _人人人人人人人人人人人人人人人_
-''":::::::::::::`''> ゆっくりした結果がこれかよ!!   <
ヽ::::::::::::::::::::: ̄^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^ ̄
 |::::::;ノ´ ̄\:::::::::::\_,. -‐ァ
 |::::ノ   ヽ、ヽr-r'"´  (.__
_,.!イ_  _,.ヘーァ'二ハ二ヽ、へ,_7、
::::::rー''7コ-‐'"´    ;  ', `ヽ/`7
r-'ァ'"´/  /! ハ  ハ  !  iヾ_ノ
!イ´ ,' | /__,.!/ V 、!__ハ  ,' ,ゝ
`!  !/レi' (ヒ_]     ヒ_ン レ'i ノ
,'  ノ   !'"    ___   "' i .レ'
 (  ,ハ    /_ /   人!
,.ヘ,)、  )>,、 _____, ,.イ ハ

9 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 15:23:45 ]
         r'ニニニ二二二ニニニ、ヽ
         | |     .@     | |            ト、____, へ
      rー┤|           |├、          ヽ         }
      |   | |       Π    | | |        ≡三ーーーーァ   /
      l    l l     lニ  コ  .| | |         ≡    /  /
     |    l l      |_|    | | |        ≡三   ./  /
       l__l_l______|_|__|   っ     .≡ /  /
       | /  ,イ,へ 丶、       ヘ       ≡三./  /       ノ|
       | ,' / //  \| \ ト、 ヽ ',   つ  ≡{   丶ーーーー'  }
      !j./l /        ` ヽト、ヽ }         ゝ、_______丿
.     | | .!/.!  ○    ○ l l |ヽ,'    ⊃
       l | | .l/////////////! | !.|      
       .| ! | ト、  ,-ー¬   .ィ| .| l     こ、これは>>1乙じゃなくてバギクロスなんだから
        | l ! l l` r --.' <j ,' | |    変な勘違いしないでよね!
        | .l ', l |ャ-ミ≡彳ァトイ ,'! !   
      .| | ヽ| | l r´ )/ハy / | ',


10 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 15:29:55 ]
    < ̄ ̄ ̄>
       ̄>/
     / /
    /  <___/|
    |______/
        |
     /  ̄  ̄ \
   / ノ   \ \
  /  <●>::::::<●>  \  こ、これは乙じゃなくてエナジーボンボンなんだから
  | /// (__人__) /// |  変な勘違いしないでよね!
  \    ` ⌒´    /
  / ̄ ̄ ̄ ̄ ̄ ̄ ̄ \



11 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 15:40:31 ]
AA厨うぜえ

12 名前:デフォルトの名無しさん [2008/02/22(金) 17:48:57 ]
ifの条件をorで繋げて書いているのですが凄く長くなってしまいます、
途中で改行したいのですがどうしたらいいでしょうか?

13 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 18:10:07 ]
orが行末にくるように改行を入れる。

見やすさのためにthenを省略しないようにするといいかも。

14 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 18:43:09 ]
Rubyスクリプティングテクニック
― テスト駆動による日常業務処理術
www.oreilly.co.jp/books/9784873113562/

これいい本ですか?

15 名前:デフォルトの名無しさん [2008/02/22(金) 22:53:02 ]
>>13
ありがとうございます _ _綺麗になりました。

立て続けに質問すみません。
Ruby/Tkで部品(ラベル)を作成しその中のテキストを処理中に複数回変更したのですが、
即時に変更されず、一番最後の変更のみが反映されます。
バッファリングがなされているのかと思い、STDOUT.flashを間に挟んでみたのですが、うまくいきませんでした。
ご助言頂けると嬉しいです _ _

16 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 23:12:59 ]
>>15
Thread.start{処理}
ってして見るのはどうか。

17 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 10:48:38 ]
matlabから乗り換える言語の候補でrubyを考えてるのですが
行列計算やグラフのplotはRと連携するのでしょうか?
Rとの連携ってどこまでできるのでしょうか?

18 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 12:28:44 ]
>>17
うむ、Rでできることのほとんどについて、ロクにサポートできないといっていい

というか、matlabから移行する先としては不適当だろ
Rubyは単なる汎用なオブジェクト指向スクリプト言語に過ぎない

19 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 13:04:05 ]
matlabとは性質が全然違うと思う
octaveなら分かるがw

20 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 14:03:52 ]
組込クラスや標準ライブラリに木構造を扱うクラスが無いのはなぜでしょうか



21 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 15:00:05 ]
ネタにマジレス(ry

22 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 15:02:57 ]
>>17
Python で numpy 使うといいよ

23 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 16:12:50 ]
>>17
RSRuby
ttp://web.kuicr.kyoto-u.ac.jp/~alexg/rsruby/

24 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 16:40:25 ]
rushってどうよ?あなたのはづかしい体験談プリーズ
journal.mycom.co.jp/news/2008/02/22/042/index.html

25 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 20:00:55 ]
Rushはプログレハード

26 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 21:37:26 ]
RubyでJAVACCみたいなパーサ生成
モジュールってありますか?

AST扱える奴がいいのでつが

27 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 23:21:42 ]
今だと treetop とか。

28 名前:デフォルトの名無しさん [2008/02/24(日) 12:01:00 ]
>>26
Racc
Lex なら StringScanner または Ragel

29 名前:デフォルトの名無しさん mailto:sage [2008/02/24(日) 12:31:43 ]
>>28
フォロー。
Raccはyaccみたいなパーサジェネレータだから、ASTは自分で組む必要がある。

30 名前:デフォルトの名無しさん [2008/02/24(日) 12:47:04 ]
メール送信をしようと思って、
gemsを見たらメール関連のパッケージがたくさんあります
現在一番使われてるパッケージってどれですか?



31 名前:デフォルトの名無しさん mailto:sage [2008/02/24(日) 13:19:48 ]
…TMailかな

Rubyだけでもなんとかなると思うけれど

require 'nkf'
mail=<<EOM
From: #{@sender} <#{@from}>
To: <#{@to}>
MIME-Version: 1.0
Subject: #{NKF.nkf('-jM',@subject.tojis)}
Date: #{@now.rfc2822}
Content-Type: text/plain; charset=ISO-2022-JP
Content-Transfer-Encoding: 7bit

#{NKF.nkf('-Ej',@body)}
EOM

Net::SMTP.start(@smtp_server,25,@helo_domain){|smtp|
smtp.send_mail(mail, @from, @to)
}

32 名前:デフォルトの名無しさん mailto:sage [2008/02/24(日) 13:53:43 ]
テストツールの利用の仕方がよくわかりません

33 名前:デフォルトの名無しさん mailto:sage [2008/02/24(日) 14:08:46 ]
>>32
テストの知識がないとだめだよ
ソフトウェアテストをRubyでも行うというツールであって、ソフトウェアテストをRubyでも学べるというツールじゃない

タイミング的に
Rubyスクリプティングテクニック ― テスト駆動による日常業務処理術
ttp://www.oreilly.co.jp/books/9784873113562/
これを持ち出して「ただの初心者本であってテスト駆動云々については書いてないじゃん!」とかDisるのがよいぞ

「Rubyで学ぶテスト入門」とかいうのは需要はあると思うんだけどねえ

34 名前:デフォルトの名無しさん mailto:sage [2008/02/24(日) 14:17:54 ]
メソッド間の値の受け渡しのとこにてきとーな値と正しい答えのペアを持ってきて
メソッドが正しく動作するか検証するツールだろ

35 名前:デフォルトの名無しさん mailto:sage [2008/02/24(日) 14:20:44 ]
>>33
Rubyを256倍使うための本 極道編
というのがあるこたあるが、2001年というのはこの世界だと古文書だな。


36 名前:デフォルトの名無しさん [2008/02/24(日) 16:39:43 ]
>>32
「Ruby Test::Unit」または「RSpec」でぐぐれ


37 名前:デフォルトの名無しさん mailto:sage [2008/02/24(日) 16:40:08 ]
>>29
>Raccはyaccみたいなパーサジェネレータだから、ASTは自分で組む必要がある。
kwsk

38 名前:デフォルトの名無しさん mailto:sage [2008/02/24(日) 16:50:50 ]
>>36
そういう話ではないと思われ

39 名前:デフォルトの名無しさん mailto:sage [2008/02/24(日) 17:19:48 ]
>>33
「disる」とかいうのやめ

40 名前:デフォルトの名無しさん mailto:sage [2008/02/24(日) 21:48:25 ]
>>37
BNFとか書けばASTを完璧に組み上げる
パーサを生成してくれるわけじゃないという意味。
(というかそこまで出来たらコンパイラコンパイラ名乗って
いい気がする)

構文解析である文法規則に還元されたときの
処理は自分で書かないといけない。



41 名前:デフォルトの名無しさん mailto:sage [2008/02/24(日) 23:11:50 ]
>>40
それは Racc の説明であって JavaCC ではないという理解で OK?
もしそうなら、JavaCC はASTを自動で作ってくれるの?

42 名前:40 mailto:sage [2008/02/25(月) 00:53:05 ]
ぉk。

JavaCCのことはさっぱり。
ただ>>26の要求にRaccは微妙かなと思って。

43 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 06:21:28 ]
class Foo
 class <<self
 end
end

これの2行目の意味が良く分からないんですが・・・

44 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 06:32:09 ]
>>43
特異クラスの定義
Railsで時々見るな
ttp://www.ruby-lang.org/ja/man/html/FAQ_A5AFA5E9A5B9A1A2A5E2A5B8A5E5A1BCA5EB.html#a6.2e6.20.c6.c3.b0.db.a5.af.a5.e9.a5.b9.a4.c8.a4.cf.b2.bf.a4.c7.a4.b9.a4.ab


45 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 10:51:44 ]
すいません、クイッククエスチョン。

特異メソッドは特異クラスのサブクラスに継承されるけど
クラスインスタンス変数は継承されないよね?あってる?

46 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 11:27:47 ]
rhtmlファイルでシンタックスエラーがあるみたいなんですが、どこがエラーか分かりません。
調べる方法があればおしえてください。

47 名前:デフォルトの名無しさん [2008/02/25(月) 11:52:29 ]
ppよりもっとディープなインスペクション(そのインスタンスの
メソッドやプロパティーのリストまで表示したり)をするには
どうしたらいいですか?

48 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 11:52:45 ]
>>45
そんな感じだったような気がする

>>46
静的なファイルなのなら、コマンドラインからerbやerubyコマンドに渡せばいい
スクリプトで動的に生成されたものにエラーがあるという話なのならちょっと違う

~$ cat test.rhtml
<title>てすと</title>
<h1>Hello, <%= World %>.</h1>

~$ erb test.rhtml
(erb):2: uninitialized constant World (NameError)
~$ cat test.rhtml
<title>てすと</title>
<h1>Hello, <%= "World" %>.</h1>

~$ erb test.rhtml
<title>てすと</title>
<h1>Hello, World.</h1>


49 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 12:06:33 ]
>>47
よーわからんがここ読め
ttp://www.ruby-lang.org/ja/man/html/Module.html

irb> 'str'.class.instance_methods
["send", "between?", "%", "rindex", "reject", "[]=", "split", "<<",
"object_id", "strip", "size", "singleton_methods", "downcase", "gsub!",
"count", "succ!", "__send__", "downcase!", "intern", "member?", "squeeze!",
...
irb> require 'net/http'
irb> Net::HTTP.instance_variables
["@proxy_port", "@proxy_addr", "@proxy_pass", "@is_proxy_class", "@proxy_user"]

50 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 18:59:27 ]
#:nodoc: とか #.nodoc: ってなに?



51 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 19:31:31 ]
ドキュメントなんか書くものか!というRubyistの強い意志

52 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 22:34:11 ]
>>46
erb -x test.rhtml | ruby -wc
または
erubis -z test.rhtml
つーかここよめ
ttp://d.hatena.ne.jp/kwatch/20080222/1203680051

>>48
それはtest.rhtmlを実行しているだけなので、シンタックスエラーのチェックには向かない。


53 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 01:42:14 ]
ハッシュを使い回すのではなく、俺用データのクラスを作ろうと思いました
def initialize の中で、インスタンス変数を
@hoge=nil
@hage=nil
@fuga=nil
...
と15個くらい書いてるんだけど、initializeの時点でnil入れておくって無意味だよね?

54 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 02:22:09 ]
@hogeの使途が分からない俺たちにとってnilを入れておく事に意味が有るか無いかは判断できない

@ary = []
@ary.each{|e| p e}
ってやれば何も出力されないけど

@ary = nil
@ary.each{|e| p e}
ってやるとnilでっせって怒られる

いきなり
@ary.each{|e| p e}
ってやると@aryなんて知りまへんでって怒られる

俺は1番目を良く使うけどね

55 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 02:39:29 ]
>>54
自分でそのコード実行してみた?

56 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 02:42:47 ]
irb(main):001:0> nil.each{|e| p e}
NoMethodError: undefined method `each' for nil:NilClass
from (irb):1
from :0
irb(main):002:0> @hoge.each{|e| p e}
NoMethodError: undefined method `each' for nil:NilClass
from (irb):2
from :0
irb(main):003:0> @hoge = []
=> []
irb(main):004:0> @hoge.each{|e| p e}
=> []

57 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 02:51:17 ]
>>54
>いきなり
>@ary.each{|e| p e}
>ってやると@aryなんて知りまへんでって怒られる
インスタンス変数でなくローカル変数の場合はその通りなのだが
未初期化のインスタンス変数を参照した場合は nil となるはず

>>53
上記のことを踏まえての質問ということでおk?
やってもやらなくてもnilが入っているという意味ではその通りかも知れないが
クラスで用いるインスタンス変数を明示的に示しておくという意味では無意味ではないと思う

58 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 02:53:56 ]
>>55
インスタンス変数は「定義」しなくてもnilだってのは忘れられがちだよな

インスタンス変数の「定義」をinitializeでする意味はRuby的にはあまりないと思う

59 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 02:59:02 ]
厳密にはメソッドが追加されるからただの定義ではないけど attr_reader とか


60 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 02:59:28 ]
外部からアクセスされるなら直後のattrに名前が出るし
外部からアクセスされないインスタンス変数って一体

あ、サブクラスからアクセスしたいか



61 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 03:23:53 ]
>>60
外部からアクセスされないインスタンス変数はあっても全然おかしくないと思う
むしろすべての実装を外部からアクセスできるように公開する方がまずいのでは

62 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 03:28:17 ]
インスタンス変数は外部からアクセスしたいときにのみおもむろに使え、ということなのでは
それ以外ではメソッド引数とかで細々とやれと

63 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 03:42:22 ]
Rubyのスコープはちょっといろんな言語と違うからね

a = 100
def foo()
return 1 + a
end
foo()
とすると何がかえってくると思う?aが定義してないってエラーになるんだぜ

64 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 03:43:47 ]
こういうときはaを@aに変えるのが定石

65 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 04:08:26 ]
>>63
そもそもの問題として、メソッド定義の中以外にローカル変数なんて置くなよ…

66 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 04:16:55 ]
トップレベルに定義したメソッドなんだろ

トップレベルのローカル変数は特別扱いしてくれてもいいような気もするけどな

67 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 06:06:31 ]
でもnilの特別扱いは要らない…

68 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 06:25:56 ]
irb(main):001:0> a=[0,1,2]
=> [0, 1, 2]
irb(main):002:0> [a]
=> [[0, 1, 2]]
irb(main):003:0> [*a]
=> [0, 1, 2]
irb(main):004:0> [3,4,5,*a]
=> [3, 4, 5, 0, 1, 2]
irb(main):005:0> [*a,3,4,5]
SyntaxError: compile error
(irb):5: syntax error, unexpected ',', expecting ']'
[*a,3,4,5]
^
from (irb):5

4行目は良いのに5行目はダメっていう挙動が理解できないんだが・・・


69 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 06:59:48 ]
>>68
*arrの「うしろ」に置けないだけ
先頭に書けないんじゃなくて、展開後にも何かがあると文法エラー

irb> a = [1, 2, 3]
[1, 2, 3]
irb> [9, 8, *a, 7]
SyntaxError: compile error


70 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 07:01:21 ]
ていうか、もしかして *array を「arrayの要素をバラす表現」とかいう理解をしてる?



71 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 07:06:23 ]
1.9なら通るよ

72 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 13:04:14 ]
自作プログラムをクラスごとにファイルに分けると20ファイルくらいになる
「ああ、実行するたびに20回もHDDにアクセスしてるんだ」と考えると憂鬱になる

ということで開発用ディレクトリと実行用ディレクトリを分けた
実行用ディレクトリには開発用ディレクトリにあるスクリプトを連結したものを入れてる
これならファイルアクセスの回数は数回で済む

いや標準添付のクラスとかrequireしてる時点で何個もファイル読み込みまくってるのはわかってんだけど

73 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 21:55:41 ]
>>72
その最適化で何秒早くなったの?

74 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 21:57:22 ]
時間が問題だと思ってる?

75 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 22:17:03 ]
>>74
>>72はそういうことを言いたいわけではないと思われ

76 名前:75 mailto:sage [2008/02/26(火) 22:17:55 ]
>>72じゃなくて>>73だorz

77 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 22:30:19 ]
>>72は一言も最適化とは言ってないな。


78 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 23:34:14 ]
ディスクアクセスが無意味に多いのが心情的に嫌なのだろう
そう感じるセンスそのものは悪くはない

79 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 01:28:06 ]
無意味に多いのかそれは、とか
全部動かさずにユニットテストしろよ、とか

80 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 01:49:05 ]
要するにプリコンパイルヘッダーが必要ということか?



81 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 04:45:24 ]
C++ とかやると、コンパイル時にいくつヘッダ読んでるかなんて
全く気にならなくなるZE

82 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 11:05:29 ]
コンパイル時(>>72の例だと開発中)はどうでもいいんだが、実行時に、というのが心情的に気持ち悪いという話だろう。

83 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 11:26:02 ]
なら、コンパイル系の言語を使えばいいんじゃまいか?

84 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 11:54:36 ]
そんな読み込み程度を気にするのがいかにも初心者だな

85 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 11:55:55 ]
Ruby使いはお茶でも飲んでまたーりするがよい
わっはっはっは

86 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 12:06:07 ]
>>84
そうか?
「それ自身は事実だから好きにせえ」以外の必死な否定論が出ることのほうがよっぽど初心者だと思うが…

87 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 12:07:32 ]
ところでCが書けないRuby書きはニワカだと思いますがどうですか。

88 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 12:13:07 ]
I/O を工夫することはパフォーマンスチューニングでは基本事項。
もとの環境や条件が不明だけど、CGIのようにリクエストのたびにプロセスを
実行しなきゃいけない場合は、読み込み速度を工夫するのは別におかしな話ではない。
ファイルサイズが小さくても、ファイルの数が多ければハードディスクのシークタイムは
バカにならない。
ただ、ファイルを連結しても断片化してたら効果は少ないから、デフラグを
ちゃんとやってやる必要があるけど。

89 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 12:17:28 ]
もうそんな時代でもないんだけどな

90 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 12:24:31 ]
>>89
ストレージへのアクセスが問題にならないコンピュータができたならぜひ教えてくれ

というか最近の子は「HDDがガリガリ言う」とか気にしないもんかね
静音化されて意識しなくなったんだろうか



91 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 12:29:29 ]
HDDはアクセスすると壊れるからなあ
いや、こんなんで壊れる確率がはっきり増えるHDDってのもかなりアレだが…

とりあえず
「クラス単位の細切れファイルをインストール時に数個にまとめとく」
というのは別に非難されるようなことじゃないと思うぞ
というかそんなにまでして行為そのものを否定する理由を知りたい

92 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 12:30:48 ]
ガリガリ言うほどのアクセスを問題にしてるのか?
そもそもそんなこと言ってたらRubyなんて選択肢にならんだろ

93 名前:デフォルトの名無しさん [2008/02/27(水) 12:32:34 ]
鈍足のRubyを使う人は達観した境地にあるので小さいことは気にしない

94 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 12:57:19 ]
正直、完全に論点がずれてるような気がしてならない。
元発言は、無駄を嫌うというプログラマの美徳を発揮してるだけじゃないの?

95 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 13:04:35 ]
チューンナップを突き詰めるとRuby使うなになるからおすすめしない

96 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 13:08:02 ]
Railsみたいな糞のかたまりで遊ぶのがRubyistだからな

97 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 13:16:36 ]
Railsのナカミを喜んでる人は少数だと思う

Railsは開けないほうがよい箱だ
あくまで外部から自分のために便利に使うシステム

98 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 14:42:30 ]
これが SyntaxError になるんだけど何故でしょうか?

def foo?; end
def bar?; end

case
when not foo?
when not bar?
end


99 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 14:52:00 ]
>>94
まぁ、美意識の問題だわな。
そしてそれは、そんな変なエネルギーってわけではない。

100 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 15:15:48 ]
>>98
notだから。

case
when (not foo?)
when (not bar?)
end



case
when ! foo?
when ! bar?
end

なら期待通りに動く



101 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 15:16:13 ]
>>98
この辺の話かな
ttp://www.ruby-lang.org/ja/man/html/trap_A4C7B2F2B7E8A4B9A4EBA4E2A4CE.html

when (not foo?)
ならおkのはず

102 名前:デフォルトの名無しさん [2008/02/27(水) 18:42:53 ]
[標準出力へのフックを仕込む]
標準出力に出力
標準出力に出力
標準出力に出力
[標準出力に書き出した内容をメールで送信]
ってやりたいんですが、
どうやったら出来ますか?

103 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 18:55:07 ]
出力時にスコープの広い変数に文字列を追加保存しとけばいいじゃん?

104 名前:98 mailto:sage [2008/02/27(水) 19:02:54 ]
>>100, >>101
なるほど。
てっきり「not foo?」は「式」かと思っていたんですが、「文」なんですね。
了解しました。深いっす。

105 名前:デフォルトの名無しさん [2008/02/27(水) 19:12:13 ]
phpでいうis_array()はどうやればいいですか?
rubyは配列もあるしハッシュもあるし、自分でコレクションも作れるしで
どう判定していいのか分かりません(?o?)

106 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 19:17:02 ]
[0,1,2].is_a?(Array) #=> true
[0,1,2].kind_of?(Array) #=> true

ArrayクラスはObjectクラスを継承している。
だからArrayクラスはObjectクラスのクラスメソッドやインスタンスメソッドも使える。
Objectクラスのリファレンスをみるべし。
www.ruby-lang.org/ja/man/html/Object.html


107 名前:デフォルトの名無しさん [2008/02/27(水) 19:30:43 ]
>>106
ありがとうございます
試してみたところ、PHPとは異なり、
ハッシュと配列は明確に区別されているようですね
ハッシュ.is_a Array → false
配列.is_a Hash → false

108 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 19:34:50 ]
オブジェクト、実際的には変数、が配列かどうかを調べなければならないコードというのはRubyではかなり異常
極力他のアプローチを取るようにしたほうがいい

109 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 19:40:03 ]
case arg
when Array
when Hash
とかよくやるじゃん

110 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 19:42:06 ]
そうですか(><)
YAMLで書いた設定ファイルを読んで
該当キーをeachで回すようにしてるんですが、
キーを省略した時にはnilになりますよね。
nilをeachしたらエラーになるので、eachできるかどうかを調べてから
eachしたいのですが、
こういう場合はruby的にはどう書くものですか?



111 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 19:45:14 ]
>>110

・ 変数がnilかどうかを事前にif文で比較して弾く
・ eachでnilが例外エラーを起こしたらその例外をキャッチする

どっちか好きなほう使え

112 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 19:45:32 ]
def hoge(foo, bar)
 raise ArgumentError unless foo.is_a?(String)
 raise ArgumentError unless foo.is_a?(Array)
 ・
 ・
 ・
end
とかメソッドの最初でモリモリやっちゃうのはだめ?

113 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 19:58:48 ]
>>112
わりと下品。

まあ、それ以上でもそれ以下でもない程度かと。
コレを無くすために悩む時間がえらい長引くってんならあっても仕方ないんじゃね。おいおい考え変えていけばいいかと。
そのクラスやメソッドに本当にそんなクラスのインスタンスが指定されることがあるのか? をよく考えるといい。
標準添付で「結果の数によってStringあるいはArrayが返ります」とかいうメソッドがあるかい?

…そういえばなんか添付モジュールで複数のクラスが返ってくる可能性のあるやつあった気がするがまあいいや。

「Stringが来たときはHashに変換しよう」とかいうのも同様。Stringなんか渡してくる奴が悪い、で桶。
raaやgemで公開して育てる気マンマンでちまちまフールプルーフさいこー、という場合はあったほうがいいのかも。

114 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 20:07:48 ]
日本語がよくわからない

115 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 21:35:03 ]
>>102
require 'stringio'
# 標準出力へのフックを仕込む
$stdout = StringIO.new
# 標準出力に出力
puts '未承諾広告'
puts 'こんにちは^^)'
#
# 標準出力に書き出した内容を
$stdout.rewind
text = $stdout.read
メールで送信(text)

116 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 21:42:15 ]
>>115
ぬう、適切だが邪悪だ…

117 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 21:45:13 ]
>>110
eachに反応するときだけeachしたいなら、
respond_to? :each する。

と思ったことが私にもありました。

なんでStringがeach持ってるんだよ……(1.8での話)



118 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 21:48:51 ]
>>116
標準出力をフックしたいとか言う元の要件自体が邪悪なだけだ(w

使い方自体は巻き戻せるIOの正しい使い方
$stderrに仕込んでおくとwarnの出力をロギングできるぞ
warn使ってる人ってあんまり見ないけどな

>>117
eachの中でArrayやHashという構造べったりの処理をするからあまり意味がなかったり…

119 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 21:52:27 ]
STDOUTに元の残ってるし、
writeメソッドがないとTypeErrorだし、
邪悪っていうにはおとなしい希ガス。
バッドノウハウなのは確かだけど。

120 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 23:24:04 ]
>>118
>標準出力をフックしたいとか言う元の要件自体が邪悪なだけだ(w
そんなことないだろ
なんで邪悪なのか説明してみな



121 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 09:08:29 ]
Herokuってどうよ

122 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 12:40:13 ]
>>120
出力先が固定になってるあたりかな。


123 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 13:02:13 ]
なんでパイプしてその先でメールするんだと
駄目なんだろ。

124 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 13:06:51 ]
>>122
それだけじゃわかんね。固定してたらなぜだめなの?

125 名前:デフォルトの名無しさん [2008/02/28(木) 13:16:13 ]
標準出力をフックしたい⇒出力先が固定
意味不明だな。

126 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 13:20:35 ]
なんかのはずみで標準出力に出るようなものも全部キャプチャしたいなら
すなおに別プロセスで読み出せ

127 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 14:07:34 ]
こんなもんでいいんじゃね

class Dummy
@@origout = $stdout

def initialize
@buf = ''
end

def write(str)
@@origout.write(str)
@buf << str
end

def flush
tmp = @buf
@buf = ''
tmp
end
end

$stdout = Dummy.new
puts "hello"
puts "world"
$stderr.puts $stdout.flush.inspect

思い切り誤爆してきた。。。


128 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 15:43:56 ]
>>126
なんで別プロセスにするのがいいの?
$stdout = StringIO .new
だとなんか問題あるの?

129 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 15:47:47 ]
>>118 バカ
>>122 バカ
>>126 バカ

130 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 15:53:15 ]
バカとしか言えない>>129はバカでよい
是正させる気も無いようだしただの害悪だな



131 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 16:52:29 ]
>>128
ttp://www.ruby-lang.org/ja/man/html/_C1C8A4DFB9FEA4DFCAD1BFF4.html#a.24stdout

大抵はそれで問題ないけど
拡張ライブラリとか子プロセスなんかの出力は
$stdoutを書き換えるだけだとリダイレクトできないはず

132 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 18:41:22 ]
Rubyに限ることではありませんが、
httpでpostするデータが大きくてメモリ不足になるとき
どうやって回避するのがよいのでしょうか?
Net::HTTP.start(host) {|http| r = http.post(path, data, header) }
という感じでpostするときdataが大きすぎる場合に備えて
小出しに分けて送ることってできませんか?


133 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 19:08:26 ]
>>131
だったら最初からそう書けよ
おまえの書き方だと $stdout を変更するのがすべて悪いみたいじゃないか

>>130
バカはおまえだろ

134 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 19:13:28 ]
>>132
サーバ側の話? それともクライアント側の話?
サーバ側の話なら、cgi.rbを使わず自前でHTTPを解析する必要がある。
クライアントの話なら、dataをファイルに保存しておいて、例えば10MBずつ読み込んで送信を繰り返せばいいんじゃね?

135 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 20:13:54 ]
空気悪いな
>>131はこの話題に関しては初めて書きこんだのだが

>>132
クライアント側だとすると、body_streamを使うのはどう?
ttp://d.hatena.ne.jp/unageanu/20071009
この辺か

136 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 20:34:05 ]
>>133=129
あきらめろ、幾ら頑張ってもお前の>>129は「馬鹿じゃない」と解釈する余地が無い。

137 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 01:19:04 ]
www.ruby-lang.org/ja/man/html/Net_HTTPRequest.html
1.9 featureって書いてあるから1.8じゃ使えないのかと思ったら1.8.6でも使えるのね。よかった。


138 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 11:22:09 ]
>>134
クライアントです。
分けるといっても複数のpostを一連の1つのpostと
認識させるにはどうしたらいいんでしょうか…

>>135>>137
チャンク形式っていうんでしょうか?
で、body_streamを使えばヘッダとか気にしなくていい
ってことでよいでしょうか?

>>132 のdataの内容を一旦 data.txt に書き出しておいて、
あとは >>135 の例のchunkedを使うようにするとできたっぽいですが、
一時ファイルを使わないようにできないでしょうか?


139 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 12:48:00 ]
RubyにあるモジュールはCGIやHTTPの知識の必要性を良くも悪くも隠蔽しない
その知識のまま進むのは危険だ
HTTPやCGIの勉強をすることを勧めるよ

140 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 13:29:26 ]
>>138
>>137が書いてるページの body_stream 使うんだろうけど、おれもやったことないからわからん。
ぐぐったらこんなのあった
d.hatena.ne.jp/unageanu/20071009



141 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 14:11:22 ]
curlコマンド使うのが一番楽やねん

142 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 18:17:48 ]
「年・月・日」ではなく「年・月」の2つしかないデータがあるんだけど、
これを格納するデータオブジェクトって何がいいかな?

いや、年月日が揃ってるデータと「年・月」が同じかどうかという比較をするんよ
年月日ならDateオブジェクトなんだけど、日をどうしようかなあと

143 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 18:30:19 ]
>>142
 ・ 「どうせ参照されないからいいじゃん?」とか年金式にdayを1に固定してDateを使う
 ・ [year, month] という配列に入れておく
 ・ Dateを継承した「dayが無指定でも動く」という新しいDateを作る

144 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 21:05:14 ]
・Date に適当にメソッドを足して適当に YYYY/MM/01 でも代表元に使う

145 名前:デフォルトの名無しさん [2008/02/29(金) 21:09:37 ]
require 'yaml'

yaml_str = <<YAML_STR
hoge:
- moge: [poge, page]
YAML_STR

data = YAML.load(yaml_str)
data['hoge'].each {|key,value| p key,value}

こうすると、
keyが{"moge"=>["poge", "page"]}
valueがnilになってしまいます。

key=moge,value=[poge, page]
になって欲しいのですが…。
どこが間違っているのでしょうか?

146 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 21:47:44 ]
data["hoge"] #=> [ {"moge"=>["poge", "page"]} ]
つまり "moge"=>["poge", "page"] という(キーが一つの)ハッシュを一つ持つ配列

mogeをリストにせずにインデントで階層にすれば
data["hoge"] #=> {"moge"=>["poge", "page"]}
になる

147 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 22:09:30 ]
>>145
data['hoge'].each {|hash| hash.each {|key,val| p key, val}}

148 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 22:17:20 ]
>>146-147
ありがとうございました
YAMLのマッピングの記述を勘違いしていたようです

149 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 01:09:51 ]
なんか最近思うんだけどさ
ここ「初心者」スレだよな・・・

素直に本家行けば?って人ばっかりじゃね?

150 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 04:39:41 ]
本スレはMatzと愉快な仲間たちについて
あれこれ語るスレであって、プログラムを語るスレではないのです


…あれ? じゃあ板違いじゃない?



151 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 11:36:51 ]
「Rubyの初心者」のスレでしょ?
プログラミング自体の初心者じゃないといけないの?

152 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 11:44:14 ]
>>149が考えるところの「本スレ」のレベルに依存するな

153 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 18:15:48 ]
>>149
同意。

154 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 18:39:06 ]
あんなS/Nの小さいスレ
使ってられねーよ

155 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 20:00:41 ]
irb> s = '2'; case s; when /(1)/,/(2)/,/(3)/ then p $1 end
"2"

irb> s = '2'; case s; when Regexp.union(/(1)/,/(2)/,/(3)/) then p $1 end
nil

なんで?

156 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 20:07:39 ]
unionすると
/(1|2|3)/ になるのではなく
/(1)|(2)|(3)/ になって、
今回マッチしたのは(2)のとこだからグループとしては$2。
$1ではない。


157 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 20:16:53 ]
>>156
をを

…正規表現をコンマで並べても用が済むcaseでunionを使うのはめんどくさいっすな

158 名前:デフォルトの名無しさん [2008/03/01(土) 21:37:16 ]
nkf.guessやKconv.guessなんかを文字列にしたいんだけど、
この文字列の配列ってあらかじめ定義されてないんでしょうか?

文字コードの推測
www2u.biglobe.ne.jp/~MAS/ruby/CAB8BBFAA5B3A1BCA5C9A4CEBFE4C2AC.html

159 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 21:54:35 ]
ないっす
いわゆるエンコーディングの名称・略称を表示するようにはできてない

puts "#{str}は日本語EUCだよ!" if NKF.guess(str) == NKF::EUC

というような使い方しか想定してない模様

一応
irb> NKF.constants
["UTF8", "VERSION", "JIS", "UNKNOWN", "NKF_VERSION", "ASCII", "UTF32", "SJIS", "NOCONV", "AUTO", "REVISION", "UTF16", "EUC", "BINARY", "NKF_RELEASE_DATE"]
の結果をどうにかすればできなくはないけど、
自前で文字列対応テーブルを書いたほうがたぶん早い

160 名前:デフォルトの名無しさん [2008/03/01(土) 22:05:26 ]
>>159
サンクス >>158のページのようなのを使いまわすことにする



161 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 00:52:59 ]
net/httpで相手サーバがタイムアウトした場合の例外をキャッチしたいんだけど、
具体的に何の例外が発生するんですか?

というか、そのへんの情報ってどっかにまとまってませんか?

162 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 00:58:15 ]
手元の俺スクリプトの例

rescue Net::ProtoRetriableError,Net::ProtoFatalError,Net::ProtoServerError,Errno::ETIMEDOUT,TimeoutError =>ex
puts 'サーバーから応答がないので空データを使います'
return ''

正直、ドレが効いてるんだかよくわからん

163 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 01:04:24 ]
net/protocol.rbを見ると、ソケット生成(接続)や読み書きは
timeoutメソッドの中でやってるのでTimeout::Errorかな。
TimeoutErrorはこれの後方互換用。



164 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 01:10:11 ]
http.getに該当する部分から飛び出す例外を全部捕捉して
「よくわからんけど鯖がエラー返しましたエラー」にすれば桶

begin
res = open(uri).read
rescue
puts "#{uri.host}のサーバかそこへのアクセスで何かエラーです"
res = ''
end

実際問題としてサーバー側の原因以外の例外はここでは起こらんわけだし
Timeoutだけ補足してもProtoServerErrorの500系エラーはスルーされるぞ
500系エラーって新幹線みたいだな

165 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 01:15:10 ]
Timeout::ErrorはStandardErrorのサブクラスではないので、
引数なしのrescueでは捕まらんのだわ。


166 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 01:27:51 ]
>>165
既にFAQレベルだな…
ttp://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/40726

直感的という言葉は使いたくないがやっぱ説明なしじゃわかりにくいよね
シグナルとかあのへんの勉強をするといいんだが、ちと重いな

167 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 01:33:49 ]
Errno::ETIMEDOUT って何?

168 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 01:39:30 ]
タイムアウトした(Timed Out)というエラー。


169 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 01:46:43 ]
ネット系はErrno::ECONNABORTEDとかErrno::ECONNRESETみたいなのも飛んでくるし、
例外をキャッチしても、それ以降の接続はなにやっても失敗したりするので悩ましい

170 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 01:51:49 ]
>>167
システムコールが返すタイムアウト

Timeout::Error → 「相手のWebサーバからHTTPの返事が返ってこない」
Errno::ETIMEOUT → 「Webサーバ以外の色々から返事が来ないタイムアウト」

と思って桶
そもそもサーバが見つからないとかそういうの。たぶん

>>169
retryはたいてい成功しないよね



171 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 16:23:37 ]

return @hoge = kekka



@hoge = kekka
return kekka



@hoge = kekka
return @hoge

ってどれが一般的かな

172 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 19:11:27 ]
@hoge = kekka

173 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 20:47:42 ]
@hoge = kekka
return

174 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 21:09:01 ]
>>171
returnを使いたくて仕方ないのなら2番目でよろしく
1番目はなんか見てて不安だ

175 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 21:33:05 ]
win環境で、一番簡単に
ファイルのオープンダイアログを表示するには
どうすればいいでしょうか

もろもろインストールの必要を最小限にしたかったりもします。

176 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 22:03:12 ]
require 'win32ole'

d = WIN32OLE.new("MSComDlg.CommonDialog")
d.maxFileSize = 256
d.showOpen
p d.fileName

177 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 22:05:12 ]
楽なのはVisualuRubyかなぁ。通常のrubyには入ってないけど、
Windows用のActiveScriptRubyならデフォで入ってます

require 'vr/vrcontrol'
fn=SWin::CommonDialog::openFilename(nil,[ ["All file","*.*"],["bmp file","*.bmp"] ])
p fn

細かいことはVisualuRubyサイトのドキュメントやサンプル見てください

ActiveScriptRuby
arton.hp.infoseek.co.jp/indexj.html
VisualuRuby計画(仮称)
www.osk.3web.ne.jp/~nyasu/software/vrproject.html

178 名前:デフォルトの名無しさん [2008/03/02(日) 22:13:20 ]
ファイルロックに関する事なんですが、みなさんはどの様なロジックで組んでますか?
自分は普通に以下みたいな感じなんですが、ごくたまにファイルが壊れる事があるんですよね…
なにか良い方法があればご教示お願いします。

File.open('data.dat', 'r'){|file|
file.flock(File::LOCK_SH)
file.read
}

File.open('data.dat', 'w'){|file|
file.flock(File::LOCK_EX)
file.write(data)
}

179 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 22:17:53 ]
>>178
スレッド使ってる?

180 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 22:22:39 ]
>>179
いえ使ってません。



181 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 22:45:34 ]
書き込みの場合は、アンロックする前に
flushしないと、アンロックした後に書き込みが行われる場合がある
みたいな事を言っている方がいたので、その辺の問題のせいでしょうか…

File.open('data.dat', 'w'){|file|
file.flock(File::LOCK_EX)
file.write(data)
file.flush
file.flock(File::LOCK_UN)
}

とかなのかな??

182 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 23:51:49 ]
175です。早速にレス感謝です。
>>176を試みてみまして
WIN32OLERuntimeError
に悩まされております・・・

もうちょっとWIN32OLE研究してみます。

183 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 00:17:15 ]
>>176はOS側の環境依存の度合いが大きいよ
インストールしたRubyの種類に依存する>>177と好きなほう選べ

184 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 00:52:19 ]
# RDEで以下のようなスクリプトを実行します
puts '文字を打ってくれ'
s = gets
puts s + 'と打ったのだね'
#すると画面左下の実行画面が表示される部分に'文字を打ってくれ'と表示される前に
#文字を入力するように求められます(文字を打たないと'文字を打ってくれ'と出ない)

ヒントだけでいいのでご享受ください。RDEとかいう開発環境なんか捨てた方がいいのでしょうか?

185 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 00:54:36 ]
getsの前に$stdout.flushしたらうまくいったりする?



186 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 00:56:47 ]
STDOUT.sync = trueな予感


187 名前:184 mailto:sage [2008/03/03(月) 01:03:01 ]
STDOUT.sync = true を使うことで
RDEでgetsが実行される前の文字が表示されるようになりました($stdout.flushではだめでした)
ありがとうございました! >>185 >>186

188 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 06:15:51 ]
>>182
これはどうかな?
tk環境が要るけど。

require "tk"
#rootを非表示にする
root=TkRoot.new.withdraw
types = [
["Ruby" , ".rb"],
["All Files", "*" ]
]
path = Tk::getOpenFile(:filetypes=>types, :defaultextension=>".rb")
p path

189 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 13:37:22 ]
「あまり別途インストールしたくない」という要求に対してWin32OLEやVisualuRubyが既に出てるのに
わざわざRuby/Tkで同じ標準ファイルオープンダイアログを出す根性に感服した

190 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 13:43:03 ]
宿題スレとか一部で流行ってるからな >Ruby/tk



191 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 14:39:30 ]
>>178
flock関数を使わずに、自前でロック処理を作るとか

192 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 15:07:19 ]
「自前」は迷宮への入り口の罠
何か有るはず。
俺はしらないけど^^;

193 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 15:44:29 ]
わざわざ関数って言い換えてる奴は同一人物か?

File.flockより堅固なファイルロックを自前で作れる奴なら悩んだりしないだろ
ファイルロックの失敗によってファイルが破損しているのだということを確かめる必要があると思われ

194 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 17:39:45 ]
>>187
実際の実行では不要なんだけどね
RDEの時だけ必要

195 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 18:48:29 ]
日本語にマッチする正規表現はどのように書きますか。
文字コードはUTF8またはEUC-JPです。

196 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 19:56:30 ]
それはあれだ、スクリプトがUTF-8だけどEUC-JPの日本語文字にマッチする正規表現を書きたいとかそういう引っかけ問題か(w

197 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 20:23:04 ]
Shift_JIS = /\A(?:
[\x00-\x7f\xa1-\xdf] |
[\x81-\x9f\xe0-\xfc][\x40-\x7e\x80-\xfc]
)*\z/nx

EUC_JP = /\A(?:
[\x00-\x7f] |
\x8e [\xa1-\xdf] |
\x8f [\xa1-\xdf] [\xa1-\xdf] |
[\xa1-\xdf] [\xa1-\xdf]
)*\z/nx

UTF8 = /\A(?:
[\x00-\x7f] |
[\xc2-\xdf] [\x80-\xbf] |
\xe0 [\xa0-\xbf] [\x80-\xbf] |
[\xe1-\xef] [\x80-\xbf] [\x80-\xbf] |
\xf0 [\x90-\xbf] [\x80-\xbf] [\x80-\xbf] |
[\xf1-\xf3] [\x80-\xbf] [\x80-\xbf] [\x80-\xbf] |
\xf4 [\x80-\x8f] [\x80-\xbf] [\x80-\xbf]
)*\z/nx


198 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 21:16:12 ]
ジス イズ ア ペン。

199 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 01:38:47 ]
>>178
file.flock(File::LOCK_EX) よりも前に、File.open('data.dat','w') の時点でファイルの内容がクリアされてしまっている。

File.open('data.dat', File::WRONLY|File::CREAT) {|file|
file.flock(File::LOCK_EX)
file.truncate(0)
file.write(data)
}

…のようにすればいいんじゃないかな。


200 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 03:28:37 ]
>>197
Kconv::RegexpEucjp と Kconv::RegexpUtf8 だな
いわゆる全角文字と半角カタカナだけ欲しい場合は [\x00-\x7f] だけの行を消すといい

irb> puts 'aa康1アアア1煕表示字典ねdこd'.scan(/(?:\x8e[\xa1-\xdf]|\x8f[\xa1-\xdf][\xa1-\xfe]|[\xa1-\xdf][\xa1-\xfe])+/n)

アアア
煕表示字典ね





201 名前:178 mailto:sage [2008/03/04(火) 07:36:00 ]
>>191
File.rename使って色々やってみたんですが
やはり上手く行かなくて…

>>199

> File.open('data.dat','w') の時点でファイルの内容がクリアされてしまっている。
それはそうですね、確かに。

ちなみに、以下のコードみたいにする事で、だいぶ頑丈になりました!

#Read
File.open(path, 'r'){|f|
f.flock(File::LOCK_SH)
data = f.read
}

#Write
File.open(path, File::WRONLY | File::CREAT){|f|
f.flock(File::LOCK_EX)
f.rewind
f.write(data)
f.truncate(f.tell)
}

#Append
File.open(path, 'a'){|f|
f.flock(File::LOCK_EX)
f.seek(0, File::SEEK_END)
f.write(data)
}

202 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 11:22:04 ]
どうして atomic な方のディレクトリロックを使わないん?

203 名前:ルファー ◆XSlQ/Lfer. [2008/03/04(火) 12:48:34 ]
Win32APIライブラリを使い、DLL関数から文字列を取得するにはどうすれば良いんですか?
ツクール(tkool.jp/products/rpgxp/)のRGSS1を使っているので、バージョンアップできないし、
ライブラリはRubyで作らないとrequireできないし・・・。

204 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 13:07:45 ]
>>203
www.google.com/search?num=50&hl=ja&q=RGSS+Win32API&lr=lang_ja

205 名前:ルファー ◆XSlQ/Lfer. [2008/03/04(火) 13:11:44 ]
>>204
あぁ、解決しました。ありがとうございます。

206 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 13:14:27 ]
うわあ…

207 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 13:40:32 ]
1レスで解決したならそれはそれでいいじゃん

208 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 16:42:14 ]
標準添付のWeb::Agentって使ってる人いる?

209 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 20:58:32 ]
ruby -v; egrep '¥<Web¥>' **/*(.)
ruby 1.8.6 (2007-09-24 patchlevel 111) [universal-darwin9.0]
webrick/httprequest.rb: # (Web.Golux.Com/coar/cgi/)
webrick/httpservlet/filehandler.rb: # (Web Distributed Authoring and Versioning)

どこにあるクラス?


210 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 22:17:54 ]
Noraは標準添付ではない。



211 名前:デフォルトの名無しさん [2008/03/06(木) 06:35:30 ]
例えばCで定義された以下の様な構造体があって
その構造体のデータが格納されたデータファイルを
1レコードずつRubyスクリプトで読み込む時に

struct Record{
char n, int a, int b;
};

以下の様な、なんだか非効率な方法しか分かりません…
とりあえず、一括してreadして、あとで上手くunpackで切り分けとか出来ないでしょうか?

File.open('data.dat', 'rb'){|f|
while !f.eof?
n = f.read(1)
a = f.read(4)
b = f.read(4)
data.push(n.unpack('L')[0].to_s + ',' + a.unpack('S')[0].to_s + ',' + b.unpack('L')[0].to_s)
end
}

212 名前:211 mailto:sage [2008/03/06(木) 06:38:11 ]
× data.push(n.unpack('L')[0].to_s + ',' + a.unpack('S')[0].to_s + ',' + b.unpack('L')[0].to_s)
○ data.push(n.unpack('c')[0].to_s + ',' + a.unpack('i')[0].to_s + ',' + b.unpack('i')[0].to_s)

213 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 08:08:47 ]
>>211
# char n の後ろに3バイトのパディングがあると仮定して
data << f.read(12).unpack('cxxxii').join(',')

214 名前:211 mailto:sage [2008/03/06(木) 11:22:00 ]
>>213
あ、レスどうも。

一応以下みたいなコードでだいぶマシになりました。
あとはループ展開するとかで、どうにか納得いく速度が出せそうです。

tmp = ''
data = []
File.open('data.dat', 'rb'){|f| data = f.read }
(tmp.size / 9).times{
(n, a, b) = tmp[p, 9].unpack('LSL')
p += 9
data.push(n + ',' + v + ',' + b)
}

215 名前:211 mailto:sage [2008/03/06(木) 11:23:35 ]
× (n, a, b) = tmp[p, 9].unpack('LSL')
○ (n, a, b) = tmp[p, 9].unpack('cii')

216 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 12:37:48 ]
見てるこっちが切なくなるやりとりだな・・・

217 名前:デフォルトの名無しさん [2008/03/06(木) 12:51:12 ]
pで表示すると、
"hoge"
とカッコ付きで表示されます。
hoge
とカッコなしで表示するにはどうしたらいいですか?

218 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 12:54:06 ]
print

219 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 12:57:41 ]
え?pってprintの略じゃなかったんですか…

220 名前:211 mailto:sage [2008/03/06(木) 13:15:50 ]
>>216
何かもっと良い方法があればご教示下さい><



221 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 14:08:49 ]
>>219
そういう解説をしてるサイトか書籍があったら即晒せ

222 名前:211 mailto:sage [2008/03/07(金) 02:24:18 ]
これ以上良い方法が思いつかない…

data = []
File.open('data.dat', 'rb'){|f|
tmp = f.read
cnt = tmp.size / 9
a = tmp.unpack('cii' * cnt)
cnt.times{|i| data.push([a[3 * i], a[3 * i + 1], a[3 * i + 2]].join(',')) }
}

223 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 03:07:28 ]
効率といっても速度なのかメモリフットプリントなのかコードサイズなのか
data = f.read.enum_for(:scan, /.{9}/m).map {|x| x.unpack('cii').join(',') }

あと、>>213が書いてるけど、パディングは考慮してある?
処理系によっては#pragma packeとか


224 名前:211 mailto:sage [2008/03/07(金) 03:39:45 ]
>>223
効率は速度です><

>パディングは考慮してある?
ちょっと説明の仕方が悪かったです…
要するに、[1][4][4] の各バイトのデータの並びという事です(バディングは考慮する必要はないです)

変な説明をしてすみませんでした!><

225 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 09:55:09 ]
>>217
ダブルクォートをカッコと呼ぶやつは初めて見た。

226 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 11:30:10 ]
カッコ悪い呼び方だよな

227 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 15:05:55 ]
審議中AAry

228 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 15:13:38 ]
Float のメソッドで、
「0 から遠い方に丸める(切上げ)メソッドはありません。」
のはなんでだろう?

truncate (to_i) との対称性から、あってもバチは当たらないと思うんだけど。
やっぱ名前?

229 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 18:16:19 ]
【審議チュウ】

   (⌒ー⌒) (⌒ー⌒)
(⌒-⌒)´・ω)(・ω・`(⌒ー⌒)
(  ´・ω ー⌒)(⌒ー⌒)ω・` )
| U(  ´・) (・`  ) と ノ
〜-u (l    ) (     ノu-u'〜
    〜'u-u'  `u-u`〜






               _
            /´  `フ
           /      ,!
           レ   _,  r ミ       (⌒ー⌒)
          /  `ミ __,xノ゙、      r(   ´n
.         /        i        >   ,/   (⌒ー⌒)
         ,'    .     ,'     〜'oー、_)     r(   n)
        ;     ',  l  l                `/  <_
        i       |  | |              〜'し -一┘
      ,.-‐!     ミ  i i                     (⌒ー⌒)
     //´``、    ミ  、 ー、                   ( ´・ω)
.    | l    `──-ハ、,,),)'''´                 〜、/  っっ
     ヽ.ー─'´)                   (⌒ー⌒)   └ー-、ぅ
        ̄ ̄                      r、´・ω・))
                  (⌒ー⌒)      >  _/´
        n__n        (´・ω・`)    〜'し-一┘
      (⌒ー⌒)ノ         c'   っ
    c('・ω・`)っ      〜(_,'ーo'

230 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 18:55:39 ]
なんだかわからんがなごんだ



231 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 21:00:49 ]
ショッピングカートを作っています。
session["cart"]=Hash.new
session["cart"][@itemid]=@amount
のような形でsession["cart"]にハッシュを詰め込みたいのですが、
sessionにハッシュを詰め込むことは無理なのでしょうか?
また、無理であればto_aで配列に変換して詰め込もうと思うのですが、
元に戻すとき、
@tempSession=Hash[*session["cart"].flatten]
と、WEBの公式マニュアル(ハッシュの項)にあるようにやっても
うまくいきません…。
どなたかご教授いただければ幸いです。

232 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 21:03:38 ]
なお、使っている鯖はlolipopで、Rubyバージョンは1.8.2です。
よろしくお願いいたします。

233 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 11:53:03 ]
>>231
デフォルトだと文字列しか格納できない。
任意のオブジェクトを格納するには CGI::Session::PStore を使う。
require 'cgi/sesion/pstore'
session = CGI::Session.new(cgi, 'database_manager'=>CGI::Session::PStore)
session[key] = Hash.new

234 名前:231-232 mailto:sage [2008/03/08(土) 12:52:26 ]
>>233さん
書き込み後、文字列→配列へ変換→処理→文字列へ返還でできましたが、
やはりコードが汚くなったので悩んでいました。
PStoreについて勉強してみようと思います。
これで悩みが解決しそうです。ありがとうございました!

235 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 14:00:53 ]
>>234
JSON や YAML の文字列に変換するという手もある。

236 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 14:16:02 ]
「文字列→配列へ変換→処理→文字列」と似たようなシロモノ紹介してどうする

237 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 15:27:12 ]
はあ?YAMLやJSON使うなら手軽だしコードが汚くなることもないじゃん。
ちゃんとメリットあるものを紹介してなにが悪いの?

238 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 15:36:34 ]
net/httpについての質問です。
対象ページの[keywords][description]を取得したいのですが
http.getで返ったボディを正規表現で抜き出す以外によい方法はないでしょうか?
宜しくお願いします。

239 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 15:43:58 ]
>>237
236じゃないが、
突っ込む前と取り出した後に処理がいらうってとこの
面倒くささは大して変わらないじゃん。
CGI::Session::YAMLStoreとかをこさえて使うなら
アリだろうけど。

240 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 16:06:45 ]
>>238
[keywords][description] というのが何を指してるのかイマイチよーわからんが

<meta name="keywords" content="Ruby,初心者,プログラミング" />
<meta name="description" content="プログラミング言語Rubyの初心者が集うスレです。" />

というようなののことを指してるのだと勝手に解釈

特定のページのkeywordsとdescriptionの2つにしか興味がないというのなら、
特定のページ専用の正規表現で最初にマッチする文字列を抜き出すのが素直だし時間もかからない

どんなページのどんな変態HTMLが来るのかわからないというのなら、HpricotとかのHTMLパーサを使うといい



241 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 16:39:04 ]
>>240
レスありがとうございます。
おとなしく正規表現で取得しようと思います。

242 名前:デフォルトの名無しさん [2008/03/08(土) 19:52:15 ]
変数名を代入した変数を使って新しい変数を作るにはどうしたらいいですか?
PHPで言う$$var = 'value'
みたいなことをしたいのです

243 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 20:33:46 ]
そんな曲芸みたいな処理は本当に必要なのか?

244 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 21:04:35 ]
インスタンス変数ならinstance_variable_get/setで出来ることはできる。


245 名前:デフォルトの名無しさん [2008/03/08(土) 22:05:57 ]
Threadで引数に渡した値はthread内のローカル変数として使われて、他のスレッドの影響を受けないというような事が書いてありますが、つまりこういう事なんですか?

foo = 1
a=1
Thread.new( foo ){ | bar |
bar += 10
a += bar
hoge = a
}

この場合、barの値は他のスレッドの影響は受けないが、aは他のスレッドの影響を受けて値が変わってしまう。

bar は常に11が入っている状態になるが、aは他スレッドの影響を受けた場合、11とは限らない。

影響を受ける変数とそうでない変数との違いがいまいち分からん・・・。

246 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 22:45:41 ]
え、単なる変数のスコープの問題なんじゃないん?

247 名前:デフォルトの名無しさん [2008/03/08(土) 23:19:54 ]
え、そうなん?
ちょっと考えてみる。。。

248 名前:デフォルトの名無しさん [2008/03/09(日) 00:09:29 ]
あ、ブロックの問題か。
他のスレッドの影響を受けるような物って、どうやって作るんだ。
あれあれ。

249 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 00:21:16 ]
リファレンスの例がそのまま分かりやすいと思うけど

for i in 1..5
# スレッド内のiが書き換わる可能性がある
# Thread.start { p i }

# スレッド固有のローカル変数になる
Thread.start(i) {|t| p t }
end


250 名前:デフォルトの名無しさん [2008/03/09(日) 01:04:04 ]
それはブロックの問題にならないのか。。

#1
foo = 1
Thread.new{
foo +=10
}

ってのと
#2
for i in 1..5
Thread.new{ p i }
end

って両方ともスコープの問題なように思えてしまいます。
#2は他スレッドの影響で i の値が変わるのではなく、外側のスコープの
i が変わっているから変わってくるのでは?
#それともそういうつもりで書かれたんですかね。







251 名前:デフォルトの名無しさん [2008/03/09(日) 01:25:56 ]
ThreadのMutexの使いどころって言うのは、

1同じスコープを共有している
2同時に実行されている処理がある

1、2が当てはまる場合で、かつ2の両者が同じ変数をアクセスする際に
Mutexは使うべきなんだと思うんですが、スレッドの処理がまるまるメソッド化
されている場合はそもそも1が当てはまらないから、Mutexは必要ない
って認識でOKですか?

#ex.
i=0
th = []
def thread_run
puts i
end

1000.times{
th.push Tread.new{ thread_run }
}

while true
i += 1
puts i
end


252 名前:250 [2008/03/09(日) 01:30:13 ]
いや、やっぱ

for i in 1..5
 Thread.new{ p i }
end

は他スレッドの影響を受けているのか。
そう公式リファに書いてあるもんなw

他スレッドの影響で i が書き変わって、
かつ、i はブロックの外側のスコープだから
影響を受けてしまうっちゅーことか。

253 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 08:35:45 ]
スレッド生成した直後にスレッドの処理が終了するようなテストじゃ
よそのスレッドの影響受けてるかどうかもわからんだろ
for i in 1..5
 Thread.start(i) {|n| sleep(n) ; puts 'i = %d : n = %d'%[i,n] }
end

254 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 16:05:40 ]
「特定のWebサイトにある特定の動的HTMLを取得して解析してデータを蓄積・別途表示するよスクリプト」
というありがちなものを頑張って作ってます

で、最近微妙にスレでも話題なRSpecとか使ってテストとかしようと思ったんですが、
「Webサイトに接続してHTMLを取得するかわりにローカルのHTMLファイルを読み込ませたい」です
定番の書き方とか方法とか考え方とかありますか

255 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 16:21:39 ]
>>253
でたなsprintf厨

256 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 16:27:34 ]
>>255
でも文字列への埋め込みよりは論理的にも見える
ていうか指示子覚えちゃったら結構どっちもどっちだよね

257 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 16:47:32 ]
>>254
とりあえず
「アクセス用URIを作るクラス」
「URIを引数で受け取ってHTMLを取得しそのまま返すクラス」
「HTMLを引数で受け取って解析しデータ構造にして返すクラス」
「データを引数で受け取ってDBとかに保存するクラス」
とか細かく分けるんだ

258 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 16:56:12 ]
>>253 がそうかは知らないけど
Python 使ってると Ruby でもそう書きたくなる
5.times じゃなくて for i in 1..5 してるのもそれっぽいと感じた
関数のカッコも省略してないし

259 名前:デフォルトの名無しさん [2008/03/09(日) 18:57:30 ]
Rubyのライブラリリファレンス本て結構いい値段するけど
ネットで見れるマニュアルに比べてのアドバンテージって何ですか?
検索も出来ないし、買う意味あるのかなーと思うんですが。

260 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 18:59:25 ]
結局はwindowsのHTMLヘルプが一番いいね



261 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 19:01:28 ]
>>259
金光編のなら、持ってますが、買う価値ないです。


262 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 19:10:21 ]
>>259

・ まじめな意味でお布施
・ オンラインヘルプの利用ができない環境向け
・ 安くない本を買ったんだからと自分を追い込む用

263 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 19:17:12 ]
return self
(returnなしでも桶)の効用がわかった気がする

264 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 19:24:33 ]
半年前の自分のスクリプトはいい意味でも悪い意味でも読めないよね
Perlでの妙な凝りっぷりほどじゃないけどさ

265 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 19:41:28 ]
ちょっと聞きたいんだけど、

irb(main):001:0> require "kconv"
=> true
irb(main):002:0> puts "シーソーゲーム".kconv(Kconv::UTF8, Kconv::SJIS).kconv(Kconv::SJIS, Kconv::UTF8)
シーメ[ゲーム
=> nil

ってやると元通りのものが帰ってきてくれないのはなんでなんだぜ?

266 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 20:02:55 ]
rubyのバージョンとかは?

267 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 20:05:05 ]
バージョンあんま関係ないと思うぞ
irb> p "シーソーゲーム".kconv(Kconv::UTF8,Kconv::SJIS)
"\343\202\267\343\203\274\343\203\241[\343\202\262\343\203\274\343\203\240"


268 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 20:09:06 ]
それ単純に$KCODEが適切じゃないだけだと思う
puts "シーソーゲーム"でもシーメ[ゲームって出力されるだろ多分

269 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 20:23:12 ]
$KCODEのデフォルトは日本語環境のWndowsであろうが、NONE


270 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 20:24:20 ]
>>266
ruby 1.8.6 (2007-09-24 patchlevel 111) [i386-mswin32]

>>268
ぬぉほんとだ
勉強不足だったみたいだ 調べてくるありがとー



271 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 21:02:16 ]
すまんもーいっこ聞きたいんだけど、ある変数ではSJISで、ある変数ではUTF8で持つとかってできないの?

test = "シーソー"
puts test.kconv(Kconv::UTF8, Kconv::SJIS)

で、ruby -Ks hoge.rb とかすると意図した通りUTF8で"シーソー"って出てくるけど、$KCODE = "SJIS"とかだとうまく動いてくれんのだが…
2種混在とか無理なのか?

272 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 21:10:17 ]
>>271
できるよ
というかStringオブジェクト自体には文字コードの情報は付記されてない
内容を表示したり正規表現にマッチさせたりするときに利用メソッド側で改めて調べてる

273 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 21:24:28 ]
>>272
そうなのかー
リファレンス見ると、KCODEが影響するのは
* インタプリタの字句解析器 etc
って書いてあるけど、これって例えば
test = "シーソー"
の "シーソー" を評価するときにKCODEを元に評価してtestに代入するってこと?

つか
$KCODE = "SJIS"
test = "シーソー"
puts test
ってやっても文字化けるのが納得いかん
irbとかでやると化けずにでるのも意味がわからん…

274 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 21:35:55 ]
#!ruby -Ks
test = "シーソー"
puts test

275 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 21:38:31 ]
>>274
それでちゃんとできるのは知ってる
$KCODEだとできたりできなかったりするのが不思議な昨今です

276 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 21:41:34 ]
>>273
あ、悪い、$KCODEについては誤解がけっこう蔓延してる
$KCODE='s'はRubyスクリプトだから、これが解釈されるということは既に実行済みってことでそのファイルについては手遅れなんだ
(それ以降にrequireとかで読み込んだファイルは$KCODEにしたがって解釈してくれる)

スクリプトの先頭からShift_JISだと認識した上で読み込んで実行してくれないと困るので、普通は-Ksを使う
Windows版Rubyでも、 1行目に
#!ruby -Ks
とか適当に書いておくだけで、スクリプト解釈前(構文木生成前)に適当に解釈してくれる

スクリプトを読み込む
    ↓ -Ks の出番
スクリプトを解釈する
    ↓
プログラムを実行する
    ↓ $KCODE='s' の出番


277 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 21:48:52 ]
スクリプト中に書き込まれた日本語文字列に駄目文字がなければ
$KCODE='NONE'(つまり #!ruby -Ks 無し)でも動くんだよ
駄目文字があった場合はうまく動作しない
Ruby作者さんも言っとる

ttp://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/41939
> まつもと ゆきひろです
> |あまりよい解決方法ではないかもしれませんが,二行目に
> |$KCODE='SJIS'
> |とするとruby -Ksと同じ挙動になると思います.
> |
> |#!/usr/bin/env ruby
> |$KCODE='SJIS'
> |
> |のような感じでどうでしょう.
>
> 残念ながら「$KCODE='SJIS'」の解釈は実行時に行われるので、プ
> ログラムの読み込みを行う時点での処理が行われません。たとえば
> ソースコードがSJISであった場合に文字列中の「表」などの処理が
> 適切に行われないことになります。


278 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 22:21:01 ]
require したファイルの名前って一覧できますか。


279 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 22:23:14 ]
>>278
irb> p $"
["irb.rb", "e2mmap.rb", "irb/init.rb", "irb/context.rb", "irb/workspace.rb", "irb/extend-command.rb",
"irb/ruby-lex.rb", "irb/slex.rb", "irb/ruby-token.rb", "irb/input-method.rb", "readline.so", "irb/locale.rb",
"kconv.rb", "nkf.so"]


280 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 22:25:29 ]
>>278
$" ($LOADED_FEATURES)





281 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 22:27:09 ]
>>279,280
さんくすです

もいっこ質問。
PHPとRubyとで、Webアプリのセッション情報を共有することはできますか。

282 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 22:28:59 ]
>>281
テキストでファイルに保存あるいはテキストベースで遣り取り可能ならできんじゃね

283 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 22:36:49 ]
memcachedとかでもイケそう。


284 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 22:51:30 ]
セッション情報って別に形式決まってないよな

285 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 23:44:58 ]
>>276
そうなのかー
$KCODE = "SJIS"を読んだ時点で設定が変更されんのかと思った
つーことはファイル毎に文字コードの設定が可能ちぅことか

>>277
ソースまで発掘してもらって申し訳ねぇ
でも2行目でやればいいってのはなんでなんだろう?
Rubyってインタプリタなんじゃないの?
読み込んだ片端から逐次実行なんじゃないの?
わかんねー

286 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 00:09:27 ]
1.8は構文木、1.9は中間コードに一旦変換してるが、インタプリタには違いない
ttp://ja.wikipedia.org/wiki/%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%97%E3%83%AA%E3%82%BF

287 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 00:14:18 ]
1. -Kオプションを解釈
2. パース
3. 実行

ソース中の「表」とかが問題になるのは2の時点、
$KCODEへの代入が実行される3の時点では手遅れ

288 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 00:32:56 ]
>>286-287
全部一旦構文木にしてから実行すんのか?
Rubyって前方宣言じゃなかったっけ?

前方宣言だよなぁ→読み込み即実行だよなぁ→$KCODEに値代入した時点で即有効になる気がするよなぁ
っていう発想なんだが…

289 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 00:42:34 ]
宣言してるというより実行時に作り上げてるだけ

290 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 02:01:50 ]
なんか勝手な前提で色々考えてる感があるが…
$KCODE = "SJIS"
↑これだって単なる代入式なんだから実行されるまで作用しないだろ。

前方宣言どころかクラス定義やメソッド定義まで実行文だぞ。



291 名前:デフォルトの名無しさん [2008/03/10(月) 06:51:16 ]
配列自体をeachで変更したいのですが、どうしたらいいですか?
破壊的メソッドは!を付けるので
each!とかやってみたのですが駄目でした

292 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 07:00:14 ]
>>291
要素数が同じでいいなら普通はmap!やcollect!を使う

irb> arr = [1,2,3]
irb> arr.map!{|e| e*2}
irb> p arr
[2, 4, 6]

293 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 07:04:59 ]
>>292
おお!ありがとうございました

294 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 07:19:01 ]
mapでの写像を覚えるとRubyコードのステキ度が100単位でアップするので超お勧め

「配列の要素をひとつずつ取り出して計算してひとつずつ格納する」から
「ある配列にブロックを作用させてもうひとつの配列を作る」という思考と記述が自然に行えるだけで超絶パラダイム
昨日までの小学生レベルのプログラムの勉強とはオサラバよオ・サ・ラ・バ

295 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 16:36:07 ]
WinXPで音声編集をできるライブラリがあったら教えてください。
RAAを見た限りではなさそうですが。

1. 1秒以上の無音部分で音声ファイル分割
2. file1とfile2を、間に1秒無音部を入れて結合

というような事をやりたいです。







[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

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

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