Ruby 初心者スレッド Part 18

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。

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

関連スレやURLは>>2-8あたりを見てください。Ruby on Railsの質問はRailsスレへ。

■質問する人へ
質問する前に次の3つをすること。ここで回答を待つよりそのほうが早い。
 ・モジュール名やエラーメッセージでググる
 ・マニュアルで引っかかったクラスの記述を探す http://www.ruby-lang.org/ja/man/
 ・FAQを一応読む http://www.ruby-lang.org/ja/man/?cmd=view;name=Ruby+FAQ
質問には以下を書くこと。へたくそな質問は再提出を要求される。
 ・詳しい内容(「動きません」「うまくできません」では回答しようがない)
 ・エラーメッセージ(自力で訳さずなるべくそのままで)
 ・実行環境(OS名、Rubyのバージョン(ruby -v でわかる))
 ・最終的にやりたいこと(もっとよい方法がある場合が多いので)
回答してくれた人には「ありがとう」のひとことをいってあげて。
■回答する人へ
相手は初心者、根気よく育てるつもりで。質問がへたくそなのも大目にみてあげる。
それができないならこないこと(だって初心者スレだもん)。
 ・既出な質問やFAQは「XXXを読め」でいいので、叩かない&怖がらせない。
 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
2デフォルトの名無しさん:2008/02/22(金) 14:36:38
【よくあるしつもん】
Q:
いちからRubyを始める初心者向けのRuby入門書は何がおすすめでしょうか?

A:
プログラム作成の初心者だったら
「たのしいRuby 第2版 Rubyではじめる気軽なプログラミング」
http://www.amazon.co.jp/dp/4797336617/
他の言語経験があるんだったら
「プログラミングRuby 第2版 言語編」
http://www.amazon.co.jp/dp/4274066428/
3デフォルトの名無しさん:2008/02/22(金) 14:39:10
■前スレ
Ruby 初心者スレッド Part 17
http://pc11.2ch.net/test/read.cgi/tech/1200472887/

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

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

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

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

Rubyについて(アンチ専用) Part002
http://pc11.2ch.net/test/read.cgi/tech/1200210768/
4デフォルトの名無しさん:2008/02/22(金) 14:40:19
■公式/非公式関連リンク
Ruby Home Page
http://www.ruby-lang.org/ja/

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

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

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

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

逆引きRuby
http://www.namaraii.com/rubytips/
5デフォルトの名無しさん:2008/02/22(金) 14:41:17
RAA - Ruby Application Archive
http://raa.ruby-lang.org/

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

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

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

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

Rubyの本一覧
http://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/>
http://www.rubyxml.com/

Matzにっき(Ruby作者の日記)
http://www.rubyist.net/~matz/
6デフォルトの名無しさん:2008/02/22(金) 14:42:08
■最近できたWiki
Ruby 初心者スレッド Hiki
http://starlet.s145.xrea.com/ruby/hiki/

Ruby Portal
http://ruby.morphball.net/portal/
7デフォルトの名無しさん:2008/02/22(金) 14:51:23

テンプレ終わり
8デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2008/02/22(金) 15:29:55
    < ̄ ̄ ̄>
       ̄>/
     / /
    /  <___/|
    |______/
        |
     /  ̄  ̄ \
   / ノ   \ \
  /  <●>::::::<●>  \  こ、これは乙じゃなくてエナジーボンボンなんだから
  | /// (__人__) /// |  変な勘違いしないでよね!
  \    ` ⌒´    /
  / ̄ ̄ ̄ ̄ ̄ ̄ ̄ \
11デフォルトの名無しさん:2008/02/22(金) 15:40:31
AA厨うぜえ
12デフォルトの名無しさん:2008/02/22(金) 17:48:57
ifの条件をorで繋げて書いているのですが凄く長くなってしまいます、
途中で改行したいのですがどうしたらいいでしょうか?
13デフォルトの名無しさん:2008/02/22(金) 18:10:07
orが行末にくるように改行を入れる。

見やすさのためにthenを省略しないようにするといいかも。
14デフォルトの名無しさん:2008/02/22(金) 18:43:09
Rubyスクリプティングテクニック
― テスト駆動による日常業務処理術
http://www.oreilly.co.jp/books/9784873113562/

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

立て続けに質問すみません。
Ruby/Tkで部品(ラベル)を作成しその中のテキストを処理中に複数回変更したのですが、
即時に変更されず、一番最後の変更のみが反映されます。
バッファリングがなされているのかと思い、STDOUT.flashを間に挟んでみたのですが、うまくいきませんでした。
ご助言頂けると嬉しいです _ _
16デフォルトの名無しさん:2008/02/22(金) 23:12:59
>>15
Thread.start{処理}
ってして見るのはどうか。
17デフォルトの名無しさん:2008/02/23(土) 10:48:38
matlabから乗り換える言語の候補でrubyを考えてるのですが
行列計算やグラフのplotはRと連携するのでしょうか?
Rとの連携ってどこまでできるのでしょうか?
18デフォルトの名無しさん:2008/02/23(土) 12:28:44
>>17
うむ、Rでできることのほとんどについて、ロクにサポートできないといっていい

というか、matlabから移行する先としては不適当だろ
Rubyは単なる汎用なオブジェクト指向スクリプト言語に過ぎない
19デフォルトの名無しさん:2008/02/23(土) 13:04:05
matlabとは性質が全然違うと思う
octaveなら分かるがw
20デフォルトの名無しさん:2008/02/23(土) 14:03:52
組込クラスや標準ライブラリに木構造を扱うクラスが無いのはなぜでしょうか
21デフォルトの名無しさん:2008/02/23(土) 15:00:05
ネタにマジレス(ry
22デフォルトの名無しさん:2008/02/23(土) 15:02:57
>>17
Python で numpy 使うといいよ
23デフォルトの名無しさん:2008/02/23(土) 16:12:50
24デフォルトの名無しさん:2008/02/23(土) 16:40:25
rushってどうよ?あなたのはづかしい体験談プリーズ
http://journal.mycom.co.jp/news/2008/02/22/042/index.html
25デフォルトの名無しさん:2008/02/23(土) 20:00:55
Rushはプログレハード
26デフォルトの名無しさん:2008/02/23(土) 21:37:26
RubyでJAVACCみたいなパーサ生成
モジュールってありますか?

AST扱える奴がいいのでつが
27デフォルトの名無しさん:2008/02/23(土) 23:21:42
今だと treetop とか。
28デフォルトの名無しさん:2008/02/24(日) 12:01:00
>>26
Racc
Lex なら StringScanner または Ragel
29デフォルトの名無しさん:2008/02/24(日) 12:31:43
>>28
フォロー。
Raccはyaccみたいなパーサジェネレータだから、ASTは自分で組む必要がある。
30デフォルトの名無しさん:2008/02/24(日) 12:47:04
メール送信をしようと思って、
gemsを見たらメール関連のパッケージがたくさんあります
現在一番使われてるパッケージってどれですか?
31デフォルトの名無しさん: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デフォルトの名無しさん:2008/02/24(日) 13:53:43
テストツールの利用の仕方がよくわかりません
33デフォルトの名無しさん:2008/02/24(日) 14:08:46
>>32
テストの知識がないとだめだよ
ソフトウェアテストをRubyでも行うというツールであって、ソフトウェアテストをRubyでも学べるというツールじゃない

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

「Rubyで学ぶテスト入門」とかいうのは需要はあると思うんだけどねえ
34デフォルトの名無しさん:2008/02/24(日) 14:17:54
メソッド間の値の受け渡しのとこにてきとーな値と正しい答えのペアを持ってきて
メソッドが正しく動作するか検証するツールだろ
35デフォルトの名無しさん:2008/02/24(日) 14:20:44
>>33
Rubyを256倍使うための本 極道編
というのがあるこたあるが、2001年というのはこの世界だと古文書だな。
36デフォルトの名無しさん:2008/02/24(日) 16:39:43
>>32
「Ruby Test::Unit」または「RSpec」でぐぐれ
37デフォルトの名無しさん:2008/02/24(日) 16:40:08
>>29
>Raccはyaccみたいなパーサジェネレータだから、ASTは自分で組む必要がある。
kwsk
38デフォルトの名無しさん:2008/02/24(日) 16:50:50
>>36
そういう話ではないと思われ
39デフォルトの名無しさん:2008/02/24(日) 17:19:48
>>33
「disる」とかいうのやめ
40デフォルトの名無しさん:2008/02/24(日) 21:48:25
>>37
BNFとか書けばASTを完璧に組み上げる
パーサを生成してくれるわけじゃないという意味。
(というかそこまで出来たらコンパイラコンパイラ名乗って
いい気がする)

構文解析である文法規則に還元されたときの
処理は自分で書かないといけない。
41デフォルトの名無しさん:2008/02/24(日) 23:11:50
>>40
それは Racc の説明であって JavaCC ではないという理解で OK?
もしそうなら、JavaCC はASTを自動で作ってくれるの?
4240:2008/02/25(月) 00:53:05
ぉk。

JavaCCのことはさっぱり。
ただ>>26の要求にRaccは微妙かなと思って。
43デフォルトの名無しさん:2008/02/25(月) 06:21:28
class Foo
 class <<self
 end
end

これの2行目の意味が良く分からないんですが・・・
44デフォルトの名無しさん:2008/02/25(月) 06:32:09
45デフォルトの名無しさん:2008/02/25(月) 10:51:44
すいません、クイッククエスチョン。

特異メソッドは特異クラスのサブクラスに継承されるけど
クラスインスタンス変数は継承されないよね?あってる?
46デフォルトの名無しさん:2008/02/25(月) 11:27:47
rhtmlファイルでシンタックスエラーがあるみたいなんですが、どこがエラーか分かりません。
調べる方法があればおしえてください。
47デフォルトの名無しさん:2008/02/25(月) 11:52:29
ppよりもっとディープなインスペクション(そのインスタンスの
メソッドやプロパティーのリストまで表示したり)をするには
どうしたらいいですか?
48デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2008/02/25(月) 18:59:27
#:nodoc: とか #.nodoc: ってなに?
51デフォルトの名無しさん:2008/02/25(月) 19:31:31
ドキュメントなんか書くものか!というRubyistの強い意志
52デフォルトの名無しさん: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デフォルトの名無しさん:2008/02/26(火) 01:42:14
ハッシュを使い回すのではなく、俺用データのクラスを作ろうと思いました
def initialize の中で、インスタンス変数を
@hoge=nil
@hage=nil
@fuga=nil
...
と15個くらい書いてるんだけど、initializeの時点でnil入れておくって無意味だよね?
54デフォルトの名無しさん: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デフォルトの名無しさん:2008/02/26(火) 02:39:29
>>54
自分でそのコード実行してみた?
56デフォルトの名無しさん: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デフォルトの名無しさん:2008/02/26(火) 02:51:17
>>54
>いきなり
>@ary.each{|e| p e}
>ってやると@aryなんて知りまへんでって怒られる
インスタンス変数でなくローカル変数の場合はその通りなのだが
未初期化のインスタンス変数を参照した場合は nil となるはず

>>53
上記のことを踏まえての質問ということでおk?
やってもやらなくてもnilが入っているという意味ではその通りかも知れないが
クラスで用いるインスタンス変数を明示的に示しておくという意味では無意味ではないと思う
58デフォルトの名無しさん:2008/02/26(火) 02:53:56
>>55
インスタンス変数は「定義」しなくてもnilだってのは忘れられがちだよな

インスタンス変数の「定義」をinitializeでする意味はRuby的にはあまりないと思う
59デフォルトの名無しさん:2008/02/26(火) 02:59:02
厳密にはメソッドが追加されるからただの定義ではないけど attr_reader とか
60デフォルトの名無しさん:2008/02/26(火) 02:59:28
外部からアクセスされるなら直後のattrに名前が出るし
外部からアクセスされないインスタンス変数って一体

あ、サブクラスからアクセスしたいか
61デフォルトの名無しさん:2008/02/26(火) 03:23:53
>>60
外部からアクセスされないインスタンス変数はあっても全然おかしくないと思う
むしろすべての実装を外部からアクセスできるように公開する方がまずいのでは
62デフォルトの名無しさん:2008/02/26(火) 03:28:17
インスタンス変数は外部からアクセスしたいときにのみおもむろに使え、ということなのでは
それ以外ではメソッド引数とかで細々とやれと
63デフォルトの名無しさん:2008/02/26(火) 03:42:22
Rubyのスコープはちょっといろんな言語と違うからね

a = 100
def foo()
return 1 + a
end
foo()
とすると何がかえってくると思う?aが定義してないってエラーになるんだぜ
64デフォルトの名無しさん:2008/02/26(火) 03:43:47
こういうときはaを@aに変えるのが定石
65デフォルトの名無しさん:2008/02/26(火) 04:08:26
>>63
そもそもの問題として、メソッド定義の中以外にローカル変数なんて置くなよ…
66デフォルトの名無しさん:2008/02/26(火) 04:16:55
トップレベルに定義したメソッドなんだろ

トップレベルのローカル変数は特別扱いしてくれてもいいような気もするけどな
67デフォルトの名無しさん:2008/02/26(火) 06:06:31
でもnilの特別扱いは要らない…
68デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2008/02/26(火) 07:01:21
ていうか、もしかして *array を「arrayの要素をバラす表現」とかいう理解をしてる?
71デフォルトの名無しさん:2008/02/26(火) 07:06:23
1.9なら通るよ
72デフォルトの名無しさん:2008/02/26(火) 13:04:14
自作プログラムをクラスごとにファイルに分けると20ファイルくらいになる
「ああ、実行するたびに20回もHDDにアクセスしてるんだ」と考えると憂鬱になる

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

いや標準添付のクラスとかrequireしてる時点で何個もファイル読み込みまくってるのはわかってんだけど
73デフォルトの名無しさん:2008/02/26(火) 21:55:41
>>72
その最適化で何秒早くなったの?
74デフォルトの名無しさん:2008/02/26(火) 21:57:22
時間が問題だと思ってる?
75デフォルトの名無しさん:2008/02/26(火) 22:17:03
>>74
>>72はそういうことを言いたいわけではないと思われ
7675:2008/02/26(火) 22:17:55
>>72じゃなくて>>73だorz
77デフォルトの名無しさん:2008/02/26(火) 22:30:19
>>72は一言も最適化とは言ってないな。
78デフォルトの名無しさん:2008/02/26(火) 23:34:14
ディスクアクセスが無意味に多いのが心情的に嫌なのだろう
そう感じるセンスそのものは悪くはない
79デフォルトの名無しさん:2008/02/27(水) 01:28:06
無意味に多いのかそれは、とか
全部動かさずにユニットテストしろよ、とか
80デフォルトの名無しさん:2008/02/27(水) 01:49:05
要するにプリコンパイルヘッダーが必要ということか?
81デフォルトの名無しさん:2008/02/27(水) 04:45:24
C++ とかやると、コンパイル時にいくつヘッダ読んでるかなんて
全く気にならなくなるZE
82デフォルトの名無しさん:2008/02/27(水) 11:05:29
コンパイル時(>>72の例だと開発中)はどうでもいいんだが、実行時に、というのが心情的に気持ち悪いという話だろう。
83デフォルトの名無しさん:2008/02/27(水) 11:26:02
なら、コンパイル系の言語を使えばいいんじゃまいか?
84デフォルトの名無しさん:2008/02/27(水) 11:54:36
そんな読み込み程度を気にするのがいかにも初心者だな
85デフォルトの名無しさん:2008/02/27(水) 11:55:55
Ruby使いはお茶でも飲んでまたーりするがよい
わっはっはっは
86デフォルトの名無しさん:2008/02/27(水) 12:06:07
>>84
そうか?
「それ自身は事実だから好きにせえ」以外の必死な否定論が出ることのほうがよっぽど初心者だと思うが…
87デフォルトの名無しさん:2008/02/27(水) 12:07:32
ところでCが書けないRuby書きはニワカだと思いますがどうですか。
88デフォルトの名無しさん:2008/02/27(水) 12:13:07
I/O を工夫することはパフォーマンスチューニングでは基本事項。
もとの環境や条件が不明だけど、CGIのようにリクエストのたびにプロセスを
実行しなきゃいけない場合は、読み込み速度を工夫するのは別におかしな話ではない。
ファイルサイズが小さくても、ファイルの数が多ければハードディスクのシークタイムは
バカにならない。
ただ、ファイルを連結しても断片化してたら効果は少ないから、デフラグを
ちゃんとやってやる必要があるけど。
89デフォルトの名無しさん:2008/02/27(水) 12:17:28
もうそんな時代でもないんだけどな
90デフォルトの名無しさん:2008/02/27(水) 12:24:31
>>89
ストレージへのアクセスが問題にならないコンピュータができたならぜひ教えてくれ

というか最近の子は「HDDがガリガリ言う」とか気にしないもんかね
静音化されて意識しなくなったんだろうか
91デフォルトの名無しさん:2008/02/27(水) 12:29:29
HDDはアクセスすると壊れるからなあ
いや、こんなんで壊れる確率がはっきり増えるHDDってのもかなりアレだが…

とりあえず
「クラス単位の細切れファイルをインストール時に数個にまとめとく」
というのは別に非難されるようなことじゃないと思うぞ
というかそんなにまでして行為そのものを否定する理由を知りたい
92デフォルトの名無しさん:2008/02/27(水) 12:30:48
ガリガリ言うほどのアクセスを問題にしてるのか?
そもそもそんなこと言ってたらRubyなんて選択肢にならんだろ
93デフォルトの名無しさん:2008/02/27(水) 12:32:34
鈍足のRubyを使う人は達観した境地にあるので小さいことは気にしない
94デフォルトの名無しさん:2008/02/27(水) 12:57:19
正直、完全に論点がずれてるような気がしてならない。
元発言は、無駄を嫌うというプログラマの美徳を発揮してるだけじゃないの?
95デフォルトの名無しさん:2008/02/27(水) 13:04:35
チューンナップを突き詰めるとRuby使うなになるからおすすめしない
96デフォルトの名無しさん:2008/02/27(水) 13:08:02
Railsみたいな糞のかたまりで遊ぶのがRubyistだからな
97デフォルトの名無しさん:2008/02/27(水) 13:16:36
Railsのナカミを喜んでる人は少数だと思う

Railsは開けないほうがよい箱だ
あくまで外部から自分のために便利に使うシステム
98デフォルトの名無しさん:2008/02/27(水) 14:42:30
これが SyntaxError になるんだけど何故でしょうか?

def foo?; end
def bar?; end

case
when not foo?
when not bar?
end
99デフォルトの名無しさん:2008/02/27(水) 14:52:00
>>94
まぁ、美意識の問題だわな。
そしてそれは、そんな変なエネルギーってわけではない。
100デフォルトの名無しさん:2008/02/27(水) 15:15:48
>>98
notだから。

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



case
when ! foo?
when ! bar?
end

なら期待通りに動く
101デフォルトの名無しさん: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デフォルトの名無しさん:2008/02/27(水) 18:55:07
出力時にスコープの広い変数に文字列を追加保存しとけばいいじゃん?
10498:2008/02/27(水) 19:02:54
>>100, >>101
なるほど。
てっきり「not foo?」は「式」かと思っていたんですが、「文」なんですね。
了解しました。深いっす。
105デフォルトの名無しさん:2008/02/27(水) 19:12:13
phpでいうis_array()はどうやればいいですか?
rubyは配列もあるしハッシュもあるし、自分でコレクションも作れるしで
どう判定していいのか分かりません(?o?)
106デフォルトの名無しさん: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クラスのリファレンスをみるべし。
http://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デフォルトの名無しさん:2008/02/27(水) 19:34:50
オブジェクト、実際的には変数、が配列かどうかを調べなければならないコードというのはRubyではかなり異常
極力他のアプローチを取るようにしたほうがいい
109デフォルトの名無しさん:2008/02/27(水) 19:40:03
case arg
when Array
when Hash
とかよくやるじゃん
110デフォルトの名無しさん:2008/02/27(水) 19:42:06
そうですか(><)
YAMLで書いた設定ファイルを読んで
該当キーをeachで回すようにしてるんですが、
キーを省略した時にはnilになりますよね。
nilをeachしたらエラーになるので、eachできるかどうかを調べてから
eachしたいのですが、
こういう場合はruby的にはどう書くものですか?
111デフォルトの名無しさん:2008/02/27(水) 19:45:14
>>110

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

どっちか好きなほう使え
112デフォルトの名無しさん: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デフォルトの名無しさん:2008/02/27(水) 19:58:48
>>112
わりと下品。

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

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

「Stringが来たときはHashに変換しよう」とかいうのも同様。Stringなんか渡してくる奴が悪い、で桶。
raaやgemで公開して育てる気マンマンでちまちまフールプルーフさいこー、という場合はあったほうがいいのかも。
114デフォルトの名無しさん:2008/02/27(水) 20:07:48
日本語がよくわからない
115デフォルトの名無しさん:2008/02/27(水) 21:35:03
>>102
require 'stringio'
# 標準出力へのフックを仕込む
$stdout = StringIO.new
# 標準出力に出力
puts '未承諾広告'
puts 'こんにちは^^)'
#
# 標準出力に書き出した内容を
$stdout.rewind
text = $stdout.read
メールで送信(text)
116デフォルトの名無しさん:2008/02/27(水) 21:42:15
>>115
ぬう、適切だが邪悪だ…
117デフォルトの名無しさん:2008/02/27(水) 21:45:13
>>110
eachに反応するときだけeachしたいなら、
respond_to? :each する。

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

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

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

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

>>117
eachの中でArrayやHashという構造べったりの処理をするからあまり意味がなかったり…
119デフォルトの名無しさん:2008/02/27(水) 21:52:27
STDOUTに元の残ってるし、
writeメソッドがないとTypeErrorだし、
邪悪っていうにはおとなしい希ガス。
バッドノウハウなのは確かだけど。
120デフォルトの名無しさん:2008/02/27(水) 23:24:04
>>118
>標準出力をフックしたいとか言う元の要件自体が邪悪なだけだ(w
そんなことないだろ
なんで邪悪なのか説明してみな
121デフォルトの名無しさん:2008/02/28(木) 09:08:29
Herokuってどうよ
122デフォルトの名無しさん:2008/02/28(木) 12:40:13
>>120
出力先が固定になってるあたりかな。
123デフォルトの名無しさん:2008/02/28(木) 13:02:13
なんでパイプしてその先でメールするんだと
駄目なんだろ。
124デフォルトの名無しさん:2008/02/28(木) 13:06:51
>>122
それだけじゃわかんね。固定してたらなぜだめなの?
125デフォルトの名無しさん:2008/02/28(木) 13:16:13
標準出力をフックしたい⇒出力先が固定
意味不明だな。
126デフォルトの名無しさん:2008/02/28(木) 13:20:35
なんかのはずみで標準出力に出るようなものも全部キャプチャしたいなら
すなおに別プロセスで読み出せ
127デフォルトの名無しさん: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デフォルトの名無しさん:2008/02/28(木) 15:43:56
>>126
なんで別プロセスにするのがいいの?
$stdout = StringIO .new
だとなんか問題あるの?
129デフォルトの名無しさん:2008/02/28(木) 15:47:47
>>118 バカ
>>122 バカ
>>126 バカ
130デフォルトの名無しさん:2008/02/28(木) 15:53:15
バカとしか言えない>>129はバカでよい
是正させる気も無いようだしただの害悪だな
131デフォルトの名無しさん:2008/02/28(木) 16:52:29
>>128
ttp://www.ruby-lang.org/ja/man/html/_C1C8A4DFB9FEA4DFCAD1BFF4.html#a.24stdout

大抵はそれで問題ないけど
拡張ライブラリとか子プロセスなんかの出力は
$stdoutを書き換えるだけだとリダイレクトできないはず
132デフォルトの名無しさん:2008/02/28(木) 18:41:22
Rubyに限ることではありませんが、
httpでpostするデータが大きくてメモリ不足になるとき
どうやって回避するのがよいのでしょうか?
Net::HTTP.start(host) {|http| r = http.post(path, data, header) }
という感じでpostするときdataが大きすぎる場合に備えて
小出しに分けて送ることってできませんか?
133デフォルトの名無しさん:2008/02/28(木) 19:08:26
>>131
だったら最初からそう書けよ
おまえの書き方だと $stdout を変更するのがすべて悪いみたいじゃないか

>>130
バカはおまえだろ
134デフォルトの名無しさん:2008/02/28(木) 19:13:28
>>132
サーバ側の話? それともクライアント側の話?
サーバ側の話なら、cgi.rbを使わず自前でHTTPを解析する必要がある。
クライアントの話なら、dataをファイルに保存しておいて、例えば10MBずつ読み込んで送信を繰り返せばいいんじゃね?
135デフォルトの名無しさん:2008/02/28(木) 20:13:54
空気悪いな
>>131はこの話題に関しては初めて書きこんだのだが

>>132
クライアント側だとすると、body_streamを使うのはどう?
ttp://d.hatena.ne.jp/unageanu/20071009
この辺か
136デフォルトの名無しさん:2008/02/28(木) 20:34:05
>>133=129
あきらめろ、幾ら頑張ってもお前の>>129は「馬鹿じゃない」と解釈する余地が無い。
137デフォルトの名無しさん:2008/02/29(金) 01:19:04
http://www.ruby-lang.org/ja/man/html/Net_HTTPRequest.html
1.9 featureって書いてあるから1.8じゃ使えないのかと思ったら1.8.6でも使えるのね。よかった。
138デフォルトの名無しさん:2008/02/29(金) 11:22:09
>>134
クライアントです。
分けるといっても複数のpostを一連の1つのpostと
認識させるにはどうしたらいいんでしょうか…

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

>>132 のdataの内容を一旦 data.txt に書き出しておいて、
あとは >>135 の例のchunkedを使うようにするとできたっぽいですが、
一時ファイルを使わないようにできないでしょうか?
139デフォルトの名無しさん:2008/02/29(金) 12:48:00
RubyにあるモジュールはCGIやHTTPの知識の必要性を良くも悪くも隠蔽しない
その知識のまま進むのは危険だ
HTTPやCGIの勉強をすることを勧めるよ
140デフォルトの名無しさん:2008/02/29(金) 13:29:26
>>138
>>137が書いてるページの body_stream 使うんだろうけど、おれもやったことないからわからん。
ぐぐったらこんなのあった
http://d.hatena.ne.jp/unageanu/20071009
141デフォルトの名無しさん:2008/02/29(金) 14:11:22
curlコマンド使うのが一番楽やねん
142デフォルトの名無しさん:2008/02/29(金) 18:17:48
「年・月・日」ではなく「年・月」の2つしかないデータがあるんだけど、
これを格納するデータオブジェクトって何がいいかな?

いや、年月日が揃ってるデータと「年・月」が同じかどうかという比較をするんよ
年月日ならDateオブジェクトなんだけど、日をどうしようかなあと
143デフォルトの名無しさん:2008/02/29(金) 18:30:19
>>142
 ・ 「どうせ参照されないからいいじゃん?」とか年金式にdayを1に固定してDateを使う
 ・ [year, month] という配列に入れておく
 ・ Dateを継承した「dayが無指定でも動く」という新しいDateを作る
144デフォルトの名無しさん: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デフォルトの名無しさん:2008/02/29(金) 21:47:44
data["hoge"] #=> [ {"moge"=>["poge", "page"]} ]
つまり "moge"=>["poge", "page"] という(キーが一つの)ハッシュを一つ持つ配列

mogeをリストにせずにインデントで階層にすれば
data["hoge"] #=> {"moge"=>["poge", "page"]}
になる
147デフォルトの名無しさん:2008/02/29(金) 22:09:30
>>145
data['hoge'].each {|hash| hash.each {|key,val| p key, val}}
148デフォルトの名無しさん:2008/02/29(金) 22:17:20
>>146-147
ありがとうございました
YAMLのマッピングの記述を勘違いしていたようです
149デフォルトの名無しさん:2008/03/01(土) 01:09:51
なんか最近思うんだけどさ
ここ「初心者」スレだよな・・・

素直に本家行けば?って人ばっかりじゃね?
150デフォルトの名無しさん:2008/03/01(土) 04:39:41
本スレはMatzと愉快な仲間たちについて
あれこれ語るスレであって、プログラムを語るスレではないのです


…あれ? じゃあ板違いじゃない?
151デフォルトの名無しさん:2008/03/01(土) 11:36:51
「Rubyの初心者」のスレでしょ?
プログラミング自体の初心者じゃないといけないの?
152デフォルトの名無しさん:2008/03/01(土) 11:44:14
>>149が考えるところの「本スレ」のレベルに依存するな
153デフォルトの名無しさん:2008/03/01(土) 18:15:48
>>149
同意。
154デフォルトの名無しさん:2008/03/01(土) 18:39:06
あんなS/Nの小さいスレ
使ってられねーよ
155デフォルトの名無しさん: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デフォルトの名無しさん:2008/03/01(土) 20:07:39
unionすると
/(1|2|3)/ になるのではなく
/(1)|(2)|(3)/ になって、
今回マッチしたのは(2)のとこだからグループとしては$2。
$1ではない。
157デフォルトの名無しさん:2008/03/01(土) 20:16:53
>>156
をを

…正規表現をコンマで並べても用が済むcaseでunionを使うのはめんどくさいっすな
158デフォルトの名無しさん:2008/03/01(土) 21:37:16
nkf.guessやKconv.guessなんかを文字列にしたいんだけど、
この文字列の配列ってあらかじめ定義されてないんでしょうか?

文字コードの推測
http://www2u.biglobe.ne.jp/~MAS/ruby/CAB8BBFAA5B3A1BCA5C9A4CEBFE4C2AC.html
159デフォルトの名無しさん: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デフォルトの名無しさん:2008/03/02(日) 00:52:59
net/httpで相手サーバがタイムアウトした場合の例外をキャッチしたいんだけど、
具体的に何の例外が発生するんですか?

というか、そのへんの情報ってどっかにまとまってませんか?
162デフォルトの名無しさん:2008/03/02(日) 00:58:15
手元の俺スクリプトの例

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

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

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

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

実際問題としてサーバー側の原因以外の例外はここでは起こらんわけだし
Timeoutだけ補足してもProtoServerErrorの500系エラーはスルーされるぞ
500系エラーって新幹線みたいだな
165デフォルトの名無しさん:2008/03/02(日) 01:15:10
Timeout::ErrorはStandardErrorのサブクラスではないので、
引数なしのrescueでは捕まらんのだわ。
166デフォルトの名無しさん:2008/03/02(日) 01:27:51
>>165
既にFAQレベルだな…
ttp://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/40726

直感的という言葉は使いたくないがやっぱ説明なしじゃわかりにくいよね
シグナルとかあのへんの勉強をするといいんだが、ちと重いな
167デフォルトの名無しさん:2008/03/02(日) 01:33:49
Errno::ETIMEDOUT って何?
168デフォルトの名無しさん:2008/03/02(日) 01:39:30
タイムアウトした(Timed Out)というエラー。
169デフォルトの名無しさん:2008/03/02(日) 01:46:43
ネット系はErrno::ECONNABORTEDとかErrno::ECONNRESETみたいなのも飛んでくるし、
例外をキャッチしても、それ以降の接続はなにやっても失敗したりするので悩ましい
170デフォルトの名無しさん:2008/03/02(日) 01:51:49
>>167
システムコールが返すタイムアウト

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

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

>>169
retryはたいてい成功しないよね
171デフォルトの名無しさん:2008/03/02(日) 16:23:37

return @hoge = kekka



@hoge = kekka
return kekka



@hoge = kekka
return @hoge

ってどれが一般的かな
172デフォルトの名無しさん:2008/03/02(日) 19:11:27
@hoge = kekka
173デフォルトの名無しさん:2008/03/02(日) 20:47:42
@hoge = kekka
return
174デフォルトの名無しさん:2008/03/02(日) 21:09:01
>>171
returnを使いたくて仕方ないのなら2番目でよろしく
1番目はなんか見てて不安だ
175デフォルトの名無しさん:2008/03/02(日) 21:33:05
win環境で、一番簡単に
ファイルのオープンダイアログを表示するには
どうすればいいでしょうか

もろもろインストールの必要を最小限にしたかったりもします。
176デフォルトの名無しさん:2008/03/02(日) 22:03:12
require 'win32ole'

d = WIN32OLE.new("MSComDlg.CommonDialog")
d.maxFileSize = 256
d.showOpen
p d.fileName
177デフォルトの名無しさん: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
http://arton.hp.infoseek.co.jp/indexj.html
VisualuRuby計画(仮称)
http://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デフォルトの名無しさん:2008/03/02(日) 22:17:53
>>178
スレッド使ってる?
180デフォルトの名無しさん:2008/03/02(日) 22:22:39
>>179
いえ使ってません。
181デフォルトの名無しさん: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デフォルトの名無しさん:2008/03/02(日) 23:51:49
175です。早速にレス感謝です。
>>176を試みてみまして
WIN32OLERuntimeError
に悩まされております・・・

もうちょっとWIN32OLE研究してみます。
183デフォルトの名無しさん:2008/03/03(月) 00:17:15
>>176はOS側の環境依存の度合いが大きいよ
インストールしたRubyの種類に依存する>>177と好きなほう選べ
184デフォルトの名無しさん:2008/03/03(月) 00:52:19
# RDEで以下のようなスクリプトを実行します
puts '文字を打ってくれ'
s = gets
puts s + 'と打ったのだね'
#すると画面左下の実行画面が表示される部分に'文字を打ってくれ'と表示される前に
#文字を入力するように求められます(文字を打たないと'文字を打ってくれ'と出ない)

ヒントだけでいいのでご享受ください。RDEとかいう開発環境なんか捨てた方がいいのでしょうか?
185デフォルトの名無しさん:2008/03/03(月) 00:54:36
getsの前に$stdout.flushしたらうまくいったりする?

186デフォルトの名無しさん:2008/03/03(月) 00:56:47
STDOUT.sync = trueな予感
187184:2008/03/03(月) 01:03:01
STDOUT.sync = true を使うことで
RDEでgetsが実行される前の文字が表示されるようになりました($stdout.flushではだめでした)
ありがとうございました! >>185 >>186
188デフォルトの名無しさん: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デフォルトの名無しさん:2008/03/03(月) 13:37:22
「あまり別途インストールしたくない」という要求に対してWin32OLEやVisualuRubyが既に出てるのに
わざわざRuby/Tkで同じ標準ファイルオープンダイアログを出す根性に感服した
190デフォルトの名無しさん:2008/03/03(月) 13:43:03
宿題スレとか一部で流行ってるからな >Ruby/tk
191デフォルトの名無しさん:2008/03/03(月) 14:39:30
>>178
flock関数を使わずに、自前でロック処理を作るとか
192デフォルトの名無しさん:2008/03/03(月) 15:07:19
「自前」は迷宮への入り口の罠
何か有るはず。
俺はしらないけど^^;
193デフォルトの名無しさん:2008/03/03(月) 15:44:29
わざわざ関数って言い換えてる奴は同一人物か?

File.flockより堅固なファイルロックを自前で作れる奴なら悩んだりしないだろ
ファイルロックの失敗によってファイルが破損しているのだということを確かめる必要があると思われ
194デフォルトの名無しさん:2008/03/03(月) 17:39:45
>>187
実際の実行では不要なんだけどね
RDEの時だけ必要
195デフォルトの名無しさん:2008/03/03(月) 18:48:29
日本語にマッチする正規表現はどのように書きますか。
文字コードはUTF8またはEUC-JPです。
196デフォルトの名無しさん:2008/03/03(月) 19:56:30
それはあれだ、スクリプトがUTF-8だけどEUC-JPの日本語文字にマッチする正規表現を書きたいとかそういう引っかけ問題か(w
197デフォルトの名無しさん: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デフォルトの名無しさん:2008/03/03(月) 21:16:12
ジス イズ ア ペン。
199デフォルトの名無しさん: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デフォルトの名無しさん: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)

アアア
煕表示字典ね

201178: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デフォルトの名無しさん:2008/03/04(火) 11:22:04
どうして atomic な方のディレクトリロックを使わないん?
203ルファー ◆XSlQ/Lfer. :2008/03/04(火) 12:48:34
Win32APIライブラリを使い、DLL関数から文字列を取得するにはどうすれば良いんですか?
ツクール(http://tkool.jp/products/rpgxp/)のRGSS1を使っているので、バージョンアップできないし、
ライブラリはRubyで作らないとrequireできないし・・・。
204デフォルトの名無しさん:2008/03/04(火) 13:07:45
205ルファー ◆XSlQ/Lfer. :2008/03/04(火) 13:11:44
>>204
あぁ、解決しました。ありがとうございます。
206デフォルトの名無しさん:2008/03/04(火) 13:14:27
うわあ…
207デフォルトの名無しさん:2008/03/04(火) 13:40:32
1レスで解決したならそれはそれでいいじゃん
208デフォルトの名無しさん:2008/03/04(火) 16:42:14
標準添付のWeb::Agentって使ってる人いる?
209デフォルトの名無しさん: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: # (http://Web.Golux.Com/coar/cgi/)
webrick/httpservlet/filehandler.rb: # (Web Distributed Authoring and Versioning)

どこにあるクラス?
210デフォルトの名無しさん: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
}
212211: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デフォルトの名無しさん:2008/03/06(木) 08:08:47
>>211
# char n の後ろに3バイトのパディングがあると仮定して
data << f.read(12).unpack('cxxxii').join(',')
214211: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)
}
215211:2008/03/06(木) 11:23:35
× (n, a, b) = tmp[p, 9].unpack('LSL')
○ (n, a, b) = tmp[p, 9].unpack('cii')
216デフォルトの名無しさん:2008/03/06(木) 12:37:48
見てるこっちが切なくなるやりとりだな・・・
217デフォルトの名無しさん:2008/03/06(木) 12:51:12
pで表示すると、
"hoge"
とカッコ付きで表示されます。
hoge
とカッコなしで表示するにはどうしたらいいですか?
218デフォルトの名無しさん:2008/03/06(木) 12:54:06
print
219デフォルトの名無しさん:2008/03/06(木) 12:57:41
え?pってprintの略じゃなかったんですか…
220211:2008/03/06(木) 13:15:50
>>216
何かもっと良い方法があればご教示下さい><
221デフォルトの名無しさん:2008/03/06(木) 14:08:49
>>219
そういう解説をしてるサイトか書籍があったら即晒せ
222211: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デフォルトの名無しさん:2008/03/07(金) 03:07:28
効率といっても速度なのかメモリフットプリントなのかコードサイズなのか
data = f.read.enum_for(:scan, /.{9}/m).map {|x| x.unpack('cii').join(',') }

あと、>>213が書いてるけど、パディングは考慮してある?
処理系によっては#pragma packeとか
224211:2008/03/07(金) 03:39:45
>>223
効率は速度です><

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

変な説明をしてすみませんでした!><
225デフォルトの名無しさん:2008/03/07(金) 09:55:09
>>217
ダブルクォートをカッコと呼ぶやつは初めて見た。
226デフォルトの名無しさん:2008/03/07(金) 11:30:10
カッコ悪い呼び方だよな
227デフォルトの名無しさん:2008/03/07(金) 15:05:55
審議中AAry
228デフォルトの名無しさん:2008/03/07(金) 15:13:38
Float のメソッドで、
「0 から遠い方に丸める(切上げ)メソッドはありません。」
のはなんでだろう?

truncate (to_i) との対称性から、あってもバチは当たらないと思うんだけど。
やっぱ名前?
229デフォルトの名無しさん: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デフォルトの名無しさん:2008/03/07(金) 18:55:39
なんだかわからんがなごんだ
231デフォルトの名無しさん: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デフォルトの名無しさん:2008/03/07(金) 21:03:38
なお、使っている鯖はlolipopで、Rubyバージョンは1.8.2です。
よろしくお願いいたします。
233デフォルトの名無しさん: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
234231-232:2008/03/08(土) 12:52:26
>>233さん
書き込み後、文字列→配列へ変換→処理→文字列へ返還でできましたが、
やはりコードが汚くなったので悩んでいました。
PStoreについて勉強してみようと思います。
これで悩みが解決しそうです。ありがとうございました!
235デフォルトの名無しさん:2008/03/08(土) 14:00:53
>>234
JSON や YAML の文字列に変換するという手もある。
236デフォルトの名無しさん:2008/03/08(土) 14:16:02
「文字列→配列へ変換→処理→文字列」と似たようなシロモノ紹介してどうする
237デフォルトの名無しさん:2008/03/08(土) 15:27:12
はあ?YAMLやJSON使うなら手軽だしコードが汚くなることもないじゃん。
ちゃんとメリットあるものを紹介してなにが悪いの?
238デフォルトの名無しさん:2008/03/08(土) 15:36:34
net/httpについての質問です。
対象ページの[keywords][description]を取得したいのですが
http.getで返ったボディを正規表現で抜き出す以外によい方法はないでしょうか?
宜しくお願いします。
239デフォルトの名無しさん:2008/03/08(土) 15:43:58
>>237
236じゃないが、
突っ込む前と取り出した後に処理がいらうってとこの
面倒くささは大して変わらないじゃん。
CGI::Session::YAMLStoreとかをこさえて使うなら
アリだろうけど。
240デフォルトの名無しさん: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デフォルトの名無しさん:2008/03/08(土) 16:39:04
>>240
レスありがとうございます。
おとなしく正規表現で取得しようと思います。
242デフォルトの名無しさん:2008/03/08(土) 19:52:15
変数名を代入した変数を使って新しい変数を作るにはどうしたらいいですか?
PHPで言う$$var = 'value'
みたいなことをしたいのです
243デフォルトの名無しさん:2008/03/08(土) 20:33:46
そんな曲芸みたいな処理は本当に必要なのか?
244デフォルトの名無しさん: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デフォルトの名無しさん:2008/03/08(土) 22:45:41
え、単なる変数のスコープの問題なんじゃないん?
247デフォルトの名無しさん:2008/03/08(土) 23:19:54
え、そうなん?
ちょっと考えてみる。。。
248デフォルトの名無しさん:2008/03/09(日) 00:09:29
あ、ブロックの問題か。
他のスレッドの影響を受けるような物って、どうやって作るんだ。
あれあれ。
249デフォルトの名無しさん: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
252250:2008/03/09(日) 01:30:13
いや、やっぱ

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

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

他スレッドの影響で i が書き変わって、
かつ、i はブロックの外側のスコープだから
影響を受けてしまうっちゅーことか。
253デフォルトの名無しさん: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デフォルトの名無しさん:2008/03/09(日) 16:05:40
「特定のWebサイトにある特定の動的HTMLを取得して解析してデータを蓄積・別途表示するよスクリプト」
というありがちなものを頑張って作ってます

で、最近微妙にスレでも話題なRSpecとか使ってテストとかしようと思ったんですが、
「Webサイトに接続してHTMLを取得するかわりにローカルのHTMLファイルを読み込ませたい」です
定番の書き方とか方法とか考え方とかありますか
255デフォルトの名無しさん:2008/03/09(日) 16:21:39
>>253
でたなsprintf厨
256デフォルトの名無しさん:2008/03/09(日) 16:27:34
>>255
でも文字列への埋め込みよりは論理的にも見える
ていうか指示子覚えちゃったら結構どっちもどっちだよね
257デフォルトの名無しさん:2008/03/09(日) 16:47:32
>>254
とりあえず
「アクセス用URIを作るクラス」
「URIを引数で受け取ってHTMLを取得しそのまま返すクラス」
「HTMLを引数で受け取って解析しデータ構造にして返すクラス」
「データを引数で受け取ってDBとかに保存するクラス」
とか細かく分けるんだ
258デフォルトの名無しさん: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デフォルトの名無しさん:2008/03/09(日) 18:59:25
結局はwindowsのHTMLヘルプが一番いいね
261デフォルトの名無しさん:2008/03/09(日) 19:01:28
>>259
金光編のなら、持ってますが、買う価値ないです。
262デフォルトの名無しさん:2008/03/09(日) 19:10:21
>>259

・ まじめな意味でお布施
・ オンラインヘルプの利用ができない環境向け
・ 安くない本を買ったんだからと自分を追い込む用
263デフォルトの名無しさん:2008/03/09(日) 19:17:12
return self
(returnなしでも桶)の効用がわかった気がする
264デフォルトの名無しさん:2008/03/09(日) 19:24:33
半年前の自分のスクリプトはいい意味でも悪い意味でも読めないよね
Perlでの妙な凝りっぷりほどじゃないけどさ
265デフォルトの名無しさん: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デフォルトの名無しさん:2008/03/09(日) 20:02:55
rubyのバージョンとかは?
267デフォルトの名無しさん: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デフォルトの名無しさん:2008/03/09(日) 20:09:06
それ単純に$KCODEが適切じゃないだけだと思う
puts "シーソーゲーム"でもシーメ[ゲームって出力されるだろ多分
269デフォルトの名無しさん:2008/03/09(日) 20:23:12
$KCODEのデフォルトは日本語環境のWndowsであろうが、NONE
270デフォルトの名無しさん:2008/03/09(日) 20:24:20
>>266
ruby 1.8.6 (2007-09-24 patchlevel 111) [i386-mswin32]

>>268
ぬぉほんとだ
勉強不足だったみたいだ 調べてくるありがとー
271デフォルトの名無しさん: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デフォルトの名無しさん:2008/03/09(日) 21:10:17
>>271
できるよ
というかStringオブジェクト自体には文字コードの情報は付記されてない
内容を表示したり正規表現にマッチさせたりするときに利用メソッド側で改めて調べてる
273デフォルトの名無しさん:2008/03/09(日) 21:24:28
>>272
そうなのかー
リファレンス見ると、KCODEが影響するのは
* インタプリタの字句解析器 etc
って書いてあるけど、これって例えば
test = "シーソー"
の "シーソー" を評価するときにKCODEを元に評価してtestに代入するってこと?

つか
$KCODE = "SJIS"
test = "シーソー"
puts test
ってやっても文字化けるのが納得いかん
irbとかでやると化けずにでるのも意味がわからん…
274デフォルトの名無しさん:2008/03/09(日) 21:35:55
#!ruby -Ks
test = "シーソー"
puts test
275デフォルトの名無しさん:2008/03/09(日) 21:38:31
>>274
それでちゃんとできるのは知ってる
$KCODEだとできたりできなかったりするのが不思議な昨今です
276デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2008/03/09(日) 22:21:01
require したファイルの名前って一覧できますか。
279デフォルトの名無しさん: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デフォルトの名無しさん:2008/03/09(日) 22:25:29
>>278
$" ($LOADED_FEATURES)

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

もいっこ質問。
PHPとRubyとで、Webアプリのセッション情報を共有することはできますか。
282デフォルトの名無しさん:2008/03/09(日) 22:28:59
>>281
テキストでファイルに保存あるいはテキストベースで遣り取り可能ならできんじゃね
283デフォルトの名無しさん:2008/03/09(日) 22:36:49
memcachedとかでもイケそう。
284デフォルトの名無しさん:2008/03/09(日) 22:51:30
セッション情報って別に形式決まってないよな
285デフォルトの名無しさん:2008/03/09(日) 23:44:58
>>276
そうなのかー
$KCODE = "SJIS"を読んだ時点で設定が変更されんのかと思った
つーことはファイル毎に文字コードの設定が可能ちぅことか

>>277
ソースまで発掘してもらって申し訳ねぇ
でも2行目でやればいいってのはなんでなんだろう?
Rubyってインタプリタなんじゃないの?
読み込んだ片端から逐次実行なんじゃないの?
わかんねー
286デフォルトの名無しさん: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デフォルトの名無しさん:2008/03/10(月) 00:14:18
1. -Kオプションを解釈
2. パース
3. 実行

ソース中の「表」とかが問題になるのは2の時点、
$KCODEへの代入が実行される3の時点では手遅れ
288デフォルトの名無しさん:2008/03/10(月) 00:32:56
>>286-287
全部一旦構文木にしてから実行すんのか?
Rubyって前方宣言じゃなかったっけ?

前方宣言だよなぁ→読み込み即実行だよなぁ→$KCODEに値代入した時点で即有効になる気がするよなぁ
っていう発想なんだが…
289デフォルトの名無しさん:2008/03/10(月) 00:42:34
宣言してるというより実行時に作り上げてるだけ
290デフォルトの名無しさん:2008/03/10(月) 02:01:50
なんか勝手な前提で色々考えてる感があるが…
$KCODE = "SJIS"
↑これだって単なる代入式なんだから実行されるまで作用しないだろ。

前方宣言どころかクラス定義やメソッド定義まで実行文だぞ。
291デフォルトの名無しさん:2008/03/10(月) 06:51:16
配列自体をeachで変更したいのですが、どうしたらいいですか?
破壊的メソッドは!を付けるので
each!とかやってみたのですが駄目でした
292デフォルトの名無しさん: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デフォルトの名無しさん:2008/03/10(月) 07:04:59
>>292
おお!ありがとうございました
294デフォルトの名無しさん:2008/03/10(月) 07:19:01
mapでの写像を覚えるとRubyコードのステキ度が100単位でアップするので超お勧め

「配列の要素をひとつずつ取り出して計算してひとつずつ格納する」から
「ある配列にブロックを作用させてもうひとつの配列を作る」という思考と記述が自然に行えるだけで超絶パラダイム
昨日までの小学生レベルのプログラムの勉強とはオサラバよオ・サ・ラ・バ
295デフォルトの名無しさん:2008/03/10(月) 16:36:07
WinXPで音声編集をできるライブラリがあったら教えてください。
RAAを見た限りではなさそうですが。

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

というような事をやりたいです。
296デフォルトの名無しさん:2008/03/11(火) 01:17:52
流れをぶった切ってスマソ
297デフォルトの名無しさん:2008/03/11(火) 01:19:28
ww二重書き込みスマソ

MySQL を Ruby DBI モジュール で抽象化してアクセスしてるんだが,DBエンジンってどうやって選択するのか,さっぱりわからん.
どのドキュメント読んだら良いんだろ・・・
298デフォルトの名無しさん:2008/03/11(火) 01:26:27
すまん…自己解決の悪寒
299デフォルトの名無しさん:2008/03/11(火) 02:14:46
Windowsでシェルスクリプト的な使い方をしようと思っていますが
コマンドプロンプトで
>ruby hoge.rb
と入力するのではなく、
>hoge.rb
と入力してrubyスクリプトを起動させる方法があれば教えて下さい
300デフォルトの名無しさん:2008/03/11(火) 02:19:10
>>299
assoc
301デフォルトの名無しさん:2008/03/11(火) 02:33:10
自分のいるディレクトリを取得するのに、
dir = File.dirname(File.expand_path( __FILE__))
と書いてますが、File.が重複してるのが気になります。
もっとキレイに書けますか?
302デフォルトの名無しさん:2008/03/11(火) 02:33:39
普通にhogeで実行できる
303デフォルトの名無しさん:2008/03/11(火) 03:07:16
>>302
それはそういうふうに設定されてるだけ
まあWin98くらいから使ってる人は試そうとしないことも多いけどな

>>301
無理
まあフルパスくらい一発で出てくれとは思わなくもないが…
304デフォルトの名無しさん:2008/03/11(火) 03:13:06
>>300
ありがとうございます
こういうコマンドがあったんですね
>>302
確かに試したら出来ました
One Click Rubyが設定したみたいですね
305デフォルトの名無しさん:2008/03/11(火) 04:04:13
ある変数(仮に command としよう)に入っている文字列オブジェクトを
コマンド出力として解釈させるためには
%x{ command }
でいいの?
306デフォルトの名無しさん:2008/03/11(火) 04:09:41
%x{#{command}}
307デフォルトの名無しさん:2008/03/11(火) 04:13:00
>>301
__FILE__ はそれが記述されているファイルの場所だから
ruby path/to/script/files/hoge.rb とかしたら
カレントディレクトリは取得出来ない。
Dir.pwd Dir.getwd を使え。
dir = File.expand_path(Dir.pwd)
または
require 'pathname'
dir = Pathname.pwd.to_s
308デフォルトの名無しさん:2008/03/11(火) 08:27:36
>>307
> dir = File.expand_path(Dir.pwd)
Dir.pwdがすでにフルパス。
309デフォルトの名無しさん:2008/03/11(火) 11:00:39
>>307
誰がカレントディレクトリを欲しいなんて言ってるんだ?
File.dirname(File.expand_path(__FILE__)) は正しく「このスクリプトのあるディレクトリ」を返す
…まあ、「自分のいるディレクトリ」ってなんだよとは思わなくもないが

あと、 File.expand_path(__FILE__) は ruby への引数の書き方によらず必ず絶対パスを返す
問題があるとすれば、スクリプト内で cd してカレントディレクトリが起動時から変わってしまった場合
カレントディレクトリとくっつけて返すだけなので「絶対パスの形をしてるけど実際には存在しない」パスになる
310デフォルトの名無しさん:2008/03/11(火) 11:52:50
eRubyについて教えてください。
ロリポップを使っています。
htmlタグの中にRubyスクリプトを埋め込みたいと思っています。
[現在のサーバーの状態(ロリポップ初期状態です)]
Ruby 1.8(/usr/local/bin/rubyがパスです)
SSIは.shtmlで使える

.htaccessの設定か何かが必要だということまでは調べたのですが、うまく動きません。
現在.htaccessを色々いじって、
AddType application/x-httpd-eruby .rhtml
Action application/x-httpd-eruby /usr/local/bin/eruby ★←この部分でeRuby?のパスを指定するっぽい??
のようにしてみたのですが…多分全く違うのでしょう、、404エラーになります。
(アドレスも正しいのに何故404エラーになるのか不明です;)

次にロリポップではSSIについてという項で
SSIは拡張子を.shtmlにして下さい
とあるので、test.shtmlとしてアップロードしました。
以下がそのソースです。
<html><body><p><%="Just another Ruby Hacker,"%></p></body></html>
結果は画面は真白で、ソースを見ると上のまま出力されていました。
(<%=とかもそのまま文字として出力される)

ちなみに言うまでもありませんがサーバーの設定等の知識は全くありません。
「ここを読めば分かる」や「多少のヒント程度」でも構いません。
藁をも掴む思いです。。。
ある程度は検索して調べたのですが、なかなかまとまったものが無く、分りませんでした。
お前のサーバーの.htaccessはこうやるんだ! というものがあればすごく有り難いです。

よろしくお願いいたします。
311デフォルトの名無しさん:2008/03/11(火) 12:11:46
195 名前: 留学生(福島県)[] 投稿日:2008/03/11(火) 11:44:25.61 ID:piKUy7Sw0
>>149
そのつもりでrubyスクリプトかいてるんだけど、うまくいかない

r = "<a href=\"../test/read.cgi/news4vip/1205110121/48\" target=\"_blank\">>>48</a>"
r.gsub!(/<a\shref=(.*?)>>>(\d+)<\/a>/, "<a href=\"#{$2}\">>>#{$2}</a>")

$2に48が入ってるはずなんだけど、できない
だれか助けろ
312デフォルトの名無しさん:2008/03/11(火) 12:24:59
>>311,\2な
313デフォルトの名無しさん:2008/03/11(火) 12:29:24
ブロック使え
314デフォルトの名無しさん:2008/03/11(火) 12:31:03
>>310
アカウントとパスワードを書いてから
315デフォルトの名無しさん:2008/03/11(火) 12:39:11
>>314
もし方法がわかればお願いします。
316デフォルトの名無しさん:2008/03/11(火) 13:27:41
>>310
そもそもロリポップにはerubyがインストールされていないんじゃ?
317デフォルトの名無しさん:2008/03/11(火) 14:17:59
>>316
レスありがとうございます。
Ruby1.8から標準ライブラリに組み込まれていると書いてあったのですが、
インストールされていないと使えないということなのでしょうか?
(書いていて使えないような気がしてきました…)

あと、もう一つ質問をさせて下さい。
check_zaiko.cgiというスクリプトがあり、それは
check_zaiko.cgi?item=hogeというURLにアクセスすると、
puts zaiko.to_s // "5"
といった具合に、在庫を出力する様になっています。
この出力結果を他のスクリプトで使いたいのですが、なんという関数を使えば良いのでしょうか…?
例えばview_cart.cgiというもので、
m_zaiko=load("check_zaiko.cgi?itemid=hoge")
のように結果を受け取りたいのです。
loadやevalといったものを調べましたが、loadに引数(itemid)を渡す方法がよくわかりません。
よろしくお願いいたします。
318デフォルトの名無しさん:2008/03/11(火) 14:19:50
>>313
subやgsubの"$数字"使用不可問題はある意味欠陥だよな
warning出してもいいとすら思う

r.gsub!(/<a\shref=(.*?)>>>(\d+)<\/a>/){"<a href=\"#{$2}\">>>#{$2}</a>"}

1回経験して自力で理由調べると2度と間違えなくなるけどさ
319デフォルトの名無しさん:2008/03/11(火) 14:25:24
>>317
せっかくだから自力で調べるべし
> Action application/x-httpd-eruby /usr/local/bin/eruby

「ファイルタイプがapplication/x-httpd-erubyに該当するなら/usr/local/bin/erubyにファイルを渡して実行」
という設定だ
/usr/local/bin/erubyがなければそもそも動作しない

ところで、erubyでないと何かまずい? erbとか使うんじゃ駄目?
320デフォルトの名無しさん:2008/03/11(火) 14:46:20
>>317後者
ふつーは、
・ check_zaiko.cgi(で使ってるファイル)を require や load する
・ CGI の引数を分解したものを直接受け取ってるクラス(のnew)やメソッドに 'itemid'=>['hoge'] を指定
・ zaiko.to_s を適当に利用する
という流れになると思う
(CGIスクリプトが出力しようとしているものを文字列として横取りするというのは方法論としては「ありえねー」)
なので、 check_zaiko.cgi の中身は

require '標準ライブラリいろいろ'
require '自作ファイルいろいろ'
require 'checkzaiko.rb'

cgi = CGI.new
zaiko = CheckZaiko.new(cgi.params)
cgi.out() do
zaiko
end

とかいう単純な中身になってることが期待される
これなら、 view_cart.cgiでは

require 'checkzaiko.rb'
m_param = {'itemid'=>['hoge']}
m_zaiko = Checkzaiko.new(m_param).to_s

と書くだけでいい
もしcgiファイルに直接メソッドとかを書いてるなら、今回のように再利用するときに非常に面倒なので
てきとーなクラスで囲って別ファイルにしてrequire で読み込んどけ
(初心者は「クラス名とは…」とか「クラスの本質はそもそも…」とかいう小難しい理論は後回しでOK)
321デフォルトの名無しさん:2008/03/11(火) 14:50:38
自分で勉強するかWebProg板に行ったほうがいいんじゃね
セキュリティそっちのけで大やけどする前に
322デフォルトの名無しさん:2008/03/11(火) 15:17:51
自前で1年勉強してもロクにセキュアなものができないのがWeプログラミング
323デフォルトの名無しさん:2008/03/11(火) 16:03:28
>>319
ERBでも良いです。というかまだERBについては勉強していないので、
また勉強してつまづいたら質問させて頂くことにします。
(ERBで行くという方針が決まったので助かりました。ありがとうございます。)

>>320
衝撃でした;もうすでに幾つかCGIに直書きしてしまっているので、
今からはこれをアドバイス通りrbにしていくことにします…。
本当に基本的なことみたいですが、知りませんでした!ありがとうございました。

>>321,322
>>322さんご指摘の通り、自前で全部やっています。
セキュリティについてはセッションハイジャックの仕組み等、概念は勉強しましたが、
肝心の自分のコードでどのようにするかのノウハウが無く、
これでは、やけどする可能性が非常に高いですよね。
ご指摘の通り、WebProg版なども見てみようと思います。
(色々引っ掛かりすぎてるせいか、自前だと時間が本当ににかかるんですね;)

>>319-322さん、レス本当にありがとうございました!
またよろしくお願いいたします。
324デフォルトの名無しさん:2008/03/11(火) 16:56:58
>>322
まあ、業界も飯の種を垂れ流して平気なほどバカではないってことだな
フレームワーク使って検索と独学で勉強しただけでセキュリティ的に堅固なプログラムが作られたら正直困るわけで
325デフォルトの名無しさん:2008/03/11(火) 17:16:05
>>295
ruby/audio ってのがあったけど、WinXPで使えるかどうかよくわからん。
あとは適当にosalpのラッパ書いちゃうとか。
でも、わざわざruby使わんでもmp3splt/mp3wrapでいいんじゃ?
326デフォルトの名無しさん:2008/03/11(火) 17:17:34
外部コンソールプログラムに丸投げするのが正解のような気がするな
というか、仮に何かライブラリがあっても特定の外部プログラムのラッパーだと思う…
327295:2008/03/11(火) 18:58:41
>>325
Mp3splt/Mp3Wrapがまさに差がしていたものです。
ありがとうございます。

>>326
Rubyにファイル名管理させて、処理はMp3splt/Mp3Wrapに任せます。
328デフォルトの名無しさん:2008/03/11(火) 22:36:09
このレベルの人からzaikoなんてワードが出てくると少々ヒヤッとするね。
まぁ、業務アプリってもイントラならそれほど酷いことにはならんかも知れんが
329デフォルトの名無しさん:2008/03/11(火) 23:33:03
いや、実際問題としてRubyで普通に作っただけでは運用に耐えられないはず
Rubyプログラミング以外の知識がどうしても要る
330デフォルトの名無しさん:2008/03/11(火) 23:42:41
複数行モードな正規表現をファイル全体に適用し置換をしたいのですが
ファイルが巨大な場合、変数に全部読むのがためらわれます

=~の中の人(Regexpの中の人?)がもっと読みたくなったらその都度FileやIOなどから
読んでいただくみたいなのを妄想してるのですが
そんな素敵モジュールはすでにあったりするのでしょうか?

331デフォルトの名無しさん:2008/03/11(火) 23:51:31
>>330
1レコード1KBでも1GBじゃん。32bitのメモリ空間埋めるのに、
1万円でおつりが出る時代なんだから、気にしないと言うのも
それはそれでアリかとw
332デフォルトの名無しさん:2008/03/11(火) 23:54:44
今の子はPCのメモリに種類があることも知らなくて困る
333305:2008/03/12(水) 00:09:43
>>306
アリガトン
334デフォルトの名無しさん:2008/03/12(水) 08:59:31
>>331
>1レコード1KBでも1GBじゃん。
どういう計算?行数は出てきてないと思うけど?
335デフォルトの名無しさん:2008/03/12(水) 09:22:02
100万件ほどって事だろうね。
しかし今はホントPC安いよなぁ。
10万くらいだせば、安いショップなら自作機作っても
デスクトップならQuadコアのいいマシンが手に入るからなぁ。
336デフォルトの名無しさん:2008/03/12(水) 09:22:33
rubyでの掲示板の作り方教えろ
337デフォルトの名無しさん:2008/03/12(水) 09:58:14
>>336
他人に直接聞かないと作れないようでは君には無理だ
あきらめろ
338デフォルトの名無しさん:2008/03/12(水) 10:18:32
>>336
Perl,PHPなんかで書かれたものを
とりあえずRubyで書き直すとかしてみれば色々勉強になるんでは?
というか、自分はそうしたけど。
339デフォルトの名無しさん:2008/03/12(水) 11:33:46
rubbsの解説があったのって256本だっけ?
340デフォルトの名無しさん:2008/03/12(水) 12:47:16
ruby 1.8.6 (2007-03-13 patchlevel 0) [i386-mswin32]
で、Windows版Rubyでスクリプトを読み込ませるとウンコみたく遅いです
数秒待たされてから開始されます
なんとかなりませんか
341デフォルトの名無しさん:2008/03/12(水) 13:09:46
ウンコみたく遅いのは別の原因のような気もするが、普通にワンテンポ以上遅いよね

puts Time.now

と書かれた time.rb をバッチファイル/シェルスクリプトで5行記述した結果

Debian @セレ400MHz

$ ./ichiren.sh
Wed Mar 12 13:08:09 JST 2008
Wed Mar 12 13:08:09 JST 2008
Wed Mar 12 13:08:09 JST 2008
Wed Mar 12 13:08:09 JST 2008
Wed Mar 12 13:08:09 JST 2008

Win2000 @ペンIII 863MHz

>ichiren.bat
>ruby time.rb
Wed Mar 12 13:04:15 +0900 2008
>ruby time.rb
Wed Mar 12 13:04:16 +0900 2008
>ruby time.rb
Wed Mar 12 13:04:17 +0900 2008
>ruby time.rb
Wed Mar 12 13:04:18 +0900 2008
>ruby time.rb
Wed Mar 12 13:04:20 +0900 2008
342デフォルトの名無しさん:2008/03/12(水) 14:23:59
自分で作ったプログラムの説明をriやrdocに追加することはできますか?
Emacsで「カーソルがメソッドに乗ったらミニバッファに1行解説を表示するよ機能」を使ってるんですが
自分で作ったクラスやメソッドについてもこれを表示させたいです
343デフォルトの名無しさん:2008/03/12(水) 16:47:19
boost::regex_matchの引数flagsにboost::regex_constants::match_partialを指定したみたいな感じで
正規表現に途中までマッチしたことを知るにはどうすればよいですか?
344デフォルトの名無しさん:2008/03/12(水) 17:53:57
>>340>>341
NYACUSっていうシェルだとDDE(=遅い)に頼らず
拡張子でコマンドに関連付けできる。
345デフォルトの名無しさん:2008/03/12(水) 18:31:39
色んな例外クラスを定義しまくって
問題あれば例外を投げ飛ばして
後でザクザク拾い上げるってコーディングしてたら
これってgotoと何が違うの・・・?
と思って悲しくなった
346デフォルトの名無しさん:2008/03/12(水) 18:36:34
>>345
本質的にはあんま変わらんよな
そこに気づいたらもう一歩だと思う
347デフォルトの名無しさん:2008/03/12(水) 18:53:41
「必ず」同じディレクトリにあるhoge.rbをrequireで読み込みたいです
どう書くのが普通ですか?

というか、みんな困ってないんでしょうか?
348デフォルトの名無しさん:2008/03/12(水) 19:00:17
require './hoge.rb'
349デフォルトの名無しさん:2008/03/12(水) 19:23:23
>>347
“同じディレクトリにあるhoge.rbを「必ず」requireで読み込みたい”だと勝手に補完

require '標準ライブラリ'
$LOAD_PATH.unshift(File.dirname(File.expand_path(__FILE__)))
require 'このファイルから見た自作ライブラリの相対パス'

これで桶
>>348のような書き方は
/home/user/ ディレクトリとかで
~$ ruby /home/user/myscript/main.rb
とかしたときに動作しない
350デフォルトの名無しさん:2008/03/12(水) 19:26:51
じゃあこういう場合はどうする?
a.rb、test/d.rb ともに問題なく実行するにはどうすれば??
以下のままだと、a.rb でエラーが出てしまう。

----------
[a.rb]
require 'test/b.rb'
test_print
----------
[test/b.rb]
require 'c.rb'
def test_print
print TEST_MESSAGE, "\n"
end
----------
[test/c.rb]
TEST_MESSAGE = 'Test Message!'
----------
[test/d.rb]
require 'b.rb'
test_print
----------
351350:2008/03/12(水) 19:28:41
>>349
あ、ごめ
リロードする前に書き込んじゃったよ。
それは350のでも桶?
352350:2008/03/12(水) 19:32:46
>>349
今試したら動いたよ。
良かった。ありがと。
353デフォルトの名無しさん:2008/03/12(水) 19:38:06
メインの a.rb で一括して
$LOAD_PATH.unshift(File.join(File.dirname(File.expand_path(__FILE__)),'test'))
というように test/ ディレクトリ以下をrequireのロードパスに登録しておくのが素直に思う
b.rb でも c.rb でも $LOAD_PATH への追加をしていくと微妙に不恰好になる
354デフォルトの名無しさん:2008/03/12(水) 21:44:35
>>338
Perlで書いたものをPHPで書き直してそれをRubyにした後Pythonになって落ち着きました
355デフォルトの名無しさん:2008/03/12(水) 23:06:38

・ 配列の後ろからn個が欲しい
・ ただし、要素数はnより少ないこともある
・ そして、nより少ない場合は少ない配列のままが欲しい

を満たす一番妥当な書き方は

arr.reverse[0,n]

でいい?
356デフォルトの名無しさん:2008/03/13(木) 00:13:01
>>355

arr.last(n) でいいんでない?

357デフォルトの名無しさん:2008/03/13(木) 00:16:01
というかなぜreverse
逆順に欲しいのか?
358デフォルトの名無しさん:2008/03/13(木) 06:32:26
rubyの一般的な命名規則はどんなのですか?
本を参考にhoge_moge_pogeって感じにしてますが
359デフォルトの名無しさん:2008/03/13(木) 07:02:45
メソッド、変数名は hoge_moge_poge
定数は HOGE_MOGE_POGE
クラス名は HogeMogePoge
だと思う。
360デフォルトの名無しさん:2008/03/13(木) 07:23:37
Matzたんのを参考にしてみれば。
でも本人は勝手に決めてと言ってるが。
ttp://www.rubyist.net/~matz/20041006.html
361デフォルトの名無しさん:2008/03/13(木) 08:18:19
指定したファイルパスまでのディレクトリが存在しない時、
mkdir -p
を外部コマンドとして実行して親ディレクトリを作成しているのですが
もっとスマートな方法はありませんか?
362デフォルトの名無しさん:2008/03/13(木) 08:35:04
>>361
FileUtils.mkpath
Pathname.mkpath
363デフォルトの名無しさん:2008/03/13(木) 14:57:39
>>359が多数派
先頭だけ小文字であとは大文字併用なローワーキャメルケース変数(hogeArrayのような)もしぶとく勢力拡大中


Railsは異境なのでよくわからん命名規則とよくわからん名前の変数やメソッドが跳梁跋扈
364デフォルトの名無しさん:2008/03/13(木) 15:02:59
たとえ途中でも大文字が入ってると目視認識時にビビるんだよね
下手に気取らずに変数やメソッドは素直に全部小文字で行って欲しい

小文字だけ → 変数やメソッド
大文字が入ってる → 定数やクラス名

これでいいじゃんね
365デフォルトの名無しさん:2008/03/13(木) 17:24:34
>>362
ありがとうございます
FileUtilsにはmkdir_pというそのままな名前のメソッドもあるんですね
366デフォルトの名無しさん:2008/03/13(木) 17:49:00
自分用汎用ライブラリってどこに置くのがベストですか?
あとphp.iniみたいな、ruby自体の設定ファイルがありませんが、
各アプリ共通のライブラリパスはどこで設定するのが綺麗でしょうか。
367デフォルトの名無しさん:2008/03/13(木) 19:21:05
ヘッダファイルの構造体定義を食わせると pack/unpack のフォーマット文字列を
自動生成してくれるような素敵なツールって無いっすかね?
368デフォルトの名無しさん:2008/03/13(木) 22:44:19
typedefとか追っかけるのがめんどいよね
C言語のyacc/lexみたいなのがいるんじゃない?
RubyだとRaccで書くことになるんかな。
369367:2008/03/13(木) 23:26:32
そうそう、めんどうなんすよね。
最初は頑張ってたんですが、 vfmt.fmt.pix.height とか出てきて、さすがにめげた。
自分で parse するのも考えたんですが、
結局 pure Ruby で pack/unpack するのはあきらめて、
構造体からデータを入出力するのは拡張ライブラリで実装することにしますた。
370デフォルトの名無しさん:2008/03/14(金) 00:00:16
>>366
>自分用汎用ライブラリ
俺なら ~/lib/ruby か /usr/local/lib/ruby だな
371デフォルトの名無しさん:2008/03/14(金) 00:01:39
winなら?
372デフォルトの名無しさん:2008/03/14(金) 00:08:45
>>371
~/マイドキュメント/ruby
~/Local Settings/Application Data/ruby

あたり?

スペース入るのがいやなら
ドライブの直下に ruby/lib を作るとか。
373デフォルトの名無しさん:2008/03/14(金) 00:12:24
Winなら
C:\Ruby
以下があるはずだと思うけど
374デフォルトの名無しさん:2008/03/14(金) 00:15:02
ありがとう
375デフォルトの名無しさん:2008/03/14(金) 00:16:07
Windowsだと
ruby -e 'p $:'
の出力中に site_ruby っぽいのは含まれないの?
376デフォルトの名無しさん:2008/03/14(金) 00:57:45
>375
C:\usr\local\ruby 以下にインスコした漏れの場合

> ruby -e 'p $:'
["C:/usr/local/ruby/lib/ruby/site_ruby/1.8", "C:/usr/local/ruby/lib/ruby/site_ru
by/1.8/i386-msvcrt", "C:/usr/local/ruby/lib/ruby/site_ruby", "C:/usr/local/ruby/
lib/ruby/1.8", "C:/usr/local/ruby/lib/ruby/1.8/i386-mswin32", "."]

こーなった
ちなみに
> ruby -v
ruby 1.8.6 (2007-03-13 patchlevel 0) [i386-mswin32]
377デフォルトの名無しさん:2008/03/14(金) 10:20:56
マイクロソフトRuby潰す宣言
「既存のRubyのライセンスはもちろん買収するつもりだ。その上でRuby.NETの開発をまつもとひろゆき氏に依頼したい」――CEO会長坂田雄太
http://an.to/?microsoft01news
378デフォルトの名無しさん:2008/03/14(金) 10:35:57
ついにあの伝説のRuby開発者、まつもとひろゆき氏が動くのか!?
379デフォルトの名無しさん:2008/03/14(金) 10:41:10
>>377のURLコピペでいくつかのスレが荒らされとるな
URL以外の内容はスレに即したものの模様
380デフォルトの名無しさん:2008/03/14(金) 10:42:13
>>377
ブラクラじゃん
381デフォルトの名無しさん:2008/03/14(金) 10:46:36
>377
春休みか?いまどきそんなチャチなものブラクラとも言わんぞ
382デフォルトの名無しさん:2008/03/14(金) 11:30:07
>>367
dl2のdl/import.rb
383デフォルトの名無しさん:2008/03/14(金) 11:58:15
顔文字をcanna用に変換したいんだけど半角カナが全角になったゆ
だれか全角カナを半角に変換する方法知らない?
384デフォルトの名無しさん:2008/03/14(金) 12:09:38
>>383
nkfに-xを付けなかったんじゃないか? 元の変換の時に。
385デフォルトの名無しさん:2008/03/14(金) 12:17:47
>>384
やってるよ
386デフォルトの名無しさん:2008/03/14(金) 12:19:27
>>382
それ動く?
387デフォルトの名無しさん:2008/03/14(金) 13:10:12
>>383
あー、xだけではダメだった場合が記憶にある
実際のNKF::nkfのオプション晒すがいいぞ
388デフォルトの名無しさん:2008/03/14(金) 13:27:17
$ nkf -xe imekao > kao
$ ./kao.rb < kao > cannakao
kao.rbはunixuserかどっかから持ってきた奴
#!/usr/bin/ruby -Ke
require 'kconv'

while line = gets

str = line.split(/\t/)

next unless str[2]
next unless str[2].toeuc.chop == "顔文字"

print str[0].toeuc
print " #KJ "
puts str[1].toeuc.gsub(/ /, "\\ ")

end
389デフォルトの名無しさん:2008/03/14(金) 13:45:46
…。

>>388
.toeuc は半角カタカナを全角に変換する
シェル上での処理の併用っぷりとかに疑問がありまくりだが、とりあえず、.toeucを外せ
kaoファイルの時点ですべてEUC-JPに変換されている(-xの効果で半角カタカナ維持中)から、kao.rbの内部でEUC-JPへ変換する必要はない
390デフォルトの名無しさん:2008/03/14(金) 14:04:58
>>389
シェル使うのはRubyが面倒だからです
まあなんにしろできましたありがとう
391デフォルトの名無しさん:2008/03/14(金) 19:22:15
Baseを上手く継承させたいんですが、ムリでしょうか?

class Base
def msg(s)
print s, "\n"
end
end

class A < Base
def show
self.msg('class A')
end
end

class B < Base
def B.show
self.msg('class B')
end
end

A.new.show
B.show
392デフォルトの名無しさん:2008/03/14(金) 19:26:27
数値オブジェクトにsmaller_thanとかlarger_thanみたいなメソッドないですか?
>とか<を使うと、オペランド間の優先順位が気になります
393デフォルトの名無しさん:2008/03/14(金) 19:30:12
>>392
素直に ( ) でくくれ
そっちのほうが文字数も短い
394デフォルトの名無しさん:2008/03/14(金) 19:30:47
1.<(3)
3.<(1)
395デフォルトの名無しさん:2008/03/14(金) 19:35:07
>>391
Base.newとすることが無いなら、BaseをmoduleにしてAとBでincludeすれ
眠いから不正確かもしれんがだいたいそんな感じ
396デフォルトの名無しさん:2008/03/14(金) 19:35:23
>>391
Baseのmsgはインスタンスメソッドなんだから、B.showの中でBaseのインスタンスがないとどうしようもないかと
397デフォルトの名無しさん:2008/03/14(金) 19:41:04
>>393-394
そういう書き方も出来たんですね
ありがとうございました
398デフォルトの名無しさん:2008/03/14(金) 19:48:01
>>395
やっぱりB.showで使えないみたいです…

module Base
def msg(s)
print s, "\n"
end
end

class A
include Base
def show
self.msg('class A')
end
end

class B
include Base
def B.show
self.msg('class B')
end
end

A.new.show
B.show

>>395
そうですよね…
継承する時に、特異形式での継承修飾とか出来れば解決するんですが…

やっぱり特異メソッドの中だけ、Baseのインスタンスを作って、Baseのメソッドを呼び出すしかないんでしょうか?
399デフォルトの名無しさん:2008/03/14(金) 20:01:36
A')

これが気になった('A')
400デフォルトの名無しさん:2008/03/14(金) 20:15:47
>>398
class B
 extend Base
 def B.show ; self.msg('class B') ; end
end
401デフォルトの名無しさん:2008/03/14(金) 20:30:25
>>398
継承元の msg() をクラスメソッドにしないのには、
何か理由があるのでしょうか?
402398:2008/03/14(金) 21:15:32
>>400
解決しました!ありがとうございます!

>>401
既に使用しているスクリプトで
大量にメソッドを定義したBaseや、それを継承したAみたいなクラスがあったのですが
新たにインスタンス化して使うクラスを別途作成していて
そこでもBaseの機能を使用しなければならなくなって困ってました。
403デフォルトの名無しさん:2008/03/14(金) 21:52:44
なんか危ないねぇ・・・
404デフォルトの名無しさん:2008/03/14(金) 22:04:15
Ruby で書かれたウェブサーバー Mongrel の作者曰く「Ruby は低品質で、
ゴミクズソフトが頼っているクソみたいなインタプリタにも関わらず不当に勢いを得た」.
http://po3a.blogspot.com/2008/03/ruby-mongrel-ruby.html
405デフォルトの名無しさん:2008/03/14(金) 23:28:07
>>404
> エキスパートの意見を参考に死ぬまで Ruby を使わないと決心した。

あらまあ真に受けちゃってお気の毒に。

http://www.rubyist.net/~matz/20080114.html#p02
406デフォルトの名無しさん:2008/03/14(金) 23:31:21
もとからRubyが嫌いなんでしょ
その人なりのジョークだよ
407デフォルトの名無しさん:2008/03/14(金) 23:38:22
そのわりにはRubyに生活かけてる割合高いなー
408デフォルトの名無しさん:2008/03/15(土) 03:11:09
Web上で既にCSV形式になってるページをDBに突っ込みたいんだけど、
美しく記述するためにはどうすればいい?

#baz.cgiからidが10番から50番のデータを取り出す
#id,name,sex…など5カラムがCSVで返ってくる
open('http://hoge.foo.bar/baz.cgi?10&50') do |f|
 m = Mysql.new('localhost', 'hogeuser', 'hogehoge', 'hogetable')
  f.each do |line|
   sql = m.prepare('insert into name values(?, ?, ?, ?, ?)')
   sql.execute(line.split(',')[0], line.split(',')[1], line.split(',')[2], line.split(',')[3], line.split(',')[4])
 end
end


折角CSVで来てるのに、分割して挿入するのがどうも…。
409デフォルトの名無しさん:2008/03/15(土) 03:13:21
sql.execute(*line.split(','))

*がなければ、配列1つを1引数として
*を付けると、配列をその場に展開して書いたように
渡してくれる。
410408:2008/03/15(土) 06:46:27
いろいろできるもんだね。
勉強がてら色々書いてるけど、何でも出来る分、メソッドとか覚えきれない…。
411デフォルトの名無しさん:2008/03/15(土) 11:52:02
>>408
>   f.each do |line|
>    sql = m.prepare('insert into name values(?, ?, ?, ?, ?)')
ループの中でprepareすんなよ。
412デフォルトの名無しさん:2008/03/15(土) 12:35:50
というか、コピペで頑張ってる時期でprepareのご利益についてまだ知らないんだろう
413デフォルトの名無しさん:2008/03/15(土) 12:38:19
splitを、結果保存しないで5回も呼んでる時点でそのへん突っ込んじゃいけないことが分かる。

414デフォルトの名無しさん:2008/03/15(土) 12:43:18
総力を挙げて突っこむのがこのスレの趣旨では・・・w?
415デフォルトの名無しさん:2008/03/15(土) 12:53:34
>>414
そんな趣旨はない

ただし、もし
 
csv = open('http://hoge.foo.bar/baz.cgi?10&50').readlines
m = Mysql.new('localhost', 'hogeuser', 'hogehoge', 'hogetable')
sql = m.prepare('insert into name values(?, ?, ?, ?, ?)')
csv.each do |line|
sql.execute(line.split(',')[0], line.split(',')[1], line.split(',')[2], line.split(',')[3], line.split(',')[4])
end

というコードだったらsplitの部分はm9(^Д^)プギャーされても文句言えない
416デフォルトの名無しさん:2008/03/15(土) 13:19:43
require 'csv'
csv = open('http://example.com/baz.cgi?10&50').read
m = Mysql.new('localhost', 'hogeuser', 'hogehoge', 'hogetable')
sql = m.prepare('insert into name values(?, ?, ?, ?, ?)')
CSV.parse(csv){|a| sql.execute(*a)}

読みやすさ維持しつつコンパクトに表現するとこんな感じ?
417デフォルトの名無しさん:2008/03/15(土) 13:37:06
それだけのことが書ける人はcloseするかブロック付きopenを使う、はず。
418デフォルトの名無しさん:2008/03/15(土) 13:52:14
ワンライナーでお願いします
419デフォルトの名無しさん:2008/03/15(土) 13:56:55
contents = File.open('hoge.txt'){|f| f.read}
というファイル読み込みの書き方は初学者の人に微妙に人気がない
420デフォルトの名無しさん:2008/03/15(土) 13:59:22
contents = IO.read('hoge.txt')
421デフォルトの名無しさん:2008/03/15(土) 14:01:55
>>419
contents = nil
File.open(path) do |f|
contents = f.read
end

たとえ4行に増えてもこっちのほうがわかりやすいんだろな
ブロックの最後に評価されたものが自動で返るという仕様に依存した書き方は気持ち悪いらしい
422デフォルトの名無しさん:2008/03/15(土) 14:02:10
File.readのほうが受けがよさそう。同じことだけど。
423デフォルトの名無しさん:2008/03/15(土) 14:11:13
IO.readってファイル読み終わったらクローズされてるの?
424デフォルトの名無しさん:2008/03/15(土) 14:11:19
よし、流れ理解
> ブロックの最後に評価されたものが自動で返るという仕様に依存した書き方は気持ち悪い
つまり、メソッドにおけるreturnのような明示的に値を返す意図を感じるものがあればいいんだな

contents = open(path){|f| break(f.read)}

これでどうだー
425デフォルトの名無しさん:2008/03/15(土) 14:13:45
うちの大学の助手が
fp = nil
fp = File.open(path, "r")
if(fp==nil)
(以下ry

って書いてた
早く何とかしないと・・・
426デフォルトの名無しさん:2008/03/15(土) 14:23:41
>>423
IO.readとFile.read(とforeachとreadlines)は特別

ただし、バイナリモードにしない(できない)んで、Windowsで使うときには注意、というか使ったらダメ子ちゃん
427デフォルトの名無しさん:2008/03/15(土) 14:25:33
http://doc.loveruby.net/refm/api/view/method/IO/s/read
1.9で拡張されたのかな。
428デフォルトの名無しさん:2008/03/15(土) 14:45:14
>>427
手元の1.8.6では動かね

IO#readとIO#foreachとIO#readlinesは俺スクリプト専用の便利メソッドとして割り切るしかないな
公開するスクリプトでは使えそうにない
429デフォルトの名無しさん:2008/03/15(土) 15:26:59
>>417
具体的にナニを close させる気なのか気になる
HTTP コネクションは OpenURI#open_http の中ですでに閉じてるし、
open 自体から返ってきてるのは StringIO だから close はただの読み書き禁止フラグだし

uri-open の open(uri){|sio| … } は「open(uri) の結果の StringIO をブロックに渡す」以上の意味はないように思う
カタチは同じだけれど、 open(local){|io| … } と open(uri){|sio| … } はやってることは違う
430デフォルトの名無しさん:2008/03/15(土) 15:53:18
>>429
> 具体的にナニを close させる気なのか気になる
Mysqlのコネクションとか?

> HTTP コネクションは OpenURI#open_http の中ですでに閉じてるし、
open-uriをrequireしてないじゃん。

> uri-open の open(uri){|sio| … } は「open(uri) の結果の StringIO をブロックに渡す」以上の意味はないように思う
> カタチは同じだけれど、 open(local){|io| … } と open(uri){|sio| … } はやってることは違う
URIからの読み込みと明示したいなら、URI.parse(...).readを薦める。
431デフォルトの名無しさん:2008/03/15(土) 15:57:45
>>425
> うちの大学の助手が
東大大学院の特任助手のことかー!?
432デフォルトの名無しさん:2008/03/15(土) 16:04:29
>>430
>>408読め
433デフォルトの名無しさん:2008/03/15(土) 16:11:38
open_httpの中で閉じているというのは実装詳細なので、
利用者としては期待してはいけないと思う。
434デフォルトの名無しさん:2008/03/15(土) 16:20:31
>>433
ブロックの終わりでcloseされるはずというのも実装依存だと思うぞ(ただのブロックであってもいいわけだし)
というか、件のは「closeされるべきものがそもそも無い」という話なんじゃ…

io = File.open(path)
ならIO.closeは「本来しなくてはならない」ものだけど、
sio = open(uri)
なら、StringIO.closeは「別にしなくてもいい」ものだろ
open(uri)でNet::HTTPが返ってきて適宜finishしなくてはならないというのは
それはそれで面白いことができそうだがぶっちゃけ面倒だ
435デフォルトの名無しさん:2008/03/15(土) 16:25:49
ブロック付きopenが閉じるってのは実装依存じゃなくて仕様じゃない?
436デフォルトの名無しさん:2008/03/15(土) 16:26:55
と思ったら、StringIOもしくはTempfileを返す、と仕様自体が再定義されるから問題ないのあ。
437436:2008/03/15(土) 16:27:30
↑open-uriをrequireしたあとのKernel.openのことね。
438デフォルトの名無しさん:2008/03/15(土) 16:28:58
>>433
仮に閉じなくなったとしたら、OpenURI::MetaのcloseにHTTPセッション終了の機能を追加だな…
439デフォルトの名無しさん:2008/03/15(土) 16:37:12
>>436
そう
だから、open(uri)のブロックで、open(path)のように「ブロックの終わりで何かが閉じる」と考えるのは実は勘違い
eachに渡したブロックが終わるのと同じ

まあ、実際上はclose云々ではなく変数スコープとかの関係でブロックが重宝されてるんだけどさ
変に毛嫌いせんとブロック使っとけという感じではある

ただ>>421の気持ちはわかるけど
ブロックのendにメソッドチェーンがつくのと似たような感覚なんだろう
440デフォルトの名無しさん:2008/03/15(土) 16:41:28
>>408
O/Rマッパーを使う
441デフォルトの名無しさん:2008/03/15(土) 16:44:28
ずっと思ってたんだけど、

http = Net::HTTP.start('www.example.com', 80)

で開始されるhttpって、スクリプト内部の勝手な何かだよね?
外部へのHTTPコネクション自体は、http.getが実行された時点で開始して即終了してるんだよね?

ファイルIOみたく、http.finish(あるいはブロックの終わり)で終了しなくても対外的には問題ないよね?
442デフォルトの名無しさん:2008/03/15(土) 17:01:03
>>441
- 転送終了時、keep-aliveな場合はあえて@socketを閉じてない
- ブロック終わりに呼ばれるdo_finishでは@socketを明示的に閉じてる

ブロック使って自動でfinishしてもらったほうがいいと思うぞ
443デフォルトの名無しさん:2008/03/15(土) 18:12:40
>>416
標準のcsv.rbはでかいの食わせると思いっきり遅い

何度も大きなCSVを扱うならFasterCSVのほうがいいぞ
ファイル1個だけだから面倒なインストールなしで使える

データ構造やアルゴリズムが違うのか解析に手を抜いてるのかは知らん
444デフォルトの名無しさん:2008/03/15(土) 19:47:16
RubyってRAII的なものはないの?
Procとかじゃなくて
あるメソッドの先頭でマウスカーソルを砂時計にしてるんだけど、途中で抜けたり最後まで処理したりでいろんなとこにバラバラにカーソル元に戻す文書くのめんどいし忘れるんだ…
445デフォルトの名無しさん:2008/03/15(土) 20:40:45
Rubyには砂時計なんてねーよ

「今どのメソッドの"中"にいるかで値を変化させたい、むろん自動で」

というのは単にプログラムの設計が悪いだけだと思うぞ
446デフォルトの名無しさん:2008/03/15(土) 20:47:43
>>445
じゃあどういう設計がいいの?
447デフォルトの名無しさん:2008/03/15(土) 20:48:45
Ruby での RAII 的な者はイテレータじゃないのかな。
File.open とかそうだっしょ。
448デフォルトの名無しさん:2008/03/15(土) 20:49:33
>>444
def gui_wait
 カーソル変更(砂時計)
 yield
ensure
 カーソル戻す()
end

gui_wait { 処理 }
449デフォルトの名無しさん:2008/03/15(土) 20:52:18
450デフォルトの名無しさん:2008/03/15(土) 20:57:37
しょこたんが「らいらいお(^ω^)」って言ってるのはこれの事だったのか
451デフォルトの名無しさん:2008/03/15(土) 21:07:38
うどんくいてー
452デフォルトの名無しさん:2008/03/15(土) 21:15:29
>>445
wxRuby使ってるんだ

>>447, 449
一応 Ruby RAIIでぐぐるとかはしてから聞いてるんだぜ…

>>448
ありがとう今だけ愛してる!
ensureって例外処理じゃねーとこでも使えたのかー

>>451
釜玉うどん最強
453デフォルトの名無しさん:2008/03/15(土) 21:21:41
>>452
おいおい。>>447>>449>>448 の言ってることは同じだぞw
454デフォルトの名無しさん:2008/03/15(土) 21:26:30
Ruby RAIIで今ぐぐったら一つめじゃねーか。
455デフォルトの名無しさん:2008/03/15(土) 21:29:20
>>453
ブロックに書くのと
def test
puts "test1"
return
ensure
puts "test2"
end
って書くのはちがくね?

Rubyist的にはどうかくのが定形なの?
別に毎回同じ処理だからブロックとかじゃなくて全然構わないんだけど…
456デフォルトの名無しさん:2008/03/15(土) 21:31:03
>>455
>>448 の最後の行を見る気もないようだな。
457デフォルトの名無しさん:2008/03/15(土) 21:39:38
あー、メソッド内でカーソル変えたり戻したりしないで汎用的なの1個使って使いまわせばいいじゃんってことか
458デフォルトの名無しさん:2008/03/15(土) 21:40:18
まぁWikipediaのRAIIのページに「ensureを使う」とまでは
説明してないから、ここで質問する意味はあったのであろう。
459デフォルトの名無しさん:2008/03/15(土) 21:43:03
ハッシュを多重代入する方法はありませんか?
ハッシュから複数の値を連続的に取り出す時、
ハッシュの名前を何度も書かないといけないのが気になります
460デフォルトの名無しさん:2008/03/15(土) 21:48:03
hash.values_at(key1, key2, ...)とすれば値の配列が得られる。

hash = { 'a' => 10, 'b' => 20, 'c' => 30, 'd' => 40, 'e' => 50 }
p hash.values_at('a', 'b')
p hash.values_at(*%w(a b))
461デフォルトの名無しさん:2008/03/15(土) 21:48:49
ん、多重代入する方法を知りたいのか連続的に取り出す方法が知りたいのか
どっちなんだ。
462デフォルトの名無しさん:2008/03/15(土) 21:53:39
long_name_hash = {'key1' => 'a', 'key2'=>'b', 'key3'=>'c'}
v1 = long_name_hash['key1']
v2 = long_name_hash['key2']
v3 = long_name_hash['key3']
p v1,v2,v3



(v1,v2,v3)=['key1','key2','key3'].map{|k| long_name_hash[k]}
p v1,v2,v3

と long_name_hash 1回で書けたら短けー!

とかそういう話にも見える
463デフォルトの名無しさん:2008/03/15(土) 21:57:26
「ハッシュを」じゃなくて「ハッシュから」か。
464デフォルトの名無しさん:2008/03/15(土) 21:58:41
tmp = long_name_hash
v1 = tmp['key1']
v2 = tmp['key2']
v3 = tmp['key3']
これで十分だと思うが。
465デフォルトの名無しさん:2008/03/15(土) 22:01:14
>>464
お前か、「書きやすいから」とか言う理由でhだのaだの短すぎてよくわからん変数バラ撒いてる張本人は
466デフォルトの名無しさん:2008/03/15(土) 22:07:32
tmp = foo.bar.hoge[baz].piyo

とかだとまあアリだろ。
変数名は状況が分からないとまともに付けらんないので適当。
467デフォルトの名無しさん:2008/03/15(土) 22:08:14
VBでいうwith的なものがほしくなるときはあるなー
468デフォルトの名無しさん:2008/03/15(土) 22:13:03
withってネストできるの?
469デフォルトの名無しさん:2008/03/15(土) 22:14:54
クラスやメソッドの名前は良く考えて決めるけど
ローカル変数の名前なんてどうでも良いや

と思ってるのはダメかな><;
470デフォルトの名無しさん:2008/03/15(土) 22:16:20
VBのwithってPascalといっしょだっけ?
Rubyならinstance_evalでいいんじゃね?
471デフォルトの名無しさん:2008/03/15(土) 22:24:11
他人に公開するんでなければ名前はどうでもいいんだけどね
引数は全部hやstr、返す配列はarr

ちょっとでもわかりやすい名前のほうがいいじゃんと考えるのはプログラマのいいとこ兼悪いとこだ
472デフォルトの名無しさん:2008/03/15(土) 22:26:22
仕事のプログラムは往々にして誰かに見られるんだがな。
473デフォルトの名無しさん:2008/03/15(土) 22:29:40
>>472
Rubyで仕事のプログラム書いてる人なんていないから大丈夫だよ!
474デフォルトの名無しさん:2008/03/16(日) 00:35:06
>>470
instance_evalはselfが変わるので、当然インスタンス変数やインスタンスメソッ
ドが使えなくなる。単なる一時変数の代わりに使うのはおすすめしない。
1.9ならtapというのがあるんだが。
475デフォルトの名無しさん:2008/03/16(日) 01:27:51
これくらいのなら1.9で実績作れば安定版にも入りそうだが

class Object
def tap
yield self
self
end
end

long_name_hash = {'key1' => 'a', 'key2'=>'b', 'key3'=>'c'}

long_name_hash.tap{|h| p h['key1']}
476デフォルトの名無しさん:2008/03/16(日) 01:41:59
tapの本当の使い道はメソッドチェーンの途中にくっつけることだな(tapping = 盗聴)
これがないなら単にselfをyieldするだけでいいわけで

class Object; def tap; yield(self); self; end; end
yyyymmdd = Time.now.tap{|t| p t}.strftime("%Y%m%d")
477デフォルトの名無しさん:2008/03/16(日) 01:43:23
タッピングって盗聴だったのか!
ピロピロだと思ってた・・・
478デフォルトの名無しさん:2008/03/16(日) 01:49:31
いや、ギターのタッピング(ライトハンド)はピロピロでいいだろ…
479デフォルトの名無しさん:2008/03/16(日) 02:01:29
>>475を見るとinject並にRubyプログラミングが変わる可能性があるなとか興奮したが
>>476を見るとそんなショボいメソッドいらねーよと思う不思議
480デフォルトの名無しさん:2008/03/16(日) 02:11:57
ActiveSupportにreturningというtapと形の似た定義のメソッドがある。
def returning(x)
yield x
x
end
selfじゃないところが違うな。

returning とりあえずの返値 do |x|
xをいじくる
end
みたいに使う。
481デフォルトの名無しさん:2008/03/16(日) 02:22:28
injectでRubyプログラミングが変わったなんて気はあんまりしないんだが…
微妙にわかりにくいのが初心者に広まらない原因かねえ。

result = 初期値
array.each do |e|

result = eとresultを足したり加工したりする
end

という処理はけっこう多いと思うんだけど。
482デフォルトの名無しさん:2008/03/16(日) 02:30:35
-ectシリーズの中でも比較的マイナーな動詞だからってのはあるかも。
と思ったら1.9で
* enum.c (Init_Enumerable): reduce is new alias to inject.
なのか。
483デフォルトの名無しさん:2008/03/16(日) 02:37:48
再帰処理をする時に、
関数やメソッドの名前を書かずにする方法はありますか?
関数名が変わっても、再帰部分は書き直さずにすむようにしたいです。
484デフォルトの名無しさん:2008/03/16(日) 02:38:41
すこし複雑な処理になるとeachではっきり書いたほうがわかりやすい

injectを使うと1行でまとまる、以上のメリットがあるとはあんま思えない
injectに5行くらいのdo〜endブロックがくっついてるのを見るとイライラする(w
485デフォルトの名無しさん:2008/03/16(日) 02:45:09
>>483
Yコンビ……いやなんでもない
486デフォルトの名無しさん:2008/03/16(日) 02:47:51
>>483
呼び出し部分をブロックで渡してyieldすればいいんじゃないの?
487デフォルトの名無しさん:2008/03/16(日) 02:48:02
関数とメソッドが違うという理解をしてもらえてるのは嬉しいが、
Rubyには関数がないんだよね
488デフォルトの名無しさん:2008/03/16(日) 02:50:32
実際の再帰処理をどう書いてるかによるよな
489デフォルトの名無しさん:2008/03/16(日) 18:49:46
>>483
質問の意味がいまいち理解できないがこんな感じか?
グローバル変数を使う上にスレッドセーフでもないが
def recursive_call(*param,&block)
 $recursive_block = block if block
 $recursive_block.call(*param)
end
# n から m までの合計値
a = recursive_call(1,10) {|n,m| n==m ? m : n+recursive_call(n+1,m) }
# 指定したディレクトリ以下の内容を表示
recursive_call('/tmp') {|path|
 puts path
 next unless File.directory?(path)
 Dir.new(path).each do |ent|
  recursive_call(File.join(path,ent)) unless ['.','..'].include?(ent)
 end
}
490デフォルトの名無しさん:2008/03/16(日) 20:35:13
>>483
先に断っとくと誉められたもんじゃない

def my_name
 str = caller[0].slice(/`.*?'\Z/) and str[1...-1]
