X



自作CGIを評価するスレ

0001Premature end of script headers : /this/thread
垢版 |
03/04/05 12:47ID:tIET0nhf
自分の作ったCGIをみんなに評価してもらうスレだよ。言語は問わないよ。
よほどプログラムが短くないかぎりはアプロダにでもアップしてね。
0304nobodyさん
垢版 |
03/06/03 13:17ID:???
>>303
「TABだけ」ならいいんだがな。空白と混じってるとおかしくなる。
いちいちTABだけなのを確認するより最初から空白だけの方がいいだろ。
TABなんて今時ディスクの節約にもならん。

どっちにしろ(例えば)SUNもMOZDEVもタブ不使用規約になってんだから
合わせた方がいいんでないかい?
0305nobodyさん
垢版 |
03/06/03 13:20ID:???
間違えた。SUNは推奨してるだけだった。以下引用
>インデントの単位として,4個分の半角スペースを推奨する.
>そのインデントが実際に半角スペースによって行われるかタブによって行われるかについては,これを規定しない.
>タブはすべて(4個ではなく)8個分の半角スペースでなければならない.
eclipseだったかな。曖昧記憶でスマソ
0306298
垢版 |
03/06/03 14:58ID:???
自分が思ったのは
「CGIスクリプトしか書いたことない人にありがちなソースだな。」
ってこと。
リファクタリングとか色々なことを勉強してみては?
0307301
垢版 |
03/06/03 15:12ID:???
>>302
タブは、インデント以外に使ってないから、
どんなタブ幅でもずれてないはずだけど・・・
ずれてる???
0308291
垢版 |
03/06/03 19:31ID:???
291です。評価ありがとうございます。

>>301さん
わざわざ直してくださって、本当にありがとうございます!
指摘されたのに気をつけて書き直してから、また評価をお願いしに来ます。
でも、もう…直せるところが無いかもしれませんが(汗)

>>306さん
そのとうりです。自分でCGIを作ってみたくなったので、perlを勉強しだしました。
色々なことを勉強するのもいいですけど、虻蜂取らずにはなりたくないので…。
0309nobodyさん
垢版 |
03/06/04 00:00ID:???
>>285
ソース、今見てるけど・・・
えらくコメントの少ない・・・って言うか、コメントの無いソースだな・・・
わざと、コメント消したの?
それとも、素でこれ?

素でコメント無いなら、コメント入れていった方が良いと思う。
0310nobodyさん
垢版 |
03/06/04 10:29ID:???
>>309
これ以上コメント書かれたら、読みづらくないですか?
と、素な意見。
0311nobodyさん
垢版 |
03/06/04 10:41ID:???
>>310
う〜ん、本体(?)の方はコメントあるけど、
モジュールの方にコメントがないかな。
0312385 ◆T98LkrO.aM
垢版 |
03/06/04 12:48ID:???
>>309さん
基本的にコメントを一切書かないのです。
ただ、配布とか考えると書いた方がいいかなと思って、今回はちょっと書いてみました。
やっぱ少ないですかね..
0313385 ◆T98LkrO.aM
垢版 |
03/06/04 12:52ID:???
別にコメント書かないとかいう変なこだわりがあるわけじゃなくて、
ただ、自分はコメントなくてもすぐ分かるので人に見せる予定がないものに
コメント書かなくてもいいかなと..今は勉強中ということですし。
ただ、今回は見てもらおうとここに載せたわけなので、
モジュールの方にもコメントを書くべきだったと思いました..すみません。
0315nobodyさん
垢版 |
03/06/04 13:20ID:???
「未来の自分は他人です」という言葉を贈っておこう。
0316298
垢版 |
03/06/04 14:07ID:???
コメント無しでもいいような
わかりやすいクラス名、変数名、関数名をつけるのが基本です。
コメントが無いとわからないってのは
それだけ汚いソースだということです。
0317285 ◆T98LkrO.aM
垢版 |
03/06/04 14:59ID:???
>>315, >>316なるほど.
自分は今、就職希望の会社からCのソース(50-500行,10枚くらい)を渡されて、
この説明を書いてこいとか言われているのですが、コメントなくても
関数名, 変数名が分かりやすいし、うまい具合にサブルーチンに分けてあるので
コメント少ないですが、かなり読みやすいと思いました。
まあ、漏れのはコメントないと読みにくいかもしれませんが..
自分で見ても読みにくいな、と思ったらコメントでカバーするようにしてみます。
0318301
垢版 |
03/06/04 19:23ID:???
>>316
# ■■■ 俺の意見 ■■■
俺は、とにかくコメント入れるのに賛成派。
ルーチンの名前とか、変数の名前に意味を持たすのは当たり前だけど、
コメントあれば、コメントだけ読めば、何の処理してるのかわかるし。

