09/05/16 10:08:33
【よくあるしつもん】
Q:
いちからRubyを始める初心者向けのRuby入門書は何がありますか?
A:
プログラム作成自体の初心者なら
「たのしいRuby 第2版 Rubyではじめる気軽なプログラミング」
URLリンク(www.amazon.co.jp)
文法は理解済み(orリファレンスで乗り切る既言語習得者)の場合のRuby様式を知る必携2冊目
「初めてのRuby」
URLリンク(www.amazon.co.jp)
以下は外れが少ないとされている本です。必ず立ち読みした上で自分の目的とレベルに応じて購入してください
「Rubyレシピブック 第2版 268の技」(初心者向け)
URLリンク(www.amazon.co.jp)
「プログラミングRuby 第2版 言語編」(初心者向け)
URLリンク(www.amazon.co.jp)
「Ruby Way 第2版」(脱初心者向け)
URLリンク(www.amazon.co.jp)
「Rubyクックブック ―エキスパートのための応用レシピ集」(脱初心者向け)
URLリンク(www.amazon.co.jp)
以下の本は言語作者が書いた最新本ですがとりあえず初学者向けではありません
「プログラミング言語 Ruby」(言語として深く知りたい人向け)
URLリンク(www.amazon.co.jp)
3:one
09/05/16 10:09:14
Ruby 公式・非公式便利サイト2009
Ruby Home Page 【公式、お役立ち度が微妙】
URLリンク(www.ruby-lang.org)
Rubyリファレンスマニュアル 【検索機能休止中、Googleなどの併用を】
URLリンク(www.ruby-lang.org)
URLリンク(www.ruby-doc.org) 【詳しい英語版】
HTMLヘルプ版リファレンスマニュアル配布さん 【Windowsで便利、検索も無論可能】
URLリンク(elbereth-hp.hp.infoseek.co.jp)
Programming Ruby - The Pragmatic Programmer's Guide 【好評書籍の初版がネットで、ただし英語】
URLリンク(www.ruby-doc.org)
Rubyist Magazine - るびま 【ライブラリ紹介などの読み物、過去のコードレビューは一読の価値あり】
URLリンク(jp.rubyist.net)
逆引きRuby 【やりたいことから探すWiki、最近元気ないので編集者募集】
URLリンク(www.namaraii.com)
はてなキーワード > Ruby 【うっかりどっさりまとまったリンク集、説明なし】
URLリンク(d.hatena.ne.jp)
RubyForge 【○○をやりたい管理されたライブラリを探すならここ、英語】
URLリンク(www.rubyforge.org)
GitHub 【○○をやりたいコードをとにかく探すならここ、英語】
URLリンク(github.com)
日本Rubyの会 【最近はオフライン勉強会の寄り合い場と化しているので近くで勉強会があれば】
URLリンク(jp.rubyist.net)
4:one
09/05/16 10:09:55
関連スレ
本スレ
Rubyについて Part 35
スレリンク(tech板)
アンチスレ
Rubyについて(アンチ専用) Part003
スレリンク(tech板)
Railsスレ
【Ruby】Ruby on Rails Part7
スレリンク(php板)
Windows用スレ
【ActiveScript】RubyをWindowsで使うスレ【GUI】
スレリンク(tech板)
Ruby 1.9 系列スレ
魁け! Ruby 1.9.X
スレリンク(tech板)
5:デフォルトの名無しさん
09/05/16 10:16:28
いちおつ
6:デフォルトの名無しさん
09/05/16 11:33:25
ポーニテールなんだからね!
7:デフォルトの名無しさん
09/05/16 13:00:41
前スレより:
>982 名前: デフォルトの名無しさん Mail: 投稿日: 2009/05/16(土) 04:43:41
>ruby1.8.6です。
>ファイルアクセスが他のソフトとぶつかる場合で質問です。
>
>Rubyで周期的にXMLファイルを上書きしていますが、この上書きのタイミングと
>他のソフトによるXML読み込みが衝突した場合(と思われる時)、
> in 'initialize': Permission denied - new XML.xml (Errno::EACCES)
>
>というエラーメッセージが出ます。
>そこでRubyの振る舞いとして、他のソフトがファイルアクセス中は上書きを延期するか、
>あるいは別の方法で衝突を回避したく思います。
>何か良い方法はありますでしょうか?
>
>なお別のソフト側で衝突回避を試みましたが、上手くいかないためRubyに望みを
>託すことにしました。
8:デフォルトの名無しさん
09/05/16 13:02:31
>>7
File#flock を使ってロックすればいいんじゃないでしょうか。
File.open('file.xml', 'w') do |f|
f.flock(File::LOCK_EX)
f.write('<?xml version="1.0" ?>')
end
でどうよ?
9:デフォルトの名無しさん
09/05/16 13:07:35
>>8
Perlなんかでやってたときは、そのロックだと
ファイルの書き込みオープンでファイル空っぽ
→(他のプロセスからの読み出しの可能性)
→ファイルロック
になるから駄目、だったような。
Rubyのブロックでその辺どうなるんだろ
10:デフォルトの名無しさん
09/05/16 13:25:42
このスレって前スレ書かないんだな
Ruby 初心者スレッド Part 27
スレリンク(tech板)
11:デフォルトの名無しさん
09/05/16 13:52:09
すまん、前スレにもなかったもんで。書いとくもんかな?
12:デフォルトの名無しさん
09/05/16 13:58:53
>>9
マルチプロセスだからブロックだろうとなんだろうと関係ない。
・非破壊的にopen
・ロック
・上書き
とやらないとダメだろう
File.open('file.xml', 'r+') do |f|
f.flock(File::LOCK_EX)
f.truncate(0)
f.rewind
f.write('<?xml version="1.0" ?>')
end
13:デフォルトの名無しさん
09/05/16 14:01:32
でもinitializeでEACCESってことは、その「他のソフト」側はロックじゃなくて
書き込み禁止にしてるような気がするんだが。
そうなるとロック以前にエラーになるわけで、ポーリングしかないんじゃないかな。
14:デフォルトの名無しさん
09/05/16 14:15:40
flockはNFS越しだと通らなかったりするから
使わない方がいいと思う
15:デフォルトの名無しさん
09/05/16 16:40:28
前スレ1000はRuby的には10**3だな。
16:デフォルトの名無しさん
09/05/16 17:34:47
1_000とか
17:デフォルトの名無しさん
09/05/16 18:37:17
どうも。前スレの982です(ファイルアクセスが他のソフトとぶつかる場合で質問)。
前スレ>>983さん,本スレ>>7-9,>>12-14さん、有難うぎざいます。
細かい点ですが、
前スレ>>983
直接
File.open(path,'w'){|f| f.write(data)}
するのではなく
File.open(path_v,'w'){|f| f.write(data)}
File.rename(path_v, path)
ここで、path でなく path_v としているのは、
何か意味があるのでしょうか?
18:デフォルトの名無しさん
09/05/16 18:46:57
ファイルのロックとはあんまり関連しないが、別名ならなんてもいいんじゃね
というかその質問をするってことは動作の意図わかってないんか
19:デフォルトの名無しさん
09/05/16 19:23:07
>>14
最近の Linux だと NFS でもちゃんと flock できたりするから驚きだ。
20:デフォルトの名無しさん
09/05/16 20:07:01
>>17
詳しくないけど、
・排他ロックしてないけど、書き込み途中(=壊れた状態)のファイルを読まれる心配がない。
(そんなことできるのかどうか知らないけど。)
・万一書き込み中にこけてもデータが壊れない。
って感じではないかと。
21:17
09/05/16 21:54:36
>>18, 20
色々有難うございます。
試しに例外処理を
begin
File.open('newXML.xml', 'w') {|f|
f.write new_xml
}
rescue
puts "XML, unable!"
end
の形で使ったところ、衝突中は上書きがスキップされますが
強制終了は無くなりました。
22:デフォルトの名無しさん
09/05/17 02:33:30
Rubyの実行で質問です。
現在、勉強用に買った書籍付録の実行環境+DOSプロンプトで例えばABC.rbを
C:\>ABC.rb
などどして実行していますが、アイコンクリックなどの方法で実行する
ことは出来ますか?
23:デフォルトの名無しさん
09/05/17 02:46:51
できるけど、標準出力の特性上、意図したとおりの動作にはならないと思われ
ダブルクリックで実行したいのなら自前でウィンドウ作る言語やったほうがいいぞ
24:デフォルトの名無しさん
09/05/17 02:58:33
>>22
Exerbを使えば実行ファイルにできる
ただ、普通の(標準入力や標準出力を使う)スクリプトだと
実行してすぐにウインドウが閉じるので、あまり意味をなさない
RubyでGUIアプリケーションを作るのなら役に立つ
25:デフォルトの名無しさん
09/05/17 03:26:55
>>22
可能
ただし、設定方法はOSによって異なる
「拡張子 関連付け」で検索
26:デフォルトの名無しさん
09/05/17 03:46:18
>>22
たぶん、CUIに慣れていないってことなんだろうか。
キーボード入力が不慣れってことならどうしようもないけど、それはプログラミングの
上では避けては通れないので、ないことにして。
勉強の為なら、>>23-24の言うとおり、とにかくまずは標準入出力での試行錯誤が
気楽で楽しいかも。そのためには・・・
まず、Windowsのコマンドプロンプトを、少しでも使いやすくすることを考えてはどうか。
Windous2000以上なら、DOS窓でも入力補完機能が付いている。
ショボいけど、ヒストリー(コマンド履歴)機能もある。
これらを知ってると知らないとでは、かなり違うはず。
URLリンク(journal.mycom.co.jp)
あとそれでも不満なら、補完ツールを入れるという手段もある。
たぶん、ckw + NYACUS(or PowerShell) って人もそれなりにいるかと思う。
URLリンク(d.hatena.ne.jp)
とりあえず参考になれば。
27:26
09/05/17 03:48:15
×Windous2000
○Windows2000
これは恥ずかしい;;
見なかったことにして・・・。
28:デフォルトの名無しさん
09/05/17 03:52:42
>>23-24
thx
Exerbは確かに直ぐに終了しますが、puts "Hello, World" も
puts "Hello, World"
sleep 2
と小細工すれば動作確認出来ました。
29:デフォルトの名無しさん
09/05/17 04:02:10
>>28
pts "Hello, World"
sleep 2
って書いてみ
30:22&28
09/05/17 04:03:04
大変失礼しました。動作環境を書いていませんでした。
OS) WinXP-Pro(SP2)
Mem) 4GB(実質3.24GBですがw)
Ruby) 1.8.6
>>25-26
有難うございます。
31:デフォルトの名無しさん
09/05/17 04:55:44
ruby %* | pause
確か、こんな感じのdo_ruby.batファイルとか作って.rbに関連付けておけばよかった気がした。
失敗した時だけ待つ
常に待つなら、
ruby %*
pause
32:デフォルトの名無しさん
09/05/17 05:04:21
まー実際問題としてはいちいちダブルクリックとかフォーカス当ててEnterとかやってられんのだがね
33:デフォルトの名無しさん
09/05/17 05:16:27
まあ、世の中には少しだけ便利なバッチファイルとしてrubyを使う人も
いるわけで、定形の作業用スクリプトをたまに起動するだけなら
>>32なんて問題にならないし、
人に説明する場合でも、コマンドプロンプトを開いてコマンドを入力させるより
アイコンをダブルクリックの方が楽だったりする
場合もある
34:デフォルトの名無しさん
09/05/17 08:14:42
>>31
それ知らなかったよ。サンクス
35:34
09/05/17 09:04:59
正確には、ruby %* || pause だね
36:デフォルトの名無しさん
09/05/17 14:26:56
>>35
一見パイプの拡張かと思ったらexitコードの論理和かよ
cmdで使えたなんて知らなかった
37:デフォルトの名無しさん
09/05/17 14:47:10
>>35
うる覚えだった。スマソw
38:デフォルトの名無しさん
09/05/17 14:52:47
「うろ覚え」な。
今覚えとこうな。
39:デフォルトの名無しさん
09/05/17 15:16:47
得意げに typo に突っ込んでいるかも知れないという危惧を
少しは抱くべきではないだろうか
40:デフォルトの名無しさん
09/05/17 15:21:33
>>39
URLリンク(www.google.com)
41:デフォルトの名無しさん
09/05/17 15:27:59
「うる覚え」は少なくとも誤記ではないな
「う・る・お・ぼ・え」と書くつもりで正しく書いてるだけだ
その人にとっては「うる覚え」が完全に正しい
もちろん「うろ覚え」が辞書上も多数派的にも"正しい"が、
だからといって今更「うる覚え」がなくなるわけでもなく
42:デフォルトの名無しさん
09/05/17 15:30:24
/)
///)
/,.=゙''"/
/ i f ,.r='"-‐'つ____ こまけぇこたぁいいんだよ!!
/ / _,.-‐'~/⌒ ⌒\
/ ,i ,二ニ⊃( ●). (●)\
/ ノ il゙フ::::::⌒(__人__)⌒::::: \
,イ「ト、 ,!,!| |r┬-| |
/ iトヾヽ_/ィ"\ `ー'´ /
43:デフォルトの名無しさん
09/05/17 20:31:45
今日1日かけて自作スクリプトのクラス名やメソッド名を書き換えてそれに伴う構造再構成をした
見通しがちょっとよくなったような気がする
Rubyあんまり関係ないな
44:デフォルトの名無しさん
09/05/17 20:35:40
def hoge
h = Hash.new
…
return h
end
というメソッドを勢いで作ってしまうことはある
適切な名前を付けるべきだとは思うんだけどね
45:デフォルトの名無しさん
09/05/17 21:12:55
CRubyでは通るけどJRubyではまだ通らないようなテストがあります。
で、とりあえずこのテストをJRubyで通るようにするのはあとまわしにすることに決定しました。
このとき、そのテストに『今はテストが失敗するけどあとまわしにするよ』というような目印をつける方法が
Test::UnitかRSpecにあったと思うんですけど、どなたかご存じないですか。
ぐぐろうにもキーワードが思いつきません。
46:デフォルトの名無しさん
09/05/17 21:16:01
>>44
「スコープが広いものにほど明瞭な(長い)名前を付けよ」って一般原則からすれば
メソッドが十分短いならhは許されるだろう。hogeは不味いだろうけど
というか、極端に長すぎるのも考え物
記述密度が上がって逆に可読性を落としてしまう
Linusに言わせれば
>Modula-2 や Pascal のプログラマとは違って、C言語プログラマは 「こ
>の変数は一時的に使われるカウンターである(ThisVariableIsATemporaryCounter)」
>などというような気のきいた名前は使いません。C言語プログラマは、"tmp" な
>どの十分に書きやすく、それでいて少なくとも分かりにくくはならない変数名を
>選ぶものです。
Rubyも立場的には近いと思う
to_sとか、意味が通る限りにおいて短い名前を希求する
47:デフォルトの名無しさん
09/05/17 21:19:50
>>45
RSpecのpendingのことかな
詳しくはるびまの連載記事に載ってる
48:デフォルトの名無しさん
09/05/17 21:39:47
>>47
それです。さんきゅー。あいしてる。
49:デフォルトの名無しさん
09/05/18 11:07:46
>>12
>File.open('file.xml', 'r+') do |f|
> f.flock(File::LOCK_EX)
> f.truncate(0)
> f.rewind
> f.write('<?xml version="1.0" ?>')
>end
'r+' だとファイルが存在しなかったときにエラーになるよね。
それがいやで、自分は 'r+' じゃなくて 'a' にしてるんだけど、なにか問題あるでしょうか。
詳しい人のコメント求む。
50:デフォルトの名無しさん
09/05/18 11:18:10
'a' はファイルの最後から書き込む
'r+' はファイルの先頭から書き込む
対象のファイルが全くの空である場合は動作が「たまたま」同一
51:デフォルトの名無しさん
09/05/18 11:20:57
なら IO::CREAT|IO::WRONLY で
52:デフォルトの名無しさん
09/05/18 11:24:10
>>49
「あるはずのファイルが無い」とか「書けるはずなのに(権限などで)書けない」なんてのは
似たようなもんで、どのみちきっちりやるならチェックなり例外処理なりしなきゃいけない。
つまり、こまけぇこた(ry
53:デフォルトの名無しさん
09/05/18 11:38:29
>>49
def exclusive_write(path, content)
body = lambda{|f|
f.flock File::LOCK_EX
f.write content
f.truncate f.tell
}
File.open(path, 'r+', &body)
rescue Errno::ENOENT
File.open(path, 'w', &body)
end
自分の過去を掘り返してきたらこんなんが出てきた。
正しいかどうかは…。
54:デフォルトの名無しさん
09/05/18 11:48:30
>>48
> あいしてる
これは、
あいしてる ( ^з^)-☆Chu!!
までやるべき
55:17
09/05/18 17:02:45
前スレの982です(ファイルアクセスが他のソフトとぶつかる場合で質問)。
皆さんのレスを一通り見ましたが、File.openの箇所で工夫するというのが定石
なのでしょうか?
本を読んでいたら、 File.readable?(path) と File.writable?(path) なるものが
ありましたが、(これらが未だ登場しないといいうことは)使うと何か弊害が
生じるのでしょうか?
56:デフォルトの名無しさん
09/05/18 17:54:21
>>50
>'a' はファイルの最後から書き込む
>'r+' はファイルの先頭から書き込む
そうなんだけど、今の場合は f.truncate(0) して f.rewind(0) してから書き込んでいるから、
最初のファイルポインタの位置は関係ないよね。
>>51
これって何?初めて見るんだけど。マニュアルに書いてある?
57:デフォルトの名無しさん
09/05/18 18:05:17
>>56
URLリンク(www.ruby-lang.org)
58:デフォルトの名無しさん
09/05/18 18:07:42
>>52
そういえば昔、CGIだけどレンサバの容量の制限(quota?)でファイルが書けず、
1日分のデータが無くなったってトラブルがあったな・・・(遠い目
59:デフォルトの名無しさん
09/05/18 18:11:38
/)
///)
/,.=゙''"/
/ i f ,.r='"-‐'つ____ こまけぇこたぁいいんだよ!!
/ / _,.-‐'~/⌒ ⌒\
/ ,i ,二ニ⊃( ●). (●)\
/ ノ il゙フ::::::⌒(__人__)⌒::::: \
,イ「ト、 ,!,!| |r┬-| |
/ iトヾヽ_/ィ"\ `ー'´ /
60:デフォルトの名無しさん
09/05/18 18:46:21
マジックコメントをとりあえず強制的に utf-8 あたりで自動挿入する機能とかないかな
Emacsでいいんだけど
61:デフォルトの名無しさん
09/05/18 19:00:04
URLリンク(d.hatena.ne.jp)
62:デフォルトの名無しさん
09/05/18 21:16:28
1.9に添付されてるruby-mode.elを使え
63:デフォルトの名無しさん
09/05/19 01:53:42
URLリンク(wonko.com)
こいつのソース見てくれ。殆どの処理が module として定義されて
普通に実行しただけでは何も起こらないよね?
これはどうなっているの?
よくわからないけど、rubygems がゴニョゴニョしていると考えていいのかい。
64:デフォルトの名無しさん
09/05/19 02:20:21
crackup-1.0.1$ rak "at_exit|END"
lib/crackup.rb
288| at_exit do
まったく読み込んでないが、これじゃないか。
65:デフォルトの名無しさん
09/05/19 02:26:30
単純にmodule直下で色々やってるだけっぽいけど
66:63
09/05/19 02:36:16
>>65
すまん、勘違いしていた。さんくす。
67:デフォルトの名無しさん
09/05/19 08:09:15
>>60
検索すると、マジックコメントが Ruby(と Ruby が参考にした Python)独自のものだと思ってる人がちょくちょくいる模様
これ Emacs 自身が解釈する文字列で、読み込むファイル全般で効くから
-*- coding: utf-8 -*-
の行があったら Emacs はその文字エンコーディングだとみなして読み込むから
嘘だと思ったら
-*- ruby -*-
とだけ書いた hoge ファイルを Emacs で読み込んでみるといい
いわゆる拡張子がなくて判断情報がないはずなのに ruby-mode になるからさ
-*- perl -*- と書いたら perl-mode に、 -*- html -*- と書いたら html-mode になる
68:デフォルトの名無しさん
09/05/19 09:50:33
>>67
ほー知らなかった。emacsはそういう機能があるんだな。vimも似たようなのなのなかったっけ?
69:デフォルトの名無しさん
09/05/19 11:28:56
>>68
67 じゃないけど
URLリンク(jp.rubyist.net)
70:デフォルトの名無しさん
09/05/19 16:27:04
Rubyの、文字列中に任意の式を埋め込む機能は式展開という名前らしいですが、
これを英語でいうと何といいますか。
71:デフォルトの名無しさん
09/05/19 16:58:19
まんまだけどembedded expressionとか?
72:デフォルトの名無しさん
09/05/19 17:20:32
ruby-doc.org の Programming Ruby だと、その他のエスケープと一緒に
substitution となってるな。
73:デフォルトの名無しさん
09/05/19 20:31:20
少しお聞きします。
メソッドチェーンの途中で nil があってもそれ以後予期に計らってくれる便利なハックや方法はありませんでしょうか?
Delphi Prismのコロン演算子みたいなのです(例がマイナーすぎてスマソ・・)
Colon Operator - Delphi Prism
URLリンク(prismwiki.codegear.com)
74:73
09/05/19 20:36:41
すいません。
>>73 ですが、既存のgemsとかのユーティリティ的なものがあればそれキボンという感じです。
わがままですいません…。
Activeなんたらとかにないのかなーと探しているのですが、見つからず
75:デフォルトの名無しさん
09/05/19 20:40:43
((o = obj.hoge()) && (o = o.page()) && (o = o.moge()) && o.done()) || (puts "nil!!!")
・・・ごめん、忘れてw
76:デフォルトの名無しさん
09/05/19 20:59:01
演算子として使いたいなら、言語機能として組み込まれないとどうにもならないように思える
あえて小手先の拡張でなんとかするなら・・・こんな感じか?
obj.send_if_defined(:method1).send_if_defined(:method2)
77:デフォルトの名無しさん
09/05/19 21:08:54
>>73
眺めた程度ではリンク先の意味を理解できず申し訳ないのだけど
良きに計らうっていうのは具体的にどういう挙動を期待してる?
ふとこんなのを思いついた
class Nil; def method_missing; return nil; end
78:デフォルトの名無しさん
09/05/19 21:22:12
>>73
メソッドチェーンを使わないか、
期待した返り値にならない場合は例外出して抜けるメソッドだけをチェーンに使うか、
NoMethodError を rescue する
79:デフォルトの名無しさん
09/05/19 21:59:40
>>70
variable interpolation
いや、
expression interpolationだな。
80:デフォルトの名無しさん
09/05/19 22:00:42
>>73
ActiveSupportのObject#tryおよびそれの同等品でどうか。
実態はsendだが、nilにだけはnilを返すように定義されている。
81:デフォルトの名無しさん
09/05/19 22:17:57
ま た R a i l s か
でもこれ確かに便利だな
URLリンク(d.hatena.ne.jp)
82:デフォルトの名無しさん
09/05/20 01:11:27
tryを1.9に取り込むって話はどうなったんだっけ?
83:デフォルトの名無しさん
09/05/20 01:18:26
>>82
catch~tryのtry?
それとも
84:デフォルトの名無しさん
09/05/20 01:39:50
haskellのめいびーがうんたらかんたら
85:デフォルトの名無しさん
09/05/20 02:18:00
>>82
名前がよければ採用してもいいという話になっていたと思うが、
誰かが思い出させないとそれきりかな?
いちおうRedmineには入っていたハズ。
86:73
09/05/20 04:16:49
ActiveSupportのtryですね。確かにそんな感じですw
ちょっと使ってみようと思います。
> require 'activesupport'; [4649, "HageUnko", nil].map{|i| i.try(:+, i) }
[9298, "HageUnkoHageUnko", nil]
ありがとうございました。
87:デフォルトの名無しさん
09/05/20 04:51:55
WinXP-ProでRubyは1.8.6です。
URLリンク(www.func09.com)
を参考にSocketサーバーを作りたいと思っています。
先ずは、server_client.rb中の require "socket_server" について調べましたが、
リファレンス URLリンク(www.ruby-lang.org) には socket_server
というライブラリはありません。
もしかして、ある時期から単に socket になったのでしょうか?
参考サイトの日付は2007年10月です。
88:87
09/05/20 06:35:46
(補足)
目標は、厳密にはXMLSocketサーバーです。
89:デフォルトの名無しさん
09/05/20 10:43:00
obj = PStore.new(path)
pstore = obj.transaction
p pstore.roots
pstore.close
とすると、2行目で止まって、Ctrl+C すると
/usr/lib/ruby/1.8/pstore.rb:296:in `flock': Interrupt
from /usr/lib/ruby/1.8/pstore.rb:296:in `transaction'
from /home/俺/上記ファイル.rb:2:in `hoge_method'
というようになるようになってしまったんだが、
似たような現象にぶち当たった経験があるとかで原因の心当たりある人いる?
90:デフォルトの名無しさん
09/05/20 11:31:07
flockってことはファイルロックしっぱなしなんじゃないのか?
他のスクリプトやエディタ(てことはないか・・・)が開いててロックしているとか
91:デフォルトの名無しさん
09/05/20 12:34:18
>>90
あ、ほんとだ、超でっかいpstoreのトランザクションの奥で同じファイルをPStore.newしてる
何がどうなっていつのまにこうなったんだ、これ
まあいいや、ありがとう
92:デフォルトの名無しさん
09/05/20 15:02:35
>>79
>interpolation
さんくすです
93:デフォルトの名無しさん
09/05/20 15:17:04
存在してないファイルからpstoreで読み込んだときに何が返るかの記憶法あるかな
nil だったか空のハッシュだったかぜんぜん覚えられないんだが
94:デフォルトの名無しさん
09/05/20 15:17:49
irbでさくっと試せ
95:デフォルトの名無しさん
09/05/20 15:21:43
わざわざターミナル開いて
irb
require 'pstore'
PStore.new('1').transaction{|p| p[p.roots.first]}
これを打つのがしんどいから聞いてるんだよ逆切れ
96:デフォルトの名無しさん
09/05/20 15:25:05
PStoreでハッシュを保存してるとわけわかめになることが全くないでもない
というかなんであれは ENOENT とか発生しないのは何故?
97:デフォルトの名無しさん
09/05/20 15:34:21
>>93-95
言うのをめんどくさがるから却ってめんどくさくなる好例だなw
まあそのコードが一発で出てきたところから推測できるように
rootsの初期値は空のArray
nilもHashもfirstが通らん
98:デフォルトの名無しさん
09/05/20 15:49:54
pstore は、ファイルが存在しているかどうかを全く関知しない
ファイルがそもそも存在しない場合も、
ファイルはあるけど登録が空である場合も、
ファイルがあって何らかのデータが登録されてる場合も、
transaction の返り値オブジェクトの [] メソッドはハッシュのように振舞うし、
fetch メソッドはキーの有無をチェックして例外を出す
ということで、 ファイル自体が無い場合もそのキーでの登録が無い場合も一律 nil だな
nil をキーとして何かデータが登録されていると誤動作するであろう pstore 利用スクリプトは時々見る
99:デフォルトの名無しさん
09/05/20 18:00:35
ruby 1.8.6 で日本語を slice しようと思ってます。
URLリンク(taiyaki.org)
が定番でしょうか?
最終版が 2003-5-7 ですが、枯れているのか
放置されているのか分からなくて。
100:デフォルトの名無しさん
09/05/20 18:14:13
>>99
UTF-8で、
puts "日本語".scan(/./u)[1]
とかではいかんのでしょうか?
101:99
09/05/20 18:32:30
>>100
できました。ステキ。
/./u の u がないともっとステキなのですが、
これはどうしようもないのでしょうか。
102:デフォルトの名無しさん
09/05/20 18:41:55
じゃあメソッド作って隠せ
それで>>99と同じになる
103:デフォルトの名無しさん
09/05/20 18:47:03
>>101
$KCODE設定だけでいけるんじゃないかと。
詳しくは知らない
URLリンク(www.ruby-lang.org)
104:デフォルトの名無しさん
09/05/21 00:14:09
ファイルからUTF8のテキストデータを読んだのですが、
p line[0,2]
としても期待どおりに文字を切り出せません。
どう書けばよいのでしょうか?
105:デフォルトの名無しさん
09/05/21 01:01:58
>>104
期待とは line = 'こんにちは' のとき line[0,2] #=> 'こん' ということ?
1.8系 $KCODE = 'u' 前提
1.8.6 までなら line.split(//)[0,2].join
1.8.7 なら line.chars.to_a[0,2].join でも。
おまけ line[0, 6] # 漢字(1文字3バイト)のみからなるのが確実な場合
1.9系
エンコーディングが正しければ、それで期待どおりになる。
106:デフォルトの名無しさん
09/05/21 01:25:29
>>105
ありがとうございます。うまくいきました。
107:デフォルトの名無しさん
09/05/21 02:02:56
1~10の数字のうち、ランダムに5個を選ぶ記述で悩んでいます。
単純に r=rand(10) r=r+1 を5回やるとしても、5,4,8,8,7と同じ数が並ぶ
可能性があり、条件式で判別するのは元の数が増えた場合を考えると
スマートではないような気がします。
(数が増えて100万個の中から1000個を選ぶとか)
何か良い方法はありますか?
108:デフォルトの名無しさん
09/05/21 02:37:07
>100万個の中から1000個を選ぶ
大きな量でも扱える方法が少量の際でもスマートとは限らないから
別個に考えた方がいいと思う
とりあえず一例
ary = []
(1..10).each{|i| ary << i }
5.times{ puts ary.delete_at(rand(ary.length)) }
もちろん数が大きい時には向かない
109:デフォルトの名無しさん
09/05/21 02:38:04
なんで書き込んだ直後に(1..10).to_aを思い出すかなorz
110:デフォルトの名無しさん
09/05/21 02:48:19
numbers=[]
while numbers.size<5
numbers|=[rand(10)]
end
こんな感じかな
乱数の出てきた順番がどうでもいいならSet使ったほうが良いと思うが
111:デフォルトの名無しさん
09/05/21 02:49:31
>>107
step.0 選ばれた数の総数 n = 0
step.1 1を選ぶ確率 5/10
step.2 2を選ぶ確率 (5-n)/9
step.3 3を選ぶ確率 (5-n)/8
...
nが5になるまでstepごとに0から1の一様乱数を発生させて確率以下ならその数を選択することを続ける
112:デフォルトの名無しさん
09/05/21 03:54:58
それと選ぶ総数が全体数の半分以上なら選ばない数の方を選択して
それを全体から除外するようにしたほうが特に全体数が多い場合は現実的な効率はいいと思う
起こりうる最悪ケースではどちらでも変わらないし全体数の半分程度を選ぶとかではあまり関係ないけど
それから全体数が多いときは一様乱数の有効数字の桁数が問題になるかもしれないので
0から1の浮動小数でなく選択確率の分母以下の整数値をランダムに生成して分子と比較するとかの方がいいかも
でもそれでよくなるかどうかは乱数の生成方法次第だしそもそも100万個くらいならこれは問題ないのかな?
113:デフォルトの名無しさん
09/05/21 04:19:05
100まんこのランダム抽出程度なら手抜きで作っても普通に終わるだろ
result = Array.new
max = 1_000_000 ; period = max / 100
$stdout.sync = true
print 'prepareing...' ; base = (1..max).to_a ; puts "done"
while e = base.delete_at(rand(base.size)) do
result << e
print '.' if (result.size % period).zero?
end
puts
p result.size
p result[0],result[max]
ごめん嘘ついた
インジケータ1個も出ない(w
114:デフォルトの名無しさん
09/05/21 05:50:28
spec_helper.rb って spec コマンドが勝手に探して自動で読んでくれる便利なファイル名とかそういうのじゃないのね
require '../../../spec_helper'
とか spec ファイルの最初に書くのカッコ悪いんだけどもこれは構造上仕方ないのかな
115:デフォルトの名無しさん
09/05/21 06:01:28
それだとカレントディレクトリ以外で spec コマンド使ったときに動作しないぞ
require "#{File.expand_path(File.join(File.dirname(File.expand_path(__FILE__)), '..', '..', '..', 'spec_helper'))}"
こうだな
長大なファイルパスを記述するのが面倒だから spec_helper を使おうと思ってる人には逆に憂鬱かもしれん
しかしこれ1行で済むとも言えるが
116:デフォルトの名無しさん
09/05/21 08:04:42
>>107
[*1..10].sample(5)
[*1..1_000_000].sample(1000)
117:デフォルトの名無しさん
09/05/21 08:09:23
>>115
なんでわざわざ同じことを何回も繰り返す?
require File.expand_path('../../../../spec_helper', __FILE__)
118:デフォルトの名無しさん
09/05/21 09:32:24
File.expand_path の第2引数の扱いは undocumented だからな
現在は File.exppand_path して File.dirname されているということを知ってる人がどれだけいるのやら
つまり、以下の4つは同じように /full/path/basedir/dir/file を返す
File.expand_path('dir/file', '/full/path/basedir')) # マニュアルを素直に読む場合、第2引数はフルパス
File.expand_path('dir/file', 'basedir'))
File.expand_path('dir/file', File.dirname(File.expand_path('file_in_basedir'))))
File.expand_path('dir/file', 'file_in_basedir'))
というか、このへんは実験終了と称して次のバージョンくらいでぽっと無くなりそうで嫌だ
119:デフォルトの名無しさん
09/05/21 11:40:41
第二引数なし・pathnameなしで一番短いのはこれかな
require File.join(File.dirname(__FILE__), '../../../spec_helper')
でも確かに、spec_helper.rbを自動or独自メソッドで読んでくれれば一番早いとは思う
120:デフォルトの名無しさん
09/05/21 12:08:01
メモリ上で文字列の圧縮・展開を行いたいです。
そういったライブラリはありますか?
121:デフォルトの名無しさん
09/05/21 12:20:56
よーわからんが
irb> require 'zlib'
irb> str = "プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。
【Ruby1.9.1 は従来版とは異なる部分も多く、書籍や解説やライブラリのサポートがまだありません】
【自力で解決できない壁で悩むことのない最新安定版の Ruby1.8.7 での学習をお勧めします】
※1.8.7 は 1.8 系と 1.9 系の橋渡しをするためのリリースで、1.9 系 の便利新機能の一部が利用可能です"
irb> p str.size
560
irb> z = Zlib::Deflate.deflate(str)
irb> p z.size
375
こういう話ではなく?
122:デフォルトの名無しさん
09/05/21 12:53:49
>>121
ありがとうございます。zlibを調べてみますね。
123:デフォルトの名無しさん
09/05/21 13:31:52
すいません。
>>87をお願いします。
124:デフォルトの名無しさん
09/05/21 13:48:27
>>123
socket_server.rb はライブラリではなく単なるアプリケーションで、同じページの
server_client.rb の次に説明されてる
125:デフォルトの名無しさん
09/05/21 16:16:25
rspecにて、spec/hello_spec.rbから hello.rbを起動テストしようとしています。
しかし、NetBeansの "rspecテスト"からrspecを起動した場合だけテストに失敗してしまいます。
コマンドプロンプトから spec spec/hello_spec.rb では問題ないのですし、直接 ruby hello.rbでも問題ないです。
warningの文字列で、テストしているので起動時の "-w" をとれば成功するようになるのですが、
コマンドプロンプトからは -w をつけても問題ないのが気になります。
'my script should have no errors or warnings' FAILED
expected not: =~ /warning/n,
got: "(Rubyインストールディレクトリ)/lib/ruby/site_ruby/1.8/rubygems/source_index.rb:138: warning: d:/my_home/.gem/ruby/1.8:(Rubyインストールディレクトリ)/lib/ruby/gems/1.8/specifications: Invalid argument\nHelloWorld\n"
./spec/hello_spec.rb:15:
./spec/hello_spec.rb:13:in `chdir'
./spec/hello_spec.rb:13:
hello_spec.rbのソース
require File.join(File.dirname(__FILE__), '/spec_helper.rb')
describe "my script" do
before do
@bin_path = File.join(File.dirname(__FILE__), "/../hello.rb")
end
it "should have no errors or warnings" do
pending "Hangs on JRuby" if PLATFORM =~ /java/
Dir.chdir(File.join(File.dirname(__FILE__), "/../")) do
output = `ruby -w #{@bin_path} --help 2>&1`
output.should_not =~ /warning/n
output.should_not =~ /Error/n
end
end
end
126:デフォルトの名無しさん
09/05/21 16:23:38
=~ というマッチャは見たことないな
127:デフォルトの名無しさん
09/05/21 16:35:42
>>124
さんきゅう。
同時に、「SocketServerというクラスがリファレンスにないぞ・・・」と思って
いましたが、これも下の socket_server.rb で定義していたんですね。
納得。
128:デフォルトの名無しさん
09/05/21 17:06:27
>>125
推測だが、コマンドプロンプトとNetBeansが
それぞれ違う場所にインストールされたrubyを使っていて、それで何かの問題が起こっているのでは?
実際にsource_index.rbの138行目見れば何か分かるかもよ
>>126
あるよ
129:125
09/05/21 18:40:11
>>126
正規表現のマッチャみたいです。
>>128
ありがとうさんです。
source_index.rb見てても何故かよーわからんくて、
使われているのがNetBeans標準のjrubyでなくちゃんとMatzRubyにしたよなー、
と思って設定を見直していたころ、gemパスがバグっていたことになっていたことに気づきました。
1行1パスなのに、何故か、
/my_home/.gem/ruby/1.8:(Rubyインストールディレクトリ)/lib/ruby/gems/1.8
と : で区切って2つパスが記述してありました…(´・ω・`)
削除して、/my_home/.gem/ruby/1.8 だけにしたところ、
問題なく動きました!
今思うと、source_index.rbはの該当行はgemパスの処理のところでした。
おかげさまで、無事に解決いたしました。
ありがとうございました。
130:デフォルトの名無しさん
09/05/21 19:38:56
>>116
[*1..10]も1_000_000も知らなかった
前者のはRange#to_aと優劣あるんだろうか
131:デフォルトの名無しさん
09/05/21 19:44:56
>>109-112, 116
Thx
ごめんなさい。未だ試してないです。
132:デフォルトの名無しさん
09/05/22 00:16:37
>>118
> File.expand_path の第2引数の扱いは undocumented だからな
Converts a pathname to an absolute pathname. Relative paths are
referenced from the current working directory of the process unless
<i>dir_string</i> is given, in which case it will be used as the
starting point.
「dir_stringを始点として絶対パスに展開する」とちゃんと書いてあるだろ。
> 現在は File.exppand_path して File.dirname されているということを知ってる人がどれだけいるのやら
勝手にdirnameしてるわけではなくて、>>117は>>114より'..'が一つ多い。
133:デフォルトの名無しさん
09/05/22 00:18:05
>>130
[*1..10]のほうが(1..10).to_aより短い。
遅いけどな。
134:デフォルトの名無しさん
09/05/22 05:39:26
スレ違いな質問で申し訳ないが、GnomeVFSのSSH接続で、鍵を指定することはできないの?
普通に ssh://user@host と指定しただけでは ~/.ssh 下しか探さないみたい。
Net::SSH は鍵を指定できたんだけど。。
135:デフォルトの名無しさん
09/05/22 15:46:03
eRubyについて教えてほしい
eRubyで書かれたファイルの中に
eRubyで書かれたファイルを埋め込みたい
なんか出来そうな気がするのだけど
イメージがまとまらないので、できるのなら教えてほしい。
具体的な運用としては
Apacheで*.rhtmlのファイルをeRubyを通すように設定したサーバで
運用したいと思っている。
で、ページを構成する細かい部品をeRubyで書いて
そのレイアウトをeRubyで定義できないかな~って感じです。
136:デフォルトの名無しさん
09/05/22 16:03:52
<% require 'erb' %>
<%= ERB.new(File.open(filename).read).result %>
じゃダメなんだっけ?
137:デフォルトの名無しさん
09/05/22 16:09:11
>>132
日本語マニュアル不備だよね
基本の添付ライブラリのマニュアルが英語とかなにそれ
138:デフォルトの名無しさん
09/05/22 16:35:47
>>136
それでいけました
ただ、単にERBオブジェクト作ってあげるだけでよかたんか。
これで、ヒャッホ~イ!できそうです。ありがとう。
139:デフォルトの名無しさん
09/05/22 16:50:58
>>133
サンクス
数文字程度長いぐらいならわかりやすいほうが好みだから
[*1..10]を選ぶ理由はなさそうだ
140:デフォルトの名無しさん
09/05/22 17:42:51
>>137
ri File.expand_path
141:140
09/05/22 17:44:48
いや、これも英語か。
ソースから抜き出してるから、日本語版を作るとなると
ソースに日本語でドキュメントを書くか、
自動生成を諦めるかになるのかな。
142:デフォルトの名無しさん
09/05/22 17:46:35
ja.po 形式はどうだろう
143:デフォルトの名無しさん
09/05/22 17:49:56
そういえば、rubyをgettext対応させた人っていないのかな。
144:デフォルトの名無しさん
09/05/22 17:55:05
>>143
スクリプトの話?本体の話?
前者はライブラリがある
145:デフォルトの名無しさん
09/05/22 17:56:24
>>132
第2引数は /path/to/file を渡しても /path/to/ とみなして処理される
相対パスを渡しても、絶対パスに変換したあとで基点とみなされる
startint point という語にそれだけの処理の意味を任せるのは初耳だ
146:デフォルトの名無しさん
09/05/22 18:16:07
>>141
日本語版のリファレンスにはReFeというツールが付属していてだな
147:デフォルトの名無しさん
09/05/22 18:30:33
>>145
> 第2引数は /path/to/file を渡しても /path/to/ とみなして処理される
違う。あやふやな知識で書くより、ちゃんと試してみることをすすめる。
File.expand_path("foo", "/path/to/file") #=> "/path/to/file/foo"
File.expand_path("foo", "/path/to/") #=> "/path/to/foo"
File.expand_path("../foo", "/path/to/file") #=> "/path/to/foo"
File.expand_path("../foo", "/path/to/") #=> "/path/foo"
> 相対パスを渡しても、絶対パスに変換したあとで基点とみなされる
> startint point という語にそれだけの処理の意味を任せるのは初耳だ
これも違う。重要なのは戻り値は絶対パスだということ。
File.expand_path("foo", "path") が "path/foo" だったら絶対パ
スじゃないだろ? 絶対パスを返すという仕様が前提なんだから、相
対パスは他にどう扱いようがあるというんだ。
148:デフォルトの名無しさん
09/05/22 18:50:06
>>144
ruby-gettext-packageは知ってる。
本体の出力メッセージとかの話。
149:デフォルトの名無しさん
09/05/22 18:55:53
GNU gettextはLの付かないGPLだから、使うとRubyを
Ruby's ライセンスではなくGPLで配布する必要が生じるかも。
150:デフォルトの名無しさん
09/05/22 18:56:19
URLリンク(www.nicovideo.jp)
151:デフォルトの名無しさん
09/05/22 19:01:06
「読まない人は日本語でも読まない」wwww
152:デフォルトの名無しさん
09/05/22 19:16:33
インタプリタの出すメッセージは用語みたいなもんだから
翻訳するとかえってめんどくさいことになりそうな
153:デフォルトの名無しさん
09/05/22 19:23:19
入ります
154:デフォルトの名無しさん
09/05/22 19:28:51
みんな なでしこ やったことある?
155:デフォルトの名無しさん
09/05/22 19:40:55
このスレでその質問をするココロは?
156:デフォルトの名無しさん
09/05/23 02:19:17
@port = port if( !port.nil? ) の解釈で質問です。
最初の@はインスタンス変数で、右辺のifは修飾子だと思うのですが、
()内の「?」の意味が分かりません。
これがは文字コードリテラルとは思えませんし・・・
どういう意味(役割り)なのでしょうか?
157:デフォルトの名無しさん
09/05/23 02:24:44
nil? というメソッドです
158:デフォルトの名無しさん
09/05/23 02:48:30
いちおう補足、リファレンスでObjectクラスのインスタンスメソッドを眺めてみて
しかしなんというか、不慣れな時期にそのコードというのは運が悪いな
せめて @port = port unless port.nil? と書いてほしい
159:デフォルトの名無しさん
09/05/23 02:53:02
うーん。識別子に使える文字等の解説が見つからない。
URLリンク(www.ruby-lang.org)
↑これ、ぶっちゃけ不正確じゃね?
160:デフォルトの名無しさん
09/05/23 02:59:45
>>157-159
さんきゅうです。
つまり if( !port.nil? ) というのは、「portが無効でないなら(不活性でないなら)~」
ということでOKですか?
161:デフォルトの名無しさん
09/05/23 03:05:25
うんにゃ。
if( !port.ni? ) → if()
162:デフォルトの名無しさん
09/05/23 03:07:57
あら。途中で書き込んだ。
if( !port.ni? ) → if( !port.nil? == true ) → if( port.nil? == false )
で理解してくらはい。
port.nil? は boolean を返すことが期待されてるメソッドです(たぶん)。
163:デフォルトの名無しさん
09/05/23 05:05:12
Ruby に Boolean などというものはありませんが何か
あーでも結構使ってるなー
>>156
A if COND という構造だということはわかってるんだよね
if はメソッドではなく制御構造だから、このカッコは引数のカッコではなく式を作る「まとめカッコ」だ
中身1つだけだから、本当はこのカッコは必要ない
で、最初の ! は否定の NOT だ
URLリンク(www.ruby-lang.org)
直後にあるものの真偽の概念を逆転する
つぎの port はなんらかのローカル変数またはメソッド呼び出しで、
ドットで繋がってる nil? は port の返り値のクラスの nil? というメソッド
port のクラスで再定義されていないのなら、それは Object#nil? で、オブジェクトが nil である場合に true を返す
まとめると、
「port の返り値が nli でない場合に、@port に port の返り値を代入する」
となる
164:デフォルトの名無しさん
09/05/23 05:14:20
Rubyではよっぽどでない限り
@port = port unless port
と書くけどな
・ port に false が入る可能性があって、それは nil とは違う処理が必要
・ port が nil であるというのが何か重要なサインであってソース読み下し上目立たせたい
というのでない限り、今回でいうところの
「port に何か入ってたら @port に入れとく」
というフツーの意図である限り、 Ruby では unless を使う
165:デフォルトの名無しさん
09/05/23 05:35:31
>>164.gsub("unless", "if")
166:デフォルトの名無しさん
09/05/23 05:58:35
「nil でない」なら if だと思う
167:デフォルトの名無しさん
09/05/23 10:07:30
# データからHTMLを作って返す
def html
html = String.new
…
return html
end
というように、メソッド内のローカル変数名とそのメソッドの名称が全く同じなのって、ある程度は紛らわしいですよね
できれば避けるべきなんでしょうか?
168:デフォルトの名無しさん
09/05/23 10:58:18
再帰のような処理と混同する可能性があるってこと?
メソッド内1行目でローカル変数として定義されてれば読んでて混乱はしないと思う
if (html = init_data) then みたいにどっかの文の途中でこっそり変数定義を使ってることがあるとか、
変数とメソッドを混ぜて使い倒してる処理があるとか、そういうのが1ヶ所でもあれば注意深く読む
169:デフォルトの名無しさん
09/05/23 11:28:11
IOのexpertな方、教えてください ><
# afio - manipulate archives and files
COMMAND = "afio -oZ -"
IO.popen(COMMAND, "r+") do |src|
Find.find("/etc") do |f|
src.puts(f.chomp)
end
src.close_write
File.open("myArchive.afz", "w") {|dst| dst.write(src.read)}
end
afioコマンドが pipe_wait になって終了しません。
何が悪いのでしょうか?
170:169
09/05/23 11:49:24
ちなみに、コマンドライン上から
$ find /etc | afio -oZ - 1>./myArchive.afz
とやれば、何も問題なく動作するんです。
ワケワカメで頭が破裂しそうです ><
171:デフォルトの名無しさん
09/05/23 11:52:44
afioコマンドが、入力を読み切らずに何か書き出そうとして固まってるとか?
172:169
09/05/23 13:22:11
afioで作成されたアーカイブをバイナリエディタで読んでいてふと思ったのですが、
なにやらヘッダらしきものが書かれていて、その後ろにgzipで圧縮されたバイナリがずらーと並んでいる感じです。
このバイナリファイルをハッキングして、自分でライブラリを書いてしまえばいいと思いました。
外部のコマンドに投げるよりはよりキレイに書けるとおもいまつ。
ありがとうございました。
173:デフォルトの名無しさん
09/05/23 13:25:37
>>169
原因は>>171の通りだろう。
アーカイブデータをなんか加工したいというんでなければ、直接書き出させた方がよい。
あとFind.findからyieldされるパス名はchompする必要はない、というかしてはいけない。
COMMAND = "afio -oZ myArchive.afz"
IO.popen(COMMAND, "w") do |src|
Find.find("/etc") {|f| src.puts(f)}
end
174:デフォルトの名無しさん
09/05/23 13:39:58
>>172
manpageによるとcpioフォーマットだな
Except in special cases discussed below, afio will create archives
with the same format as ASCII cpio(1) archives.
以下に述べる特殊なケースをのぞいて、afioはASCII cpio(1)アーカイブと同じ
フォーマットでアーカイブを作成する。
When creating an archive, the `large ASCII' header is used by afio to
cover the following situations:
アーカイブを作成する際、以下の場合は「large ASCII」ヘッダが使用される。
o A file has a size larger than 2 GB
・ 2GBよりも大きいファイル
o The archive contains more than 64K files which have hard links
・アーカイブ中のハードリンクが64Kを越えるファイル
o A file, directory, or special file has a UID or GID value larger
than 65535.
・65535より大きいUIDやGIDを持つファイル、ディレクトリ、特殊ファイル
175:169
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」を指すマニュアル記述または起動指示
文字化して書いててどうでもよくなってきた
もしかして、この辺の区別って実は本当の初心者にはつけづらかったりする?