[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 2chのread.cgiへ]
Update time : 03/16 20:51 / Filesize : 256 KB / Number-of Response : 901
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


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

Ruby 初心者スレッド Part 22



1 名前:730 [2008/09/15(月) 17:25:21 ]
プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。

   【Ruby1.9 は不安定な開発版であり初心者には全く向きません】
   【最新安定版の Ruby1.8.7 の使用をお勧めします】
    ※1.8.7 は1.8 と 1.9 の橋渡しをするためのリリースです。
      1.9 の新機能の一部が利用可能なので初学者にお勧めです。
    ※ただし十分安定しているとは言えないので
      プロダクション環境での利用にはお勧めしません。

関連スレや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を読め」でいいので、叩かない&怖がらせない。
 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。

809 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 17:14:38 ]
ディレクトリの中にあるすべてのファイル名を変えるプログラムを作ろうとしたのですが
5分で挫折しました(笑)

File.open("D:\\Data") {|f|
puts f.to_str()
}

とりあえずこうやってファイル名を出力しようとしたのですが、
コマンドプロンプトではすべてUNICODEのファイル名で表示されてしまい
わけわかめです。
$SCODE = SJISとかやってもダメでした

810 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 17:28:30 ]
それファイル名じゃなくdataというファイルの中身を読んでいるように思えるが

`dir d:\\data /b`.each { |f| f.chop!
  puts f
}


811 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 17:39:07 ]
その場合メソッドパラメタの名前は line とかのほうがいいぞ

812 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 17:42:01 ]
メソッドパラメタ → ブロックパラメタ

813 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 17:58:21 ]
>>809
そういうときは、致命的な動作になるまでは Dirl.glob を使う
ディレクトリ区切り文字は \ ではなく / なので注意

irb> Dir.glob('c:/*')
["c:/AUTOEXEC.BAT", "c:/boot.ini", "c:/bootfont.bin", "c:/CONFIG.SYS", "c:/Documents and Settings",
"c:/Program Files", "c:/RECYCLER", "c:/ruby", "c:/System Volume Information", "c:/WINNT"]
irb> Dir.glob('c:/*/')
["c:/Documents and Settings/", "c:/Program Files/", "c:/RECYCLER/", "c:/ruby/",
"c:/System Volume Information/", "c:/WINNT/"]
irb> Dir.glob('*.txt')
["001.txt", "002.txt", "003.txt"]
irb> Dir.glob('*.txt').each{|e| FileUtils.mv(e, "#{File.basename(e,'.*')}.bak") }
irb> Dir.glob('*')
["001.bak", "002.bak", "003.bak"]


814 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 18:15:13 ]
>>813
今のrubyは\も扱ってくれるよ

と思ってたが、Dir.globは\区切りに対応してないのね……

815 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 20:31:28 ]
下のディレクトリの中も再帰的にやるんじゃなかったら
Dir.entries(ディレクトリのパス).reject{|d| File.directory? }
とか。

816 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 00:14:51 ]
rubyでファイルの種類の判断ってできますか?
拡張子で判断するのではなくファイルの中身で、Excelファイルかどうかの判断が
したいんです。
よろしくおねがいします。

817 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 01:34:00 ]
できますよ



818 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 03:33:29 ]
>>816
がんばってマジックナンバー嫁

819 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 08:17:09 ]
>>816
unix系ならFileMagicだけどwindowsはよう知らん

820 名前:デフォルトの名無しさん mailto:sage [2008/11/04(火) 19:22:11 ]
>>815
Windowsですが
再帰でディレクトリリストが欲しい時もcmdのdirですましちゃう
サブディレクトリ一覧
dir /s /ad /b \ほげほげ\ | ruby -ne "puts $_”
ほげほげ下のサブディレクトリ内の.rbファイル一覧
dir /s /a-d /b \ほげほげ\*.rb | ruby -ne "puts $_"
とか

rubyだけでやるならglobで/**/使って
Dir.glob('/ほげほげ/**/*/'){|e| puts e}
とか
Dir.glob('/ほげほげ/**/*.rb'){|e| puts e}