end

とかをこさえて自分自身をsendなりで呼ぶ。
491デフォルトの名無しさん:2008/03/17(月) 00:14:55
Rubyでdefを変数に保存する場合って
どうすればいいのですか?

関数ポインタとか関数オブジェクトみたいな
ものがどれに該当するのか解らない
492デフォルトの名無しさん:2008/03/17(月) 00:22:31
Procとかlambdaとか
493デフォルトの名無しさん:2008/03/17(月) 00:22:50
>>491
できません

似たようなことならProcを使うことでできるけど、専用に書き下ろさないといけない
494デフォルトの名無しさん:2008/03/17(月) 00:22:59
func = Proc.new do |args|
do_something(args)
end

func.call(1000)
495デフォルトの名無しさん:2008/03/17(月) 00:26:30
Module#instance_methodとObject#methodは?
496デフォルトの名無しさん:2008/03/17(月) 00:27:16
いやいや、あるから。

#!/usr/bin/ruby

class Test
def initialize(value)
@value = value
end

def show
p @value
end
end

class App
def main
test = Test.new("hoge")
show = test.method(:show)
show.call
end
end

App.new.main
497デフォルトの名無しさん:2008/03/17(月) 00:33:08
>>491
リロードしたら答えがあがってたけど、せっかくだから晒す
def hello(name) ; puts "hello #{name}" ; end
m = method(:hello)
m.call('hoge')
498デフォルトの名無しさん:2008/03/17(月) 01:28:24
メソッドを繋げていって配列を得て、
その配列を、他のメソッドの引数にしなければならない時
(たとえば配列が表すTimeオブジェクトの生成)、
メソッドチェーンが途切れるのが嫌です。
メソッドチェーンに繋げて書く方法があれば教えて下さい
499デフォルトの名無しさん:2008/03/17(月) 01:31:22
メソッドチェーンが長過ぎると読みづらいから
適当な所で切れても別にいいんじゃない?
500デフォルトの名無しさん:2008/03/17(月) 01:35:04
class Object
 def apply(method)
  method.call(self)
 end