# ■■■ ブロック毎にコメントを入れる ■■■
ブレスで囲って無くても、処理の単体が生まれる。
それ毎に、コメントを入れておけば、一行のコメント読めば数行理解できる。

# ■■■ ルーチンの使い方のコメントは重要! ■■■
とくに、ルーチンの使い方のコメント。
絶対後から見て助かる。
いくつ、どんな引数を取って、どんな処理してくれて、どんな値をどんな形で返してくれる。
そんなコメントがあれば、一発でそのルーチンの内容がわかるでしょ。

# ■■■ 最後に・・・ ■■■
↑どう?
こんな感じでコメント入れる訳よ。
全部の行読まなくても、#で始る一行読めば、
俺が、なにについて書き込みしてるか分かるでしょ。
これを、プログラムでも実践してる。
それと、空行無しに書き込みしてると読む気失せるでしょ。
0319301
垢版 |
03/06/04 19:40ID:???
そうそう、掲示板の書き込みでも、
結構その人のセンスが出る。
変な所で改行してる人や、
長文なのに空白行入れず、
だらだらとメリハリの無い書き込みする人とか。

そういう人って、プログラムも汚いんだよね・・・
0320285 ◆T98LkrO.aM
垢版 |
03/06/04 20:33ID:???
はい、たしかに後で読む人がいるとすれば、
コメントは書いたほうがいいですね。
読む側と見るとありがたいものなので、自分でも書くようにします。

コメントが無いために間違った認識を受けたり、
重要な処理を 「これいらねぇんじゃね?」
とか思われて消されること減るはずだし。
0321316
垢版 |
03/06/04 21:21ID:???
>>318さん
自分が言いたいのは
「コメントを書くな」
ではなく
「コメントが無くてもわかるようなキレイな設計を心がけよう」
ってことです。

コメント関係ならプログラム技術板のこっちのスレのほうがいいかも。
http://pc2.2ch.net/test/read.cgi/tech/1038414493/

0322301
垢版 |
03/06/04 22:35ID:???
>>321
スレタイにワラタ

いや、もう終わってるっぽいスレなので、
もういいかな〜っと。

とにかく、コメントは思うように入れまくってみたら良いと思う。
そうしてる内に、どういう風にコメント書いたら分かりやすいとか、
こういうコメントは無駄だとか、分かってくるだろうし。

前に、冗談だろうけど・・・

$hoge++; #1を増加