と、いろいろ試してたら列挙される数が違ったんで、あれっ?と思ったら
globの方は標準ではドットファイルが除外されるのを忘れてた
使用してるのがWindowsオンリーなので、普段ドットファイルなんて意識しないし

Dir.glob('/ほげほげ/**/*.rb',File::FNM_DOTMATCH){|e| puts e}


821 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 21:56:06 ]
>>816
エクセル持って無いけど
たぶんファイルの先頭見たら判るんじゃね?とググって見ると
エクセルもワードも BIFFってフォーマット(OLE?)でどっちもファイルの先頭は同じだったorz

さらにぶらぶらと調べてたら、parseexcelっていうライブラリを見つけたので
適当にインターネットからxlsファイルを落としてきて
require 'parseexcel'
workbook = Spreadsheet::ParseExcel.parse('エクセルのサンプルファイル.xls')
で読み込めたけど、えらく遅かったので parseexcel がパース直前にやってることを直に書いてみた
require 'parseexcel'
begin
ole= OLE::Storage.new('エクセルのサンプルファイル.xls')
biff = ole.search_pps([OLE.asc2ucs('Book'),OLE.asc2ucs('Workbook')],true)
if biff.first
puts "エクセルファイル"
else
raise 'NotExcelfile'
end
rescue
puts "エクセルファイルじゃない"
end

エクセルファイルを漏れなく判定できるのかはわかりませんが…


822 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 11:05:21 ]
require 'foobar'
としたあとで、'foobar.rb' の絶対パスを調べる方法ってありますか。


823 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 15:13:55 ]
File.expand_path($LOAD_PATH.map{|d| File.join(d, 'foobar.rb') }.find{|path| File.exist?(path) })

824 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 15:19:42 ]
>>823
それは読み込んだファイルであることを保証しない

825 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 15:27:19 ]
読み込んだファイルそのものを指定することは1.8ではできないと思った
同名のファイルをファイルパスから探すことはできるけれど

>>823で問題になる場合というのはなくはないとは思うが非常にレアなような気もする

826 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 15:32:16 ]
foobar.rb で File.expand_path(__FILE__) を返すようなメソッドなりなんなりを用意しておくほうが確実なのかな
>>823の要件に合うとは思えないけど

827 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 15:35:43 ]
>>826
require を拡張したほうが妥当と思う

が、どうすればいいのやら
gem の require はどうやってるんだっけ



828 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 15:43:39 ]
foobar.rb で File.expand_path(__FILE__) を返すようなメソッドなりなんなりを
requireしたあとからくっつければ医院で内科医?


829 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 16:20:11 ]
>>828はのび太

830 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 17:55:23 ]
>>823-828
どうもありがとうございます。
ないということなので、以下の方法で済ませることにしました。
lib = "foobar.rb"
dir = $:.find{|path| File.exist?(File.join(path, lib)) }
filepath = dir ? File.join(dir, lib) : nil
ありがとうございました。

831 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 21:45:52 ]
拡張子省いてrequireしたとき、.soだったのか.rbだったのかまで知りたくなったら、$LOADED_FEATURESとも突き合わせて比較する必要も出てくる。




832 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 00:21:42 ]
突然ごめん。
p array
した時の["hoge", "fuga", "boo"]みたいな書式って
変更できたりしない?
あと一歩でcsvなので便利に使えそうなんだが。
pのことをググって調べるのは非常にホネが折れる…

833 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 00:28:03 ]
inspect

834 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 01:07:55 ]
>>832
www.ruby-lang.org/ja/man/html/_C1C8A4DFB9FEA4DFB4D8BFF4.html#p
なんでもぐぐって調べようとするから骨が折れてるんだろうw

835 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 02:12:54 ]
>>832
joinの方が楽

836 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 03:23:57 ]
>>832
>>835
その名も「csv」というライブラリが標準で付いてることを忘れないでやってくれ。

837 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 09:49:56 ]
>>832
一文字目と最後の文字消せばいいだけじゃね?



838 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 12:18:53 ]
なんでもかんでもググるって馬鹿がすることだよね。
賢い人なら知りたいことが見付かりそうな文書はどこにあるのかをまずは考える。

