09/05/23 21:41:37
すみません、最後に勉強のためにも教えてください。
納得したらもう寝ます。
>>171にある、STDINからの入力を読み終わる前に、STDOUTに出力してしまうということがあり得るのでしょうか。
全て入力した後に IO#close_write も呼びましたし、他に意識することって何でしょうか。
Pythonの os.popen2 で同様の事をやってみたのですが、あっさりうまくいって
クソワロタ状態です (;_;)
>>173
ファイルシステムに頼らずにゴニョゴニョしたいので、開いたままで
何とか出来ないかと考えておりました。... 無理そうなら他の方法も探しますが。
> あとFind.findからyieldされるパス名はchompする必要はない、
> というかしてはいけない。
すみません、確かにchompする必要はありませんでしたね。
でも「してはいけない」というのは何か致命的にまずい問題があるのでしょうか。
以上、よろしくお願いします。
176:デフォルトの名無しさん
09/05/23 23:24:38
whileの条件による終了(ループ脱出?)が分かりません。
下記は受信サーバー側のSocket通信の記述で、クライアントからの
信号s(オブジェクト)を受信したらRubyを終了したいのですが・・・
while true
Thread.start(gs.accept) do |s|
print(s, " is accepted\n")
puts(s.gets)
s.close
break # ここでは無効
end
end
どう変更すべきでしょうか?
177:169
09/05/24 00:19:36
あああ、pythonでうまくいったというのは勘違いでした。(test caseのミス)
でも
IO.popen("cat | afio -oZ -")
のように、catコマンドをクッションにしてみたらうまくいきました。
なんでだろうね。
バッファの関係??
朝起きたらlinux板でも行って聞いてみます。。もう疲れた。
178:デフォルトの名無しさん
09/05/24 01:15:44
>>175
> >>171にある、STDINからの入力を読み終わる前に、STDOUTに出力してしまうということがあり得るのでしょうか。
もちろんあり得る。それはプログラムの構造次第。afioの場合ファイル名を受
け取れば処理できるんだから、一つ分出力してもなにも不思議じゃない。
>>177は、catでバッファリングされてclose_writeされるまでafioに何も渡されて
ないんだろ。
> >>173
> ファイルシステムに頼らずにゴニョゴニョしたいので、開いたままで
> 何とか出来ないかと考えておりました。... 無理そうなら他の方法も探しますが。
書き込みと読み込みでThreadをわける。
IO.popen(COMMAND, "r+") do |src|
Thread.start do
Find.find("/etc") do |f|
src.puts(f.chomp)
end
src.close_write
end
File.open("myArchive.afz", "w") {|dst| dst.write(src.read)}
end
> でも「してはいけない」というのは何か致命的にまずい問題があるのでしょうか。
"\n"で終わるファイル名を正しく扱えない。
179:デフォルトの名無しさん
09/05/24 01:19:36
>>176
mth = Thread.current
while true
Thread.start(gs.accept) do |s|
print(s, " is accepted\n")
puts(s.gets)
s.close
mth.raise(SystemExit)
end
end
180:デフォルトの名無しさん
09/05/24 01:32:45
>>176
gsってTCPServer?
サンプルをコピーしたとするとwhileで囲う必要もスレッドを生成する必要も無いと思う
s = gs.accept
print(s, " is accepted\n")
puts(s.gets)
exit
181:176
09/05/24 02:49:36
>>179-180
Thx 確かにwhile文無しでもOKでした。
今回は URLリンク(www.ftnk.jp)
を参考にしました。
すいません。もう一つ質問です。
上記HPのクライアント側を改変して2行のテキスト「memo.txt」を読み込み
サーバーに渡すように
data = File.read("memo.txt")
puts data # チェック用
s.puts(data)
を書きました。
クライアント側では2行で表示されるのですが、サーバーの表示 puts(s.gets)
では最初の1行目のみが表示されます。
これは何故でしょうか?
182:デフォルトの名無しさん
09/05/24 03:57:22
文字列がcopy on writeじゃないのが他の言語と違って結構ハマることが多いのですが、
何か気をつける方法ってないのでしょうか?
Rubyでは全部オブジェクトってのはわかっているつもりなのですが…。
#!ruby -Ku
a = "hage"
b = a
b << "UNKO==!!"
def change_string(s)
s << "(((^^)))))"
end
change_string(b)
puts a, b
結果:
hageUNKO==!!(((^^)))))
hageUNKO==!!(((^^)))))
183:デフォルトの名無しさん
09/05/24 04:50:17
>>181
IO#gets が何をするメソッドなのかマニュアルで調べてみ
>>182
それって別に文字列に限った話じゃないよね
配列、ハッシュ、その他のオブジェクト、なんでも当てはまる
オリジナルでは無くてコピーが必要なら必ずdup,clone、を徹底するしかないかな
184:176
09/05/24 05:02:30
>>183
どうも。
readに変えたらOKでした。
185:デフォルトの名無しさん
09/05/24 05:45:31
>>182
Rubyのあらゆる変数(や定数)はただの参照タグだ
a = HogeObject.new は HogeObject.new の処理の最後を辿って(return してた)そのオブジェクトに存在を許して
それに a という参照タグを1個つけるという行為
b = a は a の処理の最後を辿って、つまりは a の返り値のオブジェクト、に b という参照タグを追加する行為
Ruby スクリプトは変数の名前を後生大事に覚えてるわけじゃない
Rubyはスクリプトのそれが変数名だとわかったら、その変数が参照している先にあるオブジェクト
(の保管場所を表す数値「オブジェクトID」)だけを記憶する
だから、
a = なにか
b = a
と書いた時点で、変数 a も変数 b も全く同一のオブジェクトを指す(つまり、一般的にはあまり意味がない)
a = "なにか"
p a.object_id
b = a
p b.object_id
p a.object_id == b.object_id
186:182
09/05/24 05:51:03
>>183 >>185
せっかく説明してくださって申し訳ないのですが
原理をわかってて言ってるのです…(´・ω・`)
他の言語のつもりで書いちゃうと、ついバグを埋め込んでしまう
まあ、ユニットテストしっかりしろってことになるのだと思いますが…。
187:デフォルトの名無しさん
09/05/24 05:52:21
で、既存のオブジェクトを破壊せずに、その内容を利用した新たなオブジェクトを作りたい場合は、
その既存のオブジェクトを破壊しないような方法を意図的に使う
a = "hage"
b = a + "ADD"
def change_string(s)
s + "CHINGE!"
end
c = change_string(a)
p a, b, c
結果:
"hage"
"hageADD"
"hageCHINGE!"
オブジェクトを「足して」新たなオブジェクトを作るようなメソッドが提供されていなかったらどうするか、というのなら
そりゃ>>183の言うようにオブジェクト内容自体を複製して新たなオブジェクトを作る dup や clone を使うしかあんめえ
188:デフォルトの名無しさん
09/05/24 05:54:44
>>186
「わかってない」と思う
わかってるのなら“絶対に間違えない”から
逆にいうと、オブジェクトと変数の関係を理解するまではよーわからんバグで悩まされて
変数は安全のためにと称して全部 initialize やメソッド定義の 1行目で dup することになるんだけどな
189:182
09/05/24 05:57:44
>>188
「わかってる」のと「間違えない」というのは等しくないですよ。
わかってて、正しいことができるなら、俺は今頃、億万長者になってる
190:182
09/05/24 06:00:14
変なところだけレスして煽りっぽくなってしもうた orz 流してくださいwww
>>187
ああ、なるほど、確かに既存のオブジェクトを破壊しないでコピーされる場合は、OKですね。
>>188
メソッドなどで渡された引数とかなるべくdupするわけですか。なるほど。
191:デフォルトの名無しさん
09/05/24 06:01:54
>>189
いいえ、理解してないんです
「他言語を使いこなす俺がこれごときを理解できていないはずがない」というようにプライドが邪魔をしてるだけです
本当は理解してないのを見なかったことにして「他の言語と違って結構ハマる」と問題を差し替えているのです
これは特に目新しい概念というわけでもありません
きちんと理解しましょう
192:デフォルトの名無しさん
09/05/24 06:27:16
むしろ Ruby に慣れると、ほかのスクリプト言語で「同じデータ」を使う必要性が出てきたときに
メモリでどういう状態になってるのかがとっても気になる
Ruby なら同じものを使い倒してるということが感覚的にわかって安心できるんだけれど
193:デフォルトの名無しさん
09/05/24 06:41:45
>>190
よく読め
dup なんてまずしない
しなければならないときはもちろんするが、普通はしないで済む方法を考える
「とりあえず dup」をしないとわけがわからなくなる初心者は dup する、と言ってるだけ
いい解説に出会えない独学系初心者の多くが通る無駄道ではあるが、
こんな期間は短いほどいいし、これに嵌る前に回避できれば最高だ
194:デフォルトの名無しさん
09/05/24 06:44:59
>>182
「copy on write」とかいってる時点でまるでわかってない
195:デフォルトの名無しさん
09/05/24 07:51:49
>>167
>というように、メソッド内のローカル変数名とそのメソッドの名称が全く同じなのって、ある程度は紛らわしいですよね
>できれば避けるべきなんでしょうか?
心配なら変数名を _html とかに変えればオK
>>194
ワハハ、その通りだ
196:デフォルトの名無しさん
09/05/24 08:09:06
俺は「わかってれば絶対に間違えない」とは思わないな
他言語の経験が短い俺でも、たまにdupし忘れることがある
結局は慣れだろう
ただ、時々ではなくて頻繁に間違えるというのであれば、ちゃんと理解できていないのかもしれない
実際に間違えたコード例を晒してもらえれば、もう少し具体的なアドバイスができるかも
197:182
09/05/24 08:35:40
>>194
うーん?頼む!
2chでよくあるのだけど、「コイツはアホ」とか「わかってない」とか言う時は「何故か」を明らかにしてほしいです。
言っている本人は本当にそうなのか判断できず、煽りかと思ってしまうので。
"copy on write"は書き換えたら、コピーされるという意味の用語です。
この言い方は一般的じゃないのかな?
Delphiの組み込みのstringの機能がそう呼ばれているわけなんですが。
(ただ、この辺はけっこうマジック的な扱いで、
Delphiでも文字列と似たような振る舞いをする動的配列では、
copy on writeはしなかったりとDelphiの中でもけっこう戸惑う扱いです)
>193
慣れたら、dupしないように書く、ということでしょうか?
198:182
09/05/24 08:40:25
ああ、でも書いていて思ったけど、
オブジェクトのメソッド呼び出しで copy on write がどうのって確かに変だよなー。
そもそも、組み込み型じゃないん(というよりコンパイラが特別扱いしてない)だし
とはいえ、それよりも、
俺が聞きたいのは、どうすれば気をつけられるんでしょうか?ってことなんですが、
その答えは「理解しろ」ってことなんでしょうから、「お前はわかってない」なんていわれるんですよね…。
199:デフォルトの名無しさん
09/05/24 08:54:52
> どうすれば気をつけられるんでしょうか?
無駄に破壊的メソッドを使わないってだけでいいんではないかと思った。
200:デフォルトの名無しさん
09/05/24 09:02:24
>>185が普段使いで必要十分な一般的な理解
これができない場合は無理
201:デフォルトの名無しさん
09/05/24 09:10:34
オブジェクトと参照の問題ってだけだからな
202:196
09/05/24 09:14:13
>>197-198
>どうすれば気をつけられるんでしょうか?
実際に間違えてるコードを見ないと、何とも言えないが
とりあえず破壊的メソッドと非破壊的メソッドの違いを意識することは大事
あと copy on write に関しては、「Rubyにその概念はない」としか言えない
なぜなら
破壊的メソッド → オブジェクトの内容を直接書き換える(オブジェクトのコピーはしない)
非破壊的メソッド → 元のオブジェクトのデータを読んで、それを元に新しいオブジェクトを生成して返す
であって、どちらの場合も「書き換えたときにコピーする」という動作はしてないから
"abc\n".chomp! # 文字列 "abc\n" の内容を変更する(新しい文字列は生成しない)
"abc\n".chomp # 文字列 "abc\n" を元に、新しい文字列 "abc" を生成して返す
203:デフォルトの名無しさん
09/05/24 09:15:54
・代入したり引数で渡すだけじゃコピーされないよ
・破壊的なメソッドには大概 ! とか = とか付いてるから目安にして気をつけてね
としか
204:デフォルトの名無しさん
09/05/24 10:06:47
mutableと言いたいんだろcowじゃなくて
てかcowは実装の詳細であってプログラマからは掩蔽されるものだ
205:デフォルトの名無しさん
09/05/24 10:09:22
>>197
きみはもしかしたらcopy on writeについては理解しているのかもしれないけど
それがRubyとはまったく関係ないことが理解できてない
206:デフォルトの名無しさん
09/05/24 10:13:21
インスタンス変数の配列の要素への代入とか、ちゃんと最初にdupなりしておかないと
わけわからんようにはなりそうだけどね。
207:デフォルトの名無しさん
09/05/24 10:28:53
>>206
どっかでの変更がリアルタイムに反映されるなにやら便利な配列として扱うような気もする
ともあれ、目的を確定させた上で処理すべきだな
とりあえず○○するとかそういうのはありえん
208:169
09/05/24 13:03:40
>>178
|
\ __ /
_ (m) _ピコーン
|ミ|
/ `´ \
('A`)
ノヽノヽ
くく
そうか、子プロセスが終了するまで親プロセスはwait状態になるのか!
IO.popen("ruby -e 'sleep(30)'", "w") do |io|
p io.puts("my message") #=> nil
puts "ok, all finished !"
# After a few seconds...
p io.close_write #=> nil
puts "closed?"
end
うわー、完全に失念していましたよ。
wait状態だから、実際には IO#.close_write がコールされずに止まっていたわけか。
Threadを生成してやってみたらうまくいきました!
本当にありがとうございましたです。
209:デフォルトの名無しさん
09/05/24 14:56:40
ちゃうねん。
system(3) とかだと子が終わるのを待つけど、popenは同時に実行するためのAPI。
その例だと、何も読み込まない ruby -e 'sleep(30)' に io.puts("my message") で
書き込もうとして固まってるわけ。
210:デフォルトの名無しさん
09/05/24 15:58:43
169の環境はMS-DOSなのかも知れない
211:169
09/05/24 16:23:30
ピコーン!今度こそわかりました。
IO.popenでafioコマンドにパイプを確立し、IO#.writeで標準入力に読み込ませる。
afio君は標準入力から来たファイル名を開いて、適切なフォーマットで標準出力に吐き出そうとする。
afio「さあバイナリができましたわよ。もらってちょうだい!随時出力するから。」
しかしreadされないため、
afio「なにやってんの!早くreadしてよ。わたしのバッファサイズはそんなに大きくないのよ。
メモリだって有限なんだから。あなたがreadしない限りいつまでもwaitするわ!」
ということなんですね。
212:デフォルトの名無しさん
09/05/24 18:00:14
少しお聞きしたいのですが、
railsでrake db:migrateを行うと mysqlが以下のエラーを吐くのですが、
>rake db:migrate
(in d:/web/redmine/redmine)
== 1 Setup: migrating =========================================================
-- create_table("attachments", {:force=>true})
rake aborted!
undefined method `each' for #<Mysql:0x803e550>
(See full trace by running task with --trace)
これって、MySQL 5.1はWindowsだとダメヨという既知な問題なのでしょうか?
xamppごとMySQL 5.1を入れてしまっているもので、MySQL 5.0で上書きしてよいものかどうか・・・
Nabble - RubyOnRails Users - rake aborted! undefined method `each' for #<Mysql:
URLリンク(www.nabble.com)
213:212
09/05/24 19:08:38
>>212のサイトにあったInstantRailsのlibmySQL.dllを (rubyインスコディレクトリ)/bin に配置したところ、
無事にdb:migrateできました。
5.0のDLLだろうと思うので不安ではあるのですが、様子を見ながら使ってみようと思います。
>The problem is that libmysql.dll shipped with Mysql doesn't play well
> with ruby 2.2..
> The solution is to download the libmysql.dll from:
> URLリンク(instantrails.rubyforge.org)
> and save this in your ruby bin directory
ありがとうございました。
214:デフォルトの名無しさん
09/05/24 23:12:09
スレリンク(php板)
【Ruby】Ruby on Rails Part7
215:デフォルトの名無しさん
09/05/24 23:24:50
文字列を spl iして、文字種類の境界で分ける方法はありますか。
たとえば
x=("abc123+456def").split(/??書き方不明/)
とすると
x[0]="abc"
x[1]="123"
x[2]="+"
x[3]="456"
x[4]="def"
みたいにしたいのですが。
216:デフォルトの名無しさん
09/05/24 23:44:58
>>215
「文字種」の定義次第では可能。
217:デフォルトの名無しさん
09/05/25 00:02:58
>>215
たとえば、シンプルでいいなら下記のようなことはできる(splitじゃないけど)
"abc123+456def".scan(/[a-zA-Z]+|\d+|\W+/) #=> ["abc", "123", "+", "456", "def"]
んだから、>>216の言うとおり「文字種」を定義すれば可能。
で、それを定義してるUnicodeブロックなるものもあるらしい
URLリンク(module.jp)
Rubyでは鬼車採用の1.9以降、になるのかな?
詳しくないけど、参考になれば
218:デフォルトの名無しさん
09/05/25 03:58:48
Rubyの使用メモリ量を調べるにはどう書けば良いのですか?
219:デフォルトの名無しさん
09/05/25 04:05:30
>>218
できません
220:デフォルトの名無しさん
09/05/25 05:24:54
Ruby自体から知る方法は確かにないが、環境依存で外部ツールを読んで取得するライブラリがrubygemにあったと思う
221:デフォルトの名無しさん
09/05/25 08:25:31
undefined method `inner_text' for nil:NilClass (NoMethodError)
…う、うぜえ
222:デフォルトの名無しさん
09/05/25 12:13:12
どうでもいいけど、委譲関係ってマニュアルもるびまも要領得ないよね
223:デフォルトの名無しさん
09/05/25 12:16:27
メモリ使用量、ヒープの個数くらい
Cのメモリマネージャから取れるようにしておけばいいのに
無理な環境は0にしておいて
224:デフォルトの名無しさん
09/05/25 12:29:00
>>222
あんま多用して欲しくないんだよ
たぶん
225:デフォルトの名無しさん
09/05/25 15:11:55
GnomeVFS for Python の gnomevfs.get_file_info() ※
に相当する GnomeVFS for Ruby のメソッドをご存じの方いましたら教えてください。
※ URLリンク(www.pygtk.org)
226:デフォルトの名無しさん
09/05/25 15:31:28
これ廃止予定じゃない?
227:デフォルトの名無しさん
09/05/25 15:34:51
>>225
File.statじゃあかんの?
gtkとかgnomeとかってAPIコロコロ変えるから嫌い
228:デフォルトの名無しさん
09/05/25 15:38:36
>>227
VFSごしにウンタラカンタラしたいのだろう
229:デフォルトの名無しさん
09/05/25 15:41:44
Gnomeの開発者も、VFSはもうやる気がないみたいだがw
230:デフォルトの名無しさん
09/05/25 15:48:04
>>221
asin = doc.at('ASIN').inner_text
こんなのだろ
doc.at('ASIN') が nil になる可能性があるから
tag_asin = doc.at('ASIN')
asin = if tag_asin then tag_asin.inner_text else nil end
みたいに場合分けで書かなければいけない
こういうのってなんかイイ書き方ないもんかね
231:デフォルトの名無しさん
09/05/25 15:53:09
>>230
>>73-86
232:デフォルトの名無しさん
09/05/25 18:23:28
>>219-220
てんきゅう
233:デフォルトの名無しさん
09/05/25 19:07:46
>>217
>scan(/[a-zA-Z]+|\d+|\W+/)
ありがとうございます。
scan にこんな使い方があったんですね。
こんな正規表現の記法は知りませんでした。
あまり難しいことはまだ無理なので、これでいきます。
234:デフォルトの名無しさん
09/05/25 19:45:24
>>222
疲れてるときは全然読めないな
何言ってるかさっぱりわからん
用途別にまとめてくれてると頭に入ると思う
235:デフォルトの名無しさん
09/05/25 19:54:10
>>233
一応補足しておくと、 \W とかの文字クラス表現は中身を確認しておいた方がいいよ
例示だから適当でいいんだけど、>>217のは "_" とかスルーするね。
また、改行やスペースの扱いとか、意図通りに動かすためにはちょっと気をつけて。
236:デフォルトの名無しさん
09/05/25 23:24:11
本格的なものが必要なら、
StringScannerとかを使って自力で解析器を書くべきかもしれない
237:デフォルトの名無しさん
09/05/27 14:06:21
質問
トップレベルにて定義されたメソッドの一覧を取得する方法はありますか?
toplevel_methods = Object.private_instance_methods
toplevel_methods -= Kernel.private_instance_methods
で、大体は絞り込めるのですが、トップレベルに未知のモジュールが include される
場合などを考えるとこのやり方では心もとないです。
トップレベルで定義されたメソッドだけをきれいに抽出する方法はないものでしょうか。
238:デフォルトの名無しさん
09/05/27 15:00:51
Object.private_instance_methods(false)
* 1.8 系だと initialize も含まれる
* ふつうに、
class Object
def bar
end
private :bar
end
とした場合との区別がつかない
239:237
09/05/27 15:25:23
自己レス
あれこれ考えた結果、無理にトップレベルでやろうとするのが間違いと気付きました。
モジュールでラップして MyModule.instance_methods(false) で済みますね
お騒がせしました。
240:デフォルトの名無しさん
09/05/27 20:50:38
初心者です。Webrickでキャッシュプロキシを作ろうと思ったのですが、
実装例を見つけられませんでした。とりあえず書いてみたのですが問題があります。
1.ヒットした場合にWebサーバにアクセスしないでブラウザに戻す方法がわからない。
2.WEBrick::HTTPResponseのインスタンスを単純に復元しただけでは上手く表示できない。
#/usr/bin/ruby 1.8.7p72 webrick 1.3.1 winXP
require 'webrick'
require 'webrick/httpproxy'
db = Hash.new()
rcHandler = Proc.new() do |req, res|
if db.key?(req.unparsed_uri)
res = db[req.unparsed_uri]
end
end
handler = Proc.new() do |req, res|
db[req.unparsed_uri] = res
end
config = {
:BindAddress => '127.0.0.1',
:Port => 8080,
:ProxyContentHandler => handler,
:RequestCallback => rcHandler
}
s = WEBrick::HTTPProxyServer.new(config)
[:INT, :TERM].each{|sig| Signal.trap(sig){s.shutdown}}
s.start
実装例とかヒントをいただけたらありがたく思います。
241:デフォルトの名無しさん
09/05/27 21:09:52
NicoProxy2とか
242:デフォルトの名無しさん
09/05/27 21:56:44
かなり前の知識しかないけど、webrickってresponseしかいじれないんじゃなかったっけ。
requestは無理だったきがす
243:デフォルトの名無しさん
09/05/27 22:14:41
>>240
俺がやってるのはこんな感じ
class MyProxyServer < WEBrick::HTTPProxyServer
def proxy_service(req,res)
if req.request_uri がキャッシュされてるなら
# キャッシュを読み込んでresにセット
else
super
# resをキャッシュファイルに保存
end
end
end
244:240
09/05/27 22:51:04
>>243
なるほど、マイリマシタ。
RequestCallbackハンドラなんて要らなかったよう。
方向を間違えると収拾つかなくなるいい例ですね。
ありがとうございました。
245:240
09/05/27 22:56:46
>>242
リクエストはRequestCallbackハンドラで変更可能だと思います。
一応、240のプログラムは完動品ですので、よかったら試してみてください。
どうもありがとう
246:デフォルトの名無しさん
09/05/28 14:16:14
RubyGemsのアップデートに失敗してしまいます。
ねーよって言われるんですが、どうしたものでしょうか?
Windowsでのアップデートは失敗した覚えがないのですが…
> sudo gem update --system
Updating RubyGems...
Bulk updating Gem source index for: URLリンク(gems.rubyforge.org)
Attempting remote update of rubygems-update
ERROR: While executing gem ... (Gem::GemNotFoundException)
Could not find rubygems-update (> 0) in any repository
環境:
・Ubuntu 8.04 LTS
・Ruby -v ruby 1.8.6 (2007-09-24 patchlevel 111) [i486-linux] (aptitudeで入れた)
・RubyGems 0.9.4 (aptitudeで入れた)
247:246
09/05/28 14:24:30
すいません。5回くらい試していたら、無事に入りました
恐れ入ります。
248:デフォルトの名無しさん
09/05/28 14:35:40
バージョン1.1以前のrubygemsは粗大ゴミなのでとっとと入れ替えましょう
Debianパッケージでrubygemをインストールするとrubygemのアップデートが実質不可能になるのでアンインストールすることをお勧め
まあ、そうするとDebianパッケージシステムで管理できない野良パッケージシステムができてしまうんだけど、
まあ、背に腹は変えられん
249:デフォルトの名無しさん
09/05/28 16:52:12
array[0][:value] == 'dog' || array[0][:value] == 'cat'
みたいなのをもっと短くできんもんでしょうか?
array[0][:value].equal?('dog', 'cat')
みたいな感じに。rubyならできるような気がするのですが・・どなたか教えていただけるとうれしいです。
250:デフォルトの名無しさん
09/05/28 16:57:42
['dog', 'cat'].include?(array[0][:value])
251:デフォルトの名無しさん
09/05/28 16:58:23
['dog', 'cat'].include? array[0][:value]
252:デフォルトの名無しさん
09/05/28 19:51:25
%w[dog cat].include?(array[0][:value])
253:デフォルトの名無しさん
09/05/28 19:59:58
case array[0][:value]
when 'dog', 'cat'
end
じゃだめなの?
254:デフォルトの名無しさん
09/05/28 20:11:25
用途による
>>249みたいなのは後置の if みたいなので1行で条件が書けることが望まれてるんだろう
255:デフォルトの名無しさん
09/05/28 20:15:34
>>253
短くなってないじゃん。
>>254
case str when "dog","cat"; true; else; false; end
256:デフォルトの名無しさん
09/05/28 20:25:04
Windowsで、RubyとC言語で書かれた2つのプログラムでテキストファイルを使って情報をやりとりしたいんだけど
Rubyからテキストファイル開くときにC言語のプログラムから読み書き禁止させたいんだけど、そういうことできるの?
C言語だと_fsopenてのがあるけど、RubyのFile.open にはそういう機能ないっぽいんだけど・・・
257:デフォルトの名無しさん
09/05/28 20:31:59
>>255
1行にまとめることができるというのと、1行で書けるというのには天と地ほどの差があるのだよ
258:デフォルトの名無しさん
09/05/28 20:41:16
>>257
そうか?
少なくともこの場合、戻り値のある式であればいいんじゃね?
259:デフォルトの名無しさん
09/05/28 21:07:32
ちょうどいま Object#in? (定義はinclude?の主客転倒)という
メソッドの導入の是非についてのスレッドがML(えーごの)で出てますな。
# 何度めやら。
260:デフォルトの名無しさん
09/05/28 21:23:49
>>256
_fsopen は C言語の機能ではない。
_fsopen はなんか「読み書き禁止」なんてしなくてむしろ共有読み書きをするっぽい。
Rubyでファイルの共有とか排他とかはFile#flock
261:デフォルトの名無しさん
09/05/28 21:25:11
include? を持つ引数を取って、みたいな感じかな
あってもいいんじゃないとか思うが、あんまり賛同されてなさそうな雰囲気
262:デフォルトの名無しさん
09/05/28 22:20:05
(∀`*)
(●´Д`) { {
263:デフォルトの名無しさん
09/05/28 23:29:10
>>259
なんかそれ実際に使えるようにしたライブラリなかったっけ
どこかで見た記憶はあるんだけど、思い出せない
264:デフォルトの名無しさん
09/05/29 00:15:36
facetあたりじゃね?
265:デフォルトの名無しさん
09/05/29 00:28:23
ほんとだ
URLリンク(facets.rubyforge.org)
266:249
09/05/29 00:47:11
おー色々ありがとうございます。
結局
['dog', 'cat'].include?(array[0][:value])
これがいいかな、と・・後置のif文なので。
in?みたいなメソッド、今のところは無いんですねぇ。
今MLで話になってるみたいですが、in?みたいなの導入のネガティブな点って何があるんでしょう?
267:デフォルトの名無しさん
09/05/29 01:10:58
>>266
> これがいいかな、と
ぶっちゃけ、それしか出てないという気もw (caseはネタだろ)
でも、
> 後置のif文なので
ってのは、caseでもいけるっていう話で
> 今MLで話になってるみたいですが、in?みたいなの導入のネガティブな点って
これのことだろうな↓
URLリンク(blade.nagaokaut.ac.jp)
斜め読みでは、
「あったら便利だぜ」 vs 「んなもんKernelに入れるってのはどうなの」
って感じに見える。
過去にもあったんなら、もうちょっと丁寧な話もしてたのかな。
詳しい人の解説を期待してみたりして。
268:デフォルトの名無しさん
09/05/29 01:16:02
Kernel#in? (Objectじゃなかた)への反対意見は
* どこかの集合に含ま「れる」というのはメンバーの特性と言えるのか
* 実装は簡単だから自分の環境でやっとけばいいじゃん
* すべてのオブジェクトの名前空間を汚染してまで導入すべきもの?
などがあるようだ。
269:デフォルトの名無しさん
09/05/29 08:58:43
>>264-265
SUGEEEEE! こんなライブラリがあったのか
今まで全然知らなかったんだけど、実はけっこう有名なライブラリ?
270:デフォルトの名無しさん
09/05/29 09:06:31
アプリケーションサーバに興味のある人にとってはそこそこ有名
わざわざそんなことやろうという人そのものが稀なので、それ以外の人にとってはさっぱり
271:デフォルトの名無しさん
09/05/29 12:54:49
-talkだと結構名前を見かけるが、実は日本じゃあまり知られてない?
272:デフォルトの名無しさん
09/05/29 13:12:30
日本のRubyユーザーってRubyを何に使ってるのか正直よくわからん
273:デフォルトの名無しさん
09/05/29 13:22:19
>>272
同感。
最近別言語から Ruby をはじめたんだけど、
有名アプリも少ないし、日本語の扱いや
Rails 以外だと Web が面倒だったり。開発環境も貧弱。
1.9 の非互換で騒がれていないものな。
PHP なら 4 → 5 で騒がれたけど。
1 日でできる blog くらいしか作ってないのか?という感じ。
274:デフォルトの名無しさん
09/05/29 13:28:11
1日で作れるような100行単位の日常スクリプトを作り倒しまくってるというのは確かだと思う
かつてのUnixユーザーがシェルスクリプト作りまくるのが日常だったように、
Rubyユーザーは自分用スクリプトを作りまくって日常を便利に過ごす
んが、まあ、これはこれで一部の人だろうな
最近作った・手直ししたもの挙げていけばアクティブユーザーの傾向が少しでも掴める?
275:デフォルトの名無しさん
09/05/29 13:34:17
Rubyについて Part 35
スレリンク(tech板)
276:デフォルトの名無しさん
09/05/29 13:41:13
>>275
Rubyに関係ないスレのURL張られても困る
> 島根
> 島根
> 鳥取
> 島根
> 鳥取
> 島根
277:デフォルトの名無しさん
09/05/29 16:34:09
ゲーム
と言いたいところだが、今のところRubyベースで有名なゲームは皆無に等しいな
RPGツクールのスクリプトで使われてはいるが
274の言うように日常のツールとして使うと超便利で、あと他には
* 大小問わずWebアプリケーション(CGIアプリケーション)を作りたいとき
* RADを使わずにGUIアプリを作りたいとき(WxRubyなどを使う)
* 簡単な数値・確率計算がしたいとき
なんかに使う
特にRakeの便利さは異常
俺はもうRakeなしでは快適なPCライフを送れない
>>273
Webアプリならそこそこ有名なのはあるよ。tDiaryとか
あとWeb周りが面倒だったのは昔の話で、今はWEBrickやRackがあるからむしろ楽なはず
278:デフォルトの名無しさん
09/05/29 16:50:24
処理が少しくらい遅くても重くても作りやすくてメンテしやすいほうがいいこともある、という裏方用途にガッチリはまったので、
Rubyが表舞台に出てくるのは、Rubyが普及すれば普及するほど減るような気がしてならない
「シェルスクリプトって使ってる人いるんですか? シェルスクリプトのメジャーなアプリケーションってなんですか?」
という問いに答えにくいのとおそらく一緒になる
という空想
ある程度使えるようになれば普段で使えるじゃん、と気づく日が来る(ただしコンピュータ利用環境依存)んで、
初心者の人は肩肘張らずにダラダラやるといいと思う
質問ある方どうぞん
279:デフォルトの名無しさん
09/05/29 16:58:23
時間があったら絶対に Java | C | PHP で書き換えるから、と言われつつ
ずっと Ruby スクリプトのまま時々呼ばれて便利に動いてる、みたいなのが個人的理想
UNIX文化に傾倒して夢見すぎかもしれないが、理想くらい楽しく行きたいと思う
280:デフォルトの名無しさん
09/05/29 18:25:30
便利スクリプトに使ってますよ。ベターPerlみたいな感じ。
ゲームのスクリプトを生成したりとか、
他の言語のサポート用スクリプトにベターmakeなrakeもつかってる
281:デフォルトの名無しさん
09/05/29 21:20:18
日本人作った言語なら日本語のドキュメント豊富なはず。
PerlやPHPの方が日本語の資料多いじゃん。
他に移行。
282:デフォルトの名無しさん
09/05/29 21:23:48
>>281
ばいばーい。
283:デフォルトの名無しさん
09/05/29 23:26:24
ドキュメントが豊富でも言語自体に魅力が無ければ意味が無い
perlやphpが魅力的だと思うなら、お前にrubyは向いてないよ
284:デフォルトの名無しさん
09/05/29 23:38:15
幼女から熟女まで余裕でいける俺にはなんの苦も無いぜ。
285:デフォルトの名無しさん
09/05/30 00:33:30
>>281 には KENT の Perl入門がお似合い
286:デフォルトの名無しさん
09/05/30 01:01:24
るりまってあんま読まれてないのかな?
287:デフォルトの名無しさん
09/05/30 03:14:26
大小問わずウェブは辞めといたほうが吉。
基本は使い捨てだよ。メンテ必要なのは向いてない。
288:デフォルトの名無しさん
09/05/30 05:45:29
君の見てるウェブはメンテナンスフリーなんだな
うらやましいよ
289:デフォルトの名無しさん
09/05/30 05:58:42
いやいや、PerlやPHPの方がよいと思ったら、すでにそっちへ行ってるw
PHPはドキュメントは豊富。これはPHP案件の時マジ助かった。
しかし、ちょっと踏み込むと全然ドキュメントなかったりする…
DateTimeクラス?とかドキュメントなくて、なきそうになった
2chでDateTimeについて質問したら、PHPがオブジェクト指向言語だと思うなよ、とか
あげくに、オブジェクト指向言語氏ねとか煽られるし。所詮その程度。
Perlは10年前にやったがモダンPerl覚える気ねえや…
モダンPerl憶えるくらいならRubyの方がラクチン
幸い、Perlの資産は書き捨てばっかで少なかったし
290:デフォルトの名無しさん
09/05/30 09:49:53
お尋ねします。
あるファイル内の文字列を一文字単位で並び替えることは可能でしょうか?
それを各行単位とファイル単位の二種類のやり方で並び替えたいのです。
1.元ファイルの例
あいうえお
かきくけこ
さしすせそ
2.各行単位の並び替えで希望する結果
おえういあ
こけくきか
そせすしさ
3.ファイル単位の並び替えで希望する結果
そせすしさこけくきかおえういあ
実際の文字列は例と違ってバラバラなので、
A-Z や Z-A のようなソート機能は使えません。
このようなプログラムをRubyで組みたいのです。
291:デフォルトの名無しさん
09/05/30 09:59:22
reverse でいいんじゃね?
292:デフォルトの名無しさん
09/05/30 10:04:07
俺ならスタックに入れてreverse
293:デフォルトの名無しさん
09/05/30 10:08:04
irb(main):006:0> puts "あいうえお".reverse
ィえういあ
なんか化けるな。KCODE='s'のせいか?
WindowsだとUTF-8でirb使う手段がないんだが、みんなどうしてるんだろ
294:デフォルトの名無しさん
09/05/30 10:10:26
str.split(//).reverse.join
295:デフォルトの名無しさん
09/05/30 10:14:41
str.split(//E).reverse.join # E は str の文字エンコーディング1文字
どう小細工しても文字ごとの配列を作らざるを得ないので素直に巨大な配列を作るべし
296:デフォルトの名無しさん
09/05/30 13:02:26
gsub!(/\n/,"") で改行が削除(置換)できません。何故?
297:デフォルトの名無しさん
09/05/30 13:08:08
できてるけどなあ。
¥nのバックスラッシュが 0x5Cではなく 0xA5 になってるとか。
実は改行が ¥r¥n だったとか。
298:デフォルトの名無しさん
09/05/30 13:19:47
\n は「改行」という集合じゃないんだよね
あくまで LF という文字そのもの 1個
LF 以外の改行があるならそれも併記しないと駄目
299:デフォルトの名無しさん
09/05/30 13:22:56
>>297
\n , \r\n , \r の全部でやってみましたが変わりません。
Windows環境だから \r\n ですが、
今まで \n で問題なくマッチてしていました。試しに、
line.gsub!(/\n/,"問題")
でやってみたら行末に「問題」が追加されて改行はそのままですし。
置換のはずが追加の動作になっています。
理由がサッパリ判りません。
300:デフォルトの名無しさん
09/05/30 13:27:44
>>299
そもそも line には \n が含まれているのか?
p line でデバッグしてみ。
301:デフォルトの名無しさん
09/05/30 13:28:12
対象文字列を inspect とか dump とかしてみるといいよー。
302:デフォルトの名無しさん
09/05/30 13:39:47
>>300
置換前を p line してみると各行に \n がありました。
置換後には \n が無くなっていました。
これを見ると置換は成功しているようです。
エディターの問題なんでしょうか。
でもエディタ側で CR+LF , CR .LF を区別して表示してみると
CR+LFが残っているんですよね。
もうちょっと頑張って原因を探ってみます。
303:デフォルトの名無しさん
09/05/30 13:45:12
File.openするときに binary モードになってないとか、
あと、DOS窓からコピーすれば CRLF になるとか。
304:デフォルトの名無しさん
09/05/30 13:55:40
>>302
原因を探るも何も、それが全てじゃ>改行コードの(意図しない)混在
自分でも
> Windows環境だから \r\n ですが、
と書いているように、環境(というかむしろそのデータを吐き出すアプリ)に依って、
その3パターンが入り乱れるなんて、不注意でよくあるケース。
# CR単独、ってのはほぼないけど。
FTPのアスキーモードでファイルの上げ下げをしたり、また適当な設定のエディタで
読み書きすることによっても、テキストデータの改行コードはさくさく変換されつづける。
たまに CRCRLFとかになってて悲しくなることがある。
個人的には、アスキーモードとかテキストモードとか言う改行コードの自動変換処理を
絡ませてろくな事になった記憶がない。
Windowsだけど、自分のスクリプトやそこで使うデータは全部LFで保存してる。
# メモ帳で読めないとか知ったこっちゃない。
305:デフォルトの名無しさん
09/05/30 19:59:29
Ruby初心者ですが、他言語の経験はそれなりにあります。
やりたいこと。
Rubyで外部コマンドを起動して、それを任意のタイミングで終了させたいです。
より詳細に。
自分のプログラムの通信をTCPdumpを使って調べたい。
ただし、何回も実験を繰り返すので、手で起動、終了を繰り返すのは避けたい。
今考えている手法
マルチスレッドでプロセスをつくり、その上でTCPdumpを走らせる。
メインのスレッド上では、自分のプログラムを起動し、しばらくするとそれが終了する。
すると、マルチスレッド上のTCPdumpにシグナルを送って停止させる。
これを数十回繰り返す。
どのように解決すればよいでしょうか。
もしよろしければアドバイスいただけると助かります。
306:デフォルトの名無しさん
09/05/30 20:13:13
これまた Ruby 関係ないな
動いてる tcpdump に SIGINT か SIGTERM を適当に送れ
307:デフォルトの名無しさん
09/05/30 20:13:17
書き忘れましたが、起動の仕方は分かります。
ただ、Ctrl-cで終了させるプログラムをどのように停止させるかが分かりません。
308:デフォルトの名無しさん
09/05/30 20:18:22
なるほど。こっちもOSのコマンドを利用するわけですか。
ジョブ番号を出す、tcpdumpのジョブ番号を取得、kill
ってわけですね。
めんどうですが、その方法でやることにします。
ありがとうございました。
309:デフォルトの名無しさん
09/05/30 20:25:09
どう見ても他言語の経験もそれなりにしかありません、の間違いだな。
質問も回答も全くRuby関係ないw
310:デフォルトの名無しさん
09/05/30 20:39:04
>>308
Rubyから子プロセスにシグナルを送れるよ。
311:デフォルトの名無しさん
09/05/30 20:52:34
>>310
おお、本当ですか。
今調べてみたんですが、それは
URLリンク(www.ruby-lang.org)
であっておりますでしょうか?
これを使ったら、
process.pidの値を取得して、
kill(pid)
のように出来るので
上のコードよりかは幾分綺麗になりそうですね。
ありがとうございます。
312:デフォルトの名無しさん
09/05/31 02:29:50
文字列を与えられた時、アルファベットを大文字小文字区別せずに出現頻度順に小文字で並べた文字列を返すプログラムを作る問題がわかりません。
313:デフォルトの名無しさん
09/05/31 02:38:47
何がわからないの?宿題は自分でやるもんですよ?
314:デフォルトの名無しさん
09/05/31 06:34:44
>>312
誘導
スレリンク(tech板)
315:デフォルトの名無しさん
09/05/31 16:06:17
hoge::huga
と
hoge#huga
はどういう意味ですか?
316:デフォルトの名無しさん
09/05/31 16:12:59
クラス名やメソッド名を連結するときの表記に使う :: と # の違いだと解釈
:: はクラスやメソッドや定数を連結する表記に使い、実際のスクリプト上でもそのように動作する
# はインスタンスメソッドを表す表記に用いられ、実際のスクリプト上では動作しない、マニュアル専用の表記
A::B::C は
Aクラス(かモジュール)の中にあるBクラス(かモジュール)の中にあるCクラス(かモジュール)、
または、
Aクラス(かモジュール)の中にあるBクラス(かモジュール)の中にある定数C
原理上、スクリプトを参照しない限り、見かけではこの2つを区別できない
A#hoge は、Aクラスのインスタンスメソッドhoge
a#hoge は、オブジェクト a のクラスで定義されているインスタンスメソッド hoge
マニュアルのどっかに書いてあった気がする
317:デフォルトの名無しさん
09/05/31 16:40:18
>>316
ありがとうございます。
318:デフォルトの名無しさん
09/05/31 16:43:22
>>316
クラス名#メソッド名 という表記、例えば String#upcase というのを見るのですが、
これはStringクラスのインスタンスの持つupcaseというメソッド、という意味でいいですか?
見ようによってはクラスメソッドに見えます。
319:デフォルトの名無しさん
09/05/31 16:49:56
インスタンスメソッドを URI#path のように # つきで書くような人間は、
クラスメソッドは絶対に URI.parse のように . で繋げて書くから混同されてる可能性は(誤記以外には)ない
安心しれ
320:デフォルトの名無しさん
09/05/31 17:34:25
>>316
これ、テンプレでFAQに入れといていい気がする。
俺も毎回なんだっけ?と迷うからなんだけど
321:デフォルトの名無しさん
09/05/31 18:03:24
なんでそんなに迷うんだよ…
特殊なのはインスタンスメソッドのマニュアル記載法の # だけで、あとは通常のスクリプト内記法と一緒じゃんよ
ドットは
「マニュアルでのクラスメソッド」
「スクリプト内のインスタンスメソッド」
「スクリプト内のクラスメソッド」
の3つがあってややアレだが、
たいていの場合、 . の左は「明らかにクラス名」か「明らかに変数名」のどっちかだろ?
左が@始まりや全部小文字の変数名だったらとりあえずインスタンスメソッドの起動記法だと思え
だから、マニュアルに “小文字.メソッド” があったら変数に対するコピペ実行可能なインスタンスメソッドチェーンだ
例: arr.join の場合、「arrはローカル変数っぽい」から、「arrが指すオブジェクトのクラスのインスタンスメソッドjoin」だとみなす
「変数arrにクラスオブジェクト本体が入ってたらクラスメソッドが起動する可能性が」とか余計なことは考えない
左が大文字で始まってる「明らかにクラス名」の場合はクラスメソッドのマニュアル記載法&スクリプト内のクラスメソッドだ
例: uri.path と URI.parse は連結法はドットで同一だが、
前者は変数っぽいので「変数uriの指すオブジェクトのクラスのインスタンスメソッドpathを起動するようにする」という指示記述
後者はクラスっぽいので「クラス(またはモジュール)URIのクラスメソッドparse」を指すマニュアル記述または起動指示
文字化して書いててどうでもよくなってきた
もしかして、この辺の区別って実は本当の初心者にはつけづらかったりする?
322:デフォルトの名無しさん
09/05/31 18:11:06
本当の初心者って?
323:デフォルトの名無しさん
09/05/31 18:16:53
オブジェクトに属するメソッドとクラスに属するメソッドの違いをてきとーにより分けられない人
324:デフォルトの名無しさん
09/05/31 19:41:33
>>321
なげーよ
もっと簡潔にかけるだろ、あんたなら
325:デフォルトの名無しさん
09/05/31 19:55:06
テンプレ用に短いのキボン
326:デフォルトの名無しさん
09/05/31 20:39:30
つカルシウム
327:デフォルトの名無しさん
09/05/31 22:05:45
やっとプログラミングに慣れきた者ですが、
ネットや本のコードを読むときで、
一つ一つのステ-トメントや式を追う時に、
これが、
インスタンス変数、ローカル変数、定数(クラスもその一種?)、メソッド と判別できるようになって、
少し自信がつきました。
デ-タ?の動き?だけでにとどまらずに、、変数のパタ-ン、メソッドと変数の見分けなどを意識できるようになるのが、
本当の初心者には一つの壁だと思います。
テンプレを書くまで、実力が上がってないけれど、、
328:デフォルトの名無しさん
09/05/31 22:38:19
>>326
カルシウムって・・・
やめろよ頭悪いと思われるぞ。
329:デフォルトの名無しさん
09/05/31 22:39:45
>>328
乳酸菌取れよ
330:デフォルトの名無しさん
09/06/01 13:36:21
カルシウムと言われて真っ先に金属カルシウムを思いつく>>328さんは秀才
「ナトリウムの過剰摂取は身体によくない」と言われて「水と反応して火花散らすから当然だな」
「カルシウムを摂ると身体にいい」と言われて「あんなにイオン化傾向が高いものを摂取するなんて信じられん」
このスレ何のスレだっけ
331:デフォルトの名無しさん
09/06/01 13:58:23
>>321みたいなのは『初めてのRuby』あたりに書いてないかい
332:デフォルトの名無しさん
09/06/01 14:03:31
3ヶ月前に作りかけだったスクリプトの製作を再開しようとしたのだが
コメントつきなのになにやってるかさっぱりわからん
333:デフォルトの名無しさん
09/06/01 14:07:53
スクリプトでそんなに長いの書くなよ。
一画面に収まらなくなってきたらもっとまともな言語使うべき。
334:デフォルトの名無しさん
09/06/01 14:15:39
>>333
まともってなに?
委員会が設計したこと?
335:デフォルトの名無しさん
09/06/01 14:20:53
>>334
事前コンパイル&リンクが必要な言語はコンパイル時間の間に精神を落ち着けることができるので
コンパイル不要な言語より質の高いプログラムを記述することができます
336:デフォルトの名無しさん
09/06/01 14:48:38
スクリプト言語でさくっと作って浮いた時間でお茶でも飲む方がいいよ
337:デフォルトの名無しさん
09/06/01 16:02:12
>>335
>事前コンパイル&リンクが必要な言語はコンパイル時間の間に精神を落ち着けることができるので
でもコードを書いているときに多大なストレスを感じてしまうんだよな、
事前コンパイル&リンクが必要な言語は。むずかしいのう。
338:デフォルトの名無しさん
09/06/01 16:49:06
そんなにあの間が好きならsleepでも噛ませとけw
339:デフォルトの名無しさん
09/06/02 02:09:00
in?の話がちょっと出てる。
qwik.jp/lang-Pattern/DSL.html
340:デフォルトの名無しさん
09/06/02 08:54:16
リンクの貼り方がわかりにくすぎるよ…パパン
341:デフォルトの名無しさん
09/06/02 08:58:17
リンクだったのか。気づかんかった
342:デフォルトの名無しさん
09/06/02 09:08:26
というか「対応するサイトがありません」と言われる
343:デフォルトの名無しさん
09/06/02 10:36:18
339 じゃないけど
URLリンク(qwik.jp)
344:デフォルトの名無しさん
09/06/02 13:02:24
Apache 2.2 + Passenger 環境で、
現在 Rails アプリを DocumentRoot 直下に a/ や b/ に置き、
RailsBaseURI /a
RailsBaseURI /b
にして
example.com/a/
example.com/b/
のように複数動かしています。
Sinatra も
example.com/c/
example.com/d/
のように複数動かしたいのですが、どうすればいいでしょうか。
サブドメインを取らないで実現したいのです。
RailsBaseURI のような SinatraBaseURI があれば簡単なのですがw