1 :
デフォルトの名無しさん :
2008/02/22(金) 14:31:31 プログラミング言語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を読め」でいいので、叩かない&怖がらせない。
・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
テンプレ終わり
_,,....,,_ _人人人人人人人人人人人人人人人_ -''":::::::::::::`''> ゆっくりした結果がこれかよ!! < ヽ::::::::::::::::::::: ̄^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 .レ' ( ,ハ /_ / 人! ,.ヘ,)、 )>,、 _____, ,.イ ハ
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 / | ',
< ̄ ̄ ̄>  ̄>/ / / / <___/| |______/ | /  ̄  ̄ \ / ノ \ \ / <●>::::::<●> \ こ、これは乙じゃなくてエナジーボンボンなんだから | /// (__人__) /// | 変な勘違いしないでよね! \ ` ⌒´ / / ̄ ̄ ̄ ̄ ̄ ̄ ̄ \
AA厨うぜえ
12 :
デフォルトの名無しさん :2008/02/22(金) 17:48:57
ifの条件をorで繋げて書いているのですが凄く長くなってしまいます、 途中で改行したいのですがどうしたらいいでしょうか?
orが行末にくるように改行を入れる。 見やすさのためにthenを省略しないようにするといいかも。
15 :
デフォルトの名無しさん :2008/02/22(金) 22:53:02
>>13 ありがとうございます _ _綺麗になりました。
立て続けに質問すみません。
Ruby/Tkで部品(ラベル)を作成しその中のテキストを処理中に複数回変更したのですが、
即時に変更されず、一番最後の変更のみが反映されます。
バッファリングがなされているのかと思い、STDOUT.flashを間に挟んでみたのですが、うまくいきませんでした。
ご助言頂けると嬉しいです _ _
>>15 Thread.start{処理}
ってして見るのはどうか。
matlabから乗り換える言語の候補でrubyを考えてるのですが 行列計算やグラフのplotはRと連携するのでしょうか? Rとの連携ってどこまでできるのでしょうか?
>>17 うむ、Rでできることのほとんどについて、ロクにサポートできないといっていい
というか、matlabから移行する先としては不適当だろ
Rubyは単なる汎用なオブジェクト指向スクリプト言語に過ぎない
matlabとは性質が全然違うと思う octaveなら分かるがw
組込クラスや標準ライブラリに木構造を扱うクラスが無いのはなぜでしょうか
ネタにマジレス(ry
>>17 Python で numpy 使うといいよ
Rushはプログレハード
RubyでJAVACCみたいなパーサ生成 モジュールってありますか? AST扱える奴がいいのでつが
今だと treetop とか。
28 :
デフォルトの名無しさん :2008/02/24(日) 12:01:00
>>26 Racc
Lex なら StringScanner または Ragel
>>28 フォロー。
Raccはyaccみたいなパーサジェネレータだから、ASTは自分で組む必要がある。
30 :
デフォルトの名無しさん :2008/02/24(日) 12:47:04
メール送信をしようと思って、 gemsを見たらメール関連のパッケージがたくさんあります 現在一番使われてるパッケージってどれですか?
…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 テストの知識がないとだめだよ
ソフトウェアテストをRubyでも行うというツールであって、ソフトウェアテストをRubyでも学べるというツールじゃない
タイミング的に
Rubyスクリプティングテクニック ― テスト駆動による日常業務処理術
ttp://www.oreilly.co.jp/books/9784873113562/ これを持ち出して「ただの初心者本であってテスト駆動云々については書いてないじゃん!」とかDisるのがよいぞ
「Rubyで学ぶテスト入門」とかいうのは需要はあると思うんだけどねえ
メソッド間の値の受け渡しのとこにてきとーな値と正しい答えのペアを持ってきて メソッドが正しく動作するか検証するツールだろ
>>33 Rubyを256倍使うための本 極道編
というのがあるこたあるが、2001年というのはこの世界だと古文書だな。
36 :
デフォルトの名無しさん :2008/02/24(日) 16:39:43
>>32 「Ruby Test::Unit」または「RSpec」でぐぐれ
>>29 >Raccはyaccみたいなパーサジェネレータだから、ASTは自分で組む必要がある。
kwsk
>>37 BNFとか書けばASTを完璧に組み上げる
パーサを生成してくれるわけじゃないという意味。
(というかそこまで出来たらコンパイラコンパイラ名乗って
いい気がする)
構文解析である文法規則に還元されたときの
処理は自分で書かないといけない。
>>40 それは Racc の説明であって JavaCC ではないという理解で OK?
もしそうなら、JavaCC はASTを自動で作ってくれるの?
42 :
40 :2008/02/25(月) 00:53:05
ぉk。
JavaCCのことはさっぱり。
ただ
>>26 の要求にRaccは微妙かなと思って。
class Foo class <<self end end これの2行目の意味が良く分からないんですが・・・
すいません、クイッククエスチョン。 特異メソッドは特異クラスのサブクラスに継承されるけど クラスインスタンス変数は継承されないよね?あってる?
rhtmlファイルでシンタックスエラーがあるみたいなんですが、どこがエラーか分かりません。 調べる方法があればおしえてください。
47 :
デフォルトの名無しさん :2008/02/25(月) 11:52:29
ppよりもっとディープなインスペクション(そのインスタンスの メソッドやプロパティーのリストまで表示したり)をするには どうしたらいいですか?
>>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>
>>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"]
#:nodoc: とか #.nodoc: ってなに?
ドキュメントなんか書くものか!というRubyistの強い意志
ハッシュを使い回すのではなく、俺用データのクラスを作ろうと思いました def initialize の中で、インスタンス変数を @hoge=nil @hage=nil @fuga=nil ... と15個くらい書いてるんだけど、initializeの時点でnil入れておくって無意味だよね?
@hogeの使途が分からない俺たちにとってnilを入れておく事に意味が有るか無いかは判断できない @ary = [] @ary.each{|e| p e} ってやれば何も出力されないけど @ary = nil @ary.each{|e| p e} ってやるとnilでっせって怒られる いきなり @ary.each{|e| p e} ってやると@aryなんて知りまへんでって怒られる 俺は1番目を良く使うけどね
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} => []
>>54 >いきなり
>@ary.each{|e| p e}
>ってやると@aryなんて知りまへんでって怒られる
インスタンス変数でなくローカル変数の場合はその通りなのだが
未初期化のインスタンス変数を参照した場合は nil となるはず
>>53 上記のことを踏まえての質問ということでおk?
やってもやらなくてもnilが入っているという意味ではその通りかも知れないが
クラスで用いるインスタンス変数を明示的に示しておくという意味では無意味ではないと思う
>>55 インスタンス変数は「定義」しなくてもnilだってのは忘れられがちだよな
インスタンス変数の「定義」をinitializeでする意味はRuby的にはあまりないと思う
厳密にはメソッドが追加されるからただの定義ではないけど attr_reader とか
外部からアクセスされるなら直後のattrに名前が出るし 外部からアクセスされないインスタンス変数って一体 あ、サブクラスからアクセスしたいか
>>60 外部からアクセスされないインスタンス変数はあっても全然おかしくないと思う
むしろすべての実装を外部からアクセスできるように公開する方がまずいのでは
インスタンス変数は外部からアクセスしたいときにのみおもむろに使え、ということなのでは それ以外ではメソッド引数とかで細々とやれと
Rubyのスコープはちょっといろんな言語と違うからね a = 100 def foo() return 1 + a end foo() とすると何がかえってくると思う?aが定義してないってエラーになるんだぜ
こういうときはaを@aに変えるのが定石
>>63 そもそもの問題として、メソッド定義の中以外にローカル変数なんて置くなよ…
トップレベルに定義したメソッドなんだろ トップレベルのローカル変数は特別扱いしてくれてもいいような気もするけどな
でもnilの特別扱いは要らない…
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行目はダメっていう挙動が理解できないんだが・・・
>>68 *arrの「うしろ」に置けないだけ
先頭に書けないんじゃなくて、展開後にも何かがあると文法エラー
irb> a = [1, 2, 3]
[1, 2, 3]
irb> [9, 8, *a, 7]
SyntaxError: compile error
ていうか、もしかして *array を「arrayの要素をバラす表現」とかいう理解をしてる?
1.9なら通るよ
自作プログラムをクラスごとにファイルに分けると20ファイルくらいになる 「ああ、実行するたびに20回もHDDにアクセスしてるんだ」と考えると憂鬱になる ということで開発用ディレクトリと実行用ディレクトリを分けた 実行用ディレクトリには開発用ディレクトリにあるスクリプトを連結したものを入れてる これならファイルアクセスの回数は数回で済む いや標準添付のクラスとかrequireしてる時点で何個もファイル読み込みまくってるのはわかってんだけど
時間が問題だと思ってる?
76 :
75 :2008/02/26(火) 22:17:55
ディスクアクセスが無意味に多いのが心情的に嫌なのだろう そう感じるセンスそのものは悪くはない
無意味に多いのかそれは、とか 全部動かさずにユニットテストしろよ、とか
要するにプリコンパイルヘッダーが必要ということか?
C++ とかやると、コンパイル時にいくつヘッダ読んでるかなんて 全く気にならなくなるZE
コンパイル時(
>>72 の例だと開発中)はどうでもいいんだが、実行時に、というのが心情的に気持ち悪いという話だろう。
なら、コンパイル系の言語を使えばいいんじゃまいか?
そんな読み込み程度を気にするのがいかにも初心者だな
Ruby使いはお茶でも飲んでまたーりするがよい わっはっはっは
>>84 そうか?
「それ自身は事実だから好きにせえ」以外の必死な否定論が出ることのほうがよっぽど初心者だと思うが…
ところでCが書けないRuby書きはニワカだと思いますがどうですか。
I/O を工夫することはパフォーマンスチューニングでは基本事項。 もとの環境や条件が不明だけど、CGIのようにリクエストのたびにプロセスを 実行しなきゃいけない場合は、読み込み速度を工夫するのは別におかしな話ではない。 ファイルサイズが小さくても、ファイルの数が多ければハードディスクのシークタイムは バカにならない。 ただ、ファイルを連結しても断片化してたら効果は少ないから、デフラグを ちゃんとやってやる必要があるけど。
もうそんな時代でもないんだけどな
>>89 ストレージへのアクセスが問題にならないコンピュータができたならぜひ教えてくれ
というか最近の子は「HDDがガリガリ言う」とか気にしないもんかね
静音化されて意識しなくなったんだろうか
HDDはアクセスすると壊れるからなあ いや、こんなんで壊れる確率がはっきり増えるHDDってのもかなりアレだが… とりあえず 「クラス単位の細切れファイルをインストール時に数個にまとめとく」 というのは別に非難されるようなことじゃないと思うぞ というかそんなにまでして行為そのものを否定する理由を知りたい
ガリガリ言うほどのアクセスを問題にしてるのか? そもそもそんなこと言ってたらRubyなんて選択肢にならんだろ
93 :
デフォルトの名無しさん :2008/02/27(水) 12:32:34
鈍足のRubyを使う人は達観した境地にあるので小さいことは気にしない
正直、完全に論点がずれてるような気がしてならない。 元発言は、無駄を嫌うというプログラマの美徳を発揮してるだけじゃないの?
チューンナップを突き詰めるとRuby使うなになるからおすすめしない
Railsみたいな糞のかたまりで遊ぶのがRubyistだからな
Railsのナカミを喜んでる人は少数だと思う Railsは開けないほうがよい箱だ あくまで外部から自分のために便利に使うシステム
これが SyntaxError になるんだけど何故でしょうか? def foo?; end def bar?; end case when not foo? when not bar? end
>>94 まぁ、美意識の問題だわな。
そしてそれは、そんな変なエネルギーってわけではない。
>>98 notだから。
case
when (not foo?)
when (not bar?)
end
か
case
when ! foo?
when ! bar?
end
なら期待通りに動く
102 :
デフォルトの名無しさん :2008/02/27(水) 18:42:53
[標準出力へのフックを仕込む] 標準出力に出力 標準出力に出力 標準出力に出力 [標準出力に書き出した内容をメールで送信] ってやりたいんですが、 どうやったら出来ますか?
出力時にスコープの広い変数に文字列を追加保存しとけばいいじゃん?
104 :
98 :2008/02/27(水) 19:02:54
>>100 ,
>>101 なるほど。
てっきり「not foo?」は「式」かと思っていたんですが、「文」なんですね。
了解しました。深いっす。
105 :
デフォルトの名無しさん :2008/02/27(水) 19:12:13
phpでいうis_array()はどうやればいいですか? rubyは配列もあるしハッシュもあるし、自分でコレクションも作れるしで どう判定していいのか分かりません(?o?)
107 :
デフォルトの名無しさん :2008/02/27(水) 19:30:43
>>106 ありがとうございます
試してみたところ、PHPとは異なり、
ハッシュと配列は明確に区別されているようですね
ハッシュ.is_a Array → false
配列.is_a Hash → false
オブジェクト、実際的には変数、が配列かどうかを調べなければならないコードというのはRubyではかなり異常 極力他のアプローチを取るようにしたほうがいい
case arg when Array when Hash とかよくやるじゃん
そうですか(><) YAMLで書いた設定ファイルを読んで 該当キーをeachで回すようにしてるんですが、 キーを省略した時にはnilになりますよね。 nilをeachしたらエラーになるので、eachできるかどうかを調べてから eachしたいのですが、 こういう場合はruby的にはどう書くものですか?
>>110 ・ 変数がnilかどうかを事前にif文で比較して弾く
・ eachでnilが例外エラーを起こしたらその例外をキャッチする
どっちか好きなほう使え
def hoge(foo, bar) raise ArgumentError unless foo.is_a?(String) raise ArgumentError unless foo.is_a?(Array) ・ ・ ・ end とかメソッドの最初でモリモリやっちゃうのはだめ?
>>112 わりと下品。
まあ、それ以上でもそれ以下でもない程度かと。
コレを無くすために悩む時間がえらい長引くってんならあっても仕方ないんじゃね。おいおい考え変えていけばいいかと。
そのクラスやメソッドに本当にそんなクラスのインスタンスが指定されることがあるのか? をよく考えるといい。
標準添付で「結果の数によってStringあるいはArrayが返ります」とかいうメソッドがあるかい?
…そういえばなんか添付モジュールで複数のクラスが返ってくる可能性のあるやつあった気がするがまあいいや。
「Stringが来たときはHashに変換しよう」とかいうのも同様。Stringなんか渡してくる奴が悪い、で桶。
raaやgemで公開して育てる気マンマンでちまちまフールプルーフさいこー、という場合はあったほうがいいのかも。
日本語がよくわからない
>>102 require 'stringio'
# 標準出力へのフックを仕込む
$stdout = StringIO.new
# 標準出力に出力
puts '未承諾広告'
puts 'こんにちは^^)'
#
# 標準出力に書き出した内容を
$stdout.rewind
text = $stdout.read
メールで送信(text)
>>110 eachに反応するときだけeachしたいなら、
respond_to? :each する。
と思ったことが私にもありました。
なんでStringがeach持ってるんだよ……(1.8での話)
>>116 標準出力をフックしたいとか言う元の要件自体が邪悪なだけだ(w
使い方自体は巻き戻せるIOの正しい使い方
$stderrに仕込んでおくとwarnの出力をロギングできるぞ
warn使ってる人ってあんまり見ないけどな
>>117 eachの中でArrayやHashという構造べったりの処理をするからあまり意味がなかったり…
STDOUTに元の残ってるし、 writeメソッドがないとTypeErrorだし、 邪悪っていうにはおとなしい希ガス。 バッドノウハウなのは確かだけど。
>>118 >標準出力をフックしたいとか言う元の要件自体が邪悪なだけだ(w
そんなことないだろ
なんで邪悪なのか説明してみな
Herokuってどうよ
なんでパイプしてその先でメールするんだと 駄目なんだろ。
>>122 それだけじゃわかんね。固定してたらなぜだめなの?
125 :
デフォルトの名無しさん :2008/02/28(木) 13:16:13
標準出力をフックしたい⇒出力先が固定 意味不明だな。
なんかのはずみで標準出力に出るようなものも全部キャプチャしたいなら すなおに別プロセスで読み出せ
こんなもんでいいんじゃね 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 思い切り誤爆してきた。。。
>>126 なんで別プロセスにするのがいいの?
$stdout = StringIO .new
だとなんか問題あるの?
バカとしか言えない
>>129 はバカでよい
是正させる気も無いようだしただの害悪だな
Rubyに限ることではありませんが、 httpでpostするデータが大きくてメモリ不足になるとき どうやって回避するのがよいのでしょうか? Net::HTTP.start(host) {|http| r = http.post(path, data, header) } という感じでpostするときdataが大きすぎる場合に備えて 小出しに分けて送ることってできませんか?
>>131 だったら最初からそう書けよ
おまえの書き方だと $stdout を変更するのがすべて悪いみたいじゃないか
>>130 バカはおまえだろ
>>132 サーバ側の話? それともクライアント側の話?
サーバ側の話なら、cgi.rbを使わず自前でHTTPを解析する必要がある。
クライアントの話なら、dataをファイルに保存しておいて、例えば10MBずつ読み込んで送信を繰り返せばいいんじゃね?
>>133 =129
あきらめろ、幾ら頑張ってもお前の
>>129 は「馬鹿じゃない」と解釈する余地が無い。
>>134 クライアントです。
分けるといっても複数のpostを一連の1つのpostと
認識させるにはどうしたらいいんでしょうか…
>>135 >>137 チャンク形式っていうんでしょうか?
で、body_streamを使えばヘッダとか気にしなくていい
ってことでよいでしょうか?
>>132 のdataの内容を一旦 data.txt に書き出しておいて、
あとは
>>135 の例のchunkedを使うようにするとできたっぽいですが、
一時ファイルを使わないようにできないでしょうか?
RubyにあるモジュールはCGIやHTTPの知識の必要性を良くも悪くも隠蔽しない その知識のまま進むのは危険だ HTTPやCGIの勉強をすることを勧めるよ
curlコマンド使うのが一番楽やねん
「年・月・日」ではなく「年・月」の2つしかないデータがあるんだけど、 これを格納するデータオブジェクトって何がいいかな? いや、年月日が揃ってるデータと「年・月」が同じかどうかという比較をするんよ 年月日ならDateオブジェクトなんだけど、日をどうしようかなあと
>>142 ・ 「どうせ参照されないからいいじゃん?」とか年金式にdayを1に固定してDateを使う
・ [year, month] という配列に入れておく
・ Dateを継承した「dayが無指定でも動く」という新しいDateを作る
・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] になって欲しいのですが…。 どこが間違っているのでしょうか?
data["hoge"] #=> [ {"moge"=>["poge", "page"]} ] つまり "moge"=>["poge", "page"] という(キーが一つの)ハッシュを一つ持つ配列 mogeをリストにせずにインデントで階層にすれば data["hoge"] #=> {"moge"=>["poge", "page"]} になる
>>145 data['hoge'].each {|hash| hash.each {|key,val| p key, val}}
>>146-147 ありがとうございました
YAMLのマッピングの記述を勘違いしていたようです
なんか最近思うんだけどさ ここ「初心者」スレだよな・・・ 素直に本家行けば?って人ばっかりじゃね?
本スレはMatzと愉快な仲間たちについて あれこれ語るスレであって、プログラムを語るスレではないのです …あれ? じゃあ板違いじゃない?
「Rubyの初心者」のスレでしょ? プログラミング自体の初心者じゃないといけないの?
>>149 が考えるところの「本スレ」のレベルに依存するな
あんなS/Nの小さいスレ 使ってられねーよ
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 なんで?
unionすると /(1|2|3)/ になるのではなく /(1)|(2)|(3)/ になって、 今回マッチしたのは(2)のとこだからグループとしては$2。 $1ではない。
>>156 をを
…正規表現をコンマで並べても用が済むcaseでunionを使うのはめんどくさいっすな
158 :
デフォルトの名無しさん :2008/03/01(土) 21:37:16
ないっす いわゆるエンコーディングの名称・略称を表示するようにはできてない 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
net/httpで相手サーバがタイムアウトした場合の例外をキャッチしたいんだけど、 具体的に何の例外が発生するんですか? というか、そのへんの情報ってどっかにまとまってませんか?
手元の俺スクリプトの例 rescue Net::ProtoRetriableError,Net::ProtoFatalError,Net::ProtoServerError,Errno::ETIMEDOUT,TimeoutError =>ex puts 'サーバーから応答がないので空データを使います' return '' 正直、ドレが効いてるんだかよくわからん
net/protocol.rbを見ると、ソケット生成(接続)や読み書きは timeoutメソッドの中でやってるのでTimeout::Errorかな。 TimeoutErrorはこれの後方互換用。
http.getに該当する部分から飛び出す例外を全部捕捉して 「よくわからんけど鯖がエラー返しましたエラー」にすれば桶 begin res = open(uri).read rescue puts "#{uri.host}のサーバかそこへのアクセスで何かエラーです" res = '' end 実際問題としてサーバー側の原因以外の例外はここでは起こらんわけだし Timeoutだけ補足してもProtoServerErrorの500系エラーはスルーされるぞ 500系エラーって新幹線みたいだな
Timeout::ErrorはStandardErrorのサブクラスではないので、 引数なしのrescueでは捕まらんのだわ。
Errno::ETIMEDOUT って何?
タイムアウトした(Timed Out)というエラー。
ネット系はErrno::ECONNABORTEDとかErrno::ECONNRESETみたいなのも飛んでくるし、 例外をキャッチしても、それ以降の接続はなにやっても失敗したりするので悩ましい
>>167 システムコールが返すタイムアウト
Timeout::Error → 「相手のWebサーバからHTTPの返事が返ってこない」
Errno::ETIMEOUT → 「Webサーバ以外の色々から返事が来ないタイムアウト」
と思って桶
そもそもサーバが見つからないとかそういうの。たぶん
>>169 retryはたいてい成功しないよね
return @hoge = kekka と @hoge = kekka return kekka と @hoge = kekka return @hoge ってどれが一般的かな
@hoge = kekka
@hoge = kekka return
>>171 returnを使いたくて仕方ないのなら2番目でよろしく
1番目はなんか見てて不安だ
win環境で、一番簡単に ファイルのオープンダイアログを表示するには どうすればいいでしょうか もろもろインストールの必要を最小限にしたかったりもします。
require 'win32ole' d = WIN32OLE.new("MSComDlg.CommonDialog") d.maxFileSize = 256 d.showOpen p d.fileName
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) }
書き込みの場合は、アンロックする前に flushしないと、アンロックした後に書き込みが行われる場合がある みたいな事を言っている方がいたので、その辺の問題のせいでしょうか… File.open('data.dat', 'w'){|file| file.flock(File::LOCK_EX) file.write(data) file.flush file.flock(File::LOCK_UN) } とかなのかな??
175です。早速にレス感謝です。
>>176 を試みてみまして
WIN32OLERuntimeError
に悩まされております・・・
もうちょっとWIN32OLE研究してみます。
>>176 はOS側の環境依存の度合いが大きいよ
インストールしたRubyの種類に依存する
>>177 と好きなほう選べ
# RDEで以下のようなスクリプトを実行します puts '文字を打ってくれ' s = gets puts s + 'と打ったのだね' #すると画面左下の実行画面が表示される部分に'文字を打ってくれ'と表示される前に #文字を入力するように求められます(文字を打たないと'文字を打ってくれ'と出ない) ヒントだけでいいのでご享受ください。RDEとかいう開発環境なんか捨てた方がいいのでしょうか?
getsの前に$stdout.flushしたらうまくいったりする?
STDOUT.sync = trueな予感
187 :
184 :2008/03/03(月) 01:03:01
STDOUT.sync = true を使うことで
RDEでgetsが実行される前の文字が表示されるようになりました($stdout.flushではだめでした)
ありがとうございました!
>>185 >>186
>>182 これはどうかな?
tk環境が要るけど。
require "tk"
#rootを非表示にする
root=TkRoot.new.withdraw
types = [
["Ruby" , ".rb"],
["All Files", "*" ]
]
path = Tk::getOpenFile(:filetypes=>types, :defaultextension=>".rb")
p path
「あまり別途インストールしたくない」という要求に対してWin32OLEやVisualuRubyが既に出てるのに わざわざRuby/Tkで同じ標準ファイルオープンダイアログを出す根性に感服した
宿題スレとか一部で流行ってるからな >Ruby/tk
>>178 flock関数を使わずに、自前でロック処理を作るとか
「自前」は迷宮への入り口の罠 何か有るはず。 俺はしらないけど^^;
わざわざ関数って言い換えてる奴は同一人物か? File.flockより堅固なファイルロックを自前で作れる奴なら悩んだりしないだろ ファイルロックの失敗によってファイルが破損しているのだということを確かめる必要があると思われ
>>187 実際の実行では不要なんだけどね
RDEの時だけ必要
日本語にマッチする正規表現はどのように書きますか。 文字コードはUTF8またはEUC-JPです。
それはあれだ、スクリプトがUTF-8だけどEUC-JPの日本語文字にマッチする正規表現を書きたいとかそういう引っかけ問題か(w
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
ジス イズ ア ペン。
>>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)
}
…のようにすればいいんじゃないかな。
>>197 Kconv::RegexpEucjp と Kconv::RegexpUtf8 だな
いわゆる全角文字と半角カタカナだけ欲しい場合は [\x00-\x7f] だけの行を消すといい
irb> puts 'aa康1アアア1煕表示字典ねdこd'.scan(/(?:\x8e[\xa1-\xdf]|\x8f[\xa1-\xdf][\xa1-\xfe]|[\xa1-\xdf][\xa1-\xfe])+/n)
康
アアア
煕表示字典ね
こ
201 :
178 :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)
}
どうして atomic な方のディレクトリロックを使わないん?
203 :
ルファー ◆XSlQ/Lfer. :2008/03/04(火) 12:48:34
205 :
ルファー ◆XSlQ/Lfer. :2008/03/04(火) 13:11:44
>>204 あぁ、解決しました。ありがとうございます。
うわあ…
1レスで解決したならそれはそれでいいじゃん
標準添付のWeb::Agentって使ってる人いる?
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)
どこにあるクラス?
Noraは標準添付ではない。
211 :
デフォルトの名無しさん :2008/03/06(木) 06:35:30
例えばCで定義された以下の様な構造体があって その構造体のデータが格納されたデータファイルを 1レコードずつRubyスクリプトで読み込む時に struct Record{ char n, int a, int b; }; 以下の様な、なんだか非効率な方法しか分かりません… とりあえず、一括してreadして、あとで上手くunpackで切り分けとか出来ないでしょうか? File.open('data.dat', 'rb'){|f| while !f.eof? n = f.read(1) a = f.read(4) b = f.read(4) data.push(n.unpack('L')[0].to_s + ',' + a.unpack('S')[0].to_s + ',' + b.unpack('L')[0].to_s) end }
212 :
211 :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)
>>211 # char n の後ろに3バイトのパディングがあると仮定して
data << f.read(12).unpack('cxxxii').join(',')
214 :
211 :2008/03/06(木) 11:22:00
>>213 あ、レスどうも。
一応以下みたいなコードでだいぶマシになりました。
あとはループ展開するとかで、どうにか納得いく速度が出せそうです。
tmp = ''
data = []
File.open('data.dat', 'rb'){|f| data = f.read }
(tmp.size / 9).times{
(n, a, b) = tmp[p, 9].unpack('LSL')
p += 9
data.push(n + ',' + v + ',' + b)
}
215 :
211 :2008/03/06(木) 11:23:35
× (n, a, b) = tmp[p, 9].unpack('LSL') ○ (n, a, b) = tmp[p, 9].unpack('cii')
見てるこっちが切なくなるやりとりだな・・・
217 :
デフォルトの名無しさん :2008/03/06(木) 12:51:12
pで表示すると、 "hoge" とカッコ付きで表示されます。 hoge とカッコなしで表示するにはどうしたらいいですか?
print
え?pってprintの略じゃなかったんですか…
220 :
211 :2008/03/06(木) 13:15:50
>>216 何かもっと良い方法があればご教示下さい><
>>219 そういう解説をしてるサイトか書籍があったら即晒せ
222 :
211 :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(',')) } }
効率といっても速度なのかメモリフットプリントなのかコードサイズなのか
data = f.read.enum_for(:scan, /.{9}/m).map {|x| x.unpack('cii').join(',') }
あと、
>>213 が書いてるけど、パディングは考慮してある?
処理系によっては#pragma packeとか
224 :
211 :2008/03/07(金) 03:39:45
>>223 効率は速度です><
>パディングは考慮してある?
ちょっと説明の仕方が悪かったです…
要するに、[1][4][4] の各バイトのデータの並びという事です(バディングは考慮する必要はないです)
変な説明をしてすみませんでした!><
>>217 ダブルクォートをカッコと呼ぶやつは初めて見た。
カッコ悪い呼び方だよな
審議中AAry
Float のメソッドで、 「0 から遠い方に丸める(切上げ)メソッドはありません。」 のはなんでだろう? truncate (to_i) との対称性から、あってもバチは当たらないと思うんだけど。 やっぱ名前?
【審議チュウ】 (⌒ー⌒) (⌒ー⌒) (⌒-⌒)´・ω)(・ω・`(⌒ー⌒) ( ´・ω ー⌒)(⌒ー⌒)ω・` ) | 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'
なんだかわからんがなごんだ
ショッピングカートを作っています。 session["cart"]=Hash.new session["cart"][@itemid]=@amount のような形でsession["cart"]にハッシュを詰め込みたいのですが、 sessionにハッシュを詰め込むことは無理なのでしょうか? また、無理であればto_aで配列に変換して詰め込もうと思うのですが、 元に戻すとき、 @tempSession=Hash[*session["cart"].flatten] と、WEBの公式マニュアル(ハッシュの項)にあるようにやっても うまくいきません…。 どなたかご教授いただければ幸いです。
なお、使っている鯖はlolipopで、Rubyバージョンは1.8.2です。 よろしくお願いいたします。
>>231 デフォルトだと文字列しか格納できない。
任意のオブジェクトを格納するには CGI::Session::PStore を使う。
require 'cgi/sesion/pstore'
session = CGI::Session.new(cgi, 'database_manager'=>CGI::Session::PStore)
session[key] = Hash.new
>>233 さん
書き込み後、文字列→配列へ変換→処理→文字列へ返還でできましたが、
やはりコードが汚くなったので悩んでいました。
PStoreについて勉強してみようと思います。
これで悩みが解決しそうです。ありがとうございました!
>>234 JSON や YAML の文字列に変換するという手もある。
「文字列→配列へ変換→処理→文字列」と似たようなシロモノ紹介してどうする
はあ?YAMLやJSON使うなら手軽だしコードが汚くなることもないじゃん。 ちゃんとメリットあるものを紹介してなにが悪いの?
net/httpについての質問です。 対象ページの[keywords][description]を取得したいのですが http.getで返ったボディを正規表現で抜き出す以外によい方法はないでしょうか? 宜しくお願いします。
>>237 236じゃないが、
突っ込む前と取り出した後に処理がいらうってとこの
面倒くささは大して変わらないじゃん。
CGI::Session::YAMLStoreとかをこさえて使うなら
アリだろうけど。
>>238 [keywords][description] というのが何を指してるのかイマイチよーわからんが
<meta name="keywords" content="Ruby,初心者,プログラミング" />
<meta name="description" content="プログラミング言語Rubyの初心者が集うスレです。" />
というようなののことを指してるのだと勝手に解釈
特定のページのkeywordsとdescriptionの2つにしか興味がないというのなら、
特定のページ専用の正規表現で最初にマッチする文字列を抜き出すのが素直だし時間もかからない
どんなページのどんな変態HTMLが来るのかわからないというのなら、HpricotとかのHTMLパーサを使うといい
>>240 レスありがとうございます。
おとなしく正規表現で取得しようと思います。
242 :
デフォルトの名無しさん :2008/03/08(土) 19:52:15
変数名を代入した変数を使って新しい変数を作るにはどうしたらいいですか? PHPで言う$$var = 'value' みたいなことをしたいのです
そんな曲芸みたいな処理は本当に必要なのか?
インスタンス変数なら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とは限らない。 影響を受ける変数とそうでない変数との違いがいまいち分からん・・・。
え、単なる変数のスコープの問題なんじゃないん?
247 :
デフォルトの名無しさん :2008/03/08(土) 23:19:54
え、そうなん? ちょっと考えてみる。。。
248 :
デフォルトの名無しさん :2008/03/09(日) 00:09:29
あ、ブロックの問題か。 他のスレッドの影響を受けるような物って、どうやって作るんだ。 あれあれ。
リファレンスの例がそのまま分かりやすいと思うけど for i in 1..5 # スレッド内のiが書き換わる可能性がある # Thread.start { p i } # スレッド固有のローカル変数になる Thread.start(i) {|t| p t } end
250 :
デフォルトの名無しさん :2008/03/09(日) 01:04:04
それはブロックの問題にならないのか。。 #1 foo = 1 Thread.new{ foo +=10 } ってのと #2 for i in 1..5 Thread.new{ p i } end って両方ともスコープの問題なように思えてしまいます。 #2は他スレッドの影響で i の値が変わるのではなく、外側のスコープの i が変わっているから変わってくるのでは? #それともそういうつもりで書かれたんですかね。
251 :
デフォルトの名無しさん :2008/03/09(日) 01:25:56
ThreadのMutexの使いどころって言うのは、 1同じスコープを共有している 2同時に実行されている処理がある 1、2が当てはまる場合で、かつ2の両者が同じ変数をアクセスする際に Mutexは使うべきなんだと思うんですが、スレッドの処理がまるまるメソッド化 されている場合はそもそも1が当てはまらないから、Mutexは必要ない って認識でOKですか? #ex. i=0 th = [] def thread_run puts i end 1000.times{ th.push Tread.new{ thread_run } } while true i += 1 puts i end
252 :
250 :2008/03/09(日) 01:30:13
いや、やっぱ for i in 1..5 Thread.new{ p i } end は他スレッドの影響を受けているのか。 そう公式リファに書いてあるもんなw 他スレッドの影響で i が書き変わって、 かつ、i はブロックの外側のスコープだから 影響を受けてしまうっちゅーことか。
スレッド生成した直後にスレッドの処理が終了するようなテストじゃ よそのスレッドの影響受けてるかどうかもわからんだろ for i in 1..5 Thread.start(i) {|n| sleep(n) ; puts 'i = %d : n = %d'%[i,n] } end
「特定のWebサイトにある特定の動的HTMLを取得して解析してデータを蓄積・別途表示するよスクリプト」 というありがちなものを頑張って作ってます で、最近微妙にスレでも話題なRSpecとか使ってテストとかしようと思ったんですが、 「Webサイトに接続してHTMLを取得するかわりにローカルのHTMLファイルを読み込ませたい」です 定番の書き方とか方法とか考え方とかありますか
>>255 でも文字列への埋め込みよりは論理的にも見える
ていうか指示子覚えちゃったら結構どっちもどっちだよね
>>254 とりあえず
「アクセス用URIを作るクラス」
「URIを引数で受け取ってHTMLを取得しそのまま返すクラス」
「HTMLを引数で受け取って解析しデータ構造にして返すクラス」
「データを引数で受け取ってDBとかに保存するクラス」
とか細かく分けるんだ
>>253 がそうかは知らないけど
Python 使ってると Ruby でもそう書きたくなる
5.times じゃなくて for i in 1..5 してるのもそれっぽいと感じた
関数のカッコも省略してないし
259 :
デフォルトの名無しさん :2008/03/09(日) 18:57:30
Rubyのライブラリリファレンス本て結構いい値段するけど ネットで見れるマニュアルに比べてのアドバンテージって何ですか? 検索も出来ないし、買う意味あるのかなーと思うんですが。
結局はwindowsのHTMLヘルプが一番いいね
>>259 金光編のなら、持ってますが、買う価値ないです。
>>259 ・ まじめな意味でお布施
・ オンラインヘルプの利用ができない環境向け
・ 安くない本を買ったんだからと自分を追い込む用
return self (returnなしでも桶)の効用がわかった気がする
半年前の自分のスクリプトはいい意味でも悪い意味でも読めないよね Perlでの妙な凝りっぷりほどじゃないけどさ
ちょっと聞きたいんだけど、 irb(main):001:0> require "kconv" => true irb(main):002:0> puts "シーソーゲーム".kconv(Kconv::UTF8, Kconv::SJIS).kconv(Kconv::SJIS, Kconv::UTF8) シーメ[ゲーム => nil ってやると元通りのものが帰ってきてくれないのはなんでなんだぜ?
rubyのバージョンとかは?
バージョンあんま関係ないと思うぞ 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"
それ単純に$KCODEが適切じゃないだけだと思う puts "シーソーゲーム"でもシーメ[ゲームって出力されるだろ多分
$KCODEのデフォルトは日本語環境のWndowsであろうが、NONE
>>266 ruby 1.8.6 (2007-09-24 patchlevel 111) [i386-mswin32]
>>268 ぬぉほんとだ
勉強不足だったみたいだ 調べてくるありがとー
すまんもーいっこ聞きたいんだけど、ある変数ではSJISで、ある変数ではUTF8で持つとかってできないの? test = "シーソー" puts test.kconv(Kconv::UTF8, Kconv::SJIS) で、ruby -Ks hoge.rb とかすると意図した通りUTF8で"シーソー"って出てくるけど、$KCODE = "SJIS"とかだとうまく動いてくれんのだが… 2種混在とか無理なのか?
>>271 できるよ
というかStringオブジェクト自体には文字コードの情報は付記されてない
内容を表示したり正規表現にマッチさせたりするときに利用メソッド側で改めて調べてる
>>272 そうなのかー
リファレンス見ると、KCODEが影響するのは
* インタプリタの字句解析器 etc
って書いてあるけど、これって例えば
test = "シーソー"
の "シーソー" を評価するときにKCODEを元に評価してtestに代入するってこと?
つか
$KCODE = "SJIS"
test = "シーソー"
puts test
ってやっても文字化けるのが納得いかん
irbとかでやると化けずにでるのも意味がわからん…
#!ruby -Ks test = "シーソー" puts test
>>274 それでちゃんとできるのは知ってる
$KCODEだとできたりできなかったりするのが不思議な昨今です
>>273 あ、悪い、$KCODEについては誤解がけっこう蔓延してる
$KCODE='s'はRubyスクリプトだから、これが解釈されるということは既に実行済みってことでそのファイルについては手遅れなんだ
(それ以降にrequireとかで読み込んだファイルは$KCODEにしたがって解釈してくれる)
スクリプトの先頭からShift_JISだと認識した上で読み込んで実行してくれないと困るので、普通は-Ksを使う
Windows版Rubyでも、 1行目に
#!ruby -Ks
とか適当に書いておくだけで、スクリプト解釈前(構文木生成前)に適当に解釈してくれる
スクリプトを読み込む
↓ -Ks の出番
スクリプトを解釈する
↓
プログラムを実行する
↓ $KCODE='s' の出番
スクリプト中に書き込まれた日本語文字列に駄目文字がなければ
$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であった場合に文字列中の「表」などの処理が
> 適切に行われないことになります。
require したファイルの名前って一覧できますか。
>>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"]
>>278 $" ($LOADED_FEATURES)
>>279 ,280
さんくすです
もいっこ質問。
PHPとRubyとで、Webアプリのセッション情報を共有することはできますか。
>>281 テキストでファイルに保存あるいはテキストベースで遣り取り可能ならできんじゃね
memcachedとかでもイケそう。
セッション情報って別に形式決まってないよな
>>276 そうなのかー
$KCODE = "SJIS"を読んだ時点で設定が変更されんのかと思った
つーことはファイル毎に文字コードの設定が可能ちぅことか
>>277 ソースまで発掘してもらって申し訳ねぇ
でも2行目でやればいいってのはなんでなんだろう?
Rubyってインタプリタなんじゃないの?
読み込んだ片端から逐次実行なんじゃないの?
わかんねー
1. -Kオプションを解釈 2. パース 3. 実行 ソース中の「表」とかが問題になるのは2の時点、 $KCODEへの代入が実行される3の時点では手遅れ
>>286-287 全部一旦構文木にしてから実行すんのか?
Rubyって前方宣言じゃなかったっけ?
前方宣言だよなぁ→読み込み即実行だよなぁ→$KCODEに値代入した時点で即有効になる気がするよなぁ
っていう発想なんだが…
宣言してるというより実行時に作り上げてるだけ
なんか勝手な前提で色々考えてる感があるが… $KCODE = "SJIS" ↑これだって単なる代入式なんだから実行されるまで作用しないだろ。 前方宣言どころかクラス定義やメソッド定義まで実行文だぞ。
291 :
デフォルトの名無しさん :2008/03/10(月) 06:51:16
配列自体をeachで変更したいのですが、どうしたらいいですか? 破壊的メソッドは!を付けるので each!とかやってみたのですが駄目でした
>>291 要素数が同じでいいなら普通はmap!やcollect!を使う
irb> arr = [1,2,3]
irb> arr.map!{|e| e*2}
irb> p arr
[2, 4, 6]
mapでの写像を覚えるとRubyコードのステキ度が100単位でアップするので超お勧め 「配列の要素をひとつずつ取り出して計算してひとつずつ格納する」から 「ある配列にブロックを作用させてもうひとつの配列を作る」という思考と記述が自然に行えるだけで超絶パラダイム 昨日までの小学生レベルのプログラムの勉強とはオサラバよオ・サ・ラ・バ
WinXPで音声編集をできるライブラリがあったら教えてください。 RAAを見た限りではなさそうですが。 1. 1秒以上の無音部分で音声ファイル分割 2. file1とfile2を、間に1秒無音部を入れて結合 というような事をやりたいです。
流れをぶった切ってスマソ
ww二重書き込みスマソ MySQL を Ruby DBI モジュール で抽象化してアクセスしてるんだが,DBエンジンってどうやって選択するのか,さっぱりわからん. どのドキュメント読んだら良いんだろ・・・
すまん…自己解決の悪寒
299 :
デフォルトの名無しさん :2008/03/11(火) 02:14:46
Windowsでシェルスクリプト的な使い方をしようと思っていますが コマンドプロンプトで >ruby hoge.rb と入力するのではなく、 >hoge.rb と入力してrubyスクリプトを起動させる方法があれば教えて下さい
301 :
デフォルトの名無しさん :2008/03/11(火) 02:33:10
自分のいるディレクトリを取得するのに、 dir = File.dirname(File.expand_path( __FILE__)) と書いてますが、File.が重複してるのが気になります。 もっとキレイに書けますか?
普通にhogeで実行できる
>>302 それはそういうふうに設定されてるだけ
まあWin98くらいから使ってる人は試そうとしないことも多いけどな
>>301 無理
まあフルパスくらい一発で出てくれとは思わなくもないが…
>>300 ありがとうございます
こういうコマンドがあったんですね
>>302 確かに試したら出来ました
One Click Rubyが設定したみたいですね
ある変数(仮に command としよう)に入っている文字列オブジェクトを コマンド出力として解釈させるためには %x{ command } でいいの?
%x{#{command}}
>>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
>>307 > dir = File.expand_path(Dir.pwd)
Dir.pwdがすでにフルパス。
>>307 誰がカレントディレクトリを欲しいなんて言ってるんだ?
File.dirname(File.expand_path(__FILE__)) は正しく「このスクリプトのあるディレクトリ」を返す
…まあ、「自分のいるディレクトリ」ってなんだよとは思わなくもないが
あと、 File.expand_path(__FILE__) は ruby への引数の書き方によらず必ず絶対パスを返す
問題があるとすれば、スクリプト内で cd してカレントディレクトリが起動時から変わってしまった場合
カレントディレクトリとくっつけて返すだけなので「絶対パスの形をしてるけど実際には存在しない」パスになる
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
ブロック使え
>>310 そもそもロリポップにはerubyがインストールされていないんじゃ?
>>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)を渡す方法がよくわかりません。
よろしくお願いいたします。
>>313 subやgsubの"$数字"使用不可問題はある意味欠陥だよな
warning出してもいいとすら思う
r.gsub!(/<a\shref=(.*?)>>>(\d+)<\/a>/){"<a href=\"#{$2}\">>>#{$2}</a>"}
1回経験して自力で理由調べると2度と間違えなくなるけどさ
>>317 せっかくだから自力で調べるべし
> Action application/x-httpd-eruby /usr/local/bin/eruby
は
「ファイルタイプがapplication/x-httpd-erubyに該当するなら/usr/local/bin/erubyにファイルを渡して実行」
という設定だ
/usr/local/bin/erubyがなければそもそも動作しない
ところで、erubyでないと何かまずい? erbとか使うんじゃ駄目?
>>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)
自分で勉強するかWebProg板に行ったほうがいいんじゃね セキュリティそっちのけで大やけどする前に
自前で1年勉強してもロクにセキュアなものができないのがWeプログラミング
>>319 ERBでも良いです。というかまだERBについては勉強していないので、
また勉強してつまづいたら質問させて頂くことにします。
(ERBで行くという方針が決まったので助かりました。ありがとうございます。)
>>320 衝撃でした;もうすでに幾つかCGIに直書きしてしまっているので、
今からはこれをアドバイス通りrbにしていくことにします…。
本当に基本的なことみたいですが、知りませんでした!ありがとうございました。
>>321 ,322
>>322 さんご指摘の通り、自前で全部やっています。
セキュリティについてはセッションハイジャックの仕組み等、概念は勉強しましたが、
肝心の自分のコードでどのようにするかのノウハウが無く、
これでは、やけどする可能性が非常に高いですよね。
ご指摘の通り、WebProg版なども見てみようと思います。
(色々引っ掛かりすぎてるせいか、自前だと時間が本当ににかかるんですね;)
>>319-322 さん、レス本当にありがとうございました!
またよろしくお願いいたします。
>>322 まあ、業界も飯の種を垂れ流して平気なほどバカではないってことだな
フレームワーク使って検索と独学で勉強しただけでセキュリティ的に堅固なプログラムが作られたら正直困るわけで
>>295 ruby/audio ってのがあったけど、WinXPで使えるかどうかよくわからん。
あとは適当にosalpのラッパ書いちゃうとか。
でも、わざわざruby使わんでもmp3splt/mp3wrapでいいんじゃ?
外部コンソールプログラムに丸投げするのが正解のような気がするな というか、仮に何かライブラリがあっても特定の外部プログラムのラッパーだと思う…
327 :
295 :2008/03/11(火) 18:58:41
>>325 Mp3splt/Mp3Wrapがまさに差がしていたものです。
ありがとうございます。
>>326 Rubyにファイル名管理させて、処理はMp3splt/Mp3Wrapに任せます。
このレベルの人からzaikoなんてワードが出てくると少々ヒヤッとするね。 まぁ、業務アプリってもイントラならそれほど酷いことにはならんかも知れんが
いや、実際問題としてRubyで普通に作っただけでは運用に耐えられないはず Rubyプログラミング以外の知識がどうしても要る
330 :
デフォルトの名無しさん :2008/03/11(火) 23:42:41
複数行モードな正規表現をファイル全体に適用し置換をしたいのですが ファイルが巨大な場合、変数に全部読むのがためらわれます =~の中の人(Regexpの中の人?)がもっと読みたくなったらその都度FileやIOなどから 読んでいただくみたいなのを妄想してるのですが そんな素敵モジュールはすでにあったりするのでしょうか?
>>330 1レコード1KBでも1GBじゃん。32bitのメモリ空間埋めるのに、
1万円でおつりが出る時代なんだから、気にしないと言うのも
それはそれでアリかとw
今の子はPCのメモリに種類があることも知らなくて困る
333 :
305 :2008/03/12(水) 00:09:43
>>331 >1レコード1KBでも1GBじゃん。
どういう計算?行数は出てきてないと思うけど?
100万件ほどって事だろうね。 しかし今はホントPC安いよなぁ。 10万くらいだせば、安いショップなら自作機作っても デスクトップならQuadコアのいいマシンが手に入るからなぁ。
rubyでの掲示板の作り方教えろ
>>336 他人に直接聞かないと作れないようでは君には無理だ
あきらめろ
>>336 Perl,PHPなんかで書かれたものを
とりあえずRubyで書き直すとかしてみれば色々勉強になるんでは?
というか、自分はそうしたけど。
rubbsの解説があったのって256本だっけ?
ruby 1.8.6 (2007-03-13 patchlevel 0) [i386-mswin32] で、Windows版Rubyでスクリプトを読み込ませるとウンコみたく遅いです 数秒待たされてから開始されます なんとかなりませんか
ウンコみたく遅いのは別の原因のような気もするが、普通にワンテンポ以上遅いよね 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
自分で作ったプログラムの説明をriやrdocに追加することはできますか? Emacsで「カーソルがメソッドに乗ったらミニバッファに1行解説を表示するよ機能」を使ってるんですが 自分で作ったクラスやメソッドについてもこれを表示させたいです
343 :
デフォルトの名無しさん :2008/03/12(水) 16:47:19
boost::regex_matchの引数flagsにboost::regex_constants::match_partialを指定したみたいな感じで 正規表現に途中までマッチしたことを知るにはどうすればよいですか?
>>340 >>341 NYACUSっていうシェルだとDDE(=遅い)に頼らず
拡張子でコマンドに関連付けできる。
色んな例外クラスを定義しまくって 問題あれば例外を投げ飛ばして 後でザクザク拾い上げるってコーディングしてたら これってgotoと何が違うの・・・? と思って悲しくなった
>>345 本質的にはあんま変わらんよな
そこに気づいたらもう一歩だと思う
「必ず」同じディレクトリにあるhoge.rbをrequireで読み込みたいです どう書くのが普通ですか? というか、みんな困ってないんでしょうか?
require './hoge.rb'
>>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 ----------
351 :
350 :2008/03/12(水) 19:28:41
>>349 あ、ごめ
リロードする前に書き込んじゃったよ。
それは350のでも桶?
352 :
350 :2008/03/12(水) 19:32:46
>>349 今試したら動いたよ。
良かった。ありがと。
メインの a.rb で一括して $LOAD_PATH.unshift(File.join(File.dirname(File.expand_path(__FILE__)),'test')) というように test/ ディレクトリ以下をrequireのロードパスに登録しておくのが素直に思う b.rb でも c.rb でも $LOAD_PATH への追加をしていくと微妙に不恰好になる
>>338 Perlで書いたものをPHPで書き直してそれをRubyにした後Pythonになって落ち着きました
・ 配列の後ろからn個が欲しい ・ ただし、要素数はnより少ないこともある ・ そして、nより少ない場合は少ない配列のままが欲しい を満たす一番妥当な書き方は arr.reverse[0,n] でいい?
>>355 arr.last(n) でいいんでない?
というかなぜreverse 逆順に欲しいのか?
358 :
デフォルトの名無しさん :2008/03/13(木) 06:32:26
rubyの一般的な命名規則はどんなのですか? 本を参考にhoge_moge_pogeって感じにしてますが
メソッド、変数名は hoge_moge_poge 定数は HOGE_MOGE_POGE クラス名は HogeMogePoge だと思う。
361 :
デフォルトの名無しさん :2008/03/13(木) 08:18:19
指定したファイルパスまでのディレクトリが存在しない時、 mkdir -p を外部コマンドとして実行して親ディレクトリを作成しているのですが もっとスマートな方法はありませんか?
>>361 FileUtils.mkpath
Pathname.mkpath
>>359 が多数派
先頭だけ小文字であとは大文字併用なローワーキャメルケース変数(hogeArrayのような)もしぶとく勢力拡大中
Railsは異境なのでよくわからん命名規則とよくわからん名前の変数やメソッドが跳梁跋扈
たとえ途中でも大文字が入ってると目視認識時にビビるんだよね 下手に気取らずに変数やメソッドは素直に全部小文字で行って欲しい 小文字だけ → 変数やメソッド 大文字が入ってる → 定数やクラス名 これでいいじゃんね
>>362 ありがとうございます
FileUtilsにはmkdir_pというそのままな名前のメソッドもあるんですね
366 :
デフォルトの名無しさん :2008/03/13(木) 17:49:00
自分用汎用ライブラリってどこに置くのがベストですか? あとphp.iniみたいな、ruby自体の設定ファイルがありませんが、 各アプリ共通のライブラリパスはどこで設定するのが綺麗でしょうか。
ヘッダファイルの構造体定義を食わせると pack/unpack のフォーマット文字列を 自動生成してくれるような素敵なツールって無いっすかね?
typedefとか追っかけるのがめんどいよね C言語のyacc/lexみたいなのがいるんじゃない? RubyだとRaccで書くことになるんかな。
369 :
367 :2008/03/13(木) 23:26:32
そうそう、めんどうなんすよね。 最初は頑張ってたんですが、 vfmt.fmt.pix.height とか出てきて、さすがにめげた。 自分で parse するのも考えたんですが、 結局 pure Ruby で pack/unpack するのはあきらめて、 構造体からデータを入出力するのは拡張ライブラリで実装することにしますた。
>>366 >自分用汎用ライブラリ
俺なら ~/lib/ruby か /usr/local/lib/ruby だな
371 :
デフォルトの名無しさん :2008/03/14(金) 00:01:39
winなら?
>>371 ~/マイドキュメント/ruby
~/Local Settings/Application Data/ruby
あたり?
スペース入るのがいやなら
ドライブの直下に ruby/lib を作るとか。
Winなら C:\Ruby 以下があるはずだと思うけど
374 :
デフォルトの名無しさん :2008/03/14(金) 00:15:02
ありがとう
Windowsだと ruby -e 'p $:' の出力中に site_ruby っぽいのは含まれないの?
>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開発者、まつもとひろゆき氏が動くのか!?
>>377 のURLコピペでいくつかのスレが荒らされとるな
URL以外の内容はスレに即したものの模様
>377 春休みか?いまどきそんなチャチなものブラクラとも言わんぞ
顔文字をcanna用に変換したいんだけど半角カナが全角になったゆ だれか全角カナを半角に変換する方法知らない?
>>383 nkfに-xを付けなかったんじゃないか? 元の変換の時に。
>>383 あー、xだけではダメだった場合が記憶にある
実際のNKF::nkfのオプション晒すがいいぞ
$ 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
…。
>>388 .toeuc は半角カタカナを全角に変換する
シェル上での処理の併用っぷりとかに疑問がありまくりだが、とりあえず、.toeucを外せ
kaoファイルの時点ですべてEUC-JPに変換されている(-xの効果で半角カタカナ維持中)から、kao.rbの内部でEUC-JPへ変換する必要はない
>>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みたいなメソッドないですか? >とか<を使うと、オペランド間の優先順位が気になります
>>392 素直に ( ) でくくれ
そっちのほうが文字数も短い
1.<(3) 3.<(1)
>>391 Base.newとすることが無いなら、BaseをmoduleにしてAとBでincludeすれ
眠いから不正確かもしれんがだいたいそんな感じ
>>391 Baseのmsgはインスタンスメソッドなんだから、B.showの中でBaseのインスタンスがないとどうしようもないかと
397 :
デフォルトの名無しさん :2008/03/14(金) 19:41:04
>>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のメソッドを呼び出すしかないんでしょうか?
A') これが気になった('A')
>>398 class B
extend Base
def B.show ; self.msg('class B') ; end
end
>>398 継承元の msg() をクラスメソッドにしないのには、
何か理由があるのでしょうか?
402 :
398 :2008/03/14(金) 21:15:32
>>400 解決しました!ありがとうございます!
>>401 既に使用しているスクリプトで
大量にメソッドを定義したBaseや、それを継承したAみたいなクラスがあったのですが
新たにインスタンス化して使うクラスを別途作成していて
そこでもBaseの機能を使用しなければならなくなって困ってました。
なんか危ないねぇ・・・
もとからRubyが嫌いなんでしょ その人なりのジョークだよ
そのわりにはRubyに生活かけてる割合高いなー
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で来てるのに、分割して挿入するのがどうも…。
sql.execute(*line.split(',')) *がなければ、配列1つを1引数として *を付けると、配列をその場に展開して書いたように 渡してくれる。
410 :
408 :2008/03/15(土) 06:46:27
いろいろできるもんだね。 勉強がてら色々書いてるけど、何でも出来る分、メソッドとか覚えきれない…。
>>408 > f.each do |line|
> sql = m.prepare('insert into name values(?, ?, ?, ?, ?)')
ループの中でprepareすんなよ。
というか、コピペで頑張ってる時期でprepareのご利益についてまだ知らないんだろう
splitを、結果保存しないで5回も呼んでる時点でそのへん突っ込んじゃいけないことが分かる。
総力を挙げて突っこむのがこのスレの趣旨では・・・w?
>>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(^Д^)プギャーされても文句言えない
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)}
読みやすさ維持しつつコンパクトに表現するとこんな感じ?
それだけのことが書ける人はcloseするかブロック付きopenを使う、はず。
ワンライナーでお願いします
contents = File.open('hoge.txt'){|f| f.read} というファイル読み込みの書き方は初学者の人に微妙に人気がない
contents = IO.read('hoge.txt')
>>419 contents = nil
File.open(path) do |f|
contents = f.read
end
たとえ4行に増えてもこっちのほうがわかりやすいんだろな
ブロックの最後に評価されたものが自動で返るという仕様に依存した書き方は気持ち悪いらしい
File.readのほうが受けがよさそう。同じことだけど。
IO.readってファイル読み終わったらクローズされてるの?
よし、流れ理解 > ブロックの最後に評価されたものが自動で返るという仕様に依存した書き方は気持ち悪い つまり、メソッドにおけるreturnのような明示的に値を返す意図を感じるものがあればいいんだな contents = open(path){|f| break(f.read)} これでどうだー
うちの大学の助手が fp = nil fp = File.open(path, "r") if(fp==nil) (以下ry って書いてた 早く何とかしないと・・・
>>423 IO.readとFile.read(とforeachとreadlines)は特別
ただし、バイナリモードにしない(できない)んで、Windowsで使うときには注意、というか使ったらダメ子ちゃん
>>427 手元の1.8.6では動かね
IO#readとIO#foreachとIO#readlinesは俺スクリプト専用の便利メソッドとして割り切るしかないな
公開するスクリプトでは使えそうにない
>>417 具体的にナニを close させる気なのか気になる
HTTP コネクションは OpenURI#open_http の中ですでに閉じてるし、
open 自体から返ってきてるのは StringIO だから close はただの読み書き禁止フラグだし
uri-open の open(uri){|sio| … } は「open(uri) の結果の StringIO をブロックに渡す」以上の意味はないように思う
カタチは同じだけれど、 open(local){|io| … } と open(uri){|sio| … } はやってることは違う
>>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を薦める。
>>425 > うちの大学の助手が
東大大学院の特任助手のことかー!?
open_httpの中で閉じているというのは実装詳細なので、 利用者としては期待してはいけないと思う。
>>433 ブロックの終わりでcloseされるはずというのも実装依存だと思うぞ(ただのブロックであってもいいわけだし)
というか、件のは「closeされるべきものがそもそも無い」という話なんじゃ…
io = File.open(path)
ならIO.closeは「本来しなくてはならない」ものだけど、
sio = open(uri)
なら、StringIO.closeは「別にしなくてもいい」ものだろ
open(uri)でNet::HTTPが返ってきて適宜finishしなくてはならないというのは
それはそれで面白いことができそうだがぶっちゃけ面倒だ
ブロック付きopenが閉じるってのは実装依存じゃなくて仕様じゃない?
と思ったら、StringIOもしくはTempfileを返す、と仕様自体が再定義されるから問題ないのあ。
437 :
436 :2008/03/15(土) 16:27:30
↑open-uriをrequireしたあとのKernel.openのことね。
>>433 仮に閉じなくなったとしたら、OpenURI::MetaのcloseにHTTPセッション終了の機能を追加だな…
>>436 そう
だから、open(uri)のブロックで、open(path)のように「ブロックの終わりで何かが閉じる」と考えるのは実は勘違い
eachに渡したブロックが終わるのと同じ
まあ、実際上はclose云々ではなく変数スコープとかの関係でブロックが重宝されてるんだけどさ
変に毛嫌いせんとブロック使っとけという感じではある
ただ
>>421 の気持ちはわかるけど
ブロックのendにメソッドチェーンがつくのと似たような感覚なんだろう
ずっと思ってたんだけど、 http = Net::HTTP.start('www.example.com', 80) で開始されるhttpって、スクリプト内部の勝手な何かだよね? 外部へのHTTPコネクション自体は、http.getが実行された時点で開始して即終了してるんだよね? ファイルIOみたく、http.finish(あるいはブロックの終わり)で終了しなくても対外的には問題ないよね?
>>441 - 転送終了時、keep-aliveな場合はあえて@socketを閉じてない
- ブロック終わりに呼ばれるdo_finishでは@socketを明示的に閉じてる
ブロック使って自動でfinishしてもらったほうがいいと思うぞ
>>416 標準のcsv.rbはでかいの食わせると思いっきり遅い
何度も大きなCSVを扱うならFasterCSVのほうがいいぞ
ファイル1個だけだから面倒なインストールなしで使える
データ構造やアルゴリズムが違うのか解析に手を抜いてるのかは知らん
RubyってRAII的なものはないの? Procとかじゃなくて あるメソッドの先頭でマウスカーソルを砂時計にしてるんだけど、途中で抜けたり最後まで処理したりでいろんなとこにバラバラにカーソル元に戻す文書くのめんどいし忘れるんだ…
Rubyには砂時計なんてねーよ 「今どのメソッドの"中"にいるかで値を変化させたい、むろん自動で」 というのは単にプログラムの設計が悪いだけだと思うぞ
446 :
デフォルトの名無しさん :2008/03/15(土) 20:47:43
Ruby での RAII 的な者はイテレータじゃないのかな。 File.open とかそうだっしょ。
>>444 def gui_wait
カーソル変更(砂時計)
yield
ensure
カーソル戻す()
end
gui_wait { 処理 }
しょこたんが「らいらいお(^ω^)」って言ってるのはこれの事だったのか
うどんくいてー
>>445 wxRuby使ってるんだ
>>447 , 449
一応 Ruby RAIIでぐぐるとかはしてから聞いてるんだぜ…
>>448 ありがとう今だけ愛してる!
ensureって例外処理じゃねーとこでも使えたのかー
>>451 釜玉うどん最強
Ruby RAIIで今ぐぐったら一つめじゃねーか。
>>453 ブロックに書くのと
def test
puts "test1"
return
ensure
puts "test2"
end
って書くのはちがくね?
Rubyist的にはどうかくのが定形なの?
別に毎回同じ処理だからブロックとかじゃなくて全然構わないんだけど…
あー、メソッド内でカーソル変えたり戻したりしないで汎用的なの1個使って使いまわせばいいじゃんってことか
まぁWikipediaのRAIIのページに「ensureを使う」とまでは 説明してないから、ここで質問する意味はあったのであろう。
459 :
デフォルトの名無しさん :2008/03/15(土) 21:43: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))
ん、多重代入する方法を知りたいのか連続的に取り出す方法が知りたいのか どっちなんだ。
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回で書けたら短けー! とかそういう話にも見える
「ハッシュを」じゃなくて「ハッシュから」か。
tmp = long_name_hash v1 = tmp['key1'] v2 = tmp['key2'] v3 = tmp['key3'] これで十分だと思うが。
>>464 お前か、「書きやすいから」とか言う理由でhだのaだの短すぎてよくわからん変数バラ撒いてる張本人は
tmp = foo.bar.hoge[baz].piyo とかだとまあアリだろ。 変数名は状況が分からないとまともに付けらんないので適当。
VBでいうwith的なものがほしくなるときはあるなー
withってネストできるの?
クラスやメソッドの名前は良く考えて決めるけど ローカル変数の名前なんてどうでも良いや と思ってるのはダメかな><;
VBのwithってPascalといっしょだっけ? Rubyならinstance_evalでいいんじゃね?
他人に公開するんでなければ名前はどうでもいいんだけどね 引数は全部hやstr、返す配列はarr ちょっとでもわかりやすい名前のほうがいいじゃんと考えるのはプログラマのいいとこ兼悪いとこだ
仕事のプログラムは往々にして誰かに見られるんだがな。
>>472 Rubyで仕事のプログラム書いてる人なんていないから大丈夫だよ!
>>470 instance_evalはselfが変わるので、当然インスタンス変数やインスタンスメソッ
ドが使えなくなる。単なる一時変数の代わりに使うのはおすすめしない。
1.9ならtapというのがあるんだが。
これくらいのなら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']}
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
タッピングって盗聴だったのか! ピロピロだと思ってた・・・
いや、ギターのタッピング(ライトハンド)はピロピロでいいだろ…
>>475 を見るとinject並にRubyプログラミングが変わる可能性があるなとか興奮したが
>>476 を見るとそんなショボいメソッドいらねーよと思う不思議
ActiveSupportにreturningというtapと形の似た定義のメソッドがある。 def returning(x) yield x x end selfじゃないところが違うな。 returning とりあえずの返値 do |x| xをいじくる end みたいに使う。
injectでRubyプログラミングが変わったなんて気はあんまりしないんだが… 微妙にわかりにくいのが初心者に広まらない原因かねえ。 result = 初期値 array.each do |e| … result = eとresultを足したり加工したりする end という処理はけっこう多いと思うんだけど。
-ectシリーズの中でも比較的マイナーな動詞だからってのはあるかも。 と思ったら1.9で * enum.c (Init_Enumerable): reduce is new alias to inject. なのか。
483 :
デフォルトの名無しさん :2008/03/16(日) 02:37:48
再帰処理をする時に、 関数やメソッドの名前を書かずにする方法はありますか? 関数名が変わっても、再帰部分は書き直さずにすむようにしたいです。
すこし複雑な処理になるとeachではっきり書いたほうがわかりやすい injectを使うと1行でまとまる、以上のメリットがあるとはあんま思えない injectに5行くらいのdo〜endブロックがくっついてるのを見るとイライラする(w
>>483 呼び出し部分をブロックで渡してyieldすればいいんじゃないの?
関数とメソッドが違うという理解をしてもらえてるのは嬉しいが、 Rubyには関数がないんだよね
実際の再帰処理をどう書いてるかによるよな
>>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
}
>>483 先に断っとくと誉められたもんじゃない
def my_name
str = caller[0].slice(/`.*?'\Z/) and str[1...-1]
end
とかをこさえて自分自身をsendなりで呼ぶ。
Rubyでdefを変数に保存する場合って どうすればいいのですか? 関数ポインタとか関数オブジェクトみたいな ものがどれに該当するのか解らない
Procとかlambdaとか
>>491 できません
似たようなことならProcを使うことでできるけど、専用に書き下ろさないといけない
func = Proc.new do |args| do_something(args) end func.call(1000)
Module#instance_methodとObject#methodは?
いやいや、あるから。 #!/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
>>491 リロードしたら答えがあがってたけど、せっかくだから晒す
def hello(name) ; puts "hello #{name}" ; end
m = method(:hello)
m.call('hoge')
498 :
デフォルトの名無しさん :2008/03/17(月) 01:28:24
メソッドを繋げていって配列を得て、 その配列を、他のメソッドの引数にしなければならない時 (たとえば配列が表すTimeオブジェクトの生成)、 メソッドチェーンが途切れるのが嫌です。 メソッドチェーンに繋げて書く方法があれば教えて下さい
メソッドチェーンが長過ぎると読みづらいから 適当な所で切れても別にいいんじゃない?
class Object def apply(method) method.call(self) end end hoge.hige.hage.apply(foo.method(:bar)) あまりおすすめはしない。
メソッドが起動してしまってる時点で、存在したオブジェクトの総数は変わらんからな
変数名という薄っぺらいラベルがくっついてるかくっついてないかの違いしかない
返り値オブジェクトの回収までの時間がミリ秒長くなることを気にしてるなら、そんなん気にしてたら禿げるぞ
>>475 のtapを使えばたいていメソッドチェーンの中にいることはできるけどな
>>499-500 ありがとうございます
やっぱり自然な形ではできないんですね
あきらめて普通にやります
ruby インタープリタはFIFOから読み込むことはできないんでしょうか? $ mkfifo fifo $ echo 'puts "hello"' > fifo $ ruby fifo 反応なし ↑これでPythonやPerlではできるのですが。 ruby 1.8.6 (2007-06-07 patch level 36) [i486-linux]
今やってみたら普通にできたけど。 ruby 1.8.6 (2007-09-24 patchlevel 111) [i486-linux]
グローバル変数なんだがね,これ,一度書き込んだら後参照しかできないようにする方法って無いのかすら. やっぱそれやりたかったら,なんかクラスのインスタンス変数にしてatter_readerにするしかないんだろか.
グローバルな定数をfreezeしたらどうだろう?
む、代入は警告つきで出来ちゃうのか。
特異クラスにすれば楽かな
509 :
503 :2008/03/17(月) 05:27:37
>>504 UbuntuとFedora4で試したんですが、どちらでもだめでした。なぜでしょうね?
trace_var(:$readonly){|x| raise if @set @set = true } $readonly = 0 p $readonly $readonly = 1 @setのselfは何なんだろう
p self
>>505 2度代入しないようにプログラムを書く
いやマジで
>>510 いや、単に代入がすんでからフックを仕込めば
いいんじゃないか。
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 まあ、実施は固定になってないんだけどさ
フォームから受け取ったCGI.newの長さを調べて EUC-JPコードに変換しながら配列に入れていきたいんですが CGI.newの個数の調べ方はありますか? CGI.new.length ではできなかったので 初心者すぎる質問ですいませんが ご教授お願いしますm(_ _)m
>>515 個数は調べる必要はない
cgi = CGI.new としたcgiからどういう形でデータを取り出せるのかよく調べるといいぞ
cgi=CGI.new cgi.params.length でハッシュにして個数調べられました。 もっと調べるべきでした申し訳ないです。
要素数にこだわってんなあ
添字でないとアクセスできない人はときどきいる あと、Array.newの引数にはサイズが要るだろう、みたいな人
>>519 おれ、もともとヌルいスクリプト書きだけど
その辺に慣れきってしまってEXCEL VBAにさえ戻れなくなった
レガシVBって特にスクリプト系の別言語に馴染むと信じられんくらいめどい てか、配列が型付きなだけで、実質*allocのラッパってのがなんとも……
Emacsでコーディングしているんですが、 複数行のインデントがぐちゃぐちゃのコードを一発できれいに整形するコマンドってあるでしょうか?
region選択して C-M-\ indent-region EmacsのTutorialにはなかったっけ?
下手にEmacsの基本操作だから無いかもしれない たとえば、HTMLを扱うsgml-modeでも同じことができる indent-region とか comment-region とか覚えとくと便利
>>519 あれを Array と呼んで平気な感覚のほうがオカシイということにまず気づけ。
new 時にサイズを指定するほうが自然だと思う人をコケにするのはそのあとだ。
「配列に入れていきたい」の「配列へ」の値のセットに使う気だったんだろ?(あるいは配列の生成)
for文で繰り返しの最後の値が決められないとかそんなとこだと想像
cgi.paramsから値を取り出すときではないと思われる
というかキーと勘違いしてたということは
>>517 の自己解決っぷりからしてあまりありえなさそうだ
おまえらそんなことより gem で wirble インストールして irb に色つけようぜ マシンスペックがしょぼいと irb の起動が一瞬遅れるようになるけど rubygem 使うライブラリにはよくあることだから気にするな
529 :
デフォルトの名無しさん :2008/03/18(火) 16:42:20
色が付くとどうなるの?
カ ラ フ ル に なります
エディタの色わけは不要 って言う人がたまにいるけど、 普段スクリプト言語しか使わない人なんだろうなぁ・・・ と思ってしまう。 そういう人には構文チェックで5分かかるような世界を味わって欲しい
grepやlessで色がつくわけではないから、とか不思議な論理の話をしてる人もいたな ぜひ(g)vim使用でのviewコマンドとか試して頂きたく
色付け頼り派だが、 パイプして読むときにVimはめんどいよ…
wirbleには若干問題があって、 >> Rational(10, 10) => Rational10, 10 >> /(10|20)/ => 1020 などと表示されてしまうぜ。 どう直せばいいんだか。
>>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
作者は実は使ってないとか
初版リリースしたとたん急に意欲がなくなって放置してしまうのはよくある事w
胸が痛い。
539 :
デフォルトの名無しさん :2008/03/18(火) 23:07:49
ていうか、使ってみるとよくわかるんだが、「返り値」が「メソッドや記号」で色づけされてもイマイチ有り難味が薄いんだよな 本当に必要なのはプロンプト行を目立たせることか、あるいは p や puts の出力を明確に分けること
括弧は when '(': yield :open_paren, '(' when ')': yield :open_paren, ')' などとして色定義を追加すればOK。 /は状態を追加しないといかんな。 when '/': state << :re とか。 そのあとwhen :stringのトコをコピーしてそれっぽく真似ればなんとかなるか。
tak関数の先生の前で色付きのemacsを開いていたら 最近の若い人はみんなそうだなぁ みたいなことを言われた
色付けとかないからマッカーシー先生が見間違えるんだよ、って言ってやれ
ruby で作られたWebアプリでソースが公開されていて共用サーバでも実用に耐えるものってありますか。
tDiary とか?
hikiとか?
>>542 さすがに第1引数、第2引数、... を識別する色分けはないだろうw
ActiveRecord 使ってみたら require するだけで2秒以上かかるとか何の嫌がらせ?
>>547 ロードが終わってからも、
find_系みたいに初めて使うときに動的に定義されるメソッドとかあるぞ。
今まで使い倒してきた家庭内DebianのRubyのバージョンが1.8.2だったことに気づいて愕然とした ところで、1.8.6 feature をまとめたページってない?
>>547 インスコしたgems数に比例してロードが重くなるのはいけてないよなぁ。
そんなファイルが増えたときのこと気にして作ってるわけないじゃん
インストール時に毎回17MBのYAMLファイルをネットから取得してパースさせるようなシステムだぜ
※1: 取得しないオプションもあります
※2: 実際には1MB程度に圧縮されたファイルを取得します(
http://gems.rubyforge.org/yaml.Z )
ASもgemも使わないARっぽい奴ってねーの?
>>551 そしてyamlのパースが激重なんだよなw
いやsyckはがんばってんだけどファイルサイズがでかすぎる。
554 :
デフォルトの名無しさん :2008/03/21(金) 13:39:13
ブロック付きメソッドの中で再帰をするには、 メソッドの中で、ブロックの内容を引数化しないといけないと思うのですが どうやればいいのでしょうか?
def saiki(&block) saiki(block) end
間違えた def saiki(&block) saiki(&block) end
なるほど&varで引き取れるんですね ありがとうございました
558 :
デフォルトの名無しさん :2008/03/21(金) 21:52:05
クラスメソッド呼ぶ時は、 Hoge:fuga Hoge.fuga のどちらでもいいですが、:だと定数の可能性もあるので、 わかりやすさのために.を使った方がいいのではないかと思うのですが、 よく見る例では:が多いようです。 どちらがいいですか?
なにを見て::のほうが多かったか気になる
うむ
Array::newとかやらんだろう、別にやってもいいけど
562 :
デフォルトの名無しさん :2008/03/21(金) 22:02:15
逆引きRubyとかです。 :ではなく::でした。
563 :
デフォルトの名無しさん :2008/03/21(金) 22:19:14
AVIファイルって、どーやって見るんですか? メディアプレイヤーがエラーみたいになります
565 :
デフォルトの名無しさん :2008/03/22(土) 02:35:06
Stringで、正規表現を使わない単なる文字の置換てどうしたらいいですか?
ぶっちゃけ "::" でクラスの特異メソッドを呼べるようになったのは C++ では出来るしっていうぐらいの意味しかなかった気がするんで receiver.method っていう一つの形だけ覚えておけばいいんじゃないかと。 たまたま receiver がクラスなだけじゃないかおおげさだなあ、と。
>>566 マニュアルだと#になってるのはなんで?
>
>>565 (g)subの第一引数を正規表現ではなく文字列で与える。
570 :
デフォルトの名無しさん :2008/03/22(土) 03:10:45
実は3::to_sとかも出来るという
>>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に与える
とやるところでした
ありがとうございました
>> 'hello, world.'.gsub('.', '!') => "hello, world!" >> 'hello, world.'.gsub(/./, '!') => "!!!!!!!!!!!!!" こんな感じだな。
> ruby 1.7 feature: 1.6 以前は、pattern が文字列の場合、 > その文字列を正規表現にコンパイルしていました。 > 1.7 以降は、その文字列そのものがパターンになります。 ウサギ本で止まってる漏れは知らなかったんだぜ 原書はもうすぐ第三版も出るってのに
575 :
デフォルトの名無しさん :2008/03/22(土) 04:09:52
第三版ってバージョンはどれなの?
576 :
408 :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、テーブル、カラム数を指定する)
が、やはり不恰好になりました。美しく記述する方法はありますか?
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本ってどういう本なの?
フラナガンってニュータイプの研究をしている人じゃないだろうし・・・
>>580 ふつーにRubyの入門からメタプログラミングまで載ってる。
1.8と1.9での違いも載ってる。 あと、各章の口絵がWhy the Lucky Stiff
>>581 いや、そのジオン公国立特務機関の使途。
ニュータイプが発するサイコ・ウェーブと呼ばれる感応波、特殊な脳波の一種とミノフスキー技術とを組み合わせることにより、
「サイコミュ・システム」システムを運用しようという本。
これによって遠隔操作が可能になるため、SEやプログラマの人件費を抑えることが可能になるということです。
寒
>>576 外だし出来てる様には見えないんだけどな
とりあえず ARGV について調べれ
Class::method の記法は歴史的なものでしょ。 初期は Class.method と記述できなかったんじゃなかったっけ?
>>586 逆、というのが
>>566 の主張。前は "::" は定数アクセスのため「だけ」のオペレータだった。……と思った。
初め、オブジェクトの状態を整数値で class Something STATUS_NEW = 0 ... end のように定義して用いることを考えました。 しかし、よく考えてみると0という値に意味は無いのだから、:STATUS_NEWのような Symbolを使ってもよいと考えたのですが、こういう場合どちらの方が標準的な やり方なのでしょうか?
値に意味がなく名前そのものに意味があるならシンボルだな。
実際に使われてるのは定数だけだけどな 意味上正しいんだから定数の代わりにシンボル使うぜ、というのはそれはそれで正しいけど面倒だ
面倒か?
クラス外部からユーザーが利用する値なのなら定数にしとかないとわけわからなくなる予感 自分が混乱しないんならどう書いてもいいんじゃね 俺は固定の値に定数とシンボルの2種類があったら混乱するけどさ
良く読まないと質問の意図を取り違えるな STATUS_NEW = 0 を STATUS_NEW = :STATUS_NEW にするって事か で obj.status = :STATUS_NEW と書くのとどう違うんだ?
てっきり STATUS_NEW=0 obj.status = STATUS_NEW がいいか obj.status = :STATUS_NEW がいいかという質問だと思ってた。
>>588 bool 変数として使うのなら true にしたら?
STATUS_NEW = 0 STATUS_OLD = 1 case obj.status when STATUS_NEW when STATUS_OLD とかやるんだろ。。
OSはXP、rubyのバージョンは1.8.6です。 エディタはSciTEです。 今日はgetsを勉強しようと思い puts gets とコードを入力してエディタからF5を押してプログラムを実行したところ コマンドプロンプトが立ち上がりそこからカーソルは点滅しているのですが 文字が入力できなくなってしまいました。 Enterを押しても抜けれません。 おかしいなと思いコマンドプロンプトをスタートメニューから立ち上げて ファイル指定したらプログラムを実行することはできました。 SciTEの方からF5で立ち上がるコマンドプロンプトに文字を入力させるにはどうしたらいいでしょうか。 よろしくお願いします。
素朴な疑問なんですが、 rubyをC直下にインストールした後に環境変数を設定した覚えは無いのに どこからでもrubyコマンドが使えるってのは何故ですか? コマンドプロンプトはどうやってrubyを認識してるのでしょうか
rubyをインストールしたときに勝手に環境変数設定してくれたんじゃないの?
Rubyあんま関係ないな Rubyのインストーラが「環境変数」の「Path」に c:\ruby\bin を追加してくれただけだろう コマンド実行と環境変数の関係について調べてみるといいぞ
今調べたら C:\PROGRA~1\Borland\Delphi6\Bin とか書いてあってちょっと泣いた
602 :
588 :2008/03/23(日) 17:52:59
すいません、遅くなりました。 説明が足りませんでしたが、質問の意図としては>594さんの通りで 実際には状態を表すSTATUS_*が複数存在します。 定数でなければならない場合と、Symbolが理想的な場合があって、オブジェクトの を使う開発者から見ると、両者を区別して考えることは無いように思います。 ですから両方の場合で定数を使うように統一したほうが、オブジェクトを使う側から してみればSymbolを使うのか定数を使うのか覚える必要が無く楽である。 という結論を得たので、定数にすることにします。ありがとうございました。
>>599 >>600 ありがとうございます
今調べてみたらPATHに c\ruby\binが追加されてました。
Symbolだとtypoしたとき困りそう。 定数ならエラーになるよね?
そんなこと怖がるな。 しっかりテストしる。
606 :
デフォルトの名無しさん :2008/03/23(日) 18:56:35
RSpec
どうしてrubyなの? 実績も何も無い言語ですよね pythonじゃなくてrubyを使う理由を一つでもいいから教えてください 開発者が日本人だからですか???????
>>604 send "handle_#{sym}"
なんて感じで分岐を振ればNoMethodErrorにしてもらえるぜ。
何事も実装しだい。
TMailが使いにくいと感じたので、net/smtpやハッシュとか使ってメール作成&送信モジュールを作成 半年経ってわかりやすく改造しようと思い、メールのfromやtoもメールオブジェクトのメソッドにしていったら TMailとたいして変わらないものができた 何やってんだ俺
>>612 でも、その過程でいろいろ身についたんじゃない?
どう考えてもめんどいからデータの格納はハッシュのキーと値でいいじゃん から 使いにくいからクラス作って適当にアクセス用メソッド併用すればいいじゃん に移行する期間というのはあるな これの前後でスクリプトは全然違う プログラム名のモジュール作ってその中に細かくクラス、という習慣ができた前後でもかなり違うけど
615 :
デフォルトの名無しさん :2008/03/23(日) 21:16:48
オセロの中島知子と他2人(知らない人)と一緒に車で逃げているのだ。何から逃げてるかって? 核だよ。核。 どういうわけか、東京に核爆弾が投下されるという情報を知っていて、北へ向かって逃げているんだ。 それで、中島知子はパニクって反対車線へ行ったり来たりと、もう、てんやわんや。 で、暫く走ってると、車が沼地にハマっていて身動きが取れない。その時点で、もう東京じゃないんだけどさ。 すると、遠くの方がピカって光ったんだ。 次の瞬間、俺は食堂でトンカツを食べていた。 その味はやわらかくてジューシーで、こんな素晴らしいトンカツを食べられる私は、きっと特別な存在なのだと感じました。 今では、私が食堂の店主。客に出すのはもちろんトンカツ。 なぜなら、彼もまた、特別な存在だからです。
ここまで明後日の方向の誤爆だと誤爆元が気になる
こんな電波レスが受け入れられるスレってどこの板にあるんだ?
"客に出すのはもちろんトンカツ" でぐぐれ
>>611 ちょっ
微妙に本当くさくてイヤな理由だな
>>612 RubyForgeに登録しる
プロジェクトの活発さ:0.00
新規にゼロから作って公開して車輪がらごろするよりはTMailに関わったほうがいいな TMailが流行らないのは何故だろう
メールボックス触る機能を内包してることで微妙にわかりにくくなったのが敗因かと TMailにメール送らせるだけのラッパーライブラリとか作ったらきっと一部に受ける っていうか、Rubyの外部ライブラリとしてはわりとふつーに使われてるほうだと思うが…
どうしてrubyなの? 実績も何も無い言語ですよね pythonじゃなくてrubyを使う理由を一つでもいいから教えてください 開発者が日本人なのが誇らしいとか??????
>>623 使う理由がわからないなら今のあなたには必要のないものです。
だからとりあえず忘れてもいいですよ。
また学びたくなったらお越しください。
最後に、そういう話題はム板よりもマ板の方がふさわしいです。
コピペ交えて輪廻のように相手してくれると思う 面白ければだけど
627 :
デフォルトの名無しさん :2008/03/24(月) 16:28:28
再帰という概念がよく分かりません…。 参考書も変な例えばかりです。 分かりやすく解説されているサイトとかありましたら教えていただけますでしょうか。
再帰はフィボナッチ数列と累乗を表現するためだけに存在します それ以上の意味はないので自分から学ぼうとせずにさっくり忘れてしまってOKです
>>627 Rubyではこだわる必要ない概念のような気が。
Rubyではeachかeach_with_indexがあればなんとかなるよね 極めて必要に迫られたときになって初めて勉強するといいぞ まあ 「再帰も理解できてないなんて何のためにプログラミングしてるの?」 とか煽られがちなのは確かなんだけどさ
参考書で変だと思う例えでも、いざ分かってみると、 この筆者も悩んだあげくにこの例えを選んだんだな、と思うことがある。
632 :
デフォルトの名無しさん :2008/03/24(月) 16:48:13
全方位に完全初心者な人間が初心者にアドバイスなんかできるわけないだろ常識的に考えて スレに澱ん…いや溜まってる奴はマニュアルくらいはさくっと読んでる奴だぞ 「読んだけど使ってないしよーわからんなー」という分野が多い場合はその分野は初心者なわけだし
634 :
デフォルトの名無しさん :2008/03/24(月) 16:54:51
627です。 ありがとうございます。 上司にもこのことは忘れろと言われたので、忘れますw ありがとうございました
>>627 忘れるって言ってるけど一応
よっぽど頭のいい人は別として
再帰はそう簡単に分かったり身に付いたりするものじゃないと思われ
どの参考書の例えがわからないのかにもよるけれど
ある程度時間を割けるのならThe Little Schemerでも読んでみては
Lisp/Schemeスレで質問すれば答えも返ってくると思うよ
RubyではEnumerableとProcが理解できてればそれでいいよ
使いこなすのはともかく概念的に「再帰」ってそんなに難しいか? 今は学校で数学的帰納法とか習わないの?
再帰を使って効率が良いなら使うけど、そういうケースはあんまり無いような。
再帰を知ってて使えるかどうかと、実際に使うかどうかは別問題だわな。
それはともかく、
>>637 に同意。
概念としての再帰は全然難しくないよね。
>
>>637 いやだから、たとえば累乗だけ書けても意味ないだろ
日常に再帰を適用できる脳にならないと、再帰を理解したことにはならない
> 日常に再帰を適用できる脳にならないと ?
>>641 ループはユーザーが末尾再帰を使って表現してください、とかいう
投げっぱなしジャーマンな言語の経験があるとそういうのは早いな
644 :
635 :2008/03/24(月) 17:47:26
>>637 数学的帰納法が出てくるのは高二からの基礎解析だと思ったけど
漏れは二年から文系選択したせいで基礎解析は一切やってないんだ
ただ再帰は漏れみたいなゆとりじゃなくても難しい概念だと思うけどな
評価や言葉の問題なのでこれ以上は主張しないけど
配列の並び替えを列挙するとか、配列からn個の部分集合を列挙するとかは 再帰を使うと楽だよ。使わなくても書けるが。 1.9ならArray#permutationとcombinationがあるけどね。
順列と組み合わせ?便利そうだ
ディレクトリのトラバーサルとか再帰で書いて練習したな PC-98でTurboPascalだったから何年前かな…
再帰=漸化式
649 :
デフォルトの名無しさん :2008/03/24(月) 20:35:12
Ruby2.0っていつごろ出ますか?
5年以内?
まあ年単位の時間がかかるのは間違いない 間違っても今年中に出たりはしないだろうな
1.9 やめて 2.0 にします。とか。
ネットからデータ持ってくる必要があるのでダウンローダーのようなもの作ってます Web上のコンテンツひとつについて、 @uri @last_modified @etag @status @length @header_response @content といった感じで総合的にいろんなデータを管理保管できるクラスとか既に誰か作ってたりしませんか?
Mechanizeとか?
>>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
open-uriは器用な子
でも
>>656 みたいなのだとStringIOやTempfileにファイル内容を保持し続けてないといけない予感
PStoreに保存するとかいう場合でメタな情報だけでいいって時には取り回し面倒そうだ
再帰って普通に使うけどな。 ポイント使ったことない俺が言うくらいだから相当だよ、きっと
659 :
デフォルトの名無しさん :2008/03/24(月) 22:44:32
どういうときに?
>>657 いや、StringIOなんだしPStoreにはそもそも残らないだろ
読み込んでもメタデータ無しの普通のStringが返ってくるだけだと思うぞ
漏れは使わないなあ。 イテレータでこねこねしてるだけで大抵なんとかなるし。
662 :
658 :2008/03/24(月) 22:48:50
文字列処理系が多いかな。 xmlパースしたりwikiみたいな入力で独自文法実装したり
* 扱う構造が再帰してる(ファイルツリーを歩くとか)。 * 分割統治なアルゴリズム。 あたりだと自然に出番が来るんだけどね。 こーゆーのはライブラリの奥に埋もれてて自分で実装する機会も減ったからな。
>>660 あ、ほんとだ
じゃあhtml.metaやhtml.base_uriなんかを明示的に取り出して保存しないと駄目だな
なんか微妙に面倒
よくわからんのだが,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クラスのインスタンスになっている.これってどういう仕組み?
>>665 Rubyでは数値関係のクラスは特別扱いされてるけどそのへんの話を聞きたい?
Rubyスクリプトが出てこない話にもなっちゃうけどそれでもいい?
Rubyでは数値を例に出されると非常に困ることが多いんだ
そういう話でないのなら、たとえば
class Integer
def to_f
# 引数をFloatに変換するFloatクラスのクラスメソッドに自分自身を渡す
Float.induced_from(self)
end
end
って書いてるだけだよんとかそういう話になってとっても簡単なんだけど
rubyスクリプトと他のexeで標準入出力を介して文字列をやり取りしたいのですが、どうすればいいですか。
>>667 $stdin というIOオブジェクトで標準入力から流れてくる文字列を受け取ることができる
C:>TYPE test.rb
text = $stdin.read
puts "#{text}が来ました"
C:>ECHO うんこ | ruby test.rb
うんこ
が来ました
改行を取り除くにはどうすればいいかとか、改行ごとに配列のように扱うにはどうすればいいかとかは
$stdinが属してるIOオブジェクトの解説読め
open('hoge.txt'){|f|
とか書くときの f と同じものだ
>667 Windowsヘルプの「コマンドラインリファレンス」の「リダイレクト演算子」のところを よーーーーっく読んで下さい あとRubyリファレンスの``とかSTDINとかSTDOUTとか参照
670 :
デフォルトの名無しさん :2008/03/25(火) 01:01:10
caseとwhenの間は字下げあった方がいいですか?
>>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は対等だな
672 :
665 :2008/03/25(火) 01:49:28
673 :
デフォルトの名無しさん :2008/03/25(火) 05:45:37
Rubyで組み立てたSQLをmysqlにパイプを使って渡したいのですが どう書けばいいでしょうか?
mysqlのほうに標準入力受け取って解釈する機能があれば普通にパイプで渡すだけだな ただ、ふつーは、Rubyからmysqlに接続するライブラリがあるからそれを使う
>>665 Rubyでは変数自身はオブジェクトではなく、オブジェ
クトにつけられた仇名に過ぎない。
677 :
667 :2008/03/25(火) 20:28:05
すいません。言葉が大分足りませんでした。 AI同士で対戦する多人数のゲーム(トランプのような)を作ろうと思っています。 ディーラーの部分をRubyで実装してAIの部分は好きな言語で実装します。 ディーラーであるRubyとAI(複数ある)で通信をするわけですが、 ディーラー側からAI側にメッセージを送るときには AI側は標準入力でメッセージを受け取って、 AI側からディーラーにメッセージを送るときはAI側は標準出力にメッセージを出すようにしたいです。 ディーラーの実装をするにはどうすればいいでしょうか。
>>677 IO.popen
rubyスクリプトがAIプロセスを起動する形になるけど
679 :
667 :2008/03/25(火) 20:55:26
素早い回答ありがとうございます。 これからじっくり調べてみます。
Ruby以外の言語も学ぶといいということでGaucheの本を買ってきた わくわく
681 :
デフォルトの名無しさん :2008/03/25(火) 22:58:33
Gaucheって言語じゃなくて処理系じゃないの?
それがわかる人はお布施以外の目的で本買ったりしないだろうな
いつもgoshで起動するからGaucheとか言われてもピンとこない
>>680 # ←についての簡易コメント
と
## 以下の行の機能について普通にコメント
と
###
### クラスとかの全体的にコメント
###
の使い分けをするようになると予測
=begin
=end
はEmacsだと微妙に使い勝手が悪い
クラスを宣言するまえにクラス呼んだらエラーになるの??? なぜか通らない。 baz = Hoge.new #←エラー??? Class Hoge def fuga #Something end end
>>685 ああ、俺もRuby知って最初にこれが引っかかった
なんだよ全文評価してから実行してるんじゃないのかよ、みたいな
687 :
デフォルトの名無しさん :2008/03/26(水) 02:23:53
俺も
BASICのように1行ずつ逐次実行してる結果のように見えるよね ちなみに baz = Hoge.new BEGIN{ class Hoge def fuga #Something end end } とBEGINブロックでクラス定義全体を囲めば「後ろに回す」流儀でも動作するが、 こういうことにBEGIN使うというのはおおむねやってはイカン
1. スクリプトを構文木とかバイトコードとかなんかそんなのにコンパイルする 2. そののち、コンパイルしたものをおもむろに実行する ふつーの言語では1の時点でクラスやメソッドが定義されるから「クラスより先にメイン処理」という書き方でも動作するんだけど、 Rubyでは2の中で動的に定義されるから「知らない」クラスやメソッドや変数は参照できない 1の時点で静的に定義するように言語を作ることもできたんだろうけど、それやったらただのPerlだな
690 :
685 :2008/03/26(水) 02:49:51
こんなに柔軟な言語なのにこれが仕様なのか!逆に驚き。 実際にコーディングすると部品化が進んであんまり気にならなくなるのかな?
691 :
デフォルトの名無しさん :2008/03/26(水) 02:56:40
俺も謎だったが慣れちゃったな〜
>>685 というか、Rubyでは(1ファイルで済む簡単スクリプトでは)いちばん下に "メイン処理" を書く
$!/usr/bin/ruby -Ke
class Main
…
end
class GetData
…
end
data = GetData.new.get
main = Main.new
puts main.parse(data)
こんな感じ
実行中にクラスの再定義とかできてしまうことのトレードオフですな
if hoge class Foo def bar p 1 end end else class Foo def bar p 2 end end end みたいなことができる今の仕様の方が柔軟だろう
class自体は何度も定義をオープンし直せるから、 class Hoge; end # とりあえずClassインスタンスを定数として存在させる baz = Hoge.new # newを呼べる class Hoge # fugaを呼ぶ前にfooをおもむろに定義 def fuga puts 'ふが' end end baz.fuga はOK
×foo ○fuga fooよりfugaだろ、と思って直し、後半をなおし忘れた
>>694 いや、newを先に書きたいのではなく、それで言うとbaz.fugaもまとめて先頭に書いておきたいのだろ
そのほうが逐次実行する内容が最初に目に付いてわかりやすいから
クラスやメソッドが何してるのかわからんうちから実行のとこだけ見せられても困るなという感じではある
なお、しばらく書き慣れて行き着くところはこういう形
require '組み込みライブラリ'
require '自作汎用ライブラリ'
require 'Hogeアプリケーション用クラスをファイルに分割したもの'
HogeApprication.new
require を無視すれば、メイン処理が先頭に来て自由に書けるように見える
なんだかんだ言ってRuby使いも先頭にまとめて書くとわかりやすいなと思ってるわけで
$PRELOAD とかそんな変数作って そいつが真なら全部読み込んでから実行されるとかは無理なんかね
>>697 いや今でも全部読み込んでからきちんと上から順々に実行されてるって
同じファイルに書いたクラス定義だけを先に実行して欲しいなら
>>688 のようにBEGINで囲め
>>696 そして require する各ライブラリの末尾で
if $0 == __FILE__
require 'test/unit'
#以下ユニットテストが続く
:
:
end
とやればいいわけだな
コンセプト先行なオモシロ言語をあんまり最初のほうで選ぶと 「Rubyでやってたほうがいいような気がする」 「っていうかHaskellで何ができるんだ」 というのが頭に残って学習が進まないからな 新言語のつまみ食いに慣れるまでは、Rubyと同程度には即効の有り難味のある言語を選んだほうがいい GaucheはLisp処理系の中ではかなり実利的だから好適
if val = load_from_xxx then puts "値は#{val}です" else raise 'xxxがnilを返したので何かエラーです' end という、 「右辺からnilが返ってくれば変数の中身も代入の返り値もnil」 というのを利用したif文の書き方は真っ当ですか?
>>702 val = load_from_xxx
if val then
…
と書かないで条件のとこで代入してしまうってことね
ややテクニカル、でFA
書くときは楽だけど、読み解くときちょっと面倒
メソッドチェーンがごっそりついてたり括弧がやたらあったりするのは個人的に勘弁
val = load_from_xxx or raise
...<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"」ってかけるんですか?
>>705 val = load_from_xxx or raise 'xxxがnilを返したので何かエラーです'
puts "値は#{val}です"
>>706 普通にやればいいだけのよーな気もするが…
うっかりmオプションつけて余計なとこまで地引網状態とかいうミスがありがちなので注意
改行跨ぐととたんに面倒になるぞ
>>707 利便性のために作られた関数的メソッドの存在が気になる場合は
Kernel.puts "hello" と書くといい
710 :
デフォルトの名無しさん :2008/03/26(水) 17:19:52
hello.rbというファイルを作って def message "hello" end と書いた場合 このmessageはどこのクラスに属しているんですか? それともどのクラスにも属していない?
>>710 自分でいろいろ試せよ
Rubyは壊れたりしないから
class Object
def message
'hello'
end
end
puts message
# 実行結果
hello
ということでObjectクラス(実際は
>>709 の言うようにKernelだったはず)
トップレベルでいちいちクラスとか考えてたらめんどくさいのでちょっとだけ特別扱いされている
>711 ・行頭の半角スペースは無視される ・連続した半角スペースは一つにまとめられる
713 :
デフォルトの名無しさん :2008/03/26(水) 17:55:38
いろいろ試そうにも、そもそも class Objectってのが、どこから出てきたのか分からんし そういう発送がないんだけど とりあえず「Kernel」に含まれるこちは分かりました。 ありがとう。
属するクラスがどうこう、という話を振ったなら、 全てのクラスの親のObjectくらいは知ってると思われても仕方ないと思われ
715 :
デフォルトの名無しさん :2008/03/26(水) 18:03:40
いや、Objectがすべてのクラスの親だとは知っていますよ。 ただ、どこにもクラスの定義をしてないので Karnelに含まれるっていうのが思いつかなかっただけで。
717 :
653 :2008/03/26(水) 19:41:39
結局、 uri.update とするとuriの中の@uriを@uri.read(header)して headerには@last_modifiedや@etagや@cookieを詰め込んだりするようにしました で、クラスの名前は Mechanize2 とかでどうすかね がっかり 世の中の再発明ってそんなもんだよね
curl使えばいいのに
>>717 Ruby標準ライブラリを駆使するぜ!
WEBrick::Cookie とか存在忘れられてて地味に便利だしな!
とか思ってたら Mechanize::Cookie でナチュラルに取り込まれてたりする
全く以って世の中そんなもんだ
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は存在していますが、何故ドライバが読み込めないのかが分かりません。 誰か分かる方がいらっしゃれば教えていただけないでしょうか。 よろしくお願いします。
$GEM_HOMEって具体的に何のためのディレクトリですか?
>>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
rubyスクリプトでもtclsh並みに 外部コマンドを自然に書きたいです。 system "foo|bar > baz" みたいにquoteしてると見辛くて。。。
何らかの手段でクォートしないとそれこそ見辛いじゃないか シェルに渡す部分と自前のクラスやメソッドが渾然としてるほうがめんどくさい Shell.install_system_commandsが流行らない理由はそこだろ
>>710 def whoami; p self; end
whoami
後はリファレンス読んで。
>>723 %x{ foo|bar > baz }
リファレンスのリテラル - コマンド出力参照
727 :
デフォルトの名無しさん :2008/03/28(金) 02:56:33
aaa = ["あああ","いいい","ううう","えええ","おおお"] こういう配列があって、 ”えええ”という文字が、配列の何番目に来ているかを返す方法ってありますでしょうか?
>>727 aaa.index("えええ")
=> 3
>>726 いやそれブレースでクオートしてるじゃん
tclshにはUnknownプロシージャという仕組みがあって、これはRubyで言うmethod_missing
これで、未定義のtclコマンドがあれば外部シェルに丸投げしてる
lsというメソッドが無かったらシェル上でlsというコマンドが有効かどうか試す
愚痴なんだけど class A attr_reader :val def start @val = Array.new val << 'hoge!' end def hage # … val << 'hage!' end end こういうコード書かれるとわかりにくいので読むの苦手だ @val << 'hoge!' でいいじゃんよ attr_reader という字面に引きずられてる俺が悪いのはわかってんだけどさあ
クラスの内側からゲッター呼んだ記憶がないんだけど そういうコードってなんかメリットあるのかな
>>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 みたいになってるって事??
734 :
733 :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が可能な方法ってある?
737 :
デフォルトの名無しさん :2008/03/28(金) 13:43:16
>>736 735の、各A, B classの、include, extend をした上で
「include M」なしでM.hogeって事だよ?
module Mに module_function :hoge ってやってもエラーになるけど?
>>732 リファクタリングで言うところの「フィールドのカプセル化」じゃないのかな。
rubyでそれが有効かどうかは知らんけど。
なるほど、フィールドのカプセル化の*つもり*で > 最初にインスタンス変数に設定するときだけ @val= を使って、 > クラス内で値を参照したり追加したりするときは必ずvalというアクセサ経由 とかやってるのなら納得がいく 本当にそういう誤用なのかは実際のコードを見ないとわからないけど
>>737 module M
def self.hoge(s) print s, "\n"; end
def hoge(s) M.hoge(s); end
end
というのはどう?
>>732 ケント・ベックの言う Indirect Access パターン[IPB47,SBPP101] ですね。
当該クラスを継承してアクセッサをオーバーライドするときに威力を発揮
しますが、読みやすさとのトレードオフを考慮する必要があります。あと、
Java や Smalltalk と違い、メソッドコールの際に () や self を省略できる
Ruby では、同名の一時変数がアクセッサを遮蔽してしまう問題もあるため
要注意です。
Ruby/SDLには塗りつぶし多角形を描く命令ってないんでしょうか?
> 当該クラスを継承してアクセッサをオーバーライドするときに威力を発揮 うおーなんかすごい納得した けどなんかテクニカルだね
>>741 >Ruby では、同名の一時変数がアクセッサを遮蔽してしまう問題もあるため
これはまったよ
class Hoge
def title=(text) ; ... ; head.title = text ; end
def init(params) ; ... ; title = params[:title] ; end
end
なんて書くと、ローカル変数のtitleが作られてそれに代入される
self.title = ... て書かないといけない
>>745 というか、わざわざ module を使う時点でこんなのしかないぞ
rubyに JavaScriptで言うところの with(){} はありますか?
>>747 JavaScriptはよく知らんが、ぐぐった限りでは instance_eval が近そう
Javascriptのwithは使うな。Mozillaでも非推奨になってる。
750 :
747 :2008/03/28(金) 18:53:45
>>748 >>749 情報ありがとうございます。
簡略化好きなRubyが
JavaScriptのWith()勝手なメソッドを実装していないのは意外ですね。
Pascalにもあるwithってことで matz的には相当昔に検討してそうだな
with (x) do with (y) do end end とかするとどうなるの? 内側優先?
withの外にもレシーバ無しで呼べるメソッドやら変数があるんだから やるとしても、入れ子特有の問題はないと思う(つまり内側から探索) ローカル変数なのかメソッド呼び出しなのか、スコープが錯綜しすぎて暗黙の絞込みが出てくるとか その辺の経緯はぐぐったらMLが出てくるはず ところで、with文がある言語では、文内ではプロパティの操作のみに束縛するの?
そいや、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 ↑の呼び出しの"."と"::"は同じ意味なんですか?
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
758 :
757 :2008/03/29(土) 14:38:02
あと、編集してるソースコードは、S-JISなんですけどね。
ruby -Ks 757.rb でどうよ?
760 :
757 :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
$KCODEに設定する値に ks なんてのはない。(nと同等だろう) $KCODEへの値の設定が行われるタイミングでは既にスクリプト が構文ツリーへ変換されたあと。スクリプト自体が書かれている 文字コードは変換前に判明している必要があるから、スクリプト の中ではなく、起動オプションで指定するの。
$KCODEは先頭の1文字しか読まない $KCODE='s' と $KCODE='SEXフレンドになってくれる人妻募集!' は同じように扱われる ruby 起動時の引数の -Ks は $KCODE 以上の意味を持つ -Ks を指定すれば $KCODEは自動的に "SJIS" に設定されるから指定する必要はない あと、マルチバイト対応させた正規表現の \w はマルチバイト文字を含むから それを反転させた \W はアルファベットでも漢字でもひらがなカタカナでもない何か を表す
763 :
757 :2008/03/29(土) 15:13:07
> $KCODEに設定する値に ks なんてのはない。(nと同等だろう) なるほど。 しかしなんでまた、ヘルプに漢字を処理しない'n'でマルチバイトの正規表現が出来て S-JISの's'がマッチ出来ないのでしょうか?
764 :
757 :2008/03/29(土) 15:17:53
>>762 ああ、だから'n'でなければダメだったのですか。
あと、ウェブ上を色々見てると'jcode'は
色々と広範囲に渡って影響が出るので
なるべく使用しないほうが良いみたいな説明があったのですが
やはりあまり使用しない方がよいでしょうか?
765 :
757 :2008/03/29(土) 15:22:57
それと結局 -Ksや$KCODE='s'でマルチバイト対応させた場合 正規表現で、英数('_'含む)以外文字があるのを発見するにはどう記述すればいいのでしょうか? /\W/ ←これは使えないので… 質問ばかりで申し訳ないです。
/[^0-9A-Za-z_]/
767 :
757 :2008/03/29(土) 15:47:35
>>766 う〜ん、[]文字クラス中に'^'があった場合は、それ以外って意味になるんですねぇ…
Rubyのヘルプの正規表現の項に、説明が無かったので分かりませんでした…
ありがとうございました!
rubyとrailsのapiを探してるのですが、どちらも個人が作ったような怪しいサイトしか見つかりません 実際に開発されてる方がよく見ているapiのサイトなどがありましたら教えてください
あ、Ruby自体はターミナルからri(or fri)。
Windowsだとヘルプファイルになってるのがあったよーな。
ファイル・クラス・メソッド・本文の4ペイン式のって微妙に見づらいというか把握しづらいんだよね もーちょい有機的に繋がる表現法があるといいんだけど
個人サイトだけどapi.rails2u.comの使ってる人は結構いるんじゃない?
Railsのapp/modelsにあるファイルに validates_presence_of とか validates_format_ofってメソッド?を記述しますよね 引数として、 validates_presence_of :title :description のような書き方をしますが、どうしてシンボルにする必要があるのでしょうか?
>>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/
777 :
775 :2008/03/30(日) 01:00:30
>>776 丁寧にありがとうございます!
しかし全く理解できません。馬鹿ですいません。
勉強し直して来ます!
>>777 validates_presence_of というのが何かよくわからんが、
titleと書いてしまったらtitleメソッドの返り値に実際に入ってる文字列とかnilとか
そういうのそのものが評価されてしまうではないか
「titleという変数だかなんだかをチェックしてもらいたい」場合は、
引数に 'title' や :title という書き方をするのが普通
メソッドの可視性を無視しprivateなメソッドを実行する目的でinstance_evalが 使われる様ですが、privateにしてあるメソッドをわざわざ外部から呼び出す というのは、C++を使用したことのある私にとって、とても違和感があります。 どの様な場合にこのような呼び出しが用いられているのでしょうか?
>>779 設計意図が理解できない人間がアクセスしようとした時じゃないか?
でばっぐよう
てゆーか、Rubyを常用してる人間からしても「こんなこともあろうかと」という奥の手的な処理だぞ どうしても呼び出したい値(メソッド)があるから 「(ファイル○○のxxx行目に)この文字列がスクリプトとして書いてある」 ことにして実行させるというだけだ privateを無視するために存在する記法ってわけじゃない CやC++やJavaだけしか知らないのなら、evalという概念について調べてみるといい
>>779 インタフェース以外に、実装のテスト書くときとかさ。1.9より前だとsendの第二引数でprivateなの呼べるけど。
どうしてもそのオジブェクトのコンテキストで実行したいなにかがある時に使うもんだと思う。
>>782 instance_evalはブロック渡せる。
説明が不完全な場合も多いよね 「もちろん instance_eval を使えばメソッドを実行することはできます」 というような書き方にしとけば勘違いも減るんじゃないかと思う
$ 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 あれー?
説明しよう!
rubygems 本体のアップデートは rubugems-update をインストールしただけでは駄目で、
別途 /usr/local/bin/ とかにある update_rubygems を自力で実行しないと駄目なのだ!
なんでこんな二段構えになってるのかは不明
っていうか
>>785 のページにもアップデート方法としてきちんと書いてあるじゃん
書いてあるけど、 gem update --system が最近のやり方だな。
>>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をパースさせると死ぬのでこの場合は無理だったということで
今度からは使えそうなのでそれ使う
いちソフトウェアのライブラリのアップデーターやインストーラーがメモリ128MB使い切るって邪悪だな
獅子は兎を狩るのにも全力を尽くすの理
>>790 rubygemsメイン開発者層の人は対処したいと感じるほど困ってないんだろうか
困ってないんだろうな
あるいは英語圏OSでは問題発生しないとかさー
牛刀で鶏をなんたらの間違いじゃないか XMLをDOMにパースしたらとんでもなくメモリ使うけど YAMLもそういうクチ? SAXみたいなインタフェースないのかな
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
それ 0.9.5 だから、これまで主流の 1.0.1 にはすでに反映されてる
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 拡張ライブラリを入れるにはどうしたらよいかよろしくお願いします。
797 :
779 :2008/03/30(日) 18:11:59
遅くなりましたが、レス有り難うございます。 私のinstance_evalに対する認識がずれている様なので、再度調べてみます。 有難うございました。
mswin32版バイナリをインストールすればcurses関連は標準で入ってないか? でもこれ自分で入れたのかもしれんなあ。覚えてないや。 curses.so というファイルがrubyインストールフォルダのどこか (たぶん、lib\ruby\1.8\i386-mswin32)に入ってなければ、そもそもcurses対応になってない
ActiveScriptRuby には curses.so が入ってなくて動かなかった mswin32版ダウンロードして curses.so だけコピーしたら動いた
下手にASRをインストールするよりmswin32版を普通に展開したところに RScript18.dllなどをコピーしてregsvr32したほうが色々面倒が無くて良い気がする。
シンボルの概念がどうしても理解出来ません ある時は変数になったり ハッシュのキーになったり メソッド名になったり javaしか分からない私にどなたかjava的なヒントをください…
Lisp/Schemeをちょっとだけかじるといいと思います
識別子
>>802 よく分からないうちは「生成がとても軽い文字列」なんだと思えばいい
ただし、端末や画面に表示するときには使わない
あくまでスクリプト内部で文字列的なものが必要なときに使う
>>802 自動生成されるenumだと思えばおk
…あ、Javaにはなかったか。
「internされた文字列」でググれ。
>806 enumはJava5以降あるにゃあるが、いろいろと奇天烈なので あまし例えにつかわんほーが。
優しい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 てなもん。まあ、シンボルは整数の代わりと思うといいよ。
>>802 名札オブジェクト
いや、そういう理解で困るような使い方はそうそう無いと思う
変数「の名前」やメソッド「の名前」を指すときに使う
やっぱりlisp系やってない人向けの説明ってどーもすっきりせんよね。
>>810 でも一度シンボルの存在を知ると「なんで××にはシンボルが存在せーへんのやー!!」とちゃぶ台返ししたくなる罠。
# Java も intern() があるくらいなんだから、組み込みのシンボル用意してくれればいいのに。
でも下手に説明して同意をもらうと公開メソッドの引数のハッシュのキーが全部Symbol限定に… もちろん「Stringをキーにするのは不自然」とか言いだすから変換措置なし
# ネストしたハッシュの一番奥のvalueを配列にする arr = [] h.each_key do |k| h[k].each_key do |name| arr << h[k][name] end end return arr キーによるアクセスにこだわってるみたいなんだけど、これ何かご利益ある?
その処理だけなら、ないんじゃない?
「hのkのnameをarrに追加」と読み下せることを目的にしてるのかも
817 :
677 :2008/03/31(月) 21:19:47
>>677 です。
すいません。また教えてください。
IO.popenをつかってディーラーとAIでやり取りできるようになったのですが、
AIをpopenで起動するとコマンドプロンプトが表示されてしまいます。
コマンドプロンプトを表示しないでpopenする方法はないでしょうか。
ディーラーの部分はRuby/tkで実装していて、rubywで実行しています。
818 :
677 :2008/03/31(月) 21:23:16
書き忘れましたが、実行環境はWindowsです。
Rackって普通のCGIスクリプト(サーバーとして単体起動しない)でも使えるのかな? 試してみた人がいればぜひ教えてください
RagelとRackって同違うんだっけ? ステートマシンコンパイラとコンパイラコンパイラの違い? 分からん。
Raccだよな多分。 RackはWEBアプリの仕組みの違いを吸収するフレームワークだっけ。 Ragelはステートマシンコンパイラらしいから字句解析に使えて、 Raccはパーサジェネレータで構文解析に使える。あわせて言語処理系でも作れる。
>>817 > AIをpopenで起動するとコマンドプロンプトが表示されてしまいます。
> コマンドプロンプトを表示しないでpopenする方法はないでしょうか。
そのAIをGUIモードでコンパイルするか、
cygwinのrun.exeを間にかます。
>>814 > # ネストしたハッシュの一番奥のvalueを配列にする
簡単に書くとこうか?
arr = []
h.each_value {|v| arr.concat v.values}
824 :
817 :2008/04/01(火) 20:36:39
>>822 できましたっ
ありがとうございました。
>>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"))みたいのをしてくれるとおもったのですが 根本的にまっちがってるフラグ????
>>826 dup2が理解できるレベルなら、素直にリファレンスを見なさい。
828 :
デフォルトの名無しさん :2008/04/02(水) 19:09:44
>>826 うちではちゃんと動いた。
シェルは何使ってる?
829 :
826 :2008/04/02(水) 19:18:47
うおおおおおおおおおおおおおおおおおおおおおおお うごきました Zsh@cygwinなのですがbashからよんだらちゃんと動きました ありがとうございます
830 :
デフォルトの名無しさん :2008/04/02(水) 19:25:32
827==830涙目?
ブロックの前の空白が気になる
うちは駄目、シェルは普段 tcsh なんで /bin/sh
ruby 1.8.6 (2007-09-24 patchlevel 111) [i386-freebsd6]
で
>>826 と同じ結果
9 までは通るけど 10 以上だと駄目になる
file descriptorが一桁しか使えない?
if の条件が長くなって複数行になる時って、どうすればいい?
自分が本当に正しいことをしてるのか考える 関数にまとめる
Rubyに関数なんてありませんよ
>>836 了解です。仕様的に、条件を複数行にはできないってことですね。
リファクタリングしてメソッドにします。
>>838 え?別にできるけど。
if a == 1 &&
b == 2
puts "hoge"
end
みたいなことだよね?
>>839 if a == 1
&& b == 2
puts "hoge"
end
こうしてました。。。こっちだとダメみたいです。
ありがとうございました。
>>840 改行も区切りの一種になっているため、末尾に演算子があるとか、
カッコが閉じてないとか、明らかに行が終わっていない場合を除いて、
そこで式が終了する。
&&を次行の行頭に持っていきたい場合はカッコでくくればいい。
(あまりRubyらしくないけど)
>>841 そうみたいですね。
ただ、以下のようにカッコで括ってみてもエラーでした。
ver.1.8.4 です。
if (a == 1
&& b == 2)
puts "hoge"
end
>>842 if a == 1 \
&& b == 2
puts "hoge"
end
先に条件式の結果を出して、ローカル変数に入れるという方法もある c = (a == 1) and (b == 2) if c then puts "hoge" end
if longlonglongcondition == value1 and verylonglonglonglongcondition == value2 がヨコに長くて嫌だって人に c=(longlonglongcondition == value1 and verylonglonglonglongcondition == value2) if c then を勧めるのは、正直どうかと思わなくもない
12345678901234567890123456789012345678901234567890123456789012345678901234567890 1 2 3 4 5 6 7 8 なんだかんだ言って80文字程度で改行するというのは今の時代にも生きてるんだな
>>844 が馬鹿ってのはruby的にはそういうことしないってこと?
リファクタリングの1つだよな。
もちろん変数名はcとかじゃなくてちゃんと意味のある名前にするけどね。
849 :
848 :2008/04/04(金) 10:46:18
ああ、ただ今回の要件には向かないな。失礼。
要は
>>846 だな
Rubyの継続行のルールはようわからん
andとかorとか&&とか||の直後で改行した場合は必ず継続行とみなしてくれるのでそれ使ってる
ようわからんからこそ、俺は常にバックスラッシュ。
改行したところまでで完結した式とみなせるかどうか、だけのはずなんだがな。
853 :
デフォルトの名無しさん :2008/04/04(金) 23:13:28
WindowsのRuby開発環境で一番人気って何ですか?
cmd + edlin
NTEmacs + ruby-mode
>>853 WindowsでRubyを使うこと自体が間違い
>>854 edlin使ってるヤツ見たことないw
つっても俺もVimだが
cat+echo
winか type + echo
Cygwin + Meadow
>>853 一番人気と言えるようなものはない、が正解
Eclipse + RDE xyzzy + ruby-mode VisualuRuby Meadow + ruby-mode NetBeans + Ruby Pack Rubyスクリプト着色可能なエディタ 選択肢としてはこれくらい? Vim系列って着色以上の機能ってあったっけ?
3rd Rail
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() のところでプロセスが ブロックされるようで、終了しません。 どうしたらいいでしょうか。
RDEはブロック書いたときにしょっちゅう落ちてたからやめた。
>>863 Ctrl+Pでキーワード補完ぐらいなら
io.close_write しなきゃ
>>867 >io.close_write
なにこれー こんなのあるかよ
ちょーさんくすです
Rubyを始めたいのですがまず何をすればよいのでしょうか?
872 :
デフォルトの名無しさん :2008/04/06(日) 00:55:58
モジュールの深さってどのくらいがふつう? module プロジェクト名 module システム名 module サブシステム名 class クラス名 end end end end とか深すぎ?
そのへんは実際のディレクトリを反映するはず 規模にもよると思うんだが、個人で一生懸命作るぶんには module アプリケーション名 class メインクラス end class いろいろクラス end module 便利モジュール end end これくらい? あまり深いとわけわかめだぞ foo = AAA::BBB::new foo.hoge になるのが個人的限界
Javaのpackageみたいな仕組み作ってくれよ
3が深すぎで1が浅すぎだったら2しかないじゃん
3深すぎ 1浅すぎ 2中途半端 なしすっきり こうですか わかりません
Rubyの達人は2.5とかが可能
全部特異メソッドで頑張るという手も
特異メソッドを得意メソッドにすればいいんですね
徳井メソッドって高橋メソッドみたいなもん?
>882 高橋と徳井じゃ実装してるメソッドが違うから 人間クラスから見た関係ではそうかもな。
open-uriで質問です あるURLを開くと、リダイレクトされた先がURLエンコードされていないファイル名を返してきます そこでrubyは「C:/Ruby/lib/ruby/1.8/uri/common.rb:436:in `split': bad URI(is not URI?):(問題のリダイレクト先)」とエラーが出ます これはどうすればいいんでしょうか?
くさったヘッダを返すところが悪い。 Net::HTTPでがんばれ。
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 こんな感じ?
それだけだと uri が不明な変数だっていうエラーが出るだろうな 単体で試せる完全スクリプトの形してる割には罠っぽい(w ruby って retry_once みたいなのって無いの?
新しくオブジェクトを作っているから
うん、いいとこに気づいたな String に << を使うと、オブジェクトはそのままで末尾に文字列が追加される String に += を使うと、以前の文字列と足す文字列を足したものが新しいオブジェクトになる 本当に必要なのはただの長々とした文字列であるはずで、 毎回新しくオブジェクトが生成されるというのはとても無駄だ
str の末尾に 'hoge' を追加する、という処理を体現するコードは str = str + 'hoge' ではなく str << 'hoge' である、というだけなんだけどね str + 'hoge' が返すオブジェクトは str とは何の関連性もない そんなん好みだろ、と言われてしまうとどうにもならんが、かといって 「str がメガ単位の大きさになるかもしれないから今回は + 使うのやめる」 というブレた判断をするのはそれはそれでとても不恰好だろ
このへんがわかるとRubyが面白くなるが、症状が変なほうに進むと 「URIクラスにreplaceが無いのは変だ」とか言いだすので注意
URIにto_strがないのが不便です
せっかく削ったのに…
まあ、パフォーマンス度外視なのがスクリプト言語だしね。
require 'rubygems'したあとYAMLでファイルに保存するんだけど File.open(file, "w") { |f| YAML::dump(data, f) } と書いてしまうのはWindowsのbinnmodeとかあのへんの問題はない?
>>898 ……多分。
……YAML はテキストだし。
……まあ不安なら "w" を "wb" にでもしたらよろし。
そこまで書いた上に気になってるなら、素直にbinmodeにすればいいと思う。 害はたぶんないだろう。
DOSISHではないプラットフォームでも テキストモードなら\r\nも改行文字として扱ってくれると便利なんだけど、 そうなっていない理由ってあるのかな。 日ごろ区別する必要のない人たちには不要な機能だから?
902 :
901 :2008/04/08(火) 10:50:24
あ、
>>901 はテキストモードでの読み込み時の話ね。
universal newlineだね。 導入しようという話はあるんだが。
904 :
デフォルトの名無しさん :2008/04/08(火) 23:58:37
ゲーム作ろうとして、MyGame(Ruby/SDL の Windows バイナリ同梱) をダウンロードしたんですけど、なぜかインストールできません。 だれか詳しい方、助けてください。(ちなみにOSはvistaでActiveRubyはインストール済みです)
>>904 どの段階で失敗するのかをできるだけ詳しく書きましょう
どうせ一人の力だけでは無理なんだし要点まとめる練習だと思うべし 質問のために要点まとめて問題点洗い出してたら解決したという困った事態がザラにある
907 :
デフォルトの名無しさん :2008/04/09(水) 00:39:24
>>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初心者レベルなので、具体的にどう対処すれば
よいのかわかると幸いなんですが・・・。
>MyGameフォルダ内のinstall_mygame.rbをダブルクリック >コマンドプロンプトが起動して、終了。 ホントはここでエラーメッセージが印字されてるんだろうなぁ…。 コマンドプロンプトから実行してみるとか。
911 :
デフォルトの名無しさん :2008/04/09(水) 02:01:29
>>910 さんのアドバイス通りやってみました。
・・・が結果は同じでしたorz
いや、なにも改善してないんだからまた失敗するのは当たり前で… コマンドプロンプトから実行しただけで良くなるわけが無くて… エラーメッセージが吐かれたならそれを読み解けといってるわけで…
Rubyは高級言語なのでWindowsユーザは別の言語をお使い下さい
>>907 # 使ってないから知らんけどvistaなのが悪いとか?
mygame/rubysdl-1.3.0-mswin32-1.8.5-p12/README.ja.win32 読んでみ
特に 3.1 のところ
で、然るべき場所にそれらのファイルがあるかどうか確認
>>909 ここは人力検索サイトじゃない
コマンドプロンプトが起動できるぐらいなら、まず自分で出来る限りのことをやれ
少なくとも
1. コマンドプロンプトの実行結果をきちんと読む
2. sdl.rbが存在するかどうかを確認する
ぐらいはできるだろ?
あときちんとsage
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>
ERBならそれでいい HTMLとして読みやすいことが第一 Rubyとしての論理構造を気にするなら最初からRubyで書け(w
システムが使ってなくて目立つprefixってなにかありますか? _myvar =3 は一応通るみたいですが。
>>917 縦にデータ並べたいときとか列の数変えるとき便利かと思ったんですけどこのままでいですかね
>>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ってなんじゃらほい
スレ違いだったらスルーして。 Rubyにredmine入れたんだけど、 英語表記なんだよね。 redmineの設定メニューで Japaneseにしてるのに英語のまま。 だれか経験したことないですか?
923 :
デフォルトの名無しさん :2008/04/09(水) 22:40:35
rubyの中からシェルの環境変数を設定するにはどうしたらいいですか? ENVに代入しても、Rubyの中だけでしか有効ではないようです
>>923 まあそりゃそうだろ
「自分」が起動したシェルにしか自分が設定した環境変数の効果は及ばない
「他人」が起動したシェルにも設定を及ぼしたいのなら、OSが管理するシェルの起動設定そのものに手を入れるしかない
それはRubyの仕事ではないので、使ってるシェルの設定ファイルとか設定コマンドとかを直接編集すれ
>>922 インストール時の rake load_default_data で ja を選んだ?
あと、ユーザごとに表示言語の設定があるので、マイアカウントの設定で日本語を選んで。
>>924 Rubyでシェルのコマンド文字列を生成して、シェルのバッククオートを使うとか、
Rubyの中からサブシェルを起動するとか。
脱初心者の目安ってありますか?
>>927 Ruby学習者の15段階
レベル0: Rubyを宝石の名前以外に思いつかない
レベル1: 関数的メソッドだけで乗り切る。ドットの意義がわからない
レベル2: 関数的メソッドを自作する。ドットを「〜の」と訳すがオブジェクトはよくわからない
レベル3: クラスを形だけ自作するがinitializeのスペルを間違える。printfをダサいと感じるようになる
レベル4: モジュールを形だけ自作するようになる。RubyをBetterPerlだと吹聴するようになる
レベル5: cgi.rbを読んで絶望する。array.rbを探すがRubyスクリプトとして存在しないことに憤りを覚える
レベル6: 自作のスクリプトを公開するがバージョン0.1.3で放置される。「それRubyでもできますが」が口癖になる
うわ間違えた、printfではなくsprintfね ちなみに 「全てを自作オブジェクトで表現しクラス構造が網の目のようになる」 のレベル7の次くらいで有用性を許容します
添付ライブラリのソースを読めるくらいが初心者脱出の目安だと思う… 何やってんだかさっぱりわからん、といううちはまだ初心者ということで
optparseを読めないと初心者脱出にならないのか!
あれはコメント部分に AA 解説がある時点で危険信号が点ってはいるな 身近なとこで net/ の下くらいでいいんじゃないかとも思う comlex.rb とかも数学の知識ないと読めねーぞ
>>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 でした
ワイルドカードがいらないんじゃないの
>>935 FileUtils.cp_r(Dir.glob('/path/to/src/*'),'/path/to/dest/')
マニュアルくらい読んどけって話だな 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] がディレクトリなら再帰的にコピーします。 ということで、ファイルパス文字列かファイルパスが入った配列のどっちかしか受け付けね
Dir.glob がライブラリの内部で正規表現使って記号を探して 自前でディスクを走査して配列返してるだけってのを知ったときはちょっとショックだった