839 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 20:15:46 ]
ロックシステムについて相談があるんですが
i=0
begin
File.open('lockfile',File::WRONLY|File::CREAT|File::EXCL,0666) do |lfile|
File.open('hoge','r') do |file|
# hogeを使ったいろいろな処理
end
end
File.unlink('lockfile')
rescue SystemCallError
if(i>10) then raise
i+=1
if(File.stat('lockfile').mtime<Time.new+10) then
File.unlink('lockfile') #残骸のロックファイル削除
else
sleep(0.1)
end
retry
end

どうもi386-mswin32だとEXCLオープンしても例外を投げなくてうまくいかない
ようです。他のプラットフォームだとどうなんでしょう?

840 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 21:16:58 ]
File#flock() を使う方法しかしらない。

File.open("foobar.txt", "wb") do |f|
 f.flock(File::LOCK_EX) # 排他ロック
 f.unlock();
end

841 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 21:22:21 ]
なんか既視感がある

組み込みで妥当に動作してるロック機構を再発明しようとするな、というのがアドバイスだったはず

842 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 21:24:54 ]
>>840
まずそのサーバーでflockが使えないから無理
>>841
組み込みで現に存在してるのが使えないから問題。
確認したいこと
1.とりあえず方法があっているか。
2.Windowsだとまともに動かないようだが他のプラットフォームだとどうか。

843 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 21:35:38 ]
>>839
1.8.6-FreeBSDだけど File::CREAT|File::EXCL で Errno::EEXIST が出る
ただし>>839のソースをそのまま実行すると例外が rescue でとらえられて
例外処理でロックファイル削除されてからリトライするから、例外が発生してないように見える
あとrescueの下の二行間違ってるよ

844 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 21:40:52 ]
>>839
$ ./ruby.exe -v -e 'open("hoge", File::WRONLY|File::CREAT|File::EXCL,0666)'
ruby 1.8.7 (2008-11-04 revision 20103) [i386-mswin32]
-e:1:in `initialize': File exists - hoge (Errno::EEXIST)

投げるが。

> if(File.stat('lockfile').mtime<Time.new+10) then
未来の時刻と比較してるようだがこれはいいのか?


845 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 21:43:49 ]
>>843
確かにおかしいところがあるかもしれないです。
rescue
if(i>10) then
raise
end
i=i+1
if(File.stat('lockfile').mtime<Time.new+10) then
File.unlink('lockfile') #残骸のロックファイル削除
else
sleep(0.1)
end
retry
end

一応rescue節の書き換えはしてみました。これで大丈夫でしょうか。
あと、例外処理でロックファイルが削除されるのはたぶん正しいです。
というのもそのファイルの最終更新時間が10秒以上前なら削除するように
できてますから。

846 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 21:45:56 ]
>>844
あ、やばい。そこがおかしい。
どう考えてもおかしい。
if(File.stat('lockfile').mtime+10<Time.new) then
こう直すべきだ

847 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 21:55:09 ]
>>844
どこでおかしかったか分からないが治った。thx



848 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 21:57:23 ]
>>842
> 組み込みで現に存在してるのが使えないから問題

849 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 22:10:05 ]
>>842
> 1.とりあえず方法があっているか。
あってない。突っ込み所満載。
・SystemCallError なんて上がらないんだが。
rescue => e
puts e.class
とでもして、何が上がってるのか確認しろ。
・if文が閉じてねーぞ。
> if(i>10) then raise
1行で書きたきゃ「if(i>10) then raise; end」か「raise if (i>10)」だ。
つか、endの対応が合ってなくてさくっとsyntax errorなんだが……。
・mtimeが「現在+10秒」より過去、って何の冗談だ。
・あるプロセスがunlinkした直後に別のプロセスがstatしたら死ぬんだが。
・あるプロセスがstatしてunlinkするまでの間に別のプロセスがstatしてunlinkしてopenしたら不味いんだが。
> 2.Windowsだとまともに動かないようだが他のプラットフォームだとどうか。
とりあえず適当に修正したら、2プロセス程度の簡単なテストならちゃんと動いた。(@mswin32)

850 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 22:19:35 ]
>>849
1.Errno::XXX系統のクラスは全部SystemCallErrorのサブクラスなので
きちんと受け止められる
2.if文問題は修正済み
3.時間問題も修正済み
4.いまだにレースコンディションが解消してない件は最悪またSystemCallErrorで
受け止めてやればいい
修正したソース(rescue節のみ記載)
rescue
if(i>10) then
raise
end
i=i+1
begin
if(File.stat('lockfile').mtime+10<Time.new) then
File.unlink('lockfile') #残骸のロックファイル削除
else
sleep(0.1)
end
rescue SystemCallError
#rescueするけど何もしない
end
retry
end

851 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 22:24:21 ]
それでもやっぱり最後のレースコンディションは解消してないのだが、
これ以上この方法にこだわる限り改善の余地はなさそう。

852 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 22:42:44 ]
>>842
>まずそのサーバーでflockが使えないから無理
File#flock() が使えない環境ってどんなの?
どこでも使えるもんだと思ってた。

853 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 23:03:27 ]
>>850
更新時刻から10秒待つのに、リトライは0.1秒×10回でいいのか、というのはおいといて、ゴミ掃除を別々のプロセスで確実にやるのは無理だと俺は判断してる。
ゴミ掃除専用のプロセスを1個だけ別に動かしとけ。メインの処理に10秒以上かかる可能性がないと言えるなら、それで大丈夫だろ。


854 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 23:31:32 ]
どうせ専用のプロセスを立ち上げるなら,
druby使ってmutexを共有するという強引な方法を思いついた

855 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 00:22:16 ]
普通にO_EXLOCKでシステムのアドバイザリロック機構に頼ればいいんじゃないのか?
下がnfsだったりするとアレだが。

856 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 05:41:35 ]
>>853-854
レンタルサーバーでCGIを動かすために使うというのが大前提なので。
プロセスの常駐とかまず無理。
10秒待つのではなく確実を期すために10秒以上前のロックファイルを
削除するといっている。待つ時間は1秒。

857 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 05:43:07 ]
flockメソッド(関数)は、言語によって同じ名前でも実装が違ったり
一部のファイルシステムやレンタルサーバ上では使えなかったりしてあまり信用できない

かといって自分でロック機構を実装すれば、レースコンディションの危険がある
なんかこの辺をさくっと解決してくれるpure rubyなライブラリないかな



858 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 11:34:57 ]
>>857
>flockメソッド(関数)は、言語によって同じ名前でも実装が違ったり
Rubyの話してるんだから他の言語は関係ないだろ。

>一部のファイルシステムやレンタルサーバ上では使えなかったりしてあまり信用できない
だからどんなファイルシステムやレンタルサーバ上で使えないの?
具体名をだしてくれ。
どういう場合にflockが使えないのかを、ドキュメントに書いてもらおうぜ。


859 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 12:23:44 ]
>>858
NFS上でのロックは不可能。
これはflockシステムコールの実装から来る制約。
fcntlを使えばNFSでロックすることは可能になるがIO.ioctl関数という
可搬性が低いメソッドを用いなければならず(まずWindowsなら実装されていないと
門前払い)かなり面倒。おまけにたいていNFS上でのロックはセキュリティホールに
なるので使えないのが普通。

860 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 12:49:31 ]
>>858
レンタルサーバだと、flockが明示的に禁止されているサーバがある。パンドラとか

ただ、現在flockを使えないサーバがどのくらいあるかは分からない
無視できるほど少数かも

861 名前:デフォルトの名無しさん [2008/11/08(土) 22:07:38 ]
正規表現の書き方なのですが、、、、
>Sector:</td><td class="yfnc_tabledata1"><a href="biz.yahoo.com/p/7conameu.html">Services<
こんな文字列があって、前後にも改行以外の文字が色々とくっついているのですが、
Sector:の後のServicesをマッチさせて文字としてとってこようとすると、どう書けば良いでしょうか?


862 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 22:17:18 ]
正規表現は書き方を覚えないと駄目
なぜなら、ほんの少し変えようと思っただけで別物になるから
コピペでやろうとすると異常に遠回りになる

正規表現自体は他の言語の正規表現とけっこう互換性があるから適当なサイトで勉強すれ

863 名前:デフォルトの名無しさん [2008/11/09(日) 00:42:26 ]
>>862
ありがとうございます。
マッチしたい文字列が9種類しかないのが分かったので、こうやりました。
if line =~ /.*Sector:<.*(Basic Materials|Conglomerates|Consumer Goods|Financial|Healthcare|Industrial Goods|Services|Technology|Utilities)/
p $1
end


864 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 11:46:37 ]
wxRubyについて勉強してるんですが、何かいいサイトはありますか?

一応自力で見つけたサイト
www.gesource.jp/programming/ruby/gui/wxruby/index.html
wx.k5-n.com/wxruby/

最小限のことは自分でやってます。require周りは自分でなんとかしてます。

865 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 11:59:40 ]
具体的には…

1.とりあえずwxWindowをインストールした
2.wxRubyをgems経由でインストールした
3.簡単なテストアプリケーションが動くようになった

以上のことがすでに完了してます。

866 名前:デフォルトの名無しさん [2008/11/09(日) 12:00:00 ]
文字列変換メソッドを多数持たせたモジュールがあります。呼び出し
ごとに正規表現オブジェクトが作成されるのを防ぎたいのですが、
単に/abcde/ の代わりにRegexp.new("abcde")とすればOKですか?
それともグローバル変数みたいなものに格納しないとキャッシュと
しての効果は出ない?



867 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 12:12:20 ]
式展開を含まないならどうでもいい



868 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 12:18:17 ]
>>866
irb> class RegData
def reg1; /abc/; end
def reg2; /ABC/; end
def reg3; /123/; end
end
irb> RegData.new.reg1
/abc/
irb> RegData.new.reg1.object_id
537973880
irb> RegData.new.reg1.object_id
537973880
irb> RegData.new.reg1.object_id
537973880

ということで、静的な正規表現は、クラス定義が読み込まれた時点で使いまわしモードに入る
 @re_scan = /xxxx.+?(yyy)zzz+/i
のようにクラス変数に正規表現を保管するというようなよくあるテクニックは、
正規表現が静的である場合に限り、コスト上は実は無意味、あるいは参照コストのぶん損だったりする
>>867の言うように、式展開を含むような「毎回違う可能性のある」正規表現はこの限りではない

869 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 12:20:32 ]
>>866
/abc/ なら毎回生成されることはない。
/ab#{var}cd/ や Regexp.new("abcd") なら毎回作成される。
あとは
CACHE_REGEXP = {}
def cache_regexp(str)
 CACHE_REGEXP[str] ||= Regexp.new(str)
end
とか。


870 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 12:42:43 ]
>>864
公式のチュートリアル。
あとWxWidgetsのサイト全般と公式のAPIドキュメント。

wxに限ったことではなく、既存ライブラリのRubyバインディングは
元ネタのサイト漁るのが一番いいと思う。

871 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 12:57:40 ]
>>870
読んでみたんですが、すでに???状態です。
英語ワカンネじゃなくてそもそも読む気力がないのが大問題だったりするわけですがorz
今度気力が回復したらやってみます

872 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 13:09:11 ]
わかんなくてもコードコピペしてたら何となく動くし
それでもダメならWxWidgets関連のサイト参考にって>>870の2-4行目で

873 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 13:15:24 ]
>>872
ええ。一応その段階はある程度OKです。
あとはゆっくり亀のように進んでいけばいいんです。
解決しました。ありがとうございます。

874 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 13:23:24 ]
>>864
harukaze wxPython で検索

あと、解説サイトじゃないけど
wxRuby開発者が出してるwxsugarオススメ

875 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 13:49:02 ]
>>874
たぶん言ってるサイトはこれだと思うんだけど、
www.harukaze.net/~haruka/wxpython/index.html
なんかドメイン飛んでるよ
Pythonのが参考になるっつーことは理解できたけど。

876 名前:866 [2008/11/09(日) 15:29:30 ]
>>867-869

ありがとう、よく分かりました。

877 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 23:22:19 ]
>>859
>NFS上でのロックは不可能。
ほう、そうなのか。知らなかった。さんくす。

>fcntlを使えばNFSでロックすることは可能になるがIO.ioctl関数という
>可搬性が低いメソッドを用いなければならず(まずWindowsなら実装されていないと
>門前払い)かなり面倒。
Windows上でNFSを使うことはないだろうから、ioctlはUNIX限定でいいんじゃね?

>おまけにたいていNFS上でのロックはセキュリティホールに
>なるので使えないのが普通。
これよくわかんないんだけど、理由は?参考になるURLプリーズ。

>>860
>レンタルサーバだと、flockが明示的に禁止されているサーバがある。パンドラとか
これも理由がわからん。レンタルサーバでNFS使ってるわけじゃないだろうし。なんで?



878 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 23:31:11 ]
>>877
ttps://menu.pandora.nu/public/flock.php
パンドラ側の説明みつけた

879 名前:デフォルトの名無しさん mailto:sage [2008/11/11(火) 00:06:10 ]
超絶初心者な質問で申し訳ないんですけど、RubyScript2Exeでexeファイル作りたいんですけど上手くいきません。
使い方は、RubyScript2Exe.rbとexeにしたいファイルを同じフォルダに入れて、
コマンドプロンプトで、「ruby [RubyScript2Exeのパス] [exeにしたいファイル]」
で合っていますか?

880 名前:デフォルトの名無しさん mailto:sage [2008/11/11(火) 07:32:00 ]
>>878
サンクス。あきらかにNFS使ってるね。
そんなサーバがあることに驚いたけど。

881 名前:デフォルトの名無しさん mailto:sage [2008/11/11(火) 07:50:04 ]
つまりflock前提として、最適なロック方法は
「まずIO.ioctlでロックを試みる、エラーが出ればrescueしてflockする」ということか!

・・・面倒だ
やっぱり、完全に可搬性のあるファイルシステムロック用のライブラリが欲しいな

882 名前:デフォルトの名無しさん mailto:sage [2008/11/11(火) 08:19:04 ]
「完全に」とか簡単に言っちゃう人って頭悪そう。

883 名前:デフォルトの名無しさん mailto:sage [2008/11/11(火) 08:36:33 ]
不完全or不安定なライブラリがほしいって言うのもなんだと思うが

884 名前:デフォルトの名無しさん mailto:sage [2008/11/11(火) 08:49:34 ]
欲しい欲しい、して欲しい。

885 名前:デフォルトの名無しさん mailto:sage [2008/11/11(火) 09:14:19 ]
RAAやRubyForgeをざっと探してみたけど、ファイルロック用のライブラリらしきものが見当たらない
実はみんな、あまり必要としていないのか?

MLでこんな古い話は見つけたが、ソースコードはもう公開されてないっぽい
(時間ないから詳しく探してないけど)
ttp://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/11326

886 名前:デフォルトの名無しさん mailto:sage [2008/11/11(火) 09:50:16 ]
本来、ファイルロックみたいにべったり環境依存なものに、完全な可搬性を求める発想が普通は余りないんだよね。
とはいうものの「環境依存だから諦めろ」ってのも古い考えで、こういう操作こそ処理系で環境差異を吸収しろ、っていう意見も、確かに一つの見識だと思う。
というわけで、完全な可搬性を持ったファイルロックの実装をコントリビュートしてくれ。

887 名前:デフォルトの名無しさん mailto:sage [2008/11/11(火) 09:54:31 ]
あんまり気にしたこと無かったけど、makeするあたりで
良きに計らってくれるとよさそうな感じだね



888 名前:デフォルトの名無しさん mailto:sage [2008/11/11(火) 15:07:35 ]
flockが使えるかどうかがファイルシステムに依存する以上、
コンパイル時に判定するのは無意味じゃないか?


889 名前:デフォルトの名無しさん mailto:sage [2008/11/11(火) 17:32:32 ]
>>886
SQLが使えるなら簡単な表を作って、そこに1つだけレコードを追加して、
あとはSELECT FOR UPDATEかSELECT LOCK IN SHARE MODEで終了。
幸いSQL用のライブラリは普通に配布されてる。
SQLが使えない場合はやり方を工夫するしかないわけなんだが。
とりあえずパンドラさんのPerlライブラリを解析するしかなさそうだけど。
>>881
むしろ順番は逆のほうがいい。ioctl関数はどちらかといえば汎用関数。
ioctlが使えないのはほぼ例外なくWindowsで作られてるサーバー。

890 名前:デフォルトの名無しさん mailto:sage [2008/11/11(火) 17:34:51 ]
RuBBSになんかあったな、ロック用のモジュール。
これの可搬性はどうなんだろう。

ttp://www.google.com/codesearch?hl=ja&q=lang:ruby+lock.rb+RuBBS+show:GN3bH3qHRek:P3zWR8HHuh8:MtDFtjKjkEI&sa=N&cd=2&ct=rc&cs_p=www.spc.gr.jp/software/archive/rubbs-1.0.7.tar.gz&cs_f=rubbs-1.0.7/lock.rb

891 名前:デフォルトの名無しさん mailto:sage [2008/11/11(火) 17:53:13 ]
>>890
この関数の流れは…
1.ロックファイルを固有ファイルに名前を変えようとする。成功したら3へ
2.失敗したらタイムアウトより古いロックファイルがあればロックを取得しようとする。
成功したら3へ
3.1秒待って1へ戻る。ただしtry回試して失敗したら打ち切り
4.ロックを取得できていなければLockError例外を発生させる
5.ブロックをともなって呼び出されていた場合そのブロックを実行する。
そしてロックを解放する

ロックの解除は普通に元のファイル名に変更するだけ。

汎用性はかなり高いと思われる。レースコンディションを検討しても
まずないだろうと考えられる。ファイルのリネームができないサーバーは
まずないだろうからその面でも問題はない。

892 名前:デフォルトの名無しさん mailto:sage [2008/11/11(火) 18:01:12 ]
ただし、このプログラムを使う場合、GPL2が適用されるので
それを使ったソースの配布もGPL2を用いなければならず、
そこが唯一の問題だったりする。逆に言えば、GPL2で
配布する予定のプログラムならぜんぜん問題はないといってよい。

893 名前:デフォルトの名無しさん mailto:sage [2008/11/11(火) 19:05:10 ]
>>892
自分で書き直せばいいんじゃね?


894 名前:デフォルトの名無しさん mailto:sage [2008/11/11(火) 22:36:42 ]
アトミックな処理(シンボリックリンクの作成とか)を利用したロック方法は
それなりにノウハウが枯れきっている話題だし、自分で実装しちゃえばいい。


895 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 07:21:48 ]
試しにファイルシステムロック用のライブラリを書いてみた(不完全)
mkdir方式で共有ロック・排他ロックの区別あり
ttp://eload.run.buttobi.net/cgi-bin/img/e_260.zip

ロック検出→ロックディレクトリ作成の間に
明らかなレースコンディションがあるんだけど、解決の方法が思いつかない・・・
何かいい解決策はないだろうか

896 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 12:34:09 ]
すでに存在するディレクトリを指定したときにエラー返らないんだっけ?

897 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 13:20:39 ]
Perlだけど解説は参考になるかな
www.din.or.jp/~ohzaki/perl.htm#File_Lock



898 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 21:36:28 ]
>>896
Errno::EEXIST

899 名前:デフォルトの名無しさん mailto:sage [2008/11/13(木) 08:41:51 ]
改良版。レースコンディションは無くなった……と思う
その代わり1回のロックで2つのディレクトリを作るため、効率はやや悪い
ttp://eload.run.buttobi.net/cgi-bin/img/e_261.zip

>>896
共有ロックだと、複数のロックを同時にかけられるから
「まずmkdirしてみて、失敗するならロックされている」という検出方法が使えなかった

900 名前:デフォルトの名無しさん mailto:sage [2008/11/13(木) 16:44:54 ]
ボロボロじゃん。
教科書に載るようなちゃんと知られたアルゴリズムを調べて書いた方がいいと思うよ。






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

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

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