・・・こんなコメントを見た事がある。
こんなの、明らかに無駄。(w
ただ、なぜ1を増やすかって事についてのコメントなら・・・
それは、意味を成すかもしれない。

実は、俺も無駄なコメントが多いんだよね・・・
ぜんぜんプログラムとは関係ないようなコメントとかある。
そういうのって、俺的に後から見たら面白かったり。
もちろん、人に見せる時は、そんなコメントは消すけどね。
0323nobodyさん
垢版 |
03/06/05 04:44ID:???
OO なコード書いて POD 埋め込むようになってから
普通のコメントがかなり減った。スクリプトとドキュメント
同時に作るのは効率いいしオススメ。
0326nobodyさん
垢版 |
03/06/09 21:44ID:JSBfbdyK
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/lounge/file/1032435179_5/hoge.zip

むかしいじってたやつ、もう要らないから使えると思った香具師
勝手に使ってくれ。コメント皆無だけどね。

でも最後に軽く評価を聞きたいけどな。
0327nobodyさん
垢版 |
03/06/09 21:59ID:???
>>326
あぁ。今見直したら俺が書いたやつじゃないものが入っていた・・・
Text::WordIteratorとか。。。
あーあ。まぁ、いいや。
0329211
垢版 |
03/06/12 02:44ID:???
ども。
いつぞやのコメント削除スクリプト作った俺です。
今作ってるスクリプトが行き詰まりました。
ちょっとイライラしたので、
息抜きにコメント削除スクリプトのバージョンアップとかしてみました。

このバージョンで、サブディレクトリ内も検索可能になりました。
深さは、どんなに深いサブディレクトリでも処理可能です。

http://isweb25.infoseek.co.jp/computer/pcqa-2ch/cgi-bin/img/1160.zip

・・・リファクタリングが必要かもしれん・・・
0331nobodyさん
垢版 |
03/06/12 06:40ID:???
>>329
>深さは、どんなに深いサブディレクトリでも処理可能です。

当方にはそのスタックをあふれさせる準備があるが良いのか?

0332211
垢版 |
03/06/12 06:59ID:???
>>331
う〜ん。
スタックを溢れさせる準備があるって意味がわからんです・・・。

とにかく、かなり深いディレクトリでもOKなはず。
だって、Cのルートディレクトリから検索とか掛けてみたから。
とりあえず、試してみそ〜。
0333nobodyさん
垢版 |
03/06/12 07:54ID:s13jgVVf
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%
0334nobodyさん
垢版 |
03/06/12 10:27ID:???
>>332
ソースは見てないが、再帰的な処理をしてるのにスタックについて知らないというのは
ちょっとヤバくないか?
0335nobodyさん
垢版 |
03/06/12 12:02ID:I623aSMv
まあまあ、知らなくても書けるてことで。
0336211
垢版 |
03/06/12 14:17ID:???
>>334
再帰?
自分の中で自分を呼ぶアレ?
・・・いや、普通にwhile文とかでブン回してるだけだが・・・

ディレクトリ検索のアルゴリズム考えるの、
実はちょっと大変だったんだよね・・・
ひさびさに、フローチャートとか書いたもん。(w
ちなみに、見てもらったら分かるけど、
メモリの使用も最小限に抑えてるし。

>>335
そうみたいね・・・書けちゃったから・・・。
0337nobodyさん
垢版 |
03/06/12 18:19ID:???
whileでブン回しておいてメモリは最小限とはこれいかに。
0338nobodyさん
垢版 |
03/06/12 21:33ID:???
>>336
確かにWhileで再帰のまねごとは出来る。
でも、どっちにしろスタック的なデータ構造がないと困るはずだけれど。
0340211
垢版 |
03/06/13 01:55ID:???
>>337
簡単な話。
while文で、ブン回しながら、必要なデータか調べる。
必要なデータなら、ファイルへスワップ。
必要じゃなかったら、次のループで上書き。
つまり、メモリにデータを蓄えないようにしてる。
一通り調べ終わったら、次のステップでスワップしたファイルから
データ読み出しって感じ。

>>338
そのスタックってのがよく分かてないんで・・・
どんなデータ構造なのか分からないけど・・・
再帰処理は、一切使ってない、ただループさせてる処理をしてるよ。
DirTree.pmってファイルがディレクトリを走り回る処理部分だから。
一度、覗いてみてくださいませ。
0341211
垢版 |
03/06/13 01:55ID:???
>>339
ソース見せてもらいました。
再帰処理使ってるね。

こんな事言っても仕方ないし、
プログラム打つ人間としては失格かもしれないけど、
再帰処理って嫌いなんだよね。
逐次処理&反復処理だけで、すべてをこなせると思ってる。
いままでで、再帰処理を行わないといけない場面ってなかったし。
まぁ、ヘッポコな俺だから、
まだそんな場面に出くわしてないだけかもしれないけど。
それに、再帰処理に出くわすと、ソース読むのが大変。
俺的にね。
と、まぁこれは俺の哲学。

それと、これはD&Dに対応してないね。
それと、処理中&処理後のログが少ない。
この辺でも、俺と嗜好が違うね。
俺のは、そういうログがないと固まってるようでイヤだから。
結構うるさいソースになってる。

と、「正直痛すぎる」とかって言われたので、
ちょっと反抗してみました。(w

正直な感想は、無駄のないスッキリ仕上げなソースだと思います。
それと、俺の知らない組み込み関数とか使ってる。
もうちょっと、俺も勉強しないとね。

改造とかしてくれる人少なくってさ・・・
ソースみて勉強させてもらいます。
ありがとうございました。
0342223
垢版 |
03/06/13 03:29ID:???
久しぶりに覗いてみたら まだやってたのねご苦労さんw
実はあと風呂に入ってたらフィルターバグまだいくつかあるのを
気づいちゃったんだよね…

漏れ的ソースの書き方ならアレで問題ないんだけど
世の中には漏れの想像もできない書き方する人がいるんで
0343nobodyさん
垢版 |
03/06/13 14:25ID:???
ネタだろ?
ネタと言ってくれよ!痛すぎるよ!
0344nobodyさん
垢版 |
03/06/13 21:35ID:???
傑作にケチつけられて熱くなっちゃいました。

DirTree.pm直してやるから待っててな。
0345nobodyさん
垢版 |
03/06/13 21:56ID:???
あ。再帰処理しか考えられない…止めよう。

今のやり方で、明らかにおかしい所は、ループ内で$tmpPathListを開いて閉じてる所。
ファイルハンドルが勿体無い。

それから、少し変な所で、メモリ使用量にこだわっている割には、readdirを
リストコンテキストで呼んでる点。一つずつ調べればいいのに。

それから、趣味の問題だけど、変なインデントが気持ち悪い。スコープを分けたい(?)なら
ブロックを作ればいいし。

あと、無駄な括弧。
if ( ($_ eq '.') || ($_ eq '..') ) { next; }
こことか強烈なんだけど…このままでも条件の中身の括弧は無くてもいいんだけど、
十分に優先度が低いorを使えば、心配しなくてもいい。それに大括弧のインデントも変。

@filelistのスコープも変。とにかく変数は使用直前に宣言した方が楽。

それから、$countはハッシュのリファレンスにする価値は無い。普通のハッシュで十分。
0346nobodyさん
垢版 |
03/06/13 22:59ID:???
>>345
ごちゃごちゃ言う前に書き直してそれがより美しいことを証明すればどうだ?
0347211
垢版 |
03/06/14 08:19ID:???
>>342
うーん、忘れた頃に、またやってます(w
そうそう、コメント削除のバグ。
俺も、2つほど気付いてました。
しかし、俺的に今の所実害がないので放置中。。。
今度、直してみます。
0348211
垢版 |
03/06/14 08:19ID:???
>>345
スクリプト自体は、すごくスッキリしてて、
本当、無駄がないと思います。
大半の人は、俺のスクリプトより>>339のスクリプトを好むかと・・・

俺の言ってる事は、ヘッポコの戯言だと聞き流してください。

指摘された部分。
ループ内でファイルを開いたり閉じたりしてる部分。
メモリ使用量最小限とか言ってるのに、
ディレクトリ内のファイル名を一発で取得してる部分。
この2つは・・・
言い返す言葉がないです(w
ファイルは、ループ前に開いて、ループが終わったら閉じるように変更。
ファイル名取得も、一つづつに変更してみました。

$countのハッシュリファレンスを使ってる。
これについては・・・
戻り値は、今後の改良などで値が大きくなるかもしれない・・・
という理由から、俺が作るルーチンのほとんどはリファレンスが返ってきます。
しかし、ルーチン内でリファレンス使ってるのは意味ないですね。
と、言うことでルーチン内は普通にハッシュを使うように変更。
戻り値はリファレンスだけど・・・

インデントが変。
orを使わず、||を使って括弧の多様。
変数宣言は、使用直前に宣言した方が楽。
これらについては・・・
好みってことで、許してください。

http://isweb25.infoseek.co.jp/computer/pcqa-2ch/cgi-bin/img/1166.zip
0349nobodyさん
垢版 |
03/06/14 15:46ID:???
ファイルの開き方が直ってね〜よ
0350nobodyさん
垢版 |
03/06/14 21:12ID:jhwtfsoY
aice.zive.net/index.jsp
よろしくお願いします。
0351nobodyさん
垢版 |
03/06/15 09:57ID:???
>>350
ここの人は低レベルだからJavaなんて理解できないよ。
0352nobodyさん
垢版 |
03/06/15 10:05ID:???
>>351
言われてみれば、Javaスレってないね・・・
0353nobodyさん
垢版 |
03/06/15 11:13ID:???
難易の話をしているつもりかな?
なら351はJavaを理解していないに430スイカ
0354nobodyさん
垢版 |
03/06/15 12:09ID:???
目的を達成する手段のひとつがJava
0356nobodyさん
垢版 |
03/06/16 18:02ID:???
>>211の人。

記述が馴れないような感じになって良いなら、gotoでルーチン使うと(ルーチンね)スタックがたまらなくて良いよ。
ただし、それは履歴自体プログラムが管理しないって事だから時には諸刃の剣。

スタックはほとんど何やってもたまるよ。
スタックがたまると言うか、スタックの中にいろんなもんがたまる。
もちろんループもしっかりスタックに残り管理されてる(当たり前)。
だから「再起じゃないから」、「サブルーチンじゃないから」スタックには全く関係ないてのはでっかい間違い。

どんな経過をたどって現在まで辿り着いたのかとか、捨てたと思った変数が実は残っているとか。
スタックにも色んな種類あるから調べて味噌。
0357211
垢版 |
03/06/17 06:07ID:???
>>356
うーん、無理にスタックを意識して、
goto文を使用しようとは思わないです・・・。
あまり、ソースがトリッキーすぎると、
未来の俺から苦情がきます。
それでなくても、結構トリッキーっぽいから・・・

スタックとは、何なのかはっきり分かってなかったのですが、
いろいろ調べ回って、何なのか、何となく分かりました。
スタックについて、勉強させてもらう機会をいただいた皆さんに感謝です。

さて、また一つヘンテコなスクリプトを組みました。
複数のファイルから、文字列を検索するスクリプト。
My_Grep。

http://isweb25.infoseek.co.jp/computer/pcqa-2ch/cgi-bin/img/1181.zip

使い方などは、同封してるテキストファイルを読んでください。
改造してくれる人は、できればアップして、ソース見せてください。
勉強させてもらいます。
また、今回も「DirTree.pm」を同封してますが、
>>349の指摘された所は、直してます。

では、評価お願いします。
0359211
垢版 |
03/06/18 07:21ID:???
バージョンアップしました。

http://isweb25.infoseek.co.jp/computer/pcqa-2ch/cgi-bin/img/1184.zip

このバージョンで、
複数の拡張子のファイル検索が可能。
ログで、先頭のインデントなどのスペースを削るようにした。

・・・誰か、評価お願いします・・・
誰も手がってくれない。寂しいね。
0360nobodyさん
垢版 |
03/06/18 15:16ID:???
>>359
乙。
俺よりはるかにレヴェルの高いことやってらっしゃるので、
研究させてもらいます。

# 自作スクリプトを公開できるのはいつになることやら、、、
0361211
垢版 |
03/06/19 02:58ID:???
>>360
ども。 一応覗いてくれてた人がいてたんだね。
よかった。
まったく手がってもらえないから、かなり寂しかった(w
やってる処理自体は、そんなにレベルの高い物じゃなかったりします。
俺も研究させてもらうので、何かスクリプト作ったらアップしてくれたら嬉しいです。
0362211
垢版 |
03/06/19 02:59ID:???
さて、また意味なくバージョンアップしました。

http://isweb25.infoseek.co.jp/computer/pcqa-2ch/cgi-bin/img/1189.zip

このバージョンで、
 結果ログファイルがHTMLファイルになって、
  ヒットしたキーワードが強調表示されるようになった。

 ファイルがバイナリファイルか調べるようにした。

 拡張子指定で、ファイル名に拡張子と同じ文字列があったら、
  そのファイルも検索対象になっていたバグを修正。

 指定した拡張子のファイルが無かった時でも、
  つづけて検索フェイズに移行してたバグを修正

Html.pmってファイルを書き換えると、
出力するログの見た目が変えられるかもしれません。

それと、今回のバージョンで謎なバグが一つ・・・
tmpファイルが、今までスクリプト終了と同時に、
削除されるようにしてたんだけど・・・
今回のバージョンは、なぜかtmpファイルが残ります・・・。
何度も見直したんだけど、まったく原因がわかりませんでした。
どなたか、ご指摘いただけたら嬉しいです。
0363nobodyさん
垢版 |
03/06/19 06:20ID:???
>>362
いい加減ウザイ。完成してから後悔してくれ
0364211
垢版 |
03/06/19 14:12ID:???
>>363
あら。
何か主旨が変わってきたね。

評価貰えるよう、スレを上げるために、
何もなくスレ上げてたら荒らしだから、
何か無いかと、がんばってバージョンアップしてたんだけど・・・。

でも、いくつか勉強させてもらったし・・・
この辺が潮時かな。

じゃ、俺のスクリプト公開は終了します。
0365nobodyさん
垢版 |
03/06/19 14:28ID:???
>>364
もう少し実用性のあるもので再チャレンジしてみたら?
今回のは正直言って使いたいと思えるものでなかったから
評価しなかった
あれば便利とか使ってみたいと思えるものなら協力者も増えるのでは
03661
垢版 |
03/06/21 10:11ID:???
自作CGIを評価するスレ

このスレは終了いたしました。
みなさん書き込みありがとうございました。

投稿件数  : 365
最終投稿者: nobodyさん
最終投稿日: 03/06/19
0367nobodyさん
垢版 |
03/06/21 17:05ID:???

  ∧__∧    / ̄ ̄ ̄ ̄ ̄ ̄
  ( ^u^)  < 乙彼様でした☆
 と    つ  \______
  (__つ 丿
    し'
0368nobodyさん
垢版 |
03/06/22 07:46ID:???
スレの趣向とは少し外れるんですが、
下記のロック、アンロックはどうでしょうか?

# 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");
 }
}

評価お願いします。
0369nobodyさん
垢版 |
03/06/22 09:04ID:???
>>368
いいんじゃないかな。
while文の所は・・・

while ($retry--) {
  return 0 if rename($lock_file, $lockex_file);
}
&error( 'Lock error' );

こうの方が良いかな。
0370368
垢版 |
03/06/22 10:02ID:???
>>369
どうもありがとうございます。
他のスレでこういう書き方をみかけました。
while (!rename($lock_file, $lockex_file) {
 if (--$retry <= 0) {
  &error("lock error");
 }
}

>>369さんが書いてくれたものとどちらがいいんですかね?
0371nobodyさん
垢版 |
03/06/24 13:54ID:01cZwzPj
>>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;
0372368
垢版 |
03/06/24 14:57ID:???
>>371
ありがとうございます。
ロックが甘いということは分かりましたが、アンロックはどうでしょうか?
まだ371さんがおっしゃったサイトは見てないのでなんとも言えませんが…。

もう少し勉強してみることにします。

指摘されたリトライですが、
if (--$retry <= 0) {
こうですね。
0373nobodyさん
垢版 |
03/06/24 15:24ID:???
>>371
> このルーチンだと穴がある。経験則だけど、アクセスが殺到すると簡単に壊れる。
> 説明するのめんどいので、

> http://www.din.or.jp/~ohzaki/perl.htm#File_Lock

> この辺りでも読んでみて。

その辺り読んで、載ってるルーチンそのまま使ってテストした所、
ファイル壊れました。

俺は、>>368くらいの簡単なロックで良いと思うけど。
このロックで壊れるようなアクセス受けてるって事は、
その説明に載ってるようなルーチンでも、ほぼ壊れる。

どんなロックしててもファイルは壊れるんだから、
小細工いれた重いロック処理するより、
簡単にロックする処理入れた方が良いような。
0374nobodyさん
垢版 |
03/06/24 15:33ID:???
>どんなロックしててもファイルは壊れるんだから

そんなことはないよ。ただ言えることは、この板ではまだまともにロックできて
いるルーチンが1つも書かれてないな。
0375nobodyさん
垢版 |
03/06/24 15:35ID:???
>>374
>そんなことはないよ。ただ言えることは、この板ではまだまともにロックできて
>いるルーチンが1つも書かれてないな。
flock使っちゃだめ?
0376nobodyさん
垢版 |
03/06/24 15:36ID:???
>>374
どんなに集中アクセスを受けても、
絶対壊れないファイルロックってある訳ない。

あったら、ぜひ見て見たい。
0377nobodyさん
垢版 |
03/06/24 15:37ID:???
>>375
あ、ちなみに、flockでも壊れるんで。ファイル。
0378nobodyさん
垢版 |
03/06/24 15:40ID:???
↓これでもこわれる?(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;
0379374
垢版 |
03/06/24 15:41ID:???
>絶対壊れないファイルロックってある訳ない

この根拠がどこからくるのかわからないが、
少なくともとてつもないアクセス集中に対応できるように非ブロックモードで
タイムアウトを備えてないとまず無理だということは教えておこう。
0380378
垢版 |
03/06/24 15:41ID:???
あ、EUCにしてからSJISにもどすの忘れてるけど、そこは気にしないで
0381371
垢版 |
03/06/24 15:46ID:01cZwzPj
> どんなロックしててもファイルは壊れるんだから、

そんなことはない。

というか、上(大崎氏の)のルーチンでファイル壊れたんならファイルシステムに
不備があるか、打ち間違いがあるかパーミッションやらの設定を誤ってるかどれか。
ファイルシステム上でrenameが衝突しないという条件の元でならうまく行くはず。

アクセス集中でファイルが壊れるのはロックの機構に不備がある
だけで、正しい状況下で行われたUNIX系OSでのflockでは、ファイルシステム
にバグがあるか、ファイルシステム自体のクラッシュでもない限り壊れない。

>>375
flockはNFS越しの場合に失敗するから、ファイスシステムを予め
調べておく必要がある。
NFS越しだとPOSIXモジュール使うかfcntl使う必要があった気がする。

>>376
> どんなに集中アクセスを受けても、
> 絶対壊れないファイルロックってある訳ない。
> あったら、ぜひ見て見たい。

非ネットワークファイルシステム+UNIX系OSでのflock。stableなバージョン上で
これで壊れたって話は逆にあったら見てみたい。
0382371
垢版 |
03/06/24 15:48ID:01cZwzPj
>>377
ネットワークファイルシステムを使ってる場合はね。
それ以外で壊れるという話は(ファイルシステム開発中のバグ以外は)
聞いたことない。再現できたら結構すごいと思うが。
0383371
垢版 |
03/06/24 15:54ID:01cZwzPj
変な憶測並べる前にFAQくらいみんな読もうよ。

http://elib.cs.berkeley.edu/~loretta/perl/nmanual/pod/perlfaq5/How_can_I_lock_a_file_.html
0384nobodyさん
垢版 |
03/06/24 18:50ID:???
追加書き込みすれば壊れない。
0385371
垢版 |
03/06/24 19:10ID:01cZwzPj
>>384
2つのプロセスが同時に追加書込しようとしたら、
その部分は壊れるよ。
0386nobodyさん
垢版 |
03/06/24 20:17ID:???
>>371
って言うかOSが関与しないファイルロックで信頼できるアルゴリズムってあるの?

0388378
垢版 |
03/06/24 20:27ID:???
>>378
はどうですか?
0389nobodyさん
垢版 |
03/06/24 20:34ID:???
>>388
ええ、ばっちりシステムコールのflockがいらっしゃいますね。
0390371
垢版 |
03/06/24 20:45ID:???
>>386
symlinkにしろ、rewriteにしろ、mkdirにしろ、OSがファイルシステム上で衝突しないように
設計されているという大前提で作られてるし、実際衝突するかどうかはOS次第なので、
OSに非依存で汎用可能なアルゴリズムっていうのは原理的に不可能じゃないかと。
0391nobodyさん
垢版 |
03/06/24 20:47ID:???
>>390
その意見には激しく同意。
じゃあ、議論するだけ無駄だと思うわけだ。
0392nobodyさん
垢版 |
03/06/24 20:48ID:???
>OSがファイルシステム上で衝突しないように設計されているという大前提で作られてるし。

OS側でAtomicでもプログラム側がそうでなけりゃ・・・。
0393nobodyさん
垢版 |
03/06/24 21:00ID:???
>>373-392
スレ違い。
ファイルロックについてのスレあるから、
そこで熱く語ってくれ。
0394nobodyさん
垢版 |
03/06/25 00:00ID:???
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までカウントなんぞできんぞ。
0395374
垢版 |
03/06/25 00:21ID:???
>>394
まともに使えないならいっそ使わないほうが・・・
0396nobodyさん
垢版 |
03/06/25 00:39ID:???
>>395
はぁ?
全体に一度だけかけろとか言うのか?
それでも壊れる。

何がまともに使えないだよ・・・
ルーチン呼び出すのに使えるも使えないもないだろヴォケ。
文句言う前に試せやハゲ。
試して、壊れなかったら文句言いにこいや。
0397374
垢版 |
03/06/25 00:47ID:???
ルーチンをまともに使えないヤシが晒されるスレはここでつか?
0398nobodyさん
垢版 |
03/06/25 00:57ID:???
>>397
だから。
試せってよ・・・。
試しもしないで、使えてねーとか、使い方悪いとか。
そんな事言われても、説得力ねーっちゅーの。

こういう使い方したらファイル壊れないとか、
このタイミングでルーチン呼び出したら大丈夫だとか、

まー試しもしないで語ってるヤツに、
ロクな答えなんて返ってきそうにないけどな。
0399371
垢版 |
03/06/25 00:59ID:Q5i43+wA
>>396
> 全体に一度だけかけろとか言うのか?

だってそうしないとカウントが飛んじゃうでしょ。

> 試して、壊れなかったら文句言いにこいや。

一度に5プロセス動かして1000までやってみたけど壊れないね。
FreeBSD2.2.2 + Perl5.6.0だけど。

OS何使ってて壊れるの? > 396
0400371
垢版 |
03/06/25 01:03ID:Q5i43+wA
プロセスを7つに増やしてテスト中。
時々ロックファイルが消えるな・・・。renameしかしてないはずなので、
ファイルシステムのバグか?

でもデータが壊れるということは今のところない模様。テスト続行中。
0401371
垢版 |
03/06/25 01:13ID:Q5i43+wA
FreeBSD2.2.8 + Perl 5.6.0でも実験したところ、20000件超えてるけど、特に問題なし。
FreeBSD2.2.2の方も、10000件行ってエラーなし。
合計30000件実験してみたけど衝突は起こってない模様(プロセスの譲り合いで片方のプロセスが
ブロックする現象は見られたが)。

単にrenameシステムコールが衝突するようなファイルシステムを持つOSを使ってるだけ
とか、そういうオチじゃなくて?>>398
0402371
垢版 |
03/06/25 01:22ID:???
ファイルが消える現象は、ロックファイルをディレクトリにすることで回避
# mkdir lockdir/lockfile

で、20プロセス同時起動で、30000件やってみたけど、全く問題なし。
さすがに30000回連続で20プロセスが同時に1つのファイルにアクセス
する状況はありえないだろうから、少なくともウチの環境上では
きちんとロック機構が機能してると思われる。

で、たった2プロセス同時起動で10000件持たないファイルシステムを
持つ環境がどんな環境なのかとても気になるので早く教えてください>>398
あなたの言う条件↓は満たしましたよ。

> 文句言う前に試せやハゲ。
> 試して、壊れなかったら文句言いにこいや。
レスを投稿する