end

hoge.hige.hage.apply(foo.method(:bar))

あまりおすすめはしない。
501デフォルトの名無しさん:2008/03/17(月) 01:50:33
メソッドが起動してしまってる時点で、存在したオブジェクトの総数は変わらんからな
変数名という薄っぺらいラベルがくっついてるかくっついてないかの違いしかない
返り値オブジェクトの回収までの時間がミリ秒長くなることを気にしてるなら、そんなん気にしてたら禿げるぞ

>>475のtapを使えばたいていメソッドチェーンの中にいることはできるけどな
502デフォルトの名無しさん:2008/03/17(月) 01:50:40
>>499-500
ありがとうございます
やっぱり自然な形ではできないんですね
あきらめて普通にやります
503デフォルトの名無しさん:2008/03/17(月) 02:33:38
ruby インタープリタはFIFOから読み込むことはできないんでしょうか?

$ mkfifo fifo
$ echo 'puts "hello"' > fifo
$ ruby fifo
反応なし

↑これでPythonやPerlではできるのですが。
ruby 1.8.6 (2007-06-07 patch level 36) [i486-linux]
504デフォルトの名無しさん:2008/03/17(月) 02:35:44
今やってみたら普通にできたけど。
ruby 1.8.6 (2007-09-24 patchlevel 111) [i486-linux]
505デフォルトの名無しさん:2008/03/17(月) 03:36:08
グローバル変数なんだがね,これ,一度書き込んだら後参照しかできないようにする方法って無いのかすら.
やっぱそれやりたかったら,なんかクラスのインスタンス変数にしてatter_readerにするしかないんだろか.
506デフォルトの名無しさん:2008/03/17(月) 03:52:58
グローバルな定数をfreezeしたらどうだろう?
507デフォルトの名無しさん:2008/03/17(月) 03:54:16
む、代入は警告つきで出来ちゃうのか。
508デフォルトの名無しさん:2008/03/17(月) 04:12:14
特異クラスにすれば楽かな
509503:2008/03/17(月) 05:27:37
>>504
UbuntuとFedora4で試したんですが、どちらでもだめでした。なぜでしょうね?
510デフォルトの名無しさん:2008/03/17(月) 09:41:55
trace_var(:$readonly){|x|
raise if @set
@set = true
}
$readonly = 0
p $readonly
$readonly = 1


@setのselfは何なんだろう
511デフォルトの名無しさん:2008/03/17(月) 10:50:13
p self
512デフォルトの名無しさん:2008/03/17(月) 12:18:53
>>505
2度代入しないようにプログラムを書く

いやマジで
513デフォルトの名無しさん:2008/03/17(月) 12:48:48
>>510
いや、単に代入がすんでからフックを仕込めば
いいんじゃないか。
514デフォルトの名無しさん:2008/03/17(月) 14:41:36
Rubyの定数は「参照先が固定の変数」だからなあ

irb> VAL = '1st'
irb> VAL = '2nd'
(irb):3: warning: already initialized constant VAL
irb> p VAL
"2nd"

irb> VAL2 = '1st'
irb> VAL2.replace('2nd') # 破壊的メソッドで内容だけすりかえるのは警告されない
irb> p VAL2
"2nd"
irb> VAL2.freeze
irb> p VAL2.frozen?
true
irb> p VAL2.__id__
538355018
irb> VAL2.replace('3rd')
TypeError: can't modify frozen string # freezeは自分が破壊的メソッドの影響を受けるのを防ぐだけ
irb> p VAL2
"2nd"
irb> VAL2 = '3rd'
(irb):13: warning: already initialized constant VAL2
irb> p VAL2 # 定数が指すオブジェクトそのものが切り替えられることを防ぐ機能はfreezeにはない
"3rd"
irb> p VAL2.__id__
538545180

まあ、実施は固定になってないんだけどさ
515デフォルトの名無しさん:2008/03/17(月) 23:23:38
フォームから受け取ったCGI.newの長さを調べて
EUC-JPコードに変換しながら配列に入れていきたいんですが
CGI.newの個数の調べ方はありますか?
CGI.new.length
ではできなかったので
初心者すぎる質問ですいませんが
ご教授お願いしますm(_ _)m
516デフォルトの名無しさん:2008/03/17(月) 23:32:10
>>515
個数は調べる必要はない

cgi = CGI.new としたcgiからどういう形でデータを取り出せるのかよく調べるといいぞ
517デフォルトの名無しさん:2008/03/17(月) 23:36:49
cgi=CGI.new
cgi.params.length
でハッシュにして個数調べられました。
もっと調べるべきでした申し訳ないです。
518デフォルトの名無しさん:2008/03/17(月) 23:46:25
要素数にこだわってんなあ
519デフォルトの名無しさん:2008/03/17(月) 23:54:56
添字でないとアクセスできない人はときどきいる
あと、Array.newの引数にはサイズが要るだろう、みたいな人
520デフォルトの名無しさん:2008/03/17(月) 23:59:58
>>519
おれ、もともとヌルいスクリプト書きだけど
その辺に慣れきってしまってEXCEL VBAにさえ戻れなくなった
521デフォルトの名無しさん:2008/03/18(火) 00:50:38
レガシVBって特にスクリプト系の別言語に馴染むと信じられんくらいめどい
てか、配列が型付きなだけで、実質*allocのラッパってのがなんとも……
522デフォルトの名無しさん:2008/03/18(火) 08:14:02
Emacsでコーディングしているんですが、
複数行のインデントがぐちゃぐちゃのコードを一発できれいに整形するコマンドってあるでしょうか?
523デフォルトの名無しさん:2008/03/18(火) 09:36:38
region選択して C-M-\ indent-region

EmacsのTutorialにはなかったっけ?
524デフォルトの名無しさん:2008/03/18(火) 11:18:48
下手にEmacsの基本操作だから無いかもしれない
たとえば、HTMLを扱うsgml-modeでも同じことができる

indent-region とか comment-region とか覚えとくと便利
525デフォルトの名無しさん:2008/03/18(火) 15:48:12
>>519
あれを Array と呼んで平気な感覚のほうがオカシイということにまず気づけ。
new 時にサイズを指定するほうが自然だと思う人をコケにするのはそのあとだ。
526デフォルトの名無しさん:2008/03/18(火) 16:13:14
>>525>>515が要素数を何に使う気だったのか理解してないな
527デフォルトの名無しさん:2008/03/18(火) 16:22:19
「配列に入れていきたい」の「配列へ」の値のセットに使う気だったんだろ?(あるいは配列の生成)
for文で繰り返しの最後の値が決められないとかそんなとこだと想像

cgi.paramsから値を取り出すときではないと思われる
というかキーと勘違いしてたということは>>517の自己解決っぷりからしてあまりありえなさそうだ
528デフォルトの名無しさん:2008/03/18(火) 16:35:01
おまえらそんなことより gem で wirble インストールして irb に色つけようぜ
マシンスペックがしょぼいと irb の起動が一瞬遅れるようになるけど
rubygem 使うライブラリにはよくあることだから気にするな
529デフォルトの名無しさん:2008/03/18(火) 16:42:20
色が付くとどうなるの?
530デフォルトの名無しさん:2008/03/18(火) 16:55:32





なります
531デフォルトの名無しさん:2008/03/18(火) 19:00:44
エディタの色わけは不要

って言う人がたまにいるけど、
普段スクリプト言語しか使わない人なんだろうなぁ・・・
と思ってしまう。
そういう人には構文チェックで5分かかるような世界を味わって欲しい
532デフォルトの名無しさん:2008/03/18(火) 19:22:58
grepやlessで色がつくわけではないから、とか不思議な論理の話をしてる人もいたな
ぜひ(g)vim使用でのviewコマンドとか試して頂きたく
533デフォルトの名無しさん:2008/03/18(火) 21:05:18
色付け頼り派だが、
パイプして読むときにVimはめんどいよ…
534デフォルトの名無しさん:2008/03/18(火) 21:44:27
wirbleには若干問題があって、
>> Rational(10, 10)
=> Rational10, 10
>> /(10|20)/
=> 1020
などと表示されてしまうぜ。

どう直せばいいんだか。
535デフォルトの名無しさん:2008/03/18(火) 22:32:12
>>534
when ':': state << :symbol
when '"': state << :string
when '#': state << :object
when /[a-z]/i
state << :keyword
repeat = true
when /[0-9-]/
state << :number
repeat = true
when '{': yield :open_hash, '{'
when '[': yield :open_array, '['
when ']': yield :close_array, ']'
when '}': yield :close_hash, '}'
when /\s/: yield :whitespace, c
when ',': yield :comma, ','
when '>'
yield :refers, '=>' if lc == '='
when '.'
yield :range, '..' if lc == '.'
when '='
# ignore these, they're used elsewhere
nil
else
# $stderr.puts "DEBUG: ignoring char #{c}"
end

ということで、 返り値に / や ( や ) や | が来たときの処理がない
作者さんはこれで困ってないのかなあ、とちょっと思う
536デフォルトの名無しさん:2008/03/18(火) 22:38:35
作者は実は使ってないとか
537デフォルトの名無しさん:2008/03/18(火) 23:00:43
初版リリースしたとたん急に意欲がなくなって放置してしまうのはよくある事w
538デフォルトの名無しさん:2008/03/18(火) 23:05:35
胸が痛い。
539デフォルトの名無しさん:2008/03/18(火) 23:07:49
ていうか、使ってみるとよくわかるんだが、「返り値」が「メソッドや記号」で色づけされてもイマイチ有り難味が薄いんだよな
本当に必要なのはプロンプト行を目立たせることか、あるいは p や puts の出力を明確に分けること
540デフォルトの名無しさん:2008/03/18(火) 23:12:40
括弧は
when '(': yield :open_paren, '('
when ')': yield :open_paren, ')'
などとして色定義を追加すればOK。
/は状態を追加しないといかんな。
when '/': state << :re
とか。

そのあとwhen :stringのトコをコピーしてそれっぽく真似ればなんとかなるか。


541デフォルトの名無しさん:2008/03/19(水) 03:52:31
tak関数の先生の前で色付きのemacsを開いていたら
最近の若い人はみんなそうだなぁ みたいなことを言われた
542デフォルトの名無しさん:2008/03/19(水) 10:55:05
色付けとかないからマッカーシー先生が見間違えるんだよ、って言ってやれ
543デフォルトの名無しさん:2008/03/19(水) 11:00:49
ruby で作られたWebアプリでソースが公開されていて共用サーバでも実用に耐えるものってありますか。
544デフォルトの名無しさん:2008/03/19(水) 11:18:55
tDiary とか?
545デフォルトの名無しさん:2008/03/19(水) 11:21:42
hikiとか?
546デフォルトの名無しさん:2008/03/19(水) 12:21:43
>>542
さすがに第1引数、第2引数、... を識別する色分けはないだろうw
547デフォルトの名無しさん:2008/03/19(水) 18:21:06
ActiveRecord 使ってみたら require するだけで2秒以上かかるとか何の嫌がらせ?
548デフォルトの名無しさん:2008/03/19(水) 22:03:40
>>547
ロードが終わってからも、
find_系みたいに初めて使うときに動的に定義されるメソッドとかあるぞ。
549デフォルトの名無しさん:2008/03/19(水) 23:55:12
今まで使い倒してきた家庭内DebianのRubyのバージョンが1.8.2だったことに気づいて愕然とした

ところで、1.8.6 feature をまとめたページってない?
550デフォルトの名無しさん:2008/03/21(金) 09:54:32
>>547

インスコしたgems数に比例してロードが重くなるのはいけてないよなぁ。
551デフォルトの名無しさん:2008/03/21(金) 10:52:26
そんなファイルが増えたときのこと気にして作ってるわけないじゃん
インストール時に毎回17MBのYAMLファイルをネットから取得してパースさせるようなシステムだぜ

※1: 取得しないオプションもあります
※2: 実際には1MB程度に圧縮されたファイルを取得します(http://gems.rubyforge.org/yaml.Z
552デフォルトの名無しさん:2008/03/21(金) 11:12:50
ASもgemも使わないARっぽい奴ってねーの?
553デフォルトの名無しさん:2008/03/21(金) 11:59:14
>>551
そしてyamlのパースが激重なんだよなw
いやsyckはがんばってんだけどファイルサイズがでかすぎる。
554デフォルトの名無しさん:2008/03/21(金) 13:39:13
ブロック付きメソッドの中で再帰をするには、
メソッドの中で、ブロックの内容を引数化しないといけないと思うのですが
どうやればいいのでしょうか?
555デフォルトの名無しさん:2008/03/21(金) 13:44:09
def saiki(&block)
 saiki(block)
end
556デフォルトの名無しさん:2008/03/21(金) 13:44:50
間違えた

def saiki(&block)
 saiki(&block)
end
557デフォルトの名無しさん:2008/03/21(金) 13:52:00
なるほど&varで引き取れるんですね
ありがとうございました
558デフォルトの名無しさん:2008/03/21(金) 21:52:05
クラスメソッド呼ぶ時は、
Hoge:fuga
Hoge.fuga
のどちらでもいいですが、:だと定数の可能性もあるので、
わかりやすさのために.を使った方がいいのではないかと思うのですが、
よく見る例では:が多いようです。
どちらがいいですか?
559デフォルトの名無しさん:2008/03/21(金) 21:55:01
なにを見て::のほうが多かったか気になる
560デフォルトの名無しさん:2008/03/21(金) 21:56:27
うむ
561デフォルトの名無しさん:2008/03/21(金) 22:00:32
Array::newとかやらんだろう、別にやってもいいけど
562デフォルトの名無しさん:2008/03/21(金) 22:02:15
逆引きRubyとかです。
:ではなく::でした。
563デフォルトの名無しさん:2008/03/21(金) 22:19:14
AVIファイルって、どーやって見るんですか?
メディアプレイヤーがエラーみたいになります
564デフォルトの名無しさん:2008/03/21(金) 22:22:34
>>562
ttp://www.namaraii.com/rubytips/?%A5%C7%A5%A3%A5%EC%A5%AF%A5%C8%A5%EA

> Dir::mkdir("/home/take/tmp")
> Dir::rmdir("/home/take/tmp")
> Dir.rmdir(delthem) rescue ""

うわほんとだ気色わっるー
てかwikiの悪いとこが思いっきり出た形だな


メソッドはインスタンスメソッドとかクラスメソッドとか関係なく . で接続するのが無難
565デフォルトの名無しさん:2008/03/22(土) 02:35:06
Stringで、正規表現を使わない単なる文字の置換てどうしたらいいですか?
566デフォルトの名無しさん:2008/03/22(土) 02:52:18
ぶっちゃけ "::" でクラスの特異メソッドを呼べるようになったのは
C++ では出来るしっていうぐらいの意味しかなかった気がするんで
receiver.method っていう一つの形だけ覚えておけばいいんじゃないかと。

たまたま receiver がクラスなだけじゃないかおおげさだなあ、と。
567デフォルトの名無しさん:2008/03/22(土) 03:06:35
>>563
ffdshowをインストール
568デフォルトの名無しさん:2008/03/22(土) 03:08:40
>>566
マニュアルだと#になってるのはなんで?
569デフォルトの名無しさん:2008/03/22(土) 03:09:04
>>>565
(g)subの第一引数を正規表現ではなく文字列で与える。
570デフォルトの名無しさん:2008/03/22(土) 03:10:45
実は3::to_sとかも出来るという
571デフォルトの名無しさん:2008/03/22(土) 03:11:22
>>568
Class.new = Classクラスのnew (ex Foo = Class.new)
Class#new = Classクラスのインスタンスメソッドnew(ex a = Array.new)
の区別をするためじゃない?
572デフォルトの名無しさん:2008/03/22(土) 03:11:46
>>569
!?
そういう事になってたんですか
正規表現エスケープ→正規表現オブジェクト生成→それをgsubに与える
とやるところでした
ありがとうございました
573デフォルトの名無しさん:2008/03/22(土) 03:16:47
>> 'hello, world.'.gsub('.', '!')
=> "hello, world!"
>> 'hello, world.'.gsub(/./, '!')
=> "!!!!!!!!!!!!!"

こんな感じだな。
574デフォルトの名無しさん:2008/03/22(土) 03:58:53
> ruby 1.7 feature: 1.6 以前は、pattern が文字列の場合、
> その文字列を正規表現にコンパイルしていました。
> 1.7 以降は、その文字列そのものがパターンになります。
ウサギ本で止まってる漏れは知らなかったんだぜ
原書はもうすぐ第三版も出るってのに
575デフォルトの名無しさん:2008/03/22(土) 04:09:52
第三版ってバージョンはどれなの?
576408:2008/03/22(土) 04:26:15
いろいろご指摘頂いたので直してみました。実際の要件に沿って追加しています。
細かいところは仕組みが理解できていないので、これから勉強します。

require 'rubygems'
require 'open-uri'
require 'mysql'
require 'fastercsv'
require 'kconv'

csv = open('http://hogehogehoge/hoge.cgi?10&50').read
csv = csv.toutf8 #EUC→UTF8

m = Mysql.new('localhost', 'hogeuser', 'hogehoge', 'hogetable')
 m.query('truncate table hogetable')
 column = '?,'
 column = column * 5
 column.chop!
 sql = m.prepare("insert into hogetable values(" + column + ")")

FasterCSV.parse(csv) do |line|
 line.pop #末尾にゴミが入る仕様なので取り除く
 if line.nitems == 5 then #空データの存在する行は読まない
  sql.execute(*line)
 end
end
m.close


いくつかテーブルを読み込む要件があり、カラム幅は不定のため外出し出来るようにしてみました。(外からURL、テーブル、カラム数を指定する)
が、やはり不恰好になりました。美しく記述する方法はありますか?

577デフォルトの名無しさん:2008/03/22(土) 04:28:14
>>575
1.9対応らしいよ

ttp://www.pragprog.com/titles/ruby3
> This third edition maintains that tradition, and has been updated
> to reflect the new features of Ruby 1.9.

とはいえフラナガン+Matz本もあるんだよね
578デフォルトの名無しさん:2008/03/22(土) 04:34:13
>>577
もう1.9対応か。早いね。
しかし高いな・・・
579デフォルトの名無しさん:2008/03/22(土) 04:42:33
あー。これって日本語版だと言語編ライブラリ編と
2つに分かれてるのがいっぺんになってるのか
しかし900ページって分厚そうだな
580デフォルトの名無しさん:2008/03/22(土) 04:50:23
>>577
フラナガン+Matz本ってどういう本なの?
フラナガンってニュータイプの研究をしている人じゃないだろうし・・・
581デフォルトの名無しさん:2008/03/22(土) 13:45:00
>>580
ふつーにRubyの入門からメタプログラミングまで載ってる。
582デフォルトの名無しさん:2008/03/22(土) 13:51:59
1.8と1.9での違いも載ってる。
あと、各章の口絵がWhy the Lucky Stiff
583デフォルトの名無しさん:2008/03/22(土) 16:04:18
>>581
いや、そのジオン公国立特務機関の使途。
ニュータイプが発するサイコ・ウェーブと呼ばれる感応波、特殊な脳波の一種とミノフスキー技術とを組み合わせることにより、
「サイコミュ・システム」システムを運用しようという本。
これによって遠隔操作が可能になるため、SEやプログラマの人件費を抑えることが可能になるということです。
584デフォルトの名無しさん:2008/03/22(土) 16:15:35
585デフォルトの名無しさん:2008/03/22(土) 18:46:28
>>576
外だし出来てる様には見えないんだけどな
とりあえず ARGV について調べれ
586デフォルトの名無しさん:2008/03/22(土) 21:21:32
Class::method の記法は歴史的なものでしょ。
初期は Class.method と記述できなかったんじゃなかったっけ?
587デフォルトの名無しさん:2008/03/22(土) 23:09:25
>>586
逆、というのが >>566 の主張。前は "::" は定数アクセスのため「だけ」のオペレータだった。……と思った。
588デフォルトの名無しさん:2008/03/23(日) 00:23:25
初め、オブジェクトの状態を整数値で
class Something
STATUS_NEW = 0
...
end
のように定義して用いることを考えました。

しかし、よく考えてみると0という値に意味は無いのだから、:STATUS_NEWのような
Symbolを使ってもよいと考えたのですが、こういう場合どちらの方が標準的な
やり方なのでしょうか?
589デフォルトの名無しさん:2008/03/23(日) 00:27:19
値に意味がなく名前そのものに意味があるならシンボルだな。
590デフォルトの名無しさん:2008/03/23(日) 01:16:13
実際に使われてるのは定数だけだけどな

意味上正しいんだから定数の代わりにシンボル使うぜ、というのはそれはそれで正しいけど面倒だ
591デフォルトの名無しさん:2008/03/23(日) 01:18:10
面倒か?
592デフォルトの名無しさん:2008/03/23(日) 01:35:24
クラス外部からユーザーが利用する値なのなら定数にしとかないとわけわからなくなる予感

自分が混乱しないんならどう書いてもいいんじゃね
俺は固定の値に定数とシンボルの2種類があったら混乱するけどさ
593デフォルトの名無しさん:2008/03/23(日) 03:07:49
良く読まないと質問の意図を取り違えるな
STATUS_NEW = 0 を STATUS_NEW = :STATUS_NEW にするって事か
で obj.status = :STATUS_NEW と書くのとどう違うんだ?
594デフォルトの名無しさん:2008/03/23(日) 03:20:37
てっきり
STATUS_NEW=0
obj.status = STATUS_NEW
がいいか
obj.status = :STATUS_NEW
がいいかという質問だと思ってた。
595デフォルトの名無しさん:2008/03/23(日) 03:22:17
>>588
bool 変数として使うのなら true にしたら?
596デフォルトの名無しさん:2008/03/23(日) 09:47:31
STATUS_NEW = 0
STATUS_OLD = 1

case obj.status
when STATUS_NEW
when STATUS_OLD
とかやるんだろ。。
597デフォルトの名無しさん:2008/03/23(日) 12:39:14
OSはXP、rubyのバージョンは1.8.6です。
エディタはSciTEです。
今日はgetsを勉強しようと思い
puts gets
とコードを入力してエディタからF5を押してプログラムを実行したところ
コマンドプロンプトが立ち上がりそこからカーソルは点滅しているのですが
文字が入力できなくなってしまいました。
Enterを押しても抜けれません。
おかしいなと思いコマンドプロンプトをスタートメニューから立ち上げて
ファイル指定したらプログラムを実行することはできました。

SciTEの方からF5で立ち上がるコマンドプロンプトに文字を入力させるにはどうしたらいいでしょうか。
よろしくお願いします。
598デフォルトの名無しさん:2008/03/23(日) 17:30:07
素朴な疑問なんですが、
rubyをC直下にインストールした後に環境変数を設定した覚えは無いのに
どこからでもrubyコマンドが使えるってのは何故ですか?
コマンドプロンプトはどうやってrubyを認識してるのでしょうか
599デフォルトの名無しさん:2008/03/23(日) 17:32:49
rubyをインストールしたときに勝手に環境変数設定してくれたんじゃないの?
600デフォルトの名無しさん:2008/03/23(日) 17:42:36
Rubyあんま関係ないな

Rubyのインストーラが「環境変数」の「Path」に c:\ruby\bin を追加してくれただけだろう
コマンド実行と環境変数の関係について調べてみるといいぞ
601デフォルトの名無しさん:2008/03/23(日) 17:45:29
今調べたら C:\PROGRA~1\Borland\Delphi6\Bin とか書いてあってちょっと泣いた
602588:2008/03/23(日) 17:52:59
すいません、遅くなりました。
説明が足りませんでしたが、質問の意図としては>594さんの通りで
実際には状態を表すSTATUS_*が複数存在します。

定数でなければならない場合と、Symbolが理想的な場合があって、オブジェクトの
を使う開発者から見ると、両者を区別して考えることは無いように思います。
ですから両方の場合で定数を使うように統一したほうが、オブジェクトを使う側から
してみればSymbolを使うのか定数を使うのか覚える必要が無く楽である。

という結論を得たので、定数にすることにします。ありがとうございました。
603デフォルトの名無しさん:2008/03/23(日) 18:16:42
>>599
>>600
ありがとうございます
今調べてみたらPATHに c\ruby\binが追加されてました。
604デフォルトの名無しさん:2008/03/23(日) 18:44:20
Symbolだとtypoしたとき困りそう。
定数ならエラーになるよね?
605デフォルトの名無しさん:2008/03/23(日) 18:54:34
そんなこと怖がるな。
しっかりテストしる。
606デフォルトの名無しさん:2008/03/23(日) 18:56:35
RSpec
607デフォルトの名無しさん:2008/03/23(日) 20:32:59
どうしてrubyなの?
実績も何も無い言語ですよね
pythonじゃなくてrubyを使う理由を一つでもいいから教えてください
開発者が日本人だからですか???????
608デフォルトの名無しさん:2008/03/23(日) 20:37:39
>>604
send "handle_#{sym}"
なんて感じで分岐を振ればNoMethodErrorにしてもらえるぜ。
何事も実装しだい。
609デフォルトの名無しさん:2008/03/23(日) 20:38:18
>>607
ぐぐれ
610デフォルトの名無しさん:2008/03/23(日) 20:41:35
>>607
もうそろそろ日曜も終わるな
611デフォルトの名無しさん:2008/03/23(日) 20:42:23
>>607
Guidoはいじれないから
612デフォルトの名無しさん:2008/03/23(日) 20:48:08
TMailが使いにくいと感じたので、net/smtpやハッシュとか使ってメール作成&送信モジュールを作成

半年経ってわかりやすく改造しようと思い、メールのfromやtoもメールオブジェクトのメソッドにしていったら
TMailとたいして変わらないものができた

何やってんだ俺
613デフォルトの名無しさん:2008/03/23(日) 21:00:18
>>612
でも、その過程でいろいろ身についたんじゃない?
614デフォルトの名無しさん:2008/03/23(日) 21:12:21

どう考えてもめんどいからデータの格納はハッシュのキーと値でいいじゃん

から

使いにくいからクラス作って適当にアクセス用メソッド併用すればいいじゃん

に移行する期間というのはあるな
これの前後でスクリプトは全然違う
プログラム名のモジュール作ってその中に細かくクラス、という習慣ができた前後でもかなり違うけど
615デフォルトの名無しさん:2008/03/23(日) 21:16:48
オセロの中島知子と他2人(知らない人)と一緒に車で逃げているのだ。何から逃げてるかって?
核だよ。核。

どういうわけか、東京に核爆弾が投下されるという情報を知っていて、北へ向かって逃げているんだ。
それで、中島知子はパニクって反対車線へ行ったり来たりと、もう、てんやわんや。
で、暫く走ってると、車が沼地にハマっていて身動きが取れない。その時点で、もう東京じゃないんだけどさ。

すると、遠くの方がピカって光ったんだ。

次の瞬間、俺は食堂でトンカツを食べていた。

その味はやわらかくてジューシーで、こんな素晴らしいトンカツを食べられる私は、きっと特別な存在なのだと感じました。
今では、私が食堂の店主。客に出すのはもちろんトンカツ。
なぜなら、彼もまた、特別な存在だからです。
616デフォルトの名無しさん:2008/03/23(日) 21:29:27
ここまで明後日の方向の誤爆だと誤爆元が気になる
617デフォルトの名無しさん:2008/03/23(日) 22:06:16
こんな電波レスが受け入れられるスレってどこの板にあるんだ?
618デフォルトの名無しさん:2008/03/23(日) 22:09:44
"客に出すのはもちろんトンカツ" でぐぐれ
619デフォルトの名無しさん:2008/03/23(日) 22:09:46
>>611
ちょっ

微妙に本当くさくてイヤな理由だな
620デフォルトの名無しさん:2008/03/24(月) 07:55:30
>>612
RubyForgeに登録しる

プロジェクトの活発さ:0.00
621デフォルトの名無しさん:2008/03/24(月) 13:06:39
新規にゼロから作って公開して車輪がらごろするよりはTMailに関わったほうがいいな
TMailが流行らないのは何故だろう
622デフォルトの名無しさん:2008/03/24(月) 13:12:22
メールボックス触る機能を内包してることで微妙にわかりにくくなったのが敗因かと
TMailにメール送らせるだけのラッパーライブラリとか作ったらきっと一部に受ける

っていうか、Rubyの外部ライブラリとしてはわりとふつーに使われてるほうだと思うが…
623デフォルトの名無しさん:2008/03/24(月) 14:34:59
どうしてrubyなの?
実績も何も無い言語ですよね
pythonじゃなくてrubyを使う理由を一つでもいいから教えてください
開発者が日本人なのが誇らしいとか??????
624デフォルトの名無しさん:2008/03/24(月) 15:33:19
>>623
たまたま
625デフォルトの名無しさん:2008/03/24(月) 15:38:10
>>623
使う理由がわからないなら今のあなたには必要のないものです。
だからとりあえず忘れてもいいですよ。
また学びたくなったらお越しください。

最後に、そういう話題はム板よりもマ板の方がふさわしいです。
626デフォルトの名無しさん:2008/03/24(月) 16:03:23
コピペ交えて輪廻のように相手してくれると思う
面白ければだけど
627デフォルトの名無しさん:2008/03/24(月) 16:28:28
再帰という概念がよく分かりません…。
参考書も変な例えばかりです。
分かりやすく解説されているサイトとかありましたら教えていただけますでしょうか。
628デフォルトの名無しさん:2008/03/24(月) 16:32:45
再帰はフィボナッチ数列と累乗を表現するためだけに存在します
それ以上の意味はないので自分から学ぼうとせずにさっくり忘れてしまってOKです
629デフォルトの名無しさん:2008/03/24(月) 16:32:55
>>627
Rubyではこだわる必要ない概念のような気が。
630デフォルトの名無しさん:2008/03/24(月) 16:38:17
Rubyではeachかeach_with_indexがあればなんとかなるよね
極めて必要に迫られたときになって初めて勉強するといいぞ

まあ
「再帰も理解できてないなんて何のためにプログラミングしてるの?」
とか煽られがちなのは確かなんだけどさ
631デフォルトの名無しさん:2008/03/24(月) 16:46:20
参考書で変だと思う例えでも、いざ分かってみると、
この筆者も悩んだあげくにこの例えを選んだんだな、と思うことがある。
632デフォルトの名無しさん:2008/03/24(月) 16:48:13
>>631
お前、本当に初心者か?
633デフォルトの名無しさん:2008/03/24(月) 16:52:29
全方位に完全初心者な人間が初心者にアドバイスなんかできるわけないだろ常識的に考えて
スレに澱ん…いや溜まってる奴はマニュアルくらいはさくっと読んでる奴だぞ
「読んだけど使ってないしよーわからんなー」という分野が多い場合はその分野は初心者なわけだし
634デフォルトの名無しさん:2008/03/24(月) 16:54:51
627です。
ありがとうございます。
上司にもこのことは忘れろと言われたので、忘れますw
ありがとうございました
635デフォルトの名無しさん:2008/03/24(月) 16:56:59
>>627
忘れるって言ってるけど一応

よっぽど頭のいい人は別として
再帰はそう簡単に分かったり身に付いたりするものじゃないと思われ

どの参考書の例えがわからないのかにもよるけれど
ある程度時間を割けるのならThe Little Schemerでも読んでみては
Lisp/Schemeスレで質問すれば答えも返ってくると思うよ
636デフォルトの名無しさん:2008/03/24(月) 16:59:27
RubyではEnumerableとProcが理解できてればそれでいいよ
637デフォルトの名無しさん:2008/03/24(月) 17:10:55
使いこなすのはともかく概念的に「再帰」ってそんなに難しいか?
今は学校で数学的帰納法とか習わないの?
638デフォルトの名無しさん:2008/03/24(月) 17:17:31
再帰を使って効率が良いなら使うけど、そういうケースはあんまり無いような。
639デフォルトの名無しさん:2008/03/24(月) 17:22:05
>>637
数学的帰納法は再帰と関係ないだろ
640デフォルトの名無しさん:2008/03/24(月) 17:22:12
再帰を知ってて使えるかどうかと、実際に使うかどうかは別問題だわな。

それはともかく、>>637に同意。
概念としての再帰は全然難しくないよね。
641デフォルトの名無しさん:2008/03/24(月) 17:23:03
>>>637
いやだから、たとえば累乗だけ書けても意味ないだろ
日常に再帰を適用できる脳にならないと、再帰を理解したことにはならない
642デフォルトの名無しさん:2008/03/24(月) 17:29:55
> 日常に再帰を適用できる脳にならないと
643デフォルトの名無しさん:2008/03/24(月) 17:42:45
>>641
ループはユーザーが末尾再帰を使って表現してください、とかいう
投げっぱなしジャーマンな言語の経験があるとそういうのは早いな
644635:2008/03/24(月) 17:47:26
>>637
数学的帰納法が出てくるのは高二からの基礎解析だと思ったけど
漏れは二年から文系選択したせいで基礎解析は一切やってないんだ

ただ再帰は漏れみたいなゆとりじゃなくても難しい概念だと思うけどな
評価や言葉の問題なのでこれ以上は主張しないけど
645デフォルトの名無しさん:2008/03/24(月) 17:51:43
配列の並び替えを列挙するとか、配列からn個の部分集合を列挙するとかは
再帰を使うと楽だよ。使わなくても書けるが。
1.9ならArray#permutationとcombinationがあるけどね。
646デフォルトの名無しさん:2008/03/24(月) 18:10:53
順列と組み合わせ?便利そうだ
647デフォルトの名無しさん:2008/03/24(月) 18:48:47
ディレクトリのトラバーサルとか再帰で書いて練習したな
PC-98でTurboPascalだったから何年前かな…
648デフォルトの名無しさん:2008/03/24(月) 20:00:54
再帰=漸化式
649デフォルトの名無しさん:2008/03/24(月) 20:35:12
Ruby2.0っていつごろ出ますか?
650デフォルトの名無しさん:2008/03/24(月) 20:40:43
5年以内?
651デフォルトの名無しさん:2008/03/24(月) 20:44:43
まあ年単位の時間がかかるのは間違いない
間違っても今年中に出たりはしないだろうな
652デフォルトの名無しさん:2008/03/24(月) 20:49:17
1.9 やめて 2.0 にします。とか。
653デフォルトの名無しさん:2008/03/24(月) 21:29:33
ネットからデータ持ってくる必要があるのでダウンローダーのようなもの作ってます

Web上のコンテンツひとつについて、

@uri
@last_modified
@etag
@status
@length
@header_response
@content

といった感じで総合的にいろんなデータを管理保管できるクラスとか既に誰か作ってたりしませんか?
654デフォルトの名無しさん:2008/03/24(月) 21:50:51
Mechanizeとか?
655デフォルトの名無しさん:2008/03/24(月) 21:55:40
656デフォルトの名無しさん:2008/03/24(月) 21:58:59
>>653
open-uri を使って URI#open した返り値の文字列なら標準で使える
OpenURI::Meta で拡張されています云々というアレ
open(uri).read と書くとこの芸はできないので注意

require 'open-uri'
uri = URI.parse('http://pc11.2ch.net/test/read.cgi/tech/1203658291/l50')
html = uri.read({'User-Agent'=>'Monazilla/1.00'})

p html.base_uri.to_s
p html.last_modified
p html.meta
html.meta_add_field('Title','Ruby 初心者スレッド Part 18')
puts html.meta['title']


# 結果
"http://pc11.2ch.net/test/read.cgi/tech/1203658291/l50"
nil
{"vary"=>"Accept-Encoding", "connection"=>"close", "content-type"=>"text/html",
"date"=>"Mon, 24 Mar 2008 12:49:07 GMT",
"server"=>"Apache/2.0.59 (Unix) PHP/4.4.2 mod_ssl/2.0.59 OpenSSL/0.9.7e-p1", "transfer-encoding"=>"chunked"}
Ruby 初心者スレッド Part 18
657デフォルトの名無しさん:2008/03/24(月) 22:26:00
open-uriは器用な子

でも>>656みたいなのだとStringIOやTempfileにファイル内容を保持し続けてないといけない予感
PStoreに保存するとかいう場合でメタな情報だけでいいって時には取り回し面倒そうだ
658デフォルトの名無しさん:2008/03/24(月) 22:40:18
再帰って普通に使うけどな。
ポイント使ったことない俺が言うくらいだから相当だよ、きっと
659デフォルトの名無しさん:2008/03/24(月) 22:44:32
どういうときに?
660デフォルトの名無しさん:2008/03/24(月) 22:44:55
>>657
いや、StringIOなんだしPStoreにはそもそも残らないだろ
読み込んでもメタデータ無しの普通のStringが返ってくるだけだと思うぞ
661デフォルトの名無しさん:2008/03/24(月) 22:45:01
漏れは使わないなあ。
イテレータでこねこねしてるだけで大抵なんとかなるし。
662658:2008/03/24(月) 22:48:50
文字列処理系が多いかな。
xmlパースしたりwikiみたいな入力で独自文法実装したり
663デフォルトの名無しさん:2008/03/24(月) 22:49:19
* 扱う構造が再帰してる(ファイルツリーを歩くとか)。
* 分割統治なアルゴリズム。
あたりだと自然に出番が来るんだけどね。

こーゆーのはライブラリの奥に埋もれてて自分で実装する機会も減ったからな。
664デフォルトの名無しさん:2008/03/24(月) 22:53:12
>>660
あ、ほんとだ
じゃあhtml.metaやhtml.base_uriなんかを明示的に取り出して保存しないと駄目だな
なんか微妙に面倒
665デフォルトの名無しさん:2008/03/25(火) 00:25:30
よくわからんのだが,Integerクラスのインスタンスに対して#to_fするとFloatクラスのインスタンスになるわけだよな
それってつまり以下のサンプルみたいなことやってるのかな.
class ABC
def cde
return CDE.new
end
end

class CDE < ABC
end

hoge = ABC.new
p hoge
hoge = hoge.cde
p hoge

ただひとつ疑問が残る.Integerクラスのインスタンスであるfooに#to_fするとobject_idも変わるし,
foo = foo.to_f
と書く必要も無いのにちゃんとFloatクラスのインスタンスになっている.これってどういう仕組み?
666デフォルトの名無しさん:2008/03/25(火) 00:35:11
>>665
Rubyでは数値関係のクラスは特別扱いされてるけどそのへんの話を聞きたい?
Rubyスクリプトが出てこない話にもなっちゃうけどそれでもいい?
Rubyでは数値を例に出されると非常に困ることが多いんだ

そういう話でないのなら、たとえば

class Integer
def to_f
# 引数をFloatに変換するFloatクラスのクラスメソッドに自分自身を渡す
Float.induced_from(self)
end
end

って書いてるだけだよんとかそういう話になってとっても簡単なんだけど
667デフォルトの名無しさん:2008/03/25(火) 00:40:54
rubyスクリプトと他のexeで標準入出力を介して文字列をやり取りしたいのですが、どうすればいいですか。
668デフォルトの名無しさん:2008/03/25(火) 00:52:36
>>667
$stdin というIOオブジェクトで標準入力から流れてくる文字列を受け取ることができる

C:>TYPE test.rb
text = $stdin.read
puts "#{text}が来ました"

C:>ECHO うんこ | ruby test.rb
うんこ
が来ました

改行を取り除くにはどうすればいいかとか、改行ごとに配列のように扱うにはどうすればいいかとかは
$stdinが属してるIOオブジェクトの解説読め
open('hoge.txt'){|f|
とか書くときの f と同じものだ
669デフォルトの名無しさん:2008/03/25(火) 00:52:45
>667
Windowsヘルプの「コマンドラインリファレンス」の「リダイレクト演算子」のところを
よーーーーっく読んで下さい

あとRubyリファレンスの``とかSTDINとかSTDOUTとか参照
670デフォルトの名無しさん:2008/03/25(火) 01:01:10
caseとwhenの間は字下げあった方がいいですか?
671デフォルトの名無しさん:2008/03/25(火) 01:07:20
>>670
EmacsのRuby編集モードでは

case str
when 'hoge' then puts 'hogeです'
when 'huga' then
puta 'hugaです'
when 'piyo'
puts 'piyoです'
else
raise 'Unknown Error'
end

となっとる
caseとwhenは対等だな
672665:2008/03/25(火) 01:49:28
>>666
kwsk
673デフォルトの名無しさん:2008/03/25(火) 05:45:37
Rubyで組み立てたSQLをmysqlにパイプを使って渡したいのですが
どう書けばいいでしょうか?
674デフォルトの名無しさん:2008/03/25(火) 11:10:58
mysqlのほうに標準入力受け取って解釈する機能があれば普通にパイプで渡すだけだな

ただ、ふつーは、Rubyからmysqlに接続するライブラリがあるからそれを使う
675デフォルトの名無しさん:2008/03/25(火) 11:13:38
>>665
Rubyでは変数自身はオブジェクトではなく、オブジェ
クトにつけられた仇名に過ぎない。
676デフォルトの名無しさん:2008/03/25(火) 11:14:49
>>675
いやそれは今関係ないと思うぞ
677667:2008/03/25(火) 20:28:05
すいません。言葉が大分足りませんでした。

AI同士で対戦する多人数のゲーム(トランプのような)を作ろうと思っています。
ディーラーの部分をRubyで実装してAIの部分は好きな言語で実装します。
ディーラーであるRubyとAI(複数ある)で通信をするわけですが、
ディーラー側からAI側にメッセージを送るときには
AI側は標準入力でメッセージを受け取って、
AI側からディーラーにメッセージを送るときはAI側は標準出力にメッセージを出すようにしたいです。
ディーラーの実装をするにはどうすればいいでしょうか。
678デフォルトの名無しさん:2008/03/25(火) 20:35:15
>>677
IO.popen
rubyスクリプトがAIプロセスを起動する形になるけど
679667:2008/03/25(火) 20:55:26
素早い回答ありがとうございます。
これからじっくり調べてみます。


680デフォルトの名無しさん:2008/03/25(火) 22:53:33
Ruby以外の言語も学ぶといいということでGaucheの本を買ってきた
わくわく
681デフォルトの名無しさん:2008/03/25(火) 22:58:33
Gaucheって言語じゃなくて処理系じゃないの?
682デフォルトの名無しさん:2008/03/25(火) 23:02:55
それがわかる人はお布施以外の目的で本買ったりしないだろうな
683デフォルトの名無しさん:2008/03/25(火) 23:55:28
いつもgoshで起動するからGaucheとか言われてもピンとこない
684デフォルトの名無しさん:2008/03/26(水) 01:22:30
>>680
# ←についての簡易コメント



## 以下の行の機能について普通にコメント



###
### クラスとかの全体的にコメント
###

の使い分けをするようになると予測
=begin
=end
はEmacsだと微妙に使い勝手が悪い
685デフォルトの名無しさん:2008/03/26(水) 02:06:15
クラスを宣言するまえにクラス呼んだらエラーになるの???
なぜか通らない。

baz = Hoge.new #←エラー???

Class Hoge
def fuga
#Something
end
end
686デフォルトの名無しさん:2008/03/26(水) 02:18:54
>>685
ああ、俺もRuby知って最初にこれが引っかかった
なんだよ全文評価してから実行してるんじゃないのかよ、みたいな
687デフォルトの名無しさん:2008/03/26(水) 02:23:53
俺も
688デフォルトの名無しさん:2008/03/26(水) 02:28:07
BASICのように1行ずつ逐次実行してる結果のように見えるよね

ちなみに

baz = Hoge.new

BEGIN{
class Hoge
def fuga
#Something
end
end
}

とBEGINブロックでクラス定義全体を囲めば「後ろに回す」流儀でも動作するが、
こういうことにBEGIN使うというのはおおむねやってはイカン
689デフォルトの名無しさん:2008/03/26(水) 02:42:38
1. スクリプトを構文木とかバイトコードとかなんかそんなのにコンパイルする
2. そののち、コンパイルしたものをおもむろに実行する

ふつーの言語では1の時点でクラスやメソッドが定義されるから「クラスより先にメイン処理」という書き方でも動作するんだけど、
Rubyでは2の中で動的に定義されるから「知らない」クラスやメソッドや変数は参照できない

1の時点で静的に定義するように言語を作ることもできたんだろうけど、それやったらただのPerlだな
690685:2008/03/26(水) 02:49:51
こんなに柔軟な言語なのにこれが仕様なのか!逆に驚き。

実際にコーディングすると部品化が進んであんまり気にならなくなるのかな?
691デフォルトの名無しさん:2008/03/26(水) 02:56:40
俺も謎だったが慣れちゃったな〜
692デフォルトの名無しさん:2008/03/26(水) 02:58:24
>>685
というか、Rubyでは(1ファイルで済む簡単スクリプトでは)いちばん下に "メイン処理" を書く

$!/usr/bin/ruby -Ke

class Main

end

class GetData

end

data = GetData.new.get
main = Main.new
puts main.parse(data)


こんな感じ
実行中にクラスの再定義とかできてしまうことのトレードオフですな
693デフォルトの名無しさん:2008/03/26(水) 02:59:20
if hoge
 class Foo
  def bar
   p 1
  end
 end
else
 class Foo
  def bar
   p 2
  end
 end
end

みたいなことができる今の仕様の方が柔軟だろう
694デフォルトの名無しさん:2008/03/26(水) 02:59:47
class自体は何度も定義をオープンし直せるから、

class Hoge; end # とりあえずClassインスタンスを定数として存在させる
baz = Hoge.new # newを呼べる

class Hoge # fugaを呼ぶ前にfooをおもむろに定義
def fuga
puts 'ふが'
end
end

baz.fuga

はOK

695デフォルトの名無しさん:2008/03/26(水) 03:01:23
×foo
○fuga

fooよりfugaだろ、と思って直し、後半をなおし忘れた
696デフォルトの名無しさん:2008/03/26(水) 03:09:24
>>694
いや、newを先に書きたいのではなく、それで言うとbaz.fugaもまとめて先頭に書いておきたいのだろ
そのほうが逐次実行する内容が最初に目に付いてわかりやすいから

クラスやメソッドが何してるのかわからんうちから実行のとこだけ見せられても困るなという感じではある
なお、しばらく書き慣れて行き着くところはこういう形

require '組み込みライブラリ'
require '自作汎用ライブラリ'
require 'Hogeアプリケーション用クラスをファイルに分割したもの'

HogeApprication.new

require を無視すれば、メイン処理が先頭に来て自由に書けるように見える
なんだかんだ言ってRuby使いも先頭にまとめて書くとわかりやすいなと思ってるわけで
697デフォルトの名無しさん:2008/03/26(水) 03:45:50
$PRELOAD とかそんな変数作って
そいつが真なら全部読み込んでから実行されるとかは無理なんかね
698デフォルトの名無しさん:2008/03/26(水) 03:51:15
>>697
いや今でも全部読み込んでからきちんと上から順々に実行されてるって
同じファイルに書いたクラス定義だけを先に実行して欲しいなら>>688のようにBEGINで囲め
699デフォルトの名無しさん:2008/03/26(水) 05:26:26
>>696
そして require する各ライブラリの末尾で

if $0 == __FILE__
  require 'test/unit'
  #以下ユニットテストが続く
  :
  :
end

とやればいいわけだな
700デフォルトの名無しさん:2008/03/26(水) 13:29:15
>>680
Rubyの次はやっぱりLisp系か
701デフォルトの名無しさん:2008/03/26(水) 13:37:49
コンセプト先行なオモシロ言語をあんまり最初のほうで選ぶと

「Rubyでやってたほうがいいような気がする」
「っていうかHaskellで何ができるんだ」

というのが頭に残って学習が進まないからな
新言語のつまみ食いに慣れるまでは、Rubyと同程度には即効の有り難味のある言語を選んだほうがいい
GaucheはLisp処理系の中ではかなり実利的だから好適
702デフォルトの名無しさん:2008/03/26(水) 14:44:02
if val = load_from_xxx then
puts "値は#{val}です"
else
raise 'xxxがnilを返したので何かエラーです'
end

という、
「右辺からnilが返ってくれば変数の中身も代入の返り値もnil」
というのを利用したif文の書き方は真っ当ですか?
703デフォルトの名無しさん:2008/03/26(水) 14:48:46
>>702

val = load_from_xxx
if val then


と書かないで条件のとこで代入してしまうってことね

ややテクニカル、でFA
書くときは楽だけど、読み解くときちょっと面倒
メソッドチェーンがごっそりついてたり括弧がやたらあったりするのは個人的に勘弁
704デフォルトの名無しさん:2008/03/26(水) 15:04:16
val = load_from_xxx or raise
705デフォルトの名無しさん:2008/03/26(水) 16:49:49
>>704
それ要件カケラも満たしてねえぞ
706デフォルトの名無しさん:2008/03/26(水) 17:01:22
...<a href="../xxxx/hoge0123_a.swf" target="_blank">.....................
....<a href="../xxxx/hoge0123_a.jpg" target="_blank">....................
...<a href="../xxxx/hoge0123_b.swf" target="_blank">....................
.....<a href="../xxxx/hoge0123_b.jpg" target="_blank">.....................

から、jpgファイルのパスだけを正規表現で抜き出したいです。
['../xxxx/hoge0123_a.jpg', '../xxxx/hoge0123_b.jpg'] ← こんなのが返って欲しい
aタグ以外の何か、行数とか隣の文字とかに依存して抜き出すことはできません。
aタグ全部抜き出してswfのだけ消す、ということも今回できません。
707デフォルトの名無しさん:2008/03/26(水) 17:06:11
ルビーってオブジェクト指向言語なのに
何でクラスを作らなくても
いきなり「puts "hello"」ってかけるんですか?
708デフォルトの名無しさん:2008/03/26(水) 17:10:13
>>705
val = load_from_xxx or raise 'xxxがnilを返したので何かエラーです'
puts "値は#{val}です"
709デフォルトの名無しさん:2008/03/26(水) 17:10:52
>>706
普通にやればいいだけのよーな気もするが…
うっかりmオプションつけて余計なとこまで地引網状態とかいうミスがありがちなので注意
改行跨ぐととたんに面倒になるぞ

>>707
利便性のために作られた関数的メソッドの存在が気になる場合は
Kernel.puts "hello" と書くといい
710デフォルトの名無しさん:2008/03/26(水) 17:19:52
hello.rbというファイルを作って
def message
 "hello"
end
と書いた場合
このmessageはどこのクラスに属しているんですか?
それともどのクラスにも属していない?
711デフォルトの名無しさん:2008/03/26(水) 17:35:17
>>710
自分でいろいろ試せよ
Rubyは壊れたりしないから

class Object
def message
'hello'
end
end

puts message

# 実行結果

hello

ということでObjectクラス(実際は>>709の言うようにKernelだったはず)
トップレベルでいちいちクラスとか考えてたらめんどくさいのでちょっとだけ特別扱いされている
712デフォルトの名無しさん:2008/03/26(水) 17:52:25
>711
・行頭の半角スペースは無視される
・連続した半角スペースは一つにまとめられる
713デフォルトの名無しさん:2008/03/26(水) 17:55:38
いろいろ試そうにも、そもそも
class Objectってのが、どこから出てきたのか分からんし
そういう発送がないんだけど
とりあえず「Kernel」に含まれるこちは分かりました。
ありがとう。
714デフォルトの名無しさん:2008/03/26(水) 17:57:05
属するクラスがどうこう、という話を振ったなら、
全てのクラスの親のObjectくらいは知ってると思われても仕方ないと思われ
715デフォルトの名無しさん:2008/03/26(水) 18:03:40
いや、Objectがすべてのクラスの親だとは知っていますよ。
ただ、どこにもクラスの定義をしてないので
Karnelに含まれるっていうのが思いつかなかっただけで。
716デフォルトの名無しさん:2008/03/26(水) 18:04:36
>>706
String#scan
717653:2008/03/26(水) 19:41:39
結局、
uri.update
とするとuriの中の@uriを@uri.read(header)して
headerには@last_modifiedや@etagや@cookieを詰め込んだりするようにしました


で、クラスの名前は Mechanize2 とかでどうすかね

がっかり
世の中の再発明ってそんなもんだよね
718デフォルトの名無しさん:2008/03/26(水) 19:52:59
curl使えばいいのに
719デフォルトの名無しさん:2008/03/26(水) 19:59:43
>>717
Ruby標準ライブラリを駆使するぜ!
WEBrick::Cookie とか存在忘れられてて地味に便利だしな!

とか思ってたら Mechanize::Cookie でナチュラルに取り込まれてたりする
全く以って世の中そんなもんだ
720デフォルトの名無しさん:2008/03/26(水) 21:33:58
Ruby/DBIを使ってPostgreSQLにアクセスしようとしていますが、次のエラーが出てしまう状態です。

C:/ruby/lib/ruby/site_ruby/1.8/dbi.rb:368:in `load_driver': Could not load driver (no such file to load -- C:/ruby/lib/ruby/site_ruby/1.8/dbd/Pg) (DBI::InterfaceError)
from C:/ruby/lib/ruby/site_ruby/1.8/dbi.rb:233:in `_get_full_driver'
from C:/ruby/lib/ruby/site_ruby/1.8/dbi.rb:219:in `connect'
from t.rb:3

---------------------------------------------------
# t.rb
1 require 'dbi'
2
3 DBI.connect("DBI:Pg:practice:localhost", "postgres", "*******")

---------------------------------------------------
環境は次の通りです。

Windows XP SP2
Ruby 1.8.6 (2007-09-24 patchlevel 111) [i386-mswin32]
PostgreSQL 8.3
postgres-pr 0.4.0
dbi-0.2.0 dbi,dbd_pg

---------------------------------------------------
site_ruby/1.8/DBD/Pg/Pg.rbは存在していますが、何故ドライバが読み込めないのかが分かりません。
誰か分かる方がいらっしゃれば教えていただけないでしょうか。
よろしくお願いします。
721デフォルトの名無しさん:2008/03/26(水) 22:49:38
$GEM_HOMEって具体的に何のためのディレクトリですか?
722デフォルトの名無しさん:2008/03/26(水) 23:15:02
>>721
実は新しいgemsでは無設定でも適当にrbconfig.rbから取得して適当に動くので悩まなくてよい場合が多い
rubygems.rbによれば、Rubyが(自力コンパイルではなく)パッケージとしてインストールされてるかどうかによって
「/usr/lib/ruby/gems/1.8」か「/usr/local/lib/ruby/gems/1.8」あたりになる模様
「$GEM_HOMEを環境変数に設定して…」という過去を引きずった解説は二度手間か余計なトラブルの火種になってる可能性がある
(まあ、/varや/optあたりに置きたいという需要は一定数あるんだろうけどさ)


def dir
@gem_home ||= nil
set_home(ENV['GEM_HOME'] || default_dir) unless @gem_home
@gem_home
end

def default_dir
if defined? RUBY_FRAMEWORK_VERSION
return File.join(File.dirname(Config::CONFIG["sitedir"]), "Gems")
else
File.join(Config::CONFIG['libdir'], 'ruby', 'gems', Config::CONFIG['ruby_version'])
end
end

723デフォルトの名無しさん:2008/03/27(木) 05:57:44
rubyスクリプトでもtclsh並みに
外部コマンドを自然に書きたいです。
system "foo|bar > baz" みたいにquoteしてると見辛くて。。。
724デフォルトの名無しさん:2008/03/27(木) 10:46:12
何らかの手段でクォートしないとそれこそ見辛いじゃないか
シェルに渡す部分と自前のクラスやメソッドが渾然としてるほうがめんどくさい
Shell.install_system_commandsが流行らない理由はそこだろ
725デフォルトの名無しさん:2008/03/27(木) 11:14:35
>>710
def whoami; p self; end
whoami

後はリファレンス読んで。
726デフォルトの名無しさん:2008/03/28(金) 01:03:36
>>723
%x{ foo|bar > baz }

リファレンスのリテラル - コマンド出力参照
727デフォルトの名無しさん:2008/03/28(金) 02:56:33
aaa = ["あああ","いいい","ううう","えええ","おおお"]
こういう配列があって、

”えええ”という文字が、配列の何番目に来ているかを返す方法ってありますでしょうか?
728デフォルトの名無しさん:2008/03/28(金) 03:00:50
>>727
aaa.index("えええ")
=> 3
729デフォルトの名無しさん:2008/03/28(金) 08:38:49
>>726
いやそれブレースでクオートしてるじゃん

tclshにはUnknownプロシージャという仕組みがあって、これはRubyで言うmethod_missing
これで、未定義のtclコマンドがあれば外部シェルに丸投げしてる
lsというメソッドが無かったらシェル上でlsというコマンドが有効かどうか試す
730デフォルトの名無しさん:2008/03/28(金) 09:48:34
愚痴なんだけど

class A
attr_reader :val
def start
@val = Array.new
val << 'hoge!'
end
def hage
# …
val << 'hage!'
end
end

こういうコード書かれるとわかりにくいので読むの苦手だ
@val << 'hoge!'
でいいじゃんよ
attr_reader という字面に引きずられてる俺が悪いのはわかってんだけどさあ
731デフォルトの名無しさん:2008/03/28(金) 09:59:23
クラスの内側からゲッター呼んだ記憶がないんだけど
そういうコードってなんかメリットあるのかな
732デフォルトの名無しさん:2008/03/28(金) 10:19:52
>>731
attr* の自動生成の場合は全くご利益はないよね
インスタンス変数の表記を使わなくて済むことくらいか

>>730の例が勘違いしてるのかどうかわからんが、その例だと
「startメソッド以外ではインスタンス変数形式を使わない」という自己ポリシーの人がいる

最初にインスタンス変数に設定するときだけ @val= を使って、
クラス内で値を参照したり追加したりするときは必ずvalというアクセサ経由

めっちゃわかりにくいんだが…
733デフォルトの名無しさん:2008/03/28(金) 11:09:43
Math モジュールは同じ定義のメソッドと
特異メソッドとの両方が定義されているので、
特異メソッドを呼び出して使う使い方と、
クラスにインクルードして使う使い方との両方ができます。

pi = Math.atan2(1, 1)*4;
include Math
pi2 = atan2(1, 1)*4


ってあるけど、要は…

module Math
def self.atan2

end
def atan2

end
end

みたいになってるって事??
734733:2008/03/28(金) 11:18:51
あ〜 こういうのがあるのか。

module_function :atan2
735デフォルトの名無しさん:2008/03/28(金) 11:42:23
module M
def hoge(s) print s, "\n"; end
end

class B
include M
def moge(s) self.hoge(s); end
end

class A
extend M
def self.moge(s) self.hoge(s); end
end

B.new.moge('B')
A.moge('A')
#include M
M.hoge('M')

「include M」なしで、M.hogeが可能な方法ってある?
736デフォルトの名無しさん:2008/03/28(金) 12:47:03
737デフォルトの名無しさん:2008/03/28(金) 13:43:16
>>736
735の、各A, B classの、include, extend をした上で
「include M」なしでM.hogeって事だよ?
module Mに module_function :hoge ってやってもエラーになるけど?
738デフォルトの名無しさん:2008/03/28(金) 13:48:02
>>732
リファクタリングで言うところの「フィールドのカプセル化」じゃないのかな。
rubyでそれが有効かどうかは知らんけど。
739デフォルトの名無しさん:2008/03/28(金) 14:35:38
なるほど、フィールドのカプセル化の*つもり*で
> 最初にインスタンス変数に設定するときだけ @val= を使って、
> クラス内で値を参照したり追加したりするときは必ずvalというアクセサ経由
とかやってるのなら納得がいく
本当にそういう誤用なのかは実際のコードを見ないとわからないけど
740デフォルトの名無しさん:2008/03/28(金) 14:44:16
>>737
module M
def self.hoge(s) print s, "\n"; end
def hoge(s) M.hoge(s); end
end
というのはどう?
741デフォルトの名無しさん:2008/03/28(金) 14:47:26
>>732
ケント・ベックの言う Indirect Access パターン[IPB47,SBPP101] ですね。
当該クラスを継承してアクセッサをオーバーライドするときに威力を発揮
しますが、読みやすさとのトレードオフを考慮する必要があります。あと、
Java や Smalltalk と違い、メソッドコールの際に () や self を省略できる
Ruby では、同名の一時変数がアクセッサを遮蔽してしまう問題もあるため
要注意です。
742デフォルトの名無しさん:2008/03/28(金) 15:24:21
Ruby/SDLには塗りつぶし多角形を描く命令ってないんでしょうか?
743デフォルトの名無しさん:2008/03/28(金) 15:25:06
> 当該クラスを継承してアクセッサをオーバーライドするときに威力を発揮
うおーなんかすごい納得した

けどなんかテクニカルだね
744デフォルトの名無しさん:2008/03/28(金) 15:34:59
>>741
>Ruby では、同名の一時変数がアクセッサを遮蔽してしまう問題もあるため
これはまったよ
class Hoge
def title=(text) ; ... ; head.title = text ; end
def init(params) ; ... ; title = params[:title] ; end
end
なんて書くと、ローカル変数のtitleが作られてそれに代入される
self.title = ... て書かないといけない
745デフォルトの名無しさん:2008/03/28(金) 16:35:59
>>740
う〜む、結局そうやるしかないのか…
746デフォルトの名無しさん:2008/03/28(金) 16:45:59
>>745
というか、わざわざ module を使う時点でこんなのしかないぞ
747デフォルトの名無しさん:2008/03/28(金) 18:15:02
rubyに
JavaScriptで言うところの with(){} はありますか?
748デフォルトの名無しさん:2008/03/28(金) 18:27:12
>>747
JavaScriptはよく知らんが、ぐぐった限りでは instance_eval が近そう
749デフォルトの名無しさん:2008/03/28(金) 18:27:19
Javascriptのwithは使うな。Mozillaでも非推奨になってる。
750747:2008/03/28(金) 18:53:45
>>748
>>749
情報ありがとうございます。

簡略化好きなRubyが
JavaScriptのWith()勝手なメソッドを実装していないのは意外ですね。
751デフォルトの名無しさん:2008/03/29(土) 12:25:10
Pascalにもあるwithってことで
matz的には相当昔に検討してそうだな
752デフォルトの名無しさん:2008/03/29(土) 12:42:22
with (x) do
with (y) do
end
end

とかするとどうなるの? 内側優先?
753デフォルトの名無しさん:2008/03/29(土) 13:14:07
withの外にもレシーバ無しで呼べるメソッドやら変数があるんだから
やるとしても、入れ子特有の問題はないと思う(つまり内側から探索)

ローカル変数なのかメソッド呼び出しなのか、スコープが錯綜しすぎて暗黙の絞込みが出てくるとか
その辺の経緯はぐぐったらMLが出てくるはず

ところで、with文がある言語では、文内ではプロパティの操作のみに束縛するの?
754デフォルトの名無しさん:2008/03/29(土) 14:03:39
そいや、instance_evalのなかで当然selfが変わってるのに気づかずに
テストが通らなくて悩んだことがあったな。
755デフォルトの名無しさん:2008/03/29(土) 14:20:44
class Hoge
def self.moge
print "Hoge::moge\n"
end
end

Hoge::moge
Hoge.moge

↑の呼び出しの"."と"::"は同じ意味なんですか?
756デフォルトの名無しさん:2008/03/29(土) 14:25:46
>>755
このスレの>>558あたりからしばらくその話題
757デフォルトの名無しさん:2008/03/29(土) 14:33:36
>>756
やっぱり、同じだったんですね。

あとついでにもう一つ。
以下のコードだと's'を指定した場合は、正規表現で上手くマッチ出来ません。
's'の場合はS-JISですよね?だから日本語も処理出来る様になると思ったんですが…
$KCODE = 's' #こっちはダメ
#$KCODE = 'e' #こっちだとOK
if 'abcあいう'[/\W/] then print "error!\n"; end
758757:2008/03/29(土) 14:38:02
あと、編集してるソースコードは、S-JISなんですけどね。
759デフォルトの名無しさん:2008/03/29(土) 14:39:13
ruby -Ks 757.rb
でどうよ?
760757:2008/03/29(土) 14:45:42
>>759
それは、
$KCODE = 'ks'
でもいいんですよね?
確かにこうすれば正規表現マッチしますね。

あとついでに、以下の'jcode'をrewuireして
マルチバイト文字の置き換えなんかをする時
今度は、$KCODE='ks'では置き換え出来ず
$KCODE='s'にする必要があるのですが
正規表現で、/\W/をマッチさせ、且つ
trのマルチバイト文字置き換えを両立させるには
以下みたいにするしかないのでしょうか?

require 'jcode'

$KCODE = 's'
s = '012345'
print s.tr('0-9', '0-9')
$KCODE = 'ks'

if 'abcあいう'[/\W/] then print "\nerror!\n"; end
761デフォルトの名無しさん:2008/03/29(土) 15:06:21
$KCODEに設定する値に ks なんてのはない。(nと同等だろう)

$KCODEへの値の設定が行われるタイミングでは既にスクリプト
が構文ツリーへ変換されたあと。スクリプト自体が書かれている
文字コードは変換前に判明している必要があるから、スクリプト
の中ではなく、起動オプションで指定するの。
762デフォルトの名無しさん:2008/03/29(土) 15:09:45
$KCODEは先頭の1文字しか読まない
$KCODE='s'

$KCODE='SEXフレンドになってくれる人妻募集!'
は同じように扱われる

ruby 起動時の引数の -Ks は $KCODE 以上の意味を持つ
-Ks を指定すれば $KCODEは自動的に "SJIS" に設定されるから指定する必要はない

あと、マルチバイト対応させた正規表現の \w はマルチバイト文字を含むから
それを反転させた \W はアルファベットでも漢字でもひらがなカタカナでもない何か を表す
763757:2008/03/29(土) 15:13:07
> $KCODEに設定する値に ks なんてのはない。(nと同等だろう)
なるほど。
しかしなんでまた、ヘルプに漢字を処理しない'n'でマルチバイトの正規表現が出来て
S-JISの's'がマッチ出来ないのでしょうか?
764757:2008/03/29(土) 15:17:53
>>762
ああ、だから'n'でなければダメだったのですか。

あと、ウェブ上を色々見てると'jcode'は
色々と広範囲に渡って影響が出るので
なるべく使用しないほうが良いみたいな説明があったのですが
やはりあまり使用しない方がよいでしょうか?
765757:2008/03/29(土) 15:22:57
それと結局 -Ksや$KCODE='s'でマルチバイト対応させた場合
正規表現で、英数('_'含む)以外文字があるのを発見するにはどう記述すればいいのでしょうか?
/\W/ ←これは使えないので…

質問ばかりで申し訳ないです。
766デフォルトの名無しさん:2008/03/29(土) 15:33:25
/[^0-9A-Za-z_]/
767757:2008/03/29(土) 15:47:35
>>766
う〜ん、[]文字クラス中に'^'があった場合は、それ以外って意味になるんですねぇ…
Rubyのヘルプの正規表現の項に、説明が無かったので分かりませんでした…
ありがとうございました!
768デフォルトの名無しさん:2008/03/29(土) 16:21:40
rubyとrailsのapiを探してるのですが、どちらも個人が作ったような怪しいサイトしか見つかりません
実際に開発されてる方がよく見ているapiのサイトなどがありましたら教えてください
769デフォルトの名無しさん:2008/03/29(土) 16:28:50
gem serverが起動してあるので
http://localhost:8808/

できないなら
http://api.rubyonrails.org/
があるだろ。
770デフォルトの名無しさん:2008/03/29(土) 16:32:14
あ、Ruby自体はターミナルからri(or fri)。

771デフォルトの名無しさん:2008/03/29(土) 17:00:34
>>769
>>770
ありがとうございます。
難しそうですね。じっくり読んでみます
772デフォルトの名無しさん:2008/03/29(土) 17:09:45
Windowsだとヘルプファイルになってるのがあったよーな。
773デフォルトの名無しさん:2008/03/29(土) 17:20:21
ファイル・クラス・メソッド・本文の4ペイン式のって微妙に見づらいというか把握しづらいんだよね
もーちょい有機的に繋がる表現法があるといいんだけど
774デフォルトの名無しさん:2008/03/29(土) 17:23:39
個人サイトだけどapi.rails2u.comの使ってる人は結構いるんじゃない?

775デフォルトの名無しさん:2008/03/30(日) 00:36:57
Railsのapp/modelsにあるファイルに
validates_presence_of とか validates_format_ofってメソッド?を記述しますよね
引数として、
validates_presence_of :title :description
のような書き方をしますが、どうしてシンボルにする必要があるのでしょうか?
776デフォルトの名無しさん:2008/03/30(日) 00:50:18
>>775
validates_presence_of 'title'
のように文字列ではいけないのか? という質問なら文字列でいい。

validates_presence_of title
のようにアクセサメソッドではいけないのか? という質問なら、駄目。
validates_xxx を記述している位置にアクセサメソッドを書いても、
ここではselfはモデルクラス自体であってモデルのインスタンスではない。
それに、validates_xxxは検証処理を登録するクラスメソッドであって
それ自体がインスタンスに対して検証を行うわけではない。

あと、こんなスレもあるよ。
Ruby on Rails
http://pc11.2ch.net/test/read.cgi/tech/1191381506/
777775:2008/03/30(日) 01:00:30
>>776
丁寧にありがとうございます!
しかし全く理解できません。馬鹿ですいません。
勉強し直して来ます!
778デフォルトの名無しさん:2008/03/30(日) 01:10:17
>>777
validates_presence_of というのが何かよくわからんが、
titleと書いてしまったらtitleメソッドの返り値に実際に入ってる文字列とかnilとか
そういうのそのものが評価されてしまうではないか


「titleという変数だかなんだかをチェックしてもらいたい」場合は、
引数に 'title' や :title という書き方をするのが普通
779デフォルトの名無しさん:2008/03/30(日) 06:31:18
メソッドの可視性を無視しprivateなメソッドを実行する目的でinstance_evalが
使われる様ですが、privateにしてあるメソッドをわざわざ外部から呼び出す
というのは、C++を使用したことのある私にとって、とても違和感があります。

どの様な場合にこのような呼び出しが用いられているのでしょうか?
780デフォルトの名無しさん:2008/03/30(日) 06:48:40
>>779
設計意図が理解できない人間がアクセスしようとした時じゃないか?
781デフォルトの名無しさん:2008/03/30(日) 10:59:51
でばっぐよう
782デフォルトの名無しさん:2008/03/30(日) 11:17:49
てゆーか、Rubyを常用してる人間からしても「こんなこともあろうかと」という奥の手的な処理だぞ

どうしても呼び出したい値(メソッド)があるから
「(ファイル○○のxxx行目に)この文字列がスクリプトとして書いてある」
ことにして実行させるというだけだ
privateを無視するために存在する記法ってわけじゃない

CやC++やJavaだけしか知らないのなら、evalという概念について調べてみるといい
783デフォルトの名無しさん:2008/03/30(日) 11:54:19
>>779
インタフェース以外に、実装のテスト書くときとかさ。1.9より前だとsendの第二引数でprivateなの呼べるけど。
どうしてもそのオジブェクトのコンテキストで実行したいなにかがある時に使うもんだと思う。

>>782
instance_evalはブロック渡せる。
784デフォルトの名無しさん:2008/03/30(日) 12:05:48
説明が不完全な場合も多いよね
「もちろん instance_eval を使えばメソッドを実行することはできます」
というような書き方にしとけば勘違いも減るんじゃないかと思う
785デフォルトの名無しさん:2008/03/30(日) 12:14:07
>>551
http://blog.segment7.net/articles/2008/03/29/rubygems-1-1-0
インデックス更新が速くなったとかなんとか書いてあるが、どんなもんだろ。


786デフォルトの名無しさん:2008/03/30(日) 13:49:55
$ gem -v
1.0.1
$ su -
# gem install --local rubygems-update-1.1.0.gem
Successfully installed rubygems-update-1.1.0
1 gem installed
# exit
$ gem -v
1.0.1

あれー?
787デフォルトの名無しさん:2008/03/30(日) 13:59:49
説明しよう!

rubygems 本体のアップデートは rubugems-update をインストールしただけでは駄目で、
別途 /usr/local/bin/ とかにある update_rubygems を自力で実行しないと駄目なのだ!

なんでこんな二段構えになってるのかは不明
っていうか>>785のページにもアップデート方法としてきちんと書いてあるじゃん
788デフォルトの名無しさん:2008/03/30(日) 14:05:38
書いてあるけど、
gem update --system
が最近のやり方だな。
789デフォルトの名無しさん:2008/03/30(日) 15:32:22
>>787
をを
っていうかよく読め俺

> Mem: 126432k total, 123756k used, 2676k free, 156k buffers
> Swap: 361420k total, 175772k used, 185648k free, 3232k cached

とかあっさりスワップに食い込んでHDDがガリガリ言ってるが、
30分程度で gem install --remote hoge は完了するようになった
最初のパース10分、本体インストール一瞬、riとrdocインストール5分、後処理15分
これまでは10時間単位でハングアップ状態だったからたいした進歩だ

>>788
YAMLをパースさせると死ぬのでこの場合は無理だったということで
今度からは使えそうなのでそれ使う
790デフォルトの名無しさん:2008/03/30(日) 16:25:43
いちソフトウェアのライブラリのアップデーターやインストーラーがメモリ128MB使い切るって邪悪だな
791デフォルトの名無しさん:2008/03/30(日) 16:35:25
獅子は兎を狩るのにも全力を尽くすの理
792デフォルトの名無しさん:2008/03/30(日) 16:41:31
>>790
rubygemsメイン開発者層の人は対処したいと感じるほど困ってないんだろうか

困ってないんだろうな
あるいは英語圏OSでは問題発生しないとかさー
793デフォルトの名無しさん:2008/03/30(日) 16:43:17
牛刀で鶏をなんたらの間違いじゃないか

XMLをDOMにパースしたらとんでもなくメモリ使うけど
YAMLもそういうクチ? SAXみたいなインタフェースないのかな
794デフォルトの名無しさん:2008/03/30(日) 17:02:16
YAMLはオンメモリでハッシュを生成するんじゃなかったっけ?
17MBのYAMLで表現されるハッシュ(実サイズがどれくらいになるのか不明)がメモリにどかーんと居座って
その中からがりごりと目的のキーを捜すとか、そんなわかりやすいがゆえに大味な処理になってると予測

でも 1.1.0 はMarshal併用したのがやっと正式に入ったからそれなりにメモリ消費が少なくてそれなりに速いはず
ttp://blog.segment7.net/articles/2007/10/05/rubygems-beta-approaching
> a new Marshal formatted index that will reduce both bandwidth usage and memory consumption.
> Instead of 120M or so it takes to do a bulk yaml index update, it takes about 30M with a Marshal index update
795デフォルトの名無しさん:2008/03/30(日) 17:10:20
それ 0.9.5 だから、これまで主流の 1.0.1 にはすでに反映されてる
796デフォルトの名無しさん:2008/03/30(日) 17:32:17
windows-xp環境でRubyを使っています。
ruby 1.8.5 (2006-12-25 patchlevel 12)

Cursesを使ってみたいと思い
"http://jarp.does.notwork.org/win32/"から「pdcurses-2.60-1-mswin32.zip」および「zlib-1.1.4-1-mswin32.zip」をダウンロードして
解凍された「bin」フォルダのpdcurses.dll、zlib.dllをrubyのインストール先の「bin」フォルダにコピーしました。

require "curses"としたところ
no such file to load -- curses とエラーがでます。

curses 拡張ライブラリを入れるにはどうしたらよいかよろしくお願いします。
797779:2008/03/30(日) 18:11:59
遅くなりましたが、レス有り難うございます。
私のinstance_evalに対する認識がずれている様なので、再度調べてみます。
有難うございました。
798デフォルトの名無しさん:2008/03/30(日) 18:15:15
mswin32版バイナリをインストールすればcurses関連は標準で入ってないか?

でもこれ自分で入れたのかもしれんなあ。覚えてないや。
curses.so というファイルがrubyインストールフォルダのどこか
(たぶん、lib\ruby\1.8\i386-mswin32)に入ってなければ、そもそもcurses対応になってない
799デフォルトの名無しさん:2008/03/30(日) 19:15:18
>>796
ttp://www.garbagecollect.jp/ruby/mswin32/ja/documents/install.html

意外と気付きにくいんだよね、このページ
800デフォルトの名無しさん:2008/03/30(日) 20:05:43
ActiveScriptRuby には curses.so が入ってなくて動かなかった
mswin32版ダウンロードして curses.so だけコピーしたら動いた
801デフォルトの名無しさん:2008/03/30(日) 20:38:43
下手にASRをインストールするよりmswin32版を普通に展開したところに
RScript18.dllなどをコピーしてregsvr32したほうが色々面倒が無くて良い気がする。
802デフォルトの名無しさん:2008/03/30(日) 21:20:42
シンボルの概念がどうしても理解出来ません
ある時は変数になったり
ハッシュのキーになったり
メソッド名になったり

javaしか分からない私にどなたかjava的なヒントをください…
803デフォルトの名無しさん:2008/03/30(日) 21:26:57
Lisp/Schemeをちょっとだけかじるといいと思います
804デフォルトの名無しさん:2008/03/30(日) 21:37:16
識別子
805デフォルトの名無しさん:2008/03/30(日) 21:53:28
>>802
よく分からないうちは「生成がとても軽い文字列」なんだと思えばいい

ただし、端末や画面に表示するときには使わない
あくまでスクリプト内部で文字列的なものが必要なときに使う
806デフォルトの名無しさん:2008/03/30(日) 22:40:59
>>802
自動生成されるenumだと思えばおk
…あ、Javaにはなかったか。

「internされた文字列」でググれ。
807デフォルトの名無しさん:2008/03/30(日) 23:40:26
>806
enumはJava5以降あるにゃあるが、いろいろと奇天烈なので
あまし例えにつかわんほーが。
808デフォルトの名無しさん:2008/03/31(月) 00:56:08
優しいRailsの育て方、だと
SymbolはJavaのString, StringはJavaのStringBuilderって書いてあったな。

Rubyでは(JavaやPythonなんかと違って)文字列はMutableで、
シンボルはImmutable。つまり
> (a = "hoge").object_id
=> -605795638
> a.replace("fuga").object_id
=> -605795638 # 変わってない

> (b = :hoge).object_id
=> 164978
> (b = :fuga).object_id
=> 165058
てなもん。まあ、シンボルは整数の代わりと思うといいよ。
809デフォルトの名無しさん:2008/03/31(月) 00:56:49
>>802
名札オブジェクト

いや、そういう理解で困るような使い方はそうそう無いと思う
変数「の名前」やメソッド「の名前」を指すときに使う
810デフォルトの名無しさん:2008/03/31(月) 00:59:26
やっぱりlisp系やってない人向けの説明ってどーもすっきりせんよね。

811デフォルトの名無しさん:2008/03/31(月) 01:51:23
>>810
でも一度シンボルの存在を知ると「なんで××にはシンボルが存在せーへんのやー!!」とちゃぶ台返ししたくなる罠。
# Java も intern() があるくらいなんだから、組み込みのシンボル用意してくれればいいのに。
812デフォルトの名無しさん:2008/03/31(月) 14:32:01
でも下手に説明して同意をもらうと公開メソッドの引数のハッシュのキーが全部Symbol限定に…
もちろん「Stringをキーにするのは不自然」とか言いだすから変換措置なし
813デフォルトの名無しさん:2008/03/31(月) 15:22:15
Rubyist Magazine - cgi.rb がイケてない 12 の理由
ttp://jp.rubyist.net/magazine/?0023-Cgirb
814デフォルトの名無しさん:2008/03/31(月) 16:40:56
# ネストしたハッシュの一番奥のvalueを配列にする
arr = []
h.each_key do |k|
h[k].each_key do |name|
arr << h[k][name]
end
end
return arr

キーによるアクセスにこだわってるみたいなんだけど、これ何かご利益ある?
815デフォルトの名無しさん:2008/03/31(月) 18:28:08
その処理だけなら、ないんじゃない?
816デフォルトの名無しさん:2008/03/31(月) 20:06:55
「hのkのnameをarrに追加」と読み下せることを目的にしてるのかも
817677:2008/03/31(月) 21:19:47
>>677です。
すいません。また教えてください。
IO.popenをつかってディーラーとAIでやり取りできるようになったのですが、
AIをpopenで起動するとコマンドプロンプトが表示されてしまいます。
コマンドプロンプトを表示しないでpopenする方法はないでしょうか。
ディーラーの部分はRuby/tkで実装していて、rubywで実行しています。
818677:2008/03/31(月) 21:23:16
書き忘れましたが、実行環境はWindowsです。
819デフォルトの名無しさん:2008/03/31(月) 21:59:40
Rackって普通のCGIスクリプト(サーバーとして単体起動しない)でも使えるのかな?
試してみた人がいればぜひ教えてください
820デフォルトの名無しさん:2008/03/31(月) 22:29:44
RagelとRackって同違うんだっけ?
ステートマシンコンパイラとコンパイラコンパイラの違い?
分からん。
821デフォルトの名無しさん:2008/03/31(月) 23:02:08
Raccだよな多分。
RackはWEBアプリの仕組みの違いを吸収するフレームワークだっけ。

Ragelはステートマシンコンパイラらしいから字句解析に使えて、
Raccはパーサジェネレータで構文解析に使える。あわせて言語処理系でも作れる。
822デフォルトの名無しさん:2008/04/01(火) 03:42:20
>>817
> AIをpopenで起動するとコマンドプロンプトが表示されてしまいます。
> コマンドプロンプトを表示しないでpopenする方法はないでしょうか。
そのAIをGUIモードでコンパイルするか、
cygwinのrun.exeを間にかます。
823デフォルトの名無しさん:2008/04/01(火) 03:44:31
>>814
> # ネストしたハッシュの一番奥のvalueを配列にする
簡単に書くとこうか?

arr = []
h.each_value {|v| arr.concat v.values}
824817:2008/04/01(火) 20:36:39
>>822
できましたっ
ありがとうございました。
825デフォルトの名無しさん:2008/04/01(火) 22:26:52
>>821
あ、ごめん Racc だった。
そっか、Racc は構文解析のみで字句解析は面倒見ないんだった。
そういえばraccの256倍本で正規表現でlexer書いてたな。なるほど。
ありがと。
826デフォルトの名無しさん:2008/04/02(水) 17:33:04
#!/usr/bin/env ruby
IO.open(10, 'w') { |io| io << 'HELLO 10' }

を./aaa.rbに保存し
./aaa.rb 10>./log
としたらlogにHELLO 10と書かれる計画だったのですが
./aaa.rb:2:in `initialize': Bad file descriptor (Errno::EBADF)とでてしっぱいしました

10>./logと書くとシェルがdup2(10,open("./log"))みたいのをしてくれるとおもったのですが
根本的にまっちがってるフラグ????
827デフォルトの名無しさん:2008/04/02(水) 18:17:46
>>826
dup2が理解できるレベルなら、素直にリファレンスを見なさい。
828デフォルトの名無しさん:2008/04/02(水) 19:09:44
>>826
うちではちゃんと動いた。
シェルは何使ってる?
829826:2008/04/02(水) 19:18:47
うおおおおおおおおおおおおおおおおおおおおおおお うごきました
Zsh@cygwinなのですがbashからよんだらちゃんと動きました
ありがとうございます
830デフォルトの名無しさん:2008/04/02(水) 19:25:32
831デフォルトの名無しさん:2008/04/02(水) 19:30:57
827==830涙目?
832デフォルトの名無しさん:2008/04/02(水) 19:52:13
ブロックの前の空白が気になる
833デフォルトの名無しさん:2008/04/02(水) 20:03:14
うちは駄目、シェルは普段 tcsh なんで /bin/sh
ruby 1.8.6 (2007-09-24 patchlevel 111) [i386-freebsd6]
>>826 と同じ結果
9 までは通るけど 10 以上だと駄目になる
834デフォルトの名無しさん:2008/04/03(木) 22:36:58
file descriptorが一桁しか使えない?
835デフォルトの名無しさん:2008/04/04(金) 00:16:16
if の条件が長くなって複数行になる時って、どうすればいい?
836デフォルトの名無しさん:2008/04/04(金) 00:18:27
自分が本当に正しいことをしてるのか考える
関数にまとめる
837デフォルトの名無しさん:2008/04/04(金) 00:45:04
Rubyに関数なんてありませんよ
838デフォルトの名無しさん:2008/04/04(金) 00:50:36
>>836
了解です。仕様的に、条件を複数行にはできないってことですね。
リファクタリングしてメソッドにします。
839デフォルトの名無しさん:2008/04/04(金) 01:00:58
>>838
え?別にできるけど。

if a == 1 &&
b == 2
 puts "hoge"
end

みたいなことだよね?
840デフォルトの名無しさん:2008/04/04(金) 01:11:11
>>839

if a == 1
&& b == 2
 puts "hoge"
end

こうしてました。。。こっちだとダメみたいです。
ありがとうございました。
841デフォルトの名無しさん:2008/04/04(金) 01:48:31
>>840
改行も区切りの一種になっているため、末尾に演算子があるとか、
カッコが閉じてないとか、明らかに行が終わっていない場合を除いて、
そこで式が終了する。
&&を次行の行頭に持っていきたい場合はカッコでくくればいい。
(あまりRubyらしくないけど)
842デフォルトの名無しさん:2008/04/04(金) 01:58:14
>>841
そうみたいですね。
ただ、以下のようにカッコで括ってみてもエラーでした。
ver.1.8.4 です。

if (a == 1
&& b == 2)
puts "hoge"
end
843デフォルトの名無しさん:2008/04/04(金) 03:21:10
>>842
if a == 1 \
&& b == 2
  puts "hoge"
end
844デフォルトの名無しさん:2008/04/04(金) 07:44:42
先に条件式の結果を出して、ローカル変数に入れるという方法もある

c = (a == 1) and (b == 2)
if c then
 puts "hoge"
end
845デフォルトの名無しさん:2008/04/04(金) 09:46:13
>>844
バカ発見
846デフォルトの名無しさん:2008/04/04(金) 09:57:48
if longlonglongcondition == value1 and verylonglonglonglongcondition == value2

がヨコに長くて嫌だって人に

c=(longlonglongcondition == value1 and verylonglonglonglongcondition == value2)
if c then

を勧めるのは、正直どうかと思わなくもない
847デフォルトの名無しさん:2008/04/04(金) 10:15:49
12345678901234567890123456789012345678901234567890123456789012345678901234567890
1 2 3 4 5 6 7 8

なんだかんだ言って80文字程度で改行するというのは今の時代にも生きてるんだな
848デフォルトの名無しさん:2008/04/04(金) 10:44:58
>>844 が馬鹿ってのはruby的にはそういうことしないってこと?
リファクタリングの1つだよな。
もちろん変数名はcとかじゃなくてちゃんと意味のある名前にするけどね。
849848:2008/04/04(金) 10:46:18
ああ、ただ今回の要件には向かないな。失礼。
850デフォルトの名無しさん:2008/04/04(金) 11:01:20
要は>>846だな

Rubyの継続行のルールはようわからん
andとかorとか&&とか||の直後で改行した場合は必ず継続行とみなしてくれるのでそれ使ってる
851デフォルトの名無しさん:2008/04/04(金) 13:50:13
ようわからんからこそ、俺は常にバックスラッシュ。
852デフォルトの名無しさん:2008/04/04(金) 22:16:47
改行したところまでで完結した式とみなせるかどうか、だけのはずなんだがな。
853デフォルトの名無しさん:2008/04/04(金) 23:13:28
WindowsのRuby開発環境で一番人気って何ですか?
854デフォルトの名無しさん:2008/04/05(土) 00:52:59
cmd + edlin
855デフォルトの名無しさん:2008/04/05(土) 01:22:50
NTEmacs + ruby-mode
856デフォルトの名無しさん:2008/04/05(土) 02:03:35
>>853
WindowsでRubyを使うこと自体が間違い
857デフォルトの名無しさん:2008/04/05(土) 02:44:20
>>854
edlin使ってるヤツ見たことないw

つっても俺もVimだが
858デフォルトの名無しさん:2008/04/05(土) 03:16:26
>>853
eclipse
859デフォルトの名無しさん:2008/04/05(土) 05:29:04
cat+echo
860デフォルトの名無しさん:2008/04/05(土) 05:31:04
winか
type + echo
861デフォルトの名無しさん:2008/04/05(土) 06:20:46
Cygwin + Meadow
862デフォルトの名無しさん:2008/04/05(土) 07:46:42
>>853
一番人気と言えるようなものはない、が正解
863デフォルトの名無しさん:2008/04/05(土) 09:12:10
Eclipse + RDE
xyzzy + ruby-mode
VisualuRuby
Meadow + ruby-mode
NetBeans + Ruby Pack
Rubyスクリプト着色可能なエディタ

選択肢としてはこれくらい?
Vim系列って着色以上の機能ってあったっけ?
864デフォルトの名無しさん:2008/04/05(土) 09:14:42
3rd Rail
865デフォルトの名無しさん:2008/04/05(土) 15:20:34
IO.popen について質問です。
子プロセスの標準入力に書き込み、コプロセスの出力結果を読み取ろうとしています。

input = <<-END
aaa
bbb
ccc
END
output = nil
IO.popen('cat -n', 'w+') do |io|
  io.write(input)
  output = io.read()
end
print output

これを実行したところ、io.read() のところでプロセスが
ブロックされるようで、終了しません。
どうしたらいいでしょうか。
866デフォルトの名無しさん:2008/04/05(土) 15:24:58
RDEはブロック書いたときにしょっちゅう落ちてたからやめた。

>>863
Ctrl+Pでキーワード補完ぐらいなら
867デフォルトの名無しさん:2008/04/05(土) 15:28:08
io.close_write
しなきゃ
868デフォルトの名無しさん:2008/04/05(土) 18:41:16
>>867
>io.close_write
なにこれー こんなのあるかよ
ちょーさんくすです
869デフォルトの名無しさん:2008/04/05(土) 23:37:50
Rubyを始めたいのですがまず何をすればよいのでしょうか?
870デフォルトの名無しさん:2008/04/05(土) 23:41:17
871デフォルトの名無しさん:2008/04/06(日) 00:40:34
>>869
モルモン教信者になる。
872デフォルトの名無しさん:2008/04/06(日) 00:55:58
モジュールの深さってどのくらいがふつう?
module プロジェクト名
 module システム名
  module サブシステム名
   class クラス名
   end
  end
 end
end
とか深すぎ?
873デフォルトの名無しさん:2008/04/06(日) 01:12:09
そのへんは実際のディレクトリを反映するはず
規模にもよると思うんだが、個人で一生懸命作るぶんには

module アプリケーション名
class メインクラス
end
class いろいろクラス
end
module 便利モジュール
end
end

これくらい?
あまり深いとわけわかめだぞ
foo = AAA::BBB::new
foo.hoge
になるのが個人的限界
874デフォルトの名無しさん:2008/04/06(日) 01:21:51
>>873を複数作ってmoduleで包む
875デフォルトの名無しさん:2008/04/06(日) 07:46:15
Javaのpackageみたいな仕組み作ってくれよ
876デフォルトの名無しさん:2008/04/06(日) 11:26:40
>>872はちと深いなあという印象で、>>873は浅すぎるなあという印象
877デフォルトの名無しさん:2008/04/06(日) 12:49:08
3が深すぎで1が浅すぎだったら2しかないじゃん
878デフォルトの名無しさん:2008/04/06(日) 13:03:35
3深すぎ 1浅すぎ 2中途半端 なしすっきり

こうですか わかりません
879デフォルトの名無しさん:2008/04/06(日) 15:40:07
Rubyの達人は2.5とかが可能
880デフォルトの名無しさん:2008/04/06(日) 16:55:47
全部特異メソッドで頑張るという手も
881デフォルトの名無しさん:2008/04/06(日) 22:11:29
特異メソッドを得意メソッドにすればいいんですね
882デフォルトの名無しさん:2008/04/06(日) 22:27:13
徳井メソッドって高橋メソッドみたいなもん?
883デフォルトの名無しさん:2008/04/06(日) 22:30:16
>882
高橋と徳井じゃ実装してるメソッドが違うから
人間クラスから見た関係ではそうかもな。
884デフォルトの名無しさん:2008/04/07(月) 01:38:49
open-uriで質問です
あるURLを開くと、リダイレクトされた先がURLエンコードされていないファイル名を返してきます
そこでrubyは「C:/Ruby/lib/ruby/1.8/uri/common.rb:436:in `split': bad URI(is not URI?):(問題のリダイレクト先)」とエラーが出ます
これはどうすればいいんでしょうか?
885デフォルトの名無しさん:2008/04/07(月) 08:30:11
くさったヘッダを返すところが悪い。
Net::HTTPでがんばれ。
886デフォルトの名無しさん:2008/04/07(月) 11:48:28
require 'uri'
require 'open-uri' # and 'net/http'

begin
open(uri).read # ここでエラーが出る
rescue URI::InvalidURIError => ex
raise ex unless /\Abad URI\(is not URI\?\)/ =~ ex.message
raise ex if @invalid_uri_err == uri
Net::HTTP.start(uri.host, uri.port) {|http|
header = http.head(uri.path)
uri = URI.parse(URI.encode(header['location']))
}
@invalid_uri_err = uri
retry
end

こんな感じ?
887デフォルトの名無しさん:2008/04/07(月) 12:24:48
それだけだと uri が不明な変数だっていうエラーが出るだろうな
単体で試せる完全スクリプトの形してる割には罠っぽい(w

ruby って retry_once みたいなのって無いの?
888デフォルトの名無しさん:2008/04/07(月) 17:32:57
889デフォルトの名無しさん:2008/04/07(月) 18:17:06
Rubyist Magazineを読んでてわからない所があったので質問させてください

http://jp.rubyist.net/magazine/?0023-Cgirb#l5
>String#<< ではなく += を使っている

これは何かダメなんでしょうか?
単なる好みの問題のような気がするのですが…
890デフォルトの名無しさん:2008/04/07(月) 18:21:02
新しくオブジェクトを作っているから
891デフォルトの名無しさん:2008/04/07(月) 18:28:38
うん、いいとこに気づいたな
String に << を使うと、オブジェクトはそのままで末尾に文字列が追加される
String に += を使うと、以前の文字列と足す文字列を足したものが新しいオブジェクトになる

本当に必要なのはただの長々とした文字列であるはずで、
毎回新しくオブジェクトが生成されるというのはとても無駄だ
892デフォルトの名無しさん:2008/04/07(月) 18:40:40
str の末尾に 'hoge' を追加する、という処理を体現するコードは
str = str + 'hoge'
ではなく
str << 'hoge'
である、というだけなんだけどね
str + 'hoge' が返すオブジェクトは str とは何の関連性もない

そんなん好みだろ、と言われてしまうとどうにもならんが、かといって
「str がメガ単位の大きさになるかもしれないから今回は + 使うのやめる」
というブレた判断をするのはそれはそれでとても不恰好だろ
893デフォルトの名無しさん:2008/04/07(月) 19:00:23
>>890-892
なるほど、そんな違いがあったのですね
ありがとうございました
894デフォルトの名無しさん:2008/04/07(月) 19:04:28
このへんがわかるとRubyが面白くなるが、症状が変なほうに進むと
「URIクラスにreplaceが無いのは変だ」とか言いだすので注意
895デフォルトの名無しさん:2008/04/07(月) 19:21:37
URIにto_strがないのが不便です
896デフォルトの名無しさん:2008/04/07(月) 19:38:07
せっかく削ったのに…
897デフォルトの名無しさん:2008/04/07(月) 19:57:33
まあ、パフォーマンス度外視なのがスクリプト言語だしね。
898デフォルトの名無しさん:2008/04/07(月) 20:22:00
require 'rubygems'したあとYAMLでファイルに保存するんだけど

File.open(file, "w") { |f|
YAML::dump(data, f)
}

と書いてしまうのはWindowsのbinnmodeとかあのへんの問題はない?
899デフォルトの名無しさん:2008/04/07(月) 20:56:42
>>898
……多分。
……YAML はテキストだし。
……まあ不安なら "w" を "wb" にでもしたらよろし。
900デフォルトの名無しさん:2008/04/08(火) 09:46:26
そこまで書いた上に気になってるなら、素直にbinmodeにすればいいと思う。
害はたぶんないだろう。
901デフォルトの名無しさん:2008/04/08(火) 10:46:31
DOSISHではないプラットフォームでも
テキストモードなら\r\nも改行文字として扱ってくれると便利なんだけど、
そうなっていない理由ってあるのかな。
日ごろ区別する必要のない人たちには不要な機能だから?
902901:2008/04/08(火) 10:50:24
あ、>>901はテキストモードでの読み込み時の話ね。
903デフォルトの名無しさん:2008/04/08(火) 11:08:51
universal newlineだね。
導入しようという話はあるんだが。
904デフォルトの名無しさん:2008/04/08(火) 23:58:37
ゲーム作ろうとして、MyGame(Ruby/SDL の Windows バイナリ同梱)
をダウンロードしたんですけど、なぜかインストールできません。

だれか詳しい方、助けてください。(ちなみにOSはvistaでActiveRubyはインストール済みです)
905デフォルトの名無しさん:2008/04/09(水) 00:19:23
>>904
どの段階で失敗するのかをできるだけ詳しく書きましょう
906デフォルトの名無しさん:2008/04/09(水) 00:22:39
どうせ一人の力だけでは無理なんだし要点まとめる練習だと思うべし
質問のために要点まとめて問題点洗い出してたら解決したという困った事態がザラにある
907デフォルトの名無しさん:2008/04/09(水) 00:39:24
>>904
すみませんでした。もうちょっと詳しく書きます。
http://dgames.jp/archive/mygame/でmygame-0.9.1-rubysdl-1.3.0-mswin32-1.8.5-p12.zipをダウンロード

デスクトップ上で展開

MyGameフォルダ内のinstall_mygame.rbをダブルクリック
コマンドプロンプトが起動して、終了。

MyGameのインストール確認のため、ruby consoleで「ruby -r mygame/boot -e ""」
と入力するが、以下のようなエラーメッセージが表示される。

C:/Program Files/ruby-1.8/lib/ruby/site_ruby/1.8/mygame.rb:1:in`require': no such
file to load -- sdl (LoadError)


こんな具合です。
908デフォルトの名無しさん:2008/04/09(水) 00:55:59
>>907
書いてある通りだろ
本来ならあるべき場所にsdl(sdl.rb)がないから、ロードに失敗した
その構造だとC:/Program Files/ruby-1.8/lib/ruby/site_ruby/1.8/sdl.rbがないのだろう

おそらく何かの原因でインストールに失敗している
909デフォルトの名無しさん:2008/04/09(水) 01:46:42
>>908
すみませn。ruby初心者どころかPG初心者レベルなので、具体的にどう対処すれば
よいのかわかると幸いなんですが・・・。
910デフォルトの名無しさん:2008/04/09(水) 01:49:49
>MyGameフォルダ内のinstall_mygame.rbをダブルクリック
>コマンドプロンプトが起動して、終了。

ホントはここでエラーメッセージが印字されてるんだろうなぁ…。
コマンドプロンプトから実行してみるとか。
911デフォルトの名無しさん:2008/04/09(水) 02:01:29
>>910さんのアドバイス通りやってみました。

・・・が結果は同じでしたorz
912デフォルトの名無しさん:2008/04/09(水) 02:49:21
いや、なにも改善してないんだからまた失敗するのは当たり前で…
コマンドプロンプトから実行しただけで良くなるわけが無くて…
エラーメッセージが吐かれたならそれを読み解けといってるわけで…
913デフォルトの名無しさん:2008/04/09(水) 02:57:48
Rubyは高級言語なのでWindowsユーザは別の言語をお使い下さい
914デフォルトの名無しさん:2008/04/09(水) 05:07:37
>>907
# 使ってないから知らんけどvistaなのが悪いとか?
mygame/rubysdl-1.3.0-mswin32-1.8.5-p12/README.ja.win32 読んでみ
特に 3.1 のところ
で、然るべき場所にそれらのファイルがあるかどうか確認
915デフォルトの名無しさん:2008/04/09(水) 08:46:36
>>909
ここは人力検索サイトじゃない
コマンドプロンプトが起動できるぐらいなら、まず自分で出来る限りのことをやれ

少なくとも
1. コマンドプロンプトの実行結果をきちんと読む
2. sdl.rbが存在するかどうかを確認する
ぐらいはできるだろ?

あときちんとsage
916デフォルトの名無しさん:2008/04/09(水) 10:09:08
html の table を生成するループってどんな風に書くのがいいの?
今こんなんなんだけど
<table><tr>
<% for data.each_with_key{|x, i| %>
<td><% x.name %></td><td><% x.value %></td>
<% if i % 5 == 0 %></tr><tr><% end %>
<% end %>
</tr></table>
917デフォルトの名無しさん:2008/04/09(水) 10:23:03
ERBならそれでいい
HTMLとして読みやすいことが第一
Rubyとしての論理構造を気にするなら最初からRubyで書け(w
918デフォルトの名無しさん:2008/04/09(水) 10:41:30
システムが使ってなくて目立つprefixってなにかありますか?
_myvar =3 は一応通るみたいですが。
919デフォルトの名無しさん:2008/04/09(水) 10:57:16
エディタにハイライトしてもらうといいぞ
背景を黄色にするとか目立って良さげ

いやわりとマジで
目立つかどうかを名前に負わせるのは不条理

マニュアルに「使える文字」が説明されてるからそれから好きなの選べ
ttp://www.ruby-lang.org/ja/man/html/_BBFAB6E7B9BDC2A4.html
920デフォルトの名無しさん:2008/04/09(水) 11:42:24
>>917
縦にデータ並べたいときとか列の数変えるとき便利かと思ったんですけどこのままでいですかね
921デフォルトの名無しさん:2008/04/09(水) 12:53:13
>>946からはそういう目的があるとはあんま読めんな

メソッドにして切り出すとスクリプトとしてもうちょっと明快になる気もするが、
ERBならそのまま記述したほうがおそらく素直
ERB使ってるのにRubyスクリプトとして凝らせるというのは方向性が逆

<table><tr>
<% for data.each_with_key{|x, i| %>
<% data2cell_and_print_sepalater_per_5(x,i) %>
<% end %>
</tr></table>

と書いたとしてもERBとして可読性はあがらない
あとeach_with_keyってなんじゃらほい
922デフォルトの名無しさん:2008/04/09(水) 20:32:25
スレ違いだったらスルーして。
Rubyにredmine入れたんだけど、
英語表記なんだよね。

redmineの設定メニューで
Japaneseにしてるのに英語のまま。

だれか経験したことないですか?
923デフォルトの名無しさん:2008/04/09(水) 22:40:35
rubyの中からシェルの環境変数を設定するにはどうしたらいいですか?
ENVに代入しても、Rubyの中だけでしか有効ではないようです
924デフォルトの名無しさん:2008/04/09(水) 22:56:01
>>923
まあそりゃそうだろ
「自分」が起動したシェルにしか自分が設定した環境変数の効果は及ばない
「他人」が起動したシェルにも設定を及ぼしたいのなら、OSが管理するシェルの起動設定そのものに手を入れるしかない
それはRubyの仕事ではないので、使ってるシェルの設定ファイルとか設定コマンドとかを直接編集すれ
925デフォルトの名無しさん:2008/04/10(木) 00:56:44
>>922

インストール時の rake load_default_data で ja を選んだ?
あと、ユーザごとに表示言語の設定があるので、マイアカウントの設定で日本語を選んで。
926デフォルトの名無しさん:2008/04/10(木) 09:38:38
>>924
Rubyでシェルのコマンド文字列を生成して、シェルのバッククオートを使うとか、
Rubyの中からサブシェルを起動するとか。
927デフォルトの名無しさん:2008/04/10(木) 13:04:18
脱初心者の目安ってありますか?
928デフォルトの名無しさん:2008/04/10(木) 13:08:30
>>926
同じことだろ
929デフォルトの名無しさん:2008/04/10(木) 13:22:56
>>927
Ruby学習者の15段階

レベル0: Rubyを宝石の名前以外に思いつかない
レベル1: 関数的メソッドだけで乗り切る。ドットの意義がわからない
レベル2: 関数的メソッドを自作する。ドットを「〜の」と訳すがオブジェクトはよくわからない
レベル3: クラスを形だけ自作するがinitializeのスペルを間違える。printfをダサいと感じるようになる
レベル4: モジュールを形だけ自作するようになる。RubyをBetterPerlだと吹聴するようになる
レベル5: cgi.rbを読んで絶望する。array.rbを探すがRubyスクリプトとして存在しないことに憤りを覚える
レベル6: 自作のスクリプトを公開するがバージョン0.1.3で放置される。「それRubyでもできますが」が口癖になる
930デフォルトの名無しさん:2008/04/10(木) 13:31:29
うわ間違えた、printfではなくsprintfね
ちなみに
「全てを自作オブジェクトで表現しクラス構造が網の目のようになる」
のレベル7の次くらいで有用性を許容します
931デフォルトの名無しさん:2008/04/10(木) 13:37:31
添付ライブラリのソースを読めるくらいが初心者脱出の目安だと思う…
何やってんだかさっぱりわからん、といううちはまだ初心者ということで
932デフォルトの名無しさん:2008/04/10(木) 14:42:05
optparseを読めないと初心者脱出にならないのか!
933デフォルトの名無しさん:2008/04/10(木) 15:06:39
あれはコメント部分に AA 解説がある時点で危険信号が点ってはいるな
身近なとこで net/ の下くらいでいいんじゃないかとも思う
comlex.rb とかも数学の知識ないと読めねーぞ
934デフォルトの名無しさん:2008/04/10(木) 20:08:47
>>925
それでした。
マイアカントから設定できたんですね。

てっきりsettingからやるのかと思ってました。
935デフォルトの名無しさん:2008/04/11(金) 03:53:51
あるディレクトリの配下を、別のディレクトリの配下に再帰的にコピーしたいです
シェルだと、
cp /path/to/src/* /path/to/dest/
でコピーできますが、これをRubyでやろうとして、
FileUtils.cp_r('/path/to/src/*','/path/to/dest/')
と書くとエラーになります。
うまくコピーするにはどう書いたらいいですか?
936デフォルトの名無しさん:2008/04/11(金) 03:54:38
シェルの場合
cp /path/to/src/* /path/to/dest/ -r
でした
937デフォルトの名無しさん:2008/04/11(金) 04:09:47
ワイルドカードがいらないんじゃないの
938デフォルトの名無しさん:2008/04/11(金) 07:15:27
>>935
FileUtils.cp_r(Dir.glob('/path/to/src/*'),'/path/to/dest/')
939デフォルトの名無しさん:2008/04/11(金) 08:42:10
マニュアルくらい読んどけって話だな
30秒もあれば理解できることだったのに
というか、シェルじゃないのにシェルグロブが利用できると考えるのがそもそもおかし以下略

> FileUtils.cp_r(src, dest, options = {})
> src を dest にコピーします。src がディレクトリであったら再帰的にコピーします。
> その際 dest がディレクトリなら dest/src にコピーします。

> FileUtils.cp_r(list, dir, options = {})
> list[0]、list[1], list[2], ... をディレクトリ dir の中にコピーします。
> list[n] がディレクトリなら再帰的にコピーします。

ということで、ファイルパス文字列かファイルパスが入った配列のどっちかしか受け付けね
940デフォルトの名無しさん
Dir.glob がライブラリの内部で正規表現使って記号を探して
自前でディスクを走査して配列返してるだけってのを知ったときはちょっとショックだった