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を読め」でいいので、叩かない&怖がらせない。 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
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 ] ボロボロじゃん。 教科書に載るようなちゃんと知られたアルゴリズムを調べて書いた方がいいと思うよ。