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

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

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

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


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

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

863:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/11/09 11:46:37
wxRubyについて勉強してるんですが、何かいいサイトはありますか?

一応自力で見つけたサイト
URLリンク(www.gesource.jp)
URLリンク(wx.k5-n.com)

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

865:デフォルトの名無しさん
08/11/09 11:59:40
具体的には…

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

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

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



867:デフォルトの名無しさん
08/11/09 12:12:20
式展開を含まないならどうでもいい

868:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/11/09 12:42:43
>>864
公式のチュートリアル。
あとWxWidgetsのサイト全般と公式のAPIドキュメント。

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

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

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

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

874:デフォルトの名無しさん
08/11/09 13:23:24
>>864
harukaze wxPython で検索

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

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

876:866
08/11/09 15:29:30
>>867-869

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

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

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

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

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

878:デフォルトの名無しさん
08/11/10 23:31:11
>>877
URLリンク(menu.pandora.nu)
パンドラ側の説明みつけた

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

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

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

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

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

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

884:デフォルトの名無しさん
08/11/11 08:49:34
欲しい欲しい、して欲しい。

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

MLでこんな古い話は見つけたが、ソースコードはもう公開されてないっぽい
(時間ないから詳しく探してないけど)
URLリンク(blade.nagaokaut.ac.jp)

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

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

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


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

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

URLリンク(www.google.com)

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

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

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

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

893:デフォルトの名無しさん
08/11/11 19:05:10
>>892
自分で書き直せばいいんじゃね?


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


895:デフォルトの名無しさん
08/11/12 07:21:48
試しにファイルシステムロック用のライブラリを書いてみた(不完全)
mkdir方式で共有ロック・排他ロックの区別あり
URLリンク(eload.run.buttobi.net)

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

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

897:デフォルトの名無しさん
08/11/12 13:20:39
Perlだけど解説は参考になるかな
URLリンク(www.din.or.jp)

898:デフォルトの名無しさん
08/11/12 21:36:28
>>896
Errno::EEXIST

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

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

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


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch