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


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

Ruby 初心者スレッド Part 18



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

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

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

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

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

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

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

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

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

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

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

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


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

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

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



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

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

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

どっちか好きなほう使え

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

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

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

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

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

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

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

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

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

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

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



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

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

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

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



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

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

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


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

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

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

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

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

class Dummy
@@origout = $stdout

def initialize
@buf = ''
end

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

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

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

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


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

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



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

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

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

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


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

>>130
バカはおまえだろ

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

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

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

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

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


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

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

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


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



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



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


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

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

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

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

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

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

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

なんで?

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


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

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

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

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

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

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

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

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



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

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

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

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

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

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

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



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

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

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

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


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

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

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

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


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



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

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

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

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

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

return @hoge = kekka



@hoge = kekka
return kekka



@hoge = kekka
return @hoge

ってどれが一般的かな

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



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

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

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

とかなのかな??

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

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

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

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

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

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



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


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

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

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

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



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

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

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

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

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

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

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

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

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

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

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


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

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

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

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




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

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

アアア
煕表示字典ね



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

>>199

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

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

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

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

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






[ 続きを読む ] / [ 携帯版 ]

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

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