自作CGIを評価するスレ
自分の作ったCGIをみんなに評価してもらうスレだよ。言語は問わないよ。 よほどプログラムが短くないかぎりはアプロダにでもアップしてね。 >>303 「TABだけ」ならいいんだがな。空白と混じってるとおかしくなる。 いちいちTABだけなのを確認するより最初から空白だけの方がいいだろ。 TABなんて今時ディスクの節約にもならん。 どっちにしろ(例えば)SUNもMOZDEVもタブ不使用規約になってんだから 合わせた方がいいんでないかい? 間違えた。SUNは推奨してるだけだった。以下引用 >インデントの単位として,4個分の半角スペースを推奨する. >そのインデントが実際に半角スペースによって行われるかタブによって行われるかについては,これを規定しない. >タブはすべて(4個ではなく)8個分の半角スペースでなければならない. eclipseだったかな。曖昧記憶でスマソ 自分が思ったのは 「CGIスクリプトしか書いたことない人にありがちなソースだな。」 ってこと。 リファクタリングとか色々なことを勉強してみては? >>302 タブは、インデント以外に使ってないから、 どんなタブ幅でもずれてないはずだけど・・・ ずれてる??? 291です。評価ありがとうございます。 >>301 さん わざわざ直してくださって、本当にありがとうございます! 指摘されたのに気をつけて書き直してから、また評価をお願いしに来ます。 でも、もう…直せるところが無いかもしれませんが(汗) >>306 さん そのとうりです。自分でCGIを作ってみたくなったので、perlを勉強しだしました。 色々なことを勉強するのもいいですけど、虻蜂取らずにはなりたくないので…。 >>285 ソース、今見てるけど・・・ えらくコメントの少ない・・・って言うか、コメントの無いソースだな・・・ わざと、コメント消したの? それとも、素でこれ? 素でコメント無いなら、コメント入れていった方が良いと思う。 >>309 これ以上コメント書かれたら、読みづらくないですか? と、素な意見。 >>310 う〜ん、本体(?)の方はコメントあるけど、 モジュールの方にコメントがないかな。 >>309 さん 基本的にコメントを一切書かないのです。 ただ、配布とか考えると書いた方がいいかなと思って、今回はちょっと書いてみました。 やっぱ少ないですかね.. 別にコメント書かないとかいう変なこだわりがあるわけじゃなくて、 ただ、自分はコメントなくてもすぐ分かるので人に見せる予定がないものに コメント書かなくてもいいかなと..今は勉強中ということですし。 ただ、今回は見てもらおうとここに載せたわけなので、 モジュールの方にもコメントを書くべきだったと思いました..すみません。 「未来の自分は他人です」という言葉を贈っておこう。 コメント無しでもいいような わかりやすいクラス名、変数名、関数名をつけるのが基本です。 コメントが無いとわからないってのは それだけ汚いソースだということです。 >>315 , >>316 なるほど. 自分は今、就職希望の会社からCのソース(50-500行,10枚くらい)を渡されて、 この説明を書いてこいとか言われているのですが、コメントなくても 関数名, 変数名が分かりやすいし、うまい具合にサブルーチンに分けてあるので コメント少ないですが、かなり読みやすいと思いました。 まあ、漏れのはコメントないと読みにくいかもしれませんが.. 自分で見ても読みにくいな、と思ったらコメントでカバーするようにしてみます。 >>316 # ■■■ 俺の意見 ■■■ 俺は、とにかくコメント入れるのに賛成派。 ルーチンの名前とか、変数の名前に意味を持たすのは当たり前だけど、 コメントあれば、コメントだけ読めば、何の処理してるのかわかるし。 # ■■■ ブロック毎にコメントを入れる ■■■ ブレスで囲って無くても、処理の単体が生まれる。 それ毎に、コメントを入れておけば、一行のコメント読めば数行理解できる。 # ■■■ ルーチンの使い方のコメントは重要! ■■■ とくに、ルーチンの使い方のコメント。 絶対後から見て助かる。 いくつ、どんな引数を取って、どんな処理してくれて、どんな値をどんな形で返してくれる。 そんなコメントがあれば、一発でそのルーチンの内容がわかるでしょ。 # ■■■ 最後に・・・ ■■■ ↑どう? こんな感じでコメント入れる訳よ。 全部の行読まなくても、#で始る一行読めば、 俺が、なにについて書き込みしてるか分かるでしょ。 これを、プログラムでも実践してる。 それと、空行無しに書き込みしてると読む気失せるでしょ。 そうそう、掲示板の書き込みでも、 結構その人のセンスが出る。 変な所で改行してる人や、 長文なのに空白行入れず、 だらだらとメリハリの無い書き込みする人とか。 そういう人って、プログラムも汚いんだよね・・・ はい、たしかに後で読む人がいるとすれば、 コメントは書いたほうがいいですね。 読む側と見るとありがたいものなので、自分でも書くようにします。 コメントが無いために間違った認識を受けたり、 重要な処理を 「これいらねぇんじゃね?」 とか思われて消されること減るはずだし。 >>318 さん 自分が言いたいのは 「コメントを書くな」 ではなく 「コメントが無くてもわかるようなキレイな設計を心がけよう」 ってことです。 コメント関係ならプログラム技術板のこっちのスレのほうがいいかも。 http://pc2.2ch.net/test/read.cgi/tech/1038414493/ >>321 スレタイにワラタ いや、もう終わってるっぽいスレなので、 もういいかな〜っと。 とにかく、コメントは思うように入れまくってみたら良いと思う。 そうしてる内に、どういう風にコメント書いたら分かりやすいとか、 こういうコメントは無駄だとか、分かってくるだろうし。 前に、冗談だろうけど・・・ $hoge++; #1を増加 ・・・こんなコメントを見た事がある。 こんなの、明らかに無駄。(w ただ、なぜ1を増やすかって事についてのコメントなら・・・ それは、意味を成すかもしれない。 実は、俺も無駄なコメントが多いんだよね・・・ ぜんぜんプログラムとは関係ないようなコメントとかある。 そういうのって、俺的に後から見たら面白かったり。 もちろん、人に見せる時は、そんなコメントは消すけどね。 OO なコード書いて POD 埋め込むようになってから 普通のコメントがかなり減った。スクリプトとドキュメント 同時に作るのは効率いいしオススメ。 http://do.sakura.ne.jp/ ~junkroom/cgi-bin/megabbs/lounge/file/1032435179_5/hoge.zip むかしいじってたやつ、もう要らないから使えると思った香具師 勝手に使ってくれ。コメント皆無だけどね。 でも最後に軽く評価を聞きたいけどな。 >>326 あぁ。今見直したら俺が書いたやつじゃないものが入っていた・・・ Text::WordIteratorとか。。。 あーあ。まぁ、いいや。 ども。 いつぞやのコメント削除スクリプト作った俺です。 今作ってるスクリプトが行き詰まりました。 ちょっとイライラしたので、 息抜きにコメント削除スクリプトのバージョンアップとかしてみました。 このバージョンで、サブディレクトリ内も検索可能になりました。 深さは、どんなに深いサブディレクトリでも処理可能です。 http://isweb25.infoseek.co.jp/computer/pcqa-2ch/cgi-bin/img/1160.zip ・・・リファクタリングが必要かもしれん・・・ >>329 >深さは、どんなに深いサブディレクトリでも処理可能です。 当方にはそのスタックをあふれさせる準備があるが良いのか? >>331 う〜ん。 スタックを溢れさせる準備があるって意味がわからんです・・・。 とにかく、かなり深いディレクトリでもOKなはず。 だって、Cのルートディレクトリから検索とか掛けてみたから。 とりあえず、試してみそ〜。 http://www1.neweb.ne.jp/wb/prof/index.htm 平成15年度 自作板 PC環境調査 ◆5月分の結果が出ました。現在は6月分に移行しています。 (参考) 平均年齢 25.4歳 ネット(2ch含) 78.7% ゲーム 59.0% Windows XP Family 46.9% Windows 2000 Family 34.4% Athlon 45.3% Pentium 4 29.7% nVIDIA 49.2% ATI 28.9% DVD-R/RW/マルチ 20.4% CD-R/RW 75.9% 光ファイバー 8.3% ADSL/xDSL 64.5% CRT 74.6% LCD 25.4% >>332 ソースは見てないが、再帰的な処理をしてるのにスタックについて知らないというのは ちょっとヤバくないか? >>334 再帰? 自分の中で自分を呼ぶアレ? ・・・いや、普通にwhile文とかでブン回してるだけだが・・・ ディレクトリ検索のアルゴリズム考えるの、 実はちょっと大変だったんだよね・・・ ひさびさに、フローチャートとか書いたもん。(w ちなみに、見てもらったら分かるけど、 メモリの使用も最小限に抑えてるし。 >>335 そうみたいね・・・書けちゃったから・・・。 whileでブン回しておいてメモリは最小限とはこれいかに。 >>336 確かにWhileで再帰のまねごとは出来る。 でも、どっちにしろスタック的なデータ構造がないと困るはずだけれど。 >>329 キモの部分 (Library_223.pm) 以外を書き換えてみた。 http://boobar.hp.infoseek.co.jp/refactoring/commentoff.pl.txt …まぁ、なんつか、もっと色々な人の話に耳を傾けて もっと上を目指して下され。今のレベルで固まられたら 正直痛すぎる。 漏れも人の事言えんけどなー。 >>337 簡単な話。 while文で、ブン回しながら、必要なデータか調べる。 必要なデータなら、ファイルへスワップ。 必要じゃなかったら、次のループで上書き。 つまり、メモリにデータを蓄えないようにしてる。 一通り調べ終わったら、次のステップでスワップしたファイルから データ読み出しって感じ。 >>338 そのスタックってのがよく分かてないんで・・・ どんなデータ構造なのか分からないけど・・・ 再帰処理は、一切使ってない、ただループさせてる処理をしてるよ。 DirTree.pmってファイルがディレクトリを走り回る処理部分だから。 一度、覗いてみてくださいませ。 >>339 ソース見せてもらいました。 再帰処理使ってるね。 こんな事言っても仕方ないし、 プログラム打つ人間としては失格かもしれないけど、 再帰処理って嫌いなんだよね。 逐次処理&反復処理だけで、すべてをこなせると思ってる。 いままでで、再帰処理を行わないといけない場面ってなかったし。 まぁ、ヘッポコな俺だから、 まだそんな場面に出くわしてないだけかもしれないけど。 それに、再帰処理に出くわすと、ソース読むのが大変。 俺的にね。 と、まぁこれは俺の哲学。 それと、これはD&Dに対応してないね。 それと、処理中&処理後のログが少ない。 この辺でも、俺と嗜好が違うね。 俺のは、そういうログがないと固まってるようでイヤだから。 結構うるさいソースになってる。 と、「正直痛すぎる」とかって言われたので、 ちょっと反抗してみました。(w 正直な感想は、無駄のないスッキリ仕上げなソースだと思います。 それと、俺の知らない組み込み関数とか使ってる。 もうちょっと、俺も勉強しないとね。 改造とかしてくれる人少なくってさ・・・ ソースみて勉強させてもらいます。 ありがとうございました。 久しぶりに覗いてみたら まだやってたのねご苦労さんw 実はあと風呂に入ってたらフィルターバグまだいくつかあるのを 気づいちゃったんだよね… 漏れ的ソースの書き方ならアレで問題ないんだけど 世の中には漏れの想像もできない書き方する人がいるんで 傑作にケチつけられて熱くなっちゃいました。 DirTree.pm直してやるから待っててな。 あ。再帰処理しか考えられない…止めよう。 今のやり方で、明らかにおかしい所は、ループ内で$tmpPathListを開いて閉じてる所。 ファイルハンドルが勿体無い。 それから、少し変な所で、メモリ使用量にこだわっている割には、readdirを リストコンテキストで呼んでる点。一つずつ調べればいいのに。 それから、趣味の問題だけど、変なインデントが気持ち悪い。スコープを分けたい(?)なら ブロックを作ればいいし。 あと、無駄な括弧。 if ( ($_ eq '.') || ($_ eq '..') ) { next; } こことか強烈なんだけど…このままでも条件の中身の括弧は無くてもいいんだけど、 十分に優先度が低いorを使えば、心配しなくてもいい。それに大括弧のインデントも変。 @filelistのスコープも変。とにかく変数は使用直前に宣言した方が楽。 それから、$countはハッシュのリファレンスにする価値は無い。普通のハッシュで十分。 >>345 ごちゃごちゃ言う前に書き直してそれがより美しいことを証明すればどうだ? >>342 うーん、忘れた頃に、またやってます(w そうそう、コメント削除のバグ。 俺も、2つほど気付いてました。 しかし、俺的に今の所実害がないので放置中。。。 今度、直してみます。 >>345 スクリプト自体は、すごくスッキリしてて、 本当、無駄がないと思います。 大半の人は、俺のスクリプトより>>339 のスクリプトを好むかと・・・ 俺の言ってる事は、ヘッポコの戯言だと聞き流してください。 指摘された部分。 ループ内でファイルを開いたり閉じたりしてる部分。 メモリ使用量最小限とか言ってるのに、 ディレクトリ内のファイル名を一発で取得してる部分。 この2つは・・・ 言い返す言葉がないです(w ファイルは、ループ前に開いて、ループが終わったら閉じるように変更。 ファイル名取得も、一つづつに変更してみました。 $countのハッシュリファレンスを使ってる。 これについては・・・ 戻り値は、今後の改良などで値が大きくなるかもしれない・・・ という理由から、俺が作るルーチンのほとんどはリファレンスが返ってきます。 しかし、ルーチン内でリファレンス使ってるのは意味ないですね。 と、言うことでルーチン内は普通にハッシュを使うように変更。 戻り値はリファレンスだけど・・・ インデントが変。 orを使わず、||を使って括弧の多様。 変数宣言は、使用直前に宣言した方が楽。 これらについては・・・ 好みってことで、許してください。 http://isweb25.infoseek.co.jp/computer/pcqa-2ch/cgi-bin/img/1166.zip aice.zive.net/index.jsp よろしくお願いします。 >>350 ここの人は低レベルだからJavaなんて理解できないよ。 >>351 言われてみれば、Javaスレってないね・・・ 難易の話をしているつもりかな? なら351はJavaを理解していないに430スイカ >>211 の人。 記述が馴れないような感じになって良いなら、gotoでルーチン使うと(ルーチンね)スタックがたまらなくて良いよ。 ただし、それは履歴自体プログラムが管理しないって事だから時には諸刃の剣。 スタックはほとんど何やってもたまるよ。 スタックがたまると言うか、スタックの中にいろんなもんがたまる。 もちろんループもしっかりスタックに残り管理されてる(当たり前)。 だから「再起じゃないから」、「サブルーチンじゃないから」スタックには全く関係ないてのはでっかい間違い。 どんな経過をたどって現在まで辿り着いたのかとか、捨てたと思った変数が実は残っているとか。 スタックにも色んな種類あるから調べて味噌。 >>356 うーん、無理にスタックを意識して、 goto文を使用しようとは思わないです・・・。 あまり、ソースがトリッキーすぎると、 未来の俺から苦情がきます。 それでなくても、結構トリッキーっぽいから・・・ スタックとは、何なのかはっきり分かってなかったのですが、 いろいろ調べ回って、何なのか、何となく分かりました。 スタックについて、勉強させてもらう機会をいただいた皆さんに感謝です。 さて、また一つヘンテコなスクリプトを組みました。 複数のファイルから、文字列を検索するスクリプト。 My_Grep。 http://isweb25.infoseek.co.jp/computer/pcqa-2ch/cgi-bin/img/1181.zip 使い方などは、同封してるテキストファイルを読んでください。 改造してくれる人は、できればアップして、ソース見せてください。 勉強させてもらいます。 また、今回も「DirTree.pm」を同封してますが、 >>349 の指摘された所は、直してます。 では、評価お願いします。 バージョンアップしました。 http://isweb25.infoseek.co.jp/computer/pcqa-2ch/cgi-bin/img/1184.zip このバージョンで、 複数の拡張子のファイル検索が可能。 ログで、先頭のインデントなどのスペースを削るようにした。 ・・・誰か、評価お願いします・・・ 誰も手がってくれない。寂しいね。 >>359 乙。 俺よりはるかにレヴェルの高いことやってらっしゃるので、 研究させてもらいます。 # 自作スクリプトを公開できるのはいつになることやら、、、 >>360 ども。 一応覗いてくれてた人がいてたんだね。 よかった。 まったく手がってもらえないから、かなり寂しかった(w やってる処理自体は、そんなにレベルの高い物じゃなかったりします。 俺も研究させてもらうので、何かスクリプト作ったらアップしてくれたら嬉しいです。 さて、また意味なくバージョンアップしました。 http://isweb25.infoseek.co.jp/computer/pcqa-2ch/cgi-bin/img/1189.zip このバージョンで、 結果ログファイルがHTMLファイルになって、 ヒットしたキーワードが強調表示されるようになった。 ファイルがバイナリファイルか調べるようにした。 拡張子指定で、ファイル名に拡張子と同じ文字列があったら、 そのファイルも検索対象になっていたバグを修正。 指定した拡張子のファイルが無かった時でも、 つづけて検索フェイズに移行してたバグを修正 Html.pmってファイルを書き換えると、 出力するログの見た目が変えられるかもしれません。 それと、今回のバージョンで謎なバグが一つ・・・ tmpファイルが、今までスクリプト終了と同時に、 削除されるようにしてたんだけど・・・ 今回のバージョンは、なぜかtmpファイルが残ります・・・。 何度も見直したんだけど、まったく原因がわかりませんでした。 どなたか、ご指摘いただけたら嬉しいです。 >>362 いい加減ウザイ。完成してから後悔してくれ >>363 あら。 何か主旨が変わってきたね。 評価貰えるよう、スレを上げるために、 何もなくスレ上げてたら荒らしだから、 何か無いかと、がんばってバージョンアップしてたんだけど・・・。 でも、いくつか勉強させてもらったし・・・ この辺が潮時かな。 じゃ、俺のスクリプト公開は終了します。 >>364 もう少し実用性のあるもので再チャレンジしてみたら? 今回のは正直言って使いたいと思えるものでなかったから 評価しなかった あれば便利とか使ってみたいと思えるものなら協力者も増えるのでは 自作CGIを評価するスレ このスレは終了いたしました。 みなさん書き込みありがとうございました。 投稿件数 : 365 最終投稿者: nobodyさん 最終投稿日: 03/06/19 ∧__∧ / ̄ ̄ ̄ ̄ ̄ ̄ ( ^u^) < 乙彼様でした☆ と つ \______ (__つ 丿 し' スレの趣向とは少し外れるんですが、 下記のロック、アンロックはどうでしょうか? # lock routine sub lock { $retry = 5; if (-e $lockex_file) { $mtime = (stat($lockex_file))[9]; if ($mtime + 600 < time) { rename($lockex_file, $lock_file) || &error("lock error"); } } while (1) { last if rename($lock_file, $lockex_file); if (--$retry < 0) { &error("lock error"); } } } # unlock routine sub unlock { if (-e $lockex_file) { rename($lockex_file, $lock_file) || &error("lock error"); } } 評価お願いします。 >>368 いいんじゃないかな。 while文の所は・・・ while ($retry--) { return 0 if rename($lock_file, $lockex_file); } &error( 'Lock error' ); こうの方が良いかな。 >>369 どうもありがとうございます。 他のスレでこういう書き方をみかけました。 while (!rename($lock_file, $lockex_file) { if (--$retry <= 0) { &error("lock error"); } } >>369 さんが書いてくれたものとどちらがいいんですかね? >>368 このルーチンだと穴がある。経験則だけど、アクセスが殺到すると簡単に壊れる。 説明するのめんどいので、 http://www.din.or.jp/ ~ohzaki/perl.htm#File_Lock この辺りでも読んでみて。 >>370 好みだと思う。 個人的には>>368 も>>369 も>>370 もループの最中にreturnやら&errorで関数の 外に飛んでるので気持ち悪い(これも好みの問題)。 あと、>>368 はテストが最大6回行われるのに大して、>>369 と>>370 は 5回なので等価なコードじゃなくなってる。 というわけで、個人的にはこう書くかな↓ my $retry = 5; for($retry++; $retry; $retry--){ last if rename($lock_file, $lockex_file); } error("lock error") if not $retry; >>371 ありがとうございます。 ロックが甘いということは分かりましたが、アンロックはどうでしょうか? まだ371さんがおっしゃったサイトは見てないのでなんとも言えませんが…。 もう少し勉強してみることにします。 指摘されたリトライですが、 if (--$retry <= 0) { こうですね。 >>371 > このルーチンだと穴がある。経験則だけど、アクセスが殺到すると簡単に壊れる。 > 説明するのめんどいので、 > http://www.din.or.jp/ ~ohzaki/perl.htm#File_Lock > この辺りでも読んでみて。 その辺り読んで、載ってるルーチンそのまま使ってテストした所、 ファイル壊れました。 俺は、>>368 くらいの簡単なロックで良いと思うけど。 このロックで壊れるようなアクセス受けてるって事は、 その説明に載ってるようなルーチンでも、ほぼ壊れる。 どんなロックしててもファイルは壊れるんだから、 小細工いれた重いロック処理するより、 簡単にロックする処理入れた方が良いような。 >どんなロックしててもファイルは壊れるんだから そんなことはないよ。ただ言えることは、この板ではまだまともにロックできて いるルーチンが1つも書かれてないな。 >>374 >そんなことはないよ。ただ言えることは、この板ではまだまともにロックできて >いるルーチンが1つも書かれてないな。 flock使っちゃだめ? >>374 どんなに集中アクセスを受けても、 絶対壊れないファイルロックってある訳ない。 あったら、ぜひ見て見たい。 >>375 あ、ちなみに、flockでも壊れるんで。ファイル。 ↓これでもこわれる?(CSVの処理はPerlメモ参考にしてます) use strict; use Fcntl qw(:flock); $tmpfile = "$datafile".".$$.". time() .".csv"; #万が一リネーム失敗したときのために、 #ユニークなファイル名にしておく open (LOCKF, ">$datafile"."_lockf") or die("cannot open:$!"); #ロックファイルを作成する #(★注:ロックファイルは、各CSVごとにユニークに) flock (LOCKF, LOCK_EX); #ロックファイルをflockする open(IN, "< $datafile") or die("cannot open:$!"); # 読みのみモードで開く open(TMP,"> $tmpfile"); #テンポラリファイルを作成 while ($line = <IN>){ $line .= <IN> while ($line =~ tr/"// % 2 and !eof(IN)); $line =~ s/(?:\x0D\x0A|[\x0D\x0A])?$/,/; @values = map {/^"(.*)"$/s ? scalar($_ = $1, s/""/"/g, $_) : $_} ($line =~ /("[^"]*(?:""[^"]*)*"|[^,]*),/g); #必要なものだけをEUCにして、出力時にSJISにする foreach $value (@values){ &jcode::convert(\$value, "euc"); }; #CSV形式に変換 $newline = join ',', map {(s/"/""/g or /[\r\n,]/) ? qq("$_") : $_} @values; print TMP "$newline\n" ;#テンポラリファイルに1レコード書き込み } close TMP; close IN; unlink $datafile; rename ($tmpfile, $datafile) or die ("cannot rename : $!"); close LOCKF; >絶対壊れないファイルロックってある訳ない この根拠がどこからくるのかわからないが、 少なくともとてつもないアクセス集中に対応できるように非ブロックモードで タイムアウトを備えてないとまず無理だということは教えておこう。 あ、EUCにしてからSJISにもどすの忘れてるけど、そこは気にしないで > どんなロックしててもファイルは壊れるんだから、 そんなことはない。 というか、上(大崎氏の)のルーチンでファイル壊れたんならファイルシステムに 不備があるか、打ち間違いがあるかパーミッションやらの設定を誤ってるかどれか。 ファイルシステム上でrenameが衝突しないという条件の元でならうまく行くはず。 アクセス集中でファイルが壊れるのはロックの機構に不備がある だけで、正しい状況下で行われたUNIX系OSでのflockでは、ファイルシステム にバグがあるか、ファイルシステム自体のクラッシュでもない限り壊れない。 >>375 flockはNFS越しの場合に失敗するから、ファイスシステムを予め 調べておく必要がある。 NFS越しだとPOSIXモジュール使うかfcntl使う必要があった気がする。 >>376 > どんなに集中アクセスを受けても、 > 絶対壊れないファイルロックってある訳ない。 > あったら、ぜひ見て見たい。 非ネットワークファイルシステム+UNIX系OSでのflock。stableなバージョン上で これで壊れたって話は逆にあったら見てみたい。 >>377 ネットワークファイルシステムを使ってる場合はね。 それ以外で壊れるという話は(ファイルシステム開発中のバグ以外は) 聞いたことない。再現できたら結構すごいと思うが。 変な憶測並べる前にFAQくらいみんな読もうよ。 http://elib.cs.berkeley.edu/ ~loretta/perl/nmanual/pod/perlfaq5/How_can_I_lock_a_file_.html >>384 2つのプロセスが同時に追加書込しようとしたら、 その部分は壊れるよ。 >>371 って言うかOSが関与しないファイルロックで信頼できるアルゴリズムってあるの? >>388 ええ、ばっちりシステムコールのflockがいらっしゃいますね。 >>386 symlinkにしろ、rewriteにしろ、mkdirにしろ、OSがファイルシステム上で衝突しないように 設計されているという大前提で作られてるし、実際衝突するかどうかはOS次第なので、 OSに非依存で汎用可能なアルゴリズムっていうのは原理的に不可能じゃないかと。 >>390 その意見には激しく同意。 じゃあ、議論するだけ無駄だと思うわけだ。 >OSがファイルシステム上で衝突しないように設計されているという大前提で作られてるし。 OS側でAtomicでもプログラム側がそうでなけりゃ・・・。 >>373-392 スレ違い。 ファイルロックについてのスレあるから、 そこで熱く語ってくれ。 require './my_flock.pl'; while (1) { while ( not defined ($lock = &my_flock()) ) {}; open (IN, "./count.txt"); $data = <IN>; close (IN); &my_funlock($lock); print ++$data. "\n"; while ( not defined ($lock = &my_flock()) ) {}; open (OUT, ">./count.txt"); print OUT $data. "\n"; close (OUT); &my_funlock($lock); if ($data >= 10000) { last; } } >>371 のその辺のファイルロックを別ファイルに取って呼び出してる。 これを、二つのプロセスで実行してみろ。 無事に10000までカウントなんぞできんぞ。 >>394 まともに使えないならいっそ使わないほうが・・・ >>395 はぁ? 全体に一度だけかけろとか言うのか? それでも壊れる。 何がまともに使えないだよ・・・ ルーチン呼び出すのに使えるも使えないもないだろヴォケ。 文句言う前に試せやハゲ。 試して、壊れなかったら文句言いにこいや。 ルーチンをまともに使えないヤシが晒されるスレはここでつか? >>397 だから。 試せってよ・・・。 試しもしないで、使えてねーとか、使い方悪いとか。 そんな事言われても、説得力ねーっちゅーの。 こういう使い方したらファイル壊れないとか、 このタイミングでルーチン呼び出したら大丈夫だとか、 まー試しもしないで語ってるヤツに、 ロクな答えなんて返ってきそうにないけどな。 >>396 > 全体に一度だけかけろとか言うのか? だってそうしないとカウントが飛んじゃうでしょ。 > 試して、壊れなかったら文句言いにこいや。 一度に5プロセス動かして1000までやってみたけど壊れないね。 FreeBSD2.2.2 + Perl5.6.0だけど。 OS何使ってて壊れるの? > 396 プロセスを7つに増やしてテスト中。 時々ロックファイルが消えるな・・・。renameしかしてないはずなので、 ファイルシステムのバグか? でもデータが壊れるということは今のところない模様。テスト続行中。 FreeBSD2.2.8 + Perl 5.6.0でも実験したところ、20000件超えてるけど、特に問題なし。 FreeBSD2.2.2の方も、10000件行ってエラーなし。 合計30000件実験してみたけど衝突は起こってない模様(プロセスの譲り合いで片方のプロセスが ブロックする現象は見られたが)。 単にrenameシステムコールが衝突するようなファイルシステムを持つOSを使ってるだけ とか、そういうオチじゃなくて?>>398 ファイルが消える現象は、ロックファイルをディレクトリにすることで回避 # mkdir lockdir/lockfile で、20プロセス同時起動で、30000件やってみたけど、全く問題なし。 さすがに30000回連続で20プロセスが同時に1つのファイルにアクセス する状況はありえないだろうから、少なくともウチの環境上では きちんとロック機構が機能してると思われる。 で、たった2プロセス同時起動で10000件持たないファイルシステムを 持つ環境がどんな環境なのかとても気になるので早く教えてください>>398 あなたの言う条件↓は満たしましたよ。 > 文句言う前に試せやハゲ。 > 試して、壊れなかったら文句言いにこいや。 read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる