bbs.cgi再開発プロジェクト 3
レス数が1000を超えています。これ以上書き込みはできません。
||||||
||||| ∠ ̄ ̄\ |
∋oノハヽo∈ 〜|/´D`|/
(´D` ) スタッ / y⊂)
/ y(⌒ヽ\ U〉 ⌒l
し( (__)し /(__ノ ~U、、スタッ ん?開発してるの?どこまで進んでるの?情報キボン http://qb3.2ch.net/test/read.cgi/operate/1069144193/997n
997 :root ★:04/02/14 16:50 ID:??? New!!
で、
A = 既存のwolf07でできるでしょう
B = PIEに置きたいなぁ
C = 今のrock54.2ch.netをそのまま使います
ということで、>>987 かと。
>>8 ということですが、
先のことはどうなるかわかりませんが
現在検討している
oyster902@pie に入れるという選択肢はありませんか? >>9
とってもありえまーす。問題ないかと。
今の901と同じように、/29 のIPアドレスブロック(つまり、IPアドレス5つ)が使えてほしいです。 ということで、902はひとつ機能が増えたですね。
過去ログ用ストレージと、2ちゃんねる用のDNSサブシステム。
よいと思います。
902の構成、決めなきゃ。 >>11
Rock54やBBQ,BBX,BBYが全部同居してます >>11
mmm1.2ch.net (wolf07, 2ちゃんねる用DNSサーバ、Xeon 2.4GHz dual)
cache1.2ch.net
2ちゃんねる用DNSキャッシュサーバ
cache1.bbspink.com
PINKちゃんねる用DNSキャッシュサーバ(予定)(しない可能性大)
dns1.2ch.net
2ちゃんねる用DNSコンテンツサーバ
a.ns.uma.2ch.net
uma.2ch.netドメイン用DNSコンテンツサーバ(dns1.2ch.netと同一IP)
b.ns.peko.2ch.net
peko.2ch.netドメイン用DNSコンテンツサーバ(dns1.2ch.netと同一IP)
dns1.bbspink.com
PINKちゃんねる用DNSコンテンツサーバ
a.ns.ama.bbspink.com
ama.bbspink.comドメイン用DNSコンテンツサーバ(dns1.bbspink.comと同一IP) >>13
そいつらは、oyster176にいますですよ。別マシンです。
oyster176.uma.2ch.net (root権限ありサーバ)
bbq.2ch.net
串折り用/広告規制用システム
串折りシステム IPアドレス指定用DNS: 管理ドメイン名: niku.2ch.net
bbq2.2ch.net
串折り用サーバ ドメイン名指定用DNS: 管理ドメイン名: sumi.2ch.net
bbq3.2ch.net
広告規制用サーバ IPアドレス指定用DNS: 管理ドメイン名: bbx.2ch.net
bbq4.2ch.net
新規スレッド関連 統計情報取得用DNS: bby.2ch.net
rock54.2ch.net
Rock54システムの基地
ほっておけば /29 だとおもいまーす < oyster902
了解です。米国のISPは太っ腹でいいすね。< IPアドレス BをPIEに置くとなると
he→PIE間のネットワークの遅延が気になるところですが、どれくらいですかね?
ついでに、今Aを引きに行っているlive8にも影響がありそうな感じですが oyster901% traceroute oyster176.uma.2ch.net
traceroute to oyster176.uma.2ch.net (64.62.236.130), 64 hops max, 52 byte packet
s
1 38.114.137.193 (38.114.137.193) 0.721 ms 0.498 ms 0.662 ms
2 g1-ba21.b003122-0.sfo01.atlas.cogentco.com (38.112.11.73) 0.818 ms 0.801 ms 0.824 ms
3 g0-4.core01.sfo01.atlas.cogentco.com (66.28.64.161) 0.968 ms 0.859 ms 0.842 ms
4 p15-0.core02.sfo01.atlas.cogentco.com (66.28.4.70) 0.819 ms 0.841 ms 0.706 ms
5 p6-0.core03.sfo01.atlas.cogentco.com (66.28.4.150) 0.603 ms 0.545 ms 0.550 ms
6 paix.he.net (198.32.176.20) 77.234 ms 77.274 ms 77.185 ms
7 64.71.129.86 (64.71.129.86) 77.845 ms 77.956 ms 77.869 ms
8 rock54.2ch.net (64.62.236.130) 101.190 ms 100.155 ms 100.358 ms
いまAをひきにいっているlive8的には、当然、好都合かと。 oysters@he の A は wolf07 で
oysters@pie の A は oyster902
って考えていいんですよね? >>22
そのへんは、DNS(キャッシュ)サーバがよきにはからってくれますです。
ネットワーク的に近いものほど、優先的にアクセスする。 ( ・∀・)つ〃∩ヘェーヘェーヘェー
DNS っすごいんですね、
さすが Donbei Nissin Sio 正式にはDomain Name Systemで(ry
過去ログサーバー自体はI/Oとトラフィックぐらいしか使わないので
DNSの副業をさせるには最適かと cgiのソースって公開されてますか?
されてないのならいろんな人の脳みそをただで使っちゃおう作戦で
一連の動作とか仕様とか伝えるためにも
IDのやばい部分とか以外は公開してみたらうどんでしょ?('-') >>26
ひ(ry が公開しちゃだめ、って言ってるらしいっすよ >>12
今度は確実にopteron244にしませうw
>>27
開発に協力してくれるのであれば
秘密保持契約結んて開示という手はあるかと思われ。
# 対価を取るかどうかは別問題として考えています。 >>26
過去ログ参照のこと。
前スレにどうやらさんの回答があります。 >27
read.cgiのperlで書かれたソースがほしぃ
規制関係で・・・
#板名 規制するホスト名(正規表現) コメントの順番 *板名に"all"と書けば全板規制
all infoweb.ne.jp 広告無差別爆撃
qb3 plala.or.jp AA荒らし
の内容のファイルを配布すれば板ごとに規制できるはず
それはsamba24のために管理してるフォルダに、
いくつIPが保存されてるかの値が記録されてるのね。
だから、ほんとは1時間ごとにクリアされるのが正しいの。
で、samba24のクリア機構にエラーがあったら数字が増え続けるわけ。 bbs.cgiってこんな感じ?
bbs.cgi
├初期処理
├IP Address/ホスト名に依存する処理
├書き込み内容に依存する処理
└書き込み処理 judeとかUMLツールでシーケンス図かいて、Wikiにでも置いとかね?
bbs.cgiの。
クラス図とかもあるといいかも。 bbs.cgi
├IP Address/ホスト名に依存する処理
├初期処理
├書き込み内容に依存する処理
├IP Address/ホスト名に依存する処理
├書き込み内容に依存する処理
├書き込み内容に依存する処理
├IP Address/ホスト名に依存する処理
├書き込み内容に依存する処理
├書き込み内容に依存する処理
├IP Address/ホスト名に依存する処理
├書き込み内容に依存する処理
├初期処理
├書き込み内容に依存する処理
├IP Address/ホスト名に依存する処理
├書き込み内容に依存する処理
├IP Address/ホスト名に依存する処理
├書き込み内容に依存する処理
├IP Address/ホスト名に依存する処理
└書き込み処理
簡単に書くと、こんな感じかな このスパゲティソースは、なんだか複雑な味がするなぁ。
隠し味は何かしら。 しかも>37の各処理で8番目と15番目は二つ組みでひとつの処理を・・・・(^_^;)っつー感じなんだよな >>37
さすが何十人もの手で作られた
インスタントラーメンのようなものだな。 ああ、叫びたい叫びたい・・・・
ヽ( ・∀・)ノ ウンコー
とかなる物ですか・・・?(汗 とりあえず、機能を買えずにに>>37を>>35にしてみれば? >>40
うーむ、昔ひ(りゃ がperlccしてだめだったわけだ、、、。
ひょっとしてoyster901でperlccが通ったのって、奇跡に近い? 残りの一割は
ま・さ・か・・・・
いわゆる「おいらのギャグ」? >>45
同じPerl 5.6.1なのに、news8では通りませんね。
本当に奇跡かも。
cc -DAPPLLIB_EXP="/usr/local/lib/perl5/5.6.1/BSDPAN" -fno-strict-aliasing -I/usr/local/include -O -pipe -I/usr/local/lib/perl5/5.6.1/mach/CORE /usr/local/lib/p
erl5/5.6.1/mach/auto/IO/IO.so /usr/local/lib/perl5/5.6.1/mach/auto/Fcntl/Fcntl.so -o ../../bbs.cgi bbs.pl.c -Wl,-E -L/usr/local/lib -L/usr/local/lib/perl5/5.6.1/mach/CORE -lperl -lm -lc -lcrypt -lutil
/tmp/cc2iTuIB.o: In function `xs_init':
/tmp/cc2iTuIB.o(.text+0x5927): undefined reference to `boot_DynaLoader'
ERROR: In compiling code for bbs.pl.c !
gccのバージョンが違うせいかもね。
こうして、偶然と奇跡のめぐり合わせで、今日も回っているわけだ。 (2chtubo愛さん)ヾ('-'*)ナデナデ ちょっと風邪薬を配合したら、make通っちゃった。どうする?
%ls -l bbs.cgi
-rwxr-xr-x 1 service service 806530 Feb 15 08:41 bbs.cgi
%file bbs.cgi
bbs.cgi: ELF 32-bit LSB executable, Intel 80386, version 1 (FreeBSD), for FreeBSD 4.9, dynamically linked (uses shared libs), not stripped 時間がとれたら、新oysterと旧oysterでもやってみよっかな。
今日はちょっと無理だけどね。
まぁ、奇跡があと2回ぐらい起こってもいいかなと。 まぁ、桃色方面ででも試せるかなと。
>>61
DynaLoader.a の位置を探し出して、直接くべたのですよ。
とりあえずいんちきバイナリを作る時のテクとしては、定番かと。
このへんは昔とった(りゃ。 lang/gcc32とかgcc33を4.9R鯖でもインスコするっのてはどうよ? yahoobbでスレ立てられなくなったんですか?
前スレの後半で解禁されたみたいですけどまた規制ですか? yahoo串なんですけどね
すぐ規制されちゃいますよね、で規制される前に使おうと思ったら「スレッド立てすぎです」
先にこの串で立てられたっぽくないんですけどね
今、他の板で立てられましたから
やっぱり先に立てられたのかなぁ >>72
>スレッド立てすぎです
jp規制と関係無いじゃん。 後は。。。
携帯&●のスレ立て規制の兼ね合いですなぁ
規制の種を携帯固有番号or●固有文字列にすればいいんだが
また解読の日々か・・・ ●も規制入れるんすか・・・。
断固反対!既得権益を死守するぞー!おー!! >>77
たしか●の利点は過去ログが読めるってだけだったはず。
スレ立て規制抜けやsamba抜けは漏れてただけ。 っていうか、●の規制抜けの穴埋めは一番最後でいいじゃん・・・
何なら埋めなくても、●で荒らせば●剥奪なんだし。 過去ログが読めるだけなら、●の更新しませんわ……。
保証されてないとは言え、現状でスレッドが立てられるから、
●購入した一人です。
つうか、運営側はサービス(機能)として認めて欲しいな。 ●買った瞬間に2chつぶれたりしませんよね?
それが怖くて買えない17の夏 リスク取ったものがリターンを得るのだ。
得ないこともあるけど・・・ 1000ストッパー素突破対策はこのスレと見たがどうか。 1000ストッパーは書き込みロックファイルを作成してから1001の処理をするとかだめかな? qmail-localのパクリアイデアの続き。
/queue以下
/スレ番号
/スレ番号/cur
/スレ番号/new
/スレ番号/tmp
・投稿用bbs.cgiはtmpにひたすら書く。tai64time.pid.とか重複しないようなファイル名で
書き込みに失敗したらcurをみて1000から始まるファイルがないかどうかチェック。なかったらウェイトしてはじめに戻る。
・tmpに書き込めたらnewにハードリンクしてtmpをunlinkする(投稿成功)
・dat追記デーモンはnewからひたすらcurに追記する。その際に0000から1000までの番号をファイル名の頭に追加する
curに追加したファイル名でハードリンクして成功したらcurをunlinkする。
999を追記した段階でtmpをreadonlyにchmodする。1000を書く
・dat書き出しデーモンがcur以下をcatして*.datとして出力。
・あぼーんするときはcur以下の数字を消してdat書き出しデーモンを呼び出す。
※もし出来るならqueueをファイルシステムじゃなくてMySQlとかにするほうが性能がいいかもしれない
curをcatする方法だと、スレ番号/l50とかスレ番号/1-100とかも別途書き出すのが楽。
まぁ*.datを直接読んでくれる専用ブラウザには関係ない話だけど。
IE対策にはなりそげ。 読み出す側で1001以上出力しないようにして、
レス数1000超えてたら自動的に1001のレスを付加してやったらええんでないの?
見た目1001超えなければ、書き込みも減る=妙な鯖負荷も減るだろうし。
で、状況見て書き込み側を改良していけばいいような。 >>94
それだと書き込みが「吸い込まれ」たことにならない? 「絶対に上がらないスレ」ってできませんかね?
bbs.cgiで>>1のメール欄を見て「sagesage」だったら
書き込みのメール欄の先頭に「sage」を追加する、とか。
重くなるだけで利用価値ないかな。 ていうか、そんなことを2ちゃんねるでやる必要性が感じられないな。
sageだかageだか知らないけど、2ちゃんねるはスレッドフロート式なんだから、 sage進行信仰に対する一つの答えを出すことに意味があるのですか? さあ?意味なんて考えてもみませんでした。
やったら、できたら、そうなったら面白さの幅が広がるかな、と思っただけですよ。 それがおもしろそうな機能には見えなかったんでね。
わざわざcgiを改造してまで追加する価値があるような
おもしろい機能とは思えないですよ。ageらないスレなんて。 うーん、やっぱダメかなぁ。
2ちゃんねるの根幹をゆるがす面白さだと思ったんですが。
(´・ω・`)ショボーン ただ、おもしろいかどうかは個人の主観なので、
おれは全然おもしろくない機能だと思うのですが、
ひろゆきがおもしろいと思えばありだとは思うんですけどね。
あと、sageっぱなしだと他の人が入ってこないのでどうしても馴れ合いが
進んでしまう、と考えられる点もマイナスポイントかも。 ああ、馴れ合いの問題はありますね。
適用してみたいと思ったのは次のようなスレです。
・+系板の雑談スレ
・AA系の板のスレ
・自己紹介板のスレ
・bbspinkの一部スレ
・ネタスレ
ひ(ryは面白がらないっぽいなあ。
なんかそんな気がしてきますた。 実況鯖だけインビジチューニングとか?(そりゃダメだろ 1.スレッド立てる人はスレが荒れてほしくないと思い強制sage進行スレに指定
2.70%のスレが強制sage進行スレとなる
3.スレはだいたい立てた順番にならぶ
4.sageの価値そのものが低くなる
こうなっちゃうんじゃない?
むかしむかし、スレタイに「(10000)」と入れると上げられないスレにできたけど
「バグ」として修正されたことを考えると望み薄では 一応こちらで。
2chの動作報告はここで。 パート10
http://qb3.2ch.net/test/read.cgi/operate/1076174286/528
528 :FOX ★:04/02/25 21:44 ID:???
問題は処理の順番というか・・・
1) bbs.cgi の中盤で dat に追記
2) bbs.cgi の後半で subject.txt を書き換え
3) この時 dat 内のレス数カウント
4) ついでに 1,000 超え判定 → 1,001 書き込んでパーミッション変更
5) しかし既にこのときには次のbbs.cgiが目前までせまっているらしい。
1)の前に3)4)を入れられないのかと。
それだけでover 1000の書き込みははねられ、
それだけDisk I/Oの負荷が減ると思われ。
何でこんな処理になっていたんでしょ。
理由が知りたい。 >>112
最初は1000超え判定ルーチンがなかったんだよね?
あとからとりあえず後ろにくっつけてみた、って感じじゃないかな。 >>112
529 :FOX ★:04/02/25 21:47 ID:???
dat のopen , close で行くと、
1) 512 超え判定、超えていたらDispError();
2) 追記のために open -> write -> close
3) subject.txt 書き換えのために res数取得 open -> read -> close
4) 超えていたら 1,001 書き込み open -> write -> close ->chmod
これなら、
open(+<);# 読み書き(追記用)両用フラグを与える
write;
read;
if(over 1000){ white; close; chmod};
else close;
endif;
とすればopenの手間は一発(=1/3)ですむ。 >>114
あ、まちがいた・・・ ○| ̄|_
×if(over 1000){ white; close; chmod};
○if(over 1000){ write; close; chmod}; 4) のところで、
A) 999以上で書き込めるの?
B) んじゃdatに1000ストッパー追記しよう
C) んでもって、パーミッション切っちゃおう
D) おしまい
となってます。
B) に詰まっちゃって、A) をすり抜けてきちゃうのがたくさんできる予感。 >>114
まさしく dat 追記する瞬間だけど
open(OUT, ">>$DATAFILE");
print OUT "$outdat\n";
close(OUT);
ここで dat 数を数えて DispError() するってこと?
そのあとで subject.txt を書き換えるときに
また dat数数えるってこと ? >>116
あ、A) は
A) 1000以上で書き込めるの?
だ。 でも、実際の1000大幅超えスレでは、1000ストッパーが何回も書き込まれているのに
その後から書き込みしたレスも書き込めちゃってるんだよね。
だから、Bに詰まっちゃってるのはないんじゃないかな。。 >>119
datへの書き込み後に1000越え判定するんで、有り得ないこともないですね、 512kB 超えの判定は bbs.cgi のかなり序盤
ここだとうまく行くから ここで dat数も数える?
んで数を保持しておいて、、、
後半の subject.txt 書き換え部分でその数使う?
すでにずれている予感もするのだが、、
ピーク時 bbs.cgi は 20回/sec くらい呼ばれているぞ
それも同じ subject.txt に対して >>117
こういうことでは?
open(OUT, $DATAFILE, "a+");
print OUT "$outdat\n";
@logdat = <OUT>;
if (scalar @logdat > 999) {
print OVER "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n";
close(OUT);
chmod(0555, $DATAFILE);
} else {
close(OUT);
} そう、だから1000越え判定をdat追記前にもってこようと。
>>121
50ms以下ですか・・・かなりきついですね。 >>121
openのコストよりstatのほうがちいさいのであればそれてもいいかと。 そういえばbbs.cgiのcputimeってどのくらいです?
それ如何によってはある程度のdat(レス)数(の意でいいのだろうか)で
filelockかけるっていうことも視野に入れてもいいかなと。
まちがいなく1000近くになれば重たくなりますが、
over 1000の膨大なdisk I/Oでリソースを食うよりはましかと。
# peko級でcputimeが50ms程度でおさまっていればいいのですが・・・。 前にも書いたけど、1000レス制限は本当に必要なんだろうか……。
サイズ制限だけでも間に合うんじゃないだろうか……。 >>127
いつ書き込みできなるのか分からないし、
次スレを作るタイミングも分からないし、
とにかくユーザにとって使いづらいというかイライラすることは間違いない。 >>128
いつ書き込みできなくなるかについては、レス数のかわりにスレサイズを見るようになり、それがあたりまえになるんでは?
AA系なんかだと「450K超えたからそろそろ次スレ」なんてのはあたりまえだし。 レス番号は左に確実に表示されているからどんなバカでも一目瞭然だけど。
datサイズは分からない人がたくさんいる。
はて。「サイズがxxxKBを超えています。512KBを超えると表示できなくなるよ。 」というメッセージは大きく表示されるけど。 専用ブラウザじゃ気づきにくいねぇ。
番号の変わりに番号+その時のDatサイズにしたら面白そうだけど。 だから1レスごとに「133 : xxxkb/512kb:動け動けウゴウゴ2ちゃんねる 」
とか表示されていればアホでも理解できるだろうけど。
そうでなければ不親切極まりない。
というかユーザー無視のプログラマ親切なダメ設計だと思う。 >>133
そういう文句は専用ブラウザの作者に言うべきでは? read.cgiは
「1000を超えると書き込めないよ」と同じように
「512Kを超えると書き込めないよ」と警告が出るし
「レス番号が表示される」のと同じように
「サイズが表示される」もんね。
ただ、その事(>>133が知らない)と1000レス制限は撤廃してよいか、ってのは
別の話だとは思うけどね。 1000とり合戦はなくなるだろうけどな。
liveだけ250kにすれば? さて、やっとここに書く時間がとれた。
chmod()を使うからいけないんだと思うですよ。
fchmod()を使って、アトミックにすべきかと。
6.10. 競合状態を避ける
http://www.linux.or.jp/JF/JFdocs/Secure-Programs-HOWTO/avoid-race.html
より引用。
他の例として、ファイルのメタ情報をいろいろ操作する作業を行う場合(オーナーの変更、
ファイルの状態確認、パーミッションビットの変更等)、まずファイルを開いて、開いたファイルに
対して操作してください。つまりこれは、chown()や chgrp()、chmod()のようなファイル名を
受けとる関数ではなく、fchown()や fstat()、fchmod()システムコールを使うことを意味して
います。こうすることで、プログラムが動作している間にファイルの置き換わりを防げます
(おそらく競合状態も)。たとえば、あるファイルを閉じてから、chmod()を使ってパーミッションを
変更すると、攻撃者はその 2 ステップ間にそのファイルを移動もしくは削除し、別のファイルに
対してシンボリックリンクを張ってしまえるかもしれません(たとえば、 /etc/passwd に対して)。 つまり、ロックじゃなくてrename()を使うというのと、意味合いは同じです。
(rename()はアトミックだから)
というわけで今の処理、
http://qb3.2ch.net/test/read.cgi/operate/1076174286/490 の、
490 名前:FOX ★[] 投稿日:04/02/24 22:13 ID:???
bbs.cgi のもっとも後半部分にこんなのがあるですよ。
open(RDAT,"<$dattemp");
@logdat=<RDAT>;#ログを配列に読み込む
close(RDAT);
#ログのカキコ数を取得
$lognum = @logdat;
if(-w $dattemp && $lognum > 999){
open(OVER, ">>$dattemp");
print OVER "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n";
close(OVER);
chmod(0555, $dattemp);
$lognum++;
を、
print OVER "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n";
fchmod(0555, OVER);
close(OVER);
$lognum++;
にすればいいんではないかなと。
# Perlよくしらないから、0555とOVERの順番は逆かも。
つかCのchmod()と引数の順番反対な気が。< Perl うん。それも一理ある。>>141
visudoとかcrontab -eとか、いろんなところに使われているですね。
こういう新機軸のかずかずを最初に実装した4BSDは、
いろんな意味で偉大だったと再認識するわけで。
ただ、こういうのって、負荷が超高くなるとか、きびしー条件じゃないと、
なかなか不具合が露見しにくいとこだから、いい実験なのかもしれんですね。< live8 open(RDAT,"<$dattemp");
seek(RDAT, 0, 2);
$lognum = $.;
close(RDAT); ちゅーか、Perl4の書き方は止めようよ。
ほれ
http://www.pure.ne.jp/~learner/program/Perl_oo.html flock って、ここだけでも使っちゃダメ?
#ログのカキコ数を取得
$lognum = @logdat;
if(-w $dattemp && $lognum > 999){
open(OVER, ">>$dattemp");
flock(OVER,2);
seek(OVER,0,2);
print OVER "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n";
chmod(0555, $dattemp);
close(OVER);
$lognum++; fchmod()って、ひょっとして標準のPerlにはついてないのかしら。 とりあえず、状況を管理人に通報しておきましたです。
原因も明確なので、あとは様子見しか正直やることがないかと。 おぉ、>>150 はごばーく。無視してくださいです。 以下のプログラムで、ちょっとテスト。いちおう動いた。
でも、ちょっと強引。
で、h2phしてsyscall.phを作っておく必要ありの模様。
これ入れれば、ほぼ間違いなく3000とか4000いくのはなくなると思われ。
うまく動くようなら、麻原判決の前に、live8でテストしてみるか。
#! /usr/local/bin/perl
#
# fchmod test via syscall
#
# may be needed 'h2ph'
require 'syscall.ph';
open(TTT,"A");
syscall(&SYS_fchmod, fileno(TTT), 0555);
close(TTT);
exit; あとは、rename()の助けを借りて、コピーして元datの複製を作っといて、
複製をchmod()してrename()するぐらいかなぁ。
でも、こんなことすると効率悪い気がするなぁ。
if (まだ書き込める) {
元ファイルの複製を作る;
chmod(555,複製);
rename(複製, 元ファイル);
} >>154はいかにも筋悪だなぁ。
複製を作っている間に、どんどん書き込まれる予感。
やっぱ、>>152 しかない気がする。
で、いちおう、make(perlcc)は通った模様。
ひ(りゃ的にOKなら、ちょっとやってみっか。
# なんだか、びんぼーくじを引いてるような気もする、する。 そしてずるずる引き込まれていくというのは内緒です。 sysopen はダメなのかな?
sysopen FH, $filename, O_RDONLY, 0555 or die;
みたいな。。。
♪open Systemcall がよく判ってなかったりして(汗) 私としては、こーゆーのはぜひとも次世代を担う若者にやってほしいわけですよ、よ、よ。やっぱ。 わたしがperlの文法を覚えたのは
旧実験室のやつがきっかけだというのは、ないしょです。 >>158
sysopen使うなら、syscall使うのと50歩100歩かも。
つか、プログラマじゃない人にPerlをいじらしたらいけません(素)。 おじさんはダメだよ、おじさんは。
あれですね、一回 bbs.cgi を整理しないといけないのかも。
継ぎ足し継ぎ足しでやってますからねー、
処理を変えずにうまいこと順番を変えていく。
色々試してみる。
いつかは Best Choice が見つかるかも。
(見つからないかも) >>162 には、激しく同意。同意だが、、、。
どなたか、柱になってすすめていただける人がいれば、
ちょっぴり支えるぐらいはできるかも。
細い杖だけどね。
わたしゃ、お守り関係で正直もうお腹いっぱい、PIEおっぱい。 >>163
( ´д)ヒソ(´д`)ヒソ(д` ) >>163
(;´Д`)
ちょっとやってみよう。
とりあえず、現在の大まかな処理を書いてみよう。 今なんとなくぼーと観察してたけど、
なんだか、何らかのシステム資源が足りなくなった瞬間にこの現象が始まる気がする。
つまり、fchmodにしても解決しない問題なのかも。かも。 で、ある速度を超えると、どうも資源が足りなくなってるような。
今回のだと、なんだか「セックルキター」ってのがどばどばっと書かれて、
該当datの読み込み数が50回/secを超えたあたりか。 で、いったんこの状態になると、軽くなるまではずっとこの状態が続くように思えるんで、
やっぱ、資源が足りない系な気がするなぁ。
でも、syslogにはそれっぽいの、出てないんだよなぁ。 うぅ、様子見ようと思ったら1869でとまっちゃった。 1) お茶でも飲みましょう
2) 串なホストを弾く
3) ブラ変
4) Cookieなかったら食え
5) 広告開いておく
6) 入力変数成型
7) ホスト取得(携帯は端末ID)
8) 512KB越え or datが書き込めないならエラー
9) Cookie設定
10) ●とかトリップとかキャップとか
11) ブラウザ変ですよん
12) 入力変数のCheck
13) PROXY制限(BBX Rock54 Samba24)
14) スレ立て制限
15) もうちょっと落ち着いて書きこみしてください
16) ID生成 and dat書き込み
17) subject.txt更新 and 1000越え判定
18) HTML出力
19) ふう、疲れた 7でホストを取得する前に2で串なホストを弾いてますね。どんなからくりなんだろう。 >>173
13)のSamba24は連投規制ですよね?
timecount/timecloseもないので、この2つで一体化すると良いと思います。 あ、現在の処理か、、
512KB処理と1000超え判定がかなり場所的に離れてますね、、 ホスト取得というのは、書き込んだ時用の記録だと思います
串を弾くのは単純にREMOTE_ADDRだったり、REMOTE_HOSTを使えばいい話ですし をーなんだか愉しそうな香りが(嬉嬉嬉)@bbs.cgi 大改竄計画
173 を検証してみて不要なものとか重複しているところとか 80kg 超えているところとかを検討するとよさそうですね。
でもゆっくりとした時間が取れないので鬱(泪) で、16 以降は単一プロセスでやらせたいなぁ。。。
bbs.cgi が受け持つのは 15 までにする。 あと、 bbs.cgi の起動数の制限を設けたいなぁ。1 鯖につき 50 プロセスまでとか。 書き込まれた内容を処理する前に、
書き込めるかどうかのチェックを、できる限り
済ませておく方向に、できないだろうか…
書き込めなかったら成型処理しても無駄な訳だし… 8)は15)の後に移動するとともに処理直前でsubject.txtをロックしてから
判定と書き込みを行いオーバーしたか18)が終わったらロック解除。
ほとんどオンメモリ状態なはずなので実際の処理は1msかかってないと思うんですよ。
ならばsubject.txtやdatの書き込みとHTML生成はシーケンシャルでもよいかななんてね。
OSのファイルキャッシュがまともに働いていれば、という前提付きですが。 >181
16以降の
ファイル書き込みは(TCP経由で)常駐プログラムだけがやるとか?
>>185
そんな感じです。
整形された line の先頭に、"bbs<>key<>" を付けて、tai64 形式のファイル名を付けて、特定のディレクトリに投げるの。
でもって、書き込みやさんはその特定のディレクトリだけを監視して(1秒おきにとか)、
何かしらファイルが放り込まれたら書き込みの操作を 1 人でやるの。
svc にさせてもよいかなぁ。 >>186
書き込み屋さんは非同期で動くんですか?
bbs.cgiがレスポンスを返すのはHTMLの生成が終わった後でなければマズい気がするんですが……。 >186
ファイルに書き出すのはやめた方がいいと思う
極端な話SQL鯖のような感じにリアルタイムで返って来るようにする
リアルタイムで返って来ないと・・・
書き込んだ内容が反映されてない -> なんらかの規制になってると判断する可能性有
2chブラウザのかちゅ〜しゃに至っては書き込み後自動的にdat読み込む
>>188
まずいっけ?
もし生成が溜まっていても、bbs.cgiがチェックしていればよさそうだけど。
>>189
書き出しはDBIにしておけば、MySQLでもDBI::Fileでも任意のドライバに変えるのは簡単。
今まではfileオープンしてそこに追記していたんだから。
tai64で1つごとにファイル書き込みしたとしても次元が違うぐらい速度が上がると思うけど。 案1
「bby -- スレッド情報一元管理システム」と同じDNS使用
dnsに板とキーを投げる
dnsは板・キー・レスカウントを保持
通常は127.0.0.1を返し
レス数1000になったら127.0.0.2を返す
案2
レス数管理にSQL鯖使用
>190
>書き出しはDBIにしておけば、MySQLでもDBI::Fileでも任意のドライバに変えるのは簡単。
2つのプログラム(2重起動含む)から1つのファイルを使って大丈夫なのか?
DNSはキャッシュされるのでそういう用途には向いていないと思います。
>2つのプログラム(2重起動含む)から1つのファイルを使って大丈夫なのか?
そういう泥臭いことを引き受けてくれるのがDBIです。
パフォーマンスを考えるとSQLデータベースになりますが、それはまぁ後々の話として。
インターフェースさえDBIにしておけば後でいくらでも入れ替えられます。
http://module.jp/works.html
のPerlによるハイパフォーマンスWebアプリケーションの開発を参考に >192
http://member.nifty.ne.jp/hippo2000/perltips/DBD/file.htm
>このモジュールは内部で flock() を使っています。
2つのプロセスから同時に使えない気がするけど
*dat書き込みプロセスがtxt経由するファイル使用中にbbs.cgiプロセスが書き込めないのはダメだぞ
bbs.cgiプロセスとdat書き込みプロセスはtxt経由ではなくTCP経由ってこと?
突貫工事で一番簡単な方法。
#DATを書き込む前に
open(FILE, '>> ../$FORM{'bbs'}/dat/$FORM{'key'}.idx');
print FILE '1';
close(FILE);
# レス数取得
$res = -s '../$FORM{'bbs'}/dat/$FORM{'key'}.idx';
# DAT書き込み
open(FILE, '>> ../$FORM{'bbs'}/dat/$FORM{'key'}.dat');
print FILE ""; #適当に
if ($res >= 1000) { #レスが1000超えてるときは1000ストップ
print(FILE "1000 over ...");
close(FILE);
chmod(0444, '../$FORM{'bbs'}/dat/$FORM{'key'}.dat');
} else { #通常は何もせずクローズ
close(FILE);
}
突貫だけあってその後いろいろめんどくさいです。 素人が書き逃げするですよ
8) 512KB越え or datが書き込めない or ロックディレクトリが存在するならエラー
17) subject.txt更新 and 1000越え判定
1000越えててカキコ可能なら
・ロックディレクトリ作成
・1001カキコ
・chmod --- 成功したらロックディレクトリ消去
1)の前に "keyfile.txt"(増加カウントファイル)のサイズをチェックして
1000いってなかったら"1>>keyfile.txt"を実行
1000超えてたら書き込み失敗
*書き込めなくてもカウントする
書き込めなかったら
マイナスカウントファイルを作って・・・
>>196
use IO::File;
my $file = = new IO::File;
以下perldoc IO::File参照 後ついでに
http://member.nifty.ne.jp/hippo2000/perltips/phpperl.htm
PerlよりPHPの方が軽くて速いは本当?
mod_perl化さえ出来れば、コンパイル後状態で動作するのでCで書くCGIに次ぐ動作速度になる。
つまりメンテナンス性で考えるとmod_perlで動くようにPerlで書けばOk。 http://p22.aaacafe.ne.jp/~deagle/AE/Perl-CGI/IO-SafeFile/transaction.html
排他処理、およびプロセスの頓死対策
>201
排他処理やると
ABCDEFG・・・と50ms順番に投稿したとする(cgiの処理は75msかかるとする)
書き込み成功 ACEG・・・ (奇数回)
書き込み失敗 BDFH・・・ (偶数回)
こんな感じになる
>>202
ロックが取れなかったら書き込み失敗とみなすならそうですが、
ロックは取れなかったら取れるまで待つものなので、
全部がちゃんと書き込めるです。 >203
>ロックは取れなかったら取れるまで待つものなので
NHK実況板だけで動作確認して次は
NTV実況板・・・と1つの板毎に実装していかないとlive8鯖がいきなり死ぬ可能性あるね
よし。レス数はctimeにやらせよう。
1970/1/1 9:0:1 が1レス目ってことで。
するとアレアレ。
subject.txtなんて/bbs/datみるだけであっという間にできちゃったりアレアレ。
flockなんて過去の遺物です。
1000のプロセスが全て並行で動いていることを想定して考えないと。 >>205
お、それ結構(・∀・)ゐゐ!! かも。
ちょっと移転作業がめんどくなりそうだけど。 今1000ストップが遅れてるのってあれでしょ?
dat書き込んだあとに/bbs/html/*.htmlからレス数とって、
1000ストップ判定するっていう処理だったかな。
うるおぼえ。
まず、DATに書く前に1000ストップ判定すべきですよ。
これだけでかなり違うかと。
処理順で言えば、DATを書き込む処理からエラーを吐いちゃいけないので、
DATを開くときにエラーにすればいいんじゃないすか? んで、実際書けない時のエラーはずーっと上の方でやっちゃっているわけで、
間の処理が長くていっぱいかけるわけですよ。
「開く前に調べる」
これだけではないかと・・・。
それと、bbs.cgiを作り直すなら、設計からやるように(す use IO::File;
use Fcntl qw(:flock :mode);
use constant LIMIT_SIZE => 512*1024;
$file = new IO::File($DATAFILE, '+<')
or DispError("ERROR!", "スレッドが見つからない");
flock($file, LOCK_EX);
DispError("ERROR!", "このスレッドには書けない")
unless -w $DATAFILE and -s $file < LIMIT_SIZE;
@logdat = $file->getlines();
$lognum = scalar @logdat;
$file->print("$outdat\n");
$logdat[$lognum++] = "$outdat\n";
if ($lognum >= 1000) {
$file->print("1001<><>Over 1000 Thread<>このスレッドは〜\n");
$lognum++;
chmod(S_IRUSR|S_IXUSR|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH, $DATAFILE);
}
$file->close();
flockを使っていいなら楽なんだけど。 >>205
http://nais.to/~yto/tools/kuttuki-counter/
くっつきカウンター
と同じアイデアだね。
秒数を進めるところで競合が起こるけど。
今のレス数からepoch + secondすればいいから厳密に1000秒を検知しなくていいのなら面白いね。 >>208
>それと、bbs.cgiを作り直すなら、設計からやるように(す
じゃあサブルーチンごとにパラメータとか列記していきましょうよ。
1)から分かる範囲でやりましょう。 泥縄的にアプローチ。
chmodが効かない(全部closeされるまで反映されない?)のが問題なわけで、
(1) chmodと同時に適当なファイル(たとえば「スレッドキー.stop」)も作る
(2) サイズオーバーや書込み禁止のチェックと同時に (1) のファイルの存在チェックも行う
とすれば、とりあえずは解決するかな、と。
スレッドが1000に達するたびにファイルができるのが難点だけど。 >chmodが効かない(全部closeされるまで反映されない?)のが問題なわけで
そうなのか
書き込む直前に1000行ったことを知らせるファイルチェック -> ファイルがあったらエラー
現在の投稿が1000なら1000行ったことを知らせるファイルを作る
実際の書き込み
chmodをやる
でどうだ
>>213
ファイル生成のコストがそれなりにかかりますよ。
ディスクI/Oはなるべく避けたいですし。 そです
1,000 超えて 3,000 とか行くのは いつかなと?
その前にチャレンジ版を投入するといいかな?
改善を目指したけど、結果は改悪になるかもしれないけどさ。 今日のめちゃいけはヨモギダ祭りですよ。
あの「ヨモギダ」ですよ。 318 :名無しさん :04/02/28 03:08 ID:atMg9E5Y
2/28(土)ヨモギタ少年愚連隊・記憶編 ←ここ
3/ 2(火)16:00〜16:59・チャンネルα「ヨモギダ・ダイジェスト」
「今週土曜から撮影9年超大型企画ついに解禁ヨモギダ少年と感動の再会最新作」
3/ 3(水)16:00〜16:59・チャンネルα「めちゃ2イケてるッ!(再放送)」
「180日超大作!!岡村大学受験涙と感動ヨモギダ少年3年後の姿」
3/ 4(木)16:00〜16:59・チャンネルα「めちゃ2イケてるッ!(再放送)」
「岡村受験(秘)結果速報・ヨモギダ原宿で盗撮された涙の衝撃映像は」
3/ 5(金)16:00〜16:59・チャンネルα「めちゃ2イケてるッ!(再放送)」
「岡村(秘)大学受験本番・美人教師は19歳東大生・恋と勉強の記録公開」
3/ 6(土)15:25〜17:25・めちゃ2イケてるッ!ヨモギダ完結編
3/ 6(土)ヨモギタ少年愚連隊02編
3/13(土)ヨモギタ少年愚連隊03編
3/20(土)ヨモギタ少年愚連隊04編 今日のブレーメンはたぶんなかなかだと思うけど、単にスレが速いだけでは
なかなか再現しないんすよね。
ROMも含めたユーザ数が多くないと、再現しないみたい。
ゴールデンタイムで各局の主力番組が目白押しの時の、
一番の人気番組で発生することが多いみたいだから、、、。
とすると、どれが該当するだろう。
live総合スレで聞いてみるかな。 >>217
peko系実況だけ3000にして人柱にして見るのはどうよと振ってみるテスト。
で、来週金曜1855-2148、TBSでオウム特番あり。
あとテロ朝は1、3、5の深夜、五輪サッカーの予選中継が。
open(OUT, $DATAFILE, "a+");
これが Configration Error になるんですが
どうすればいいのかなぁ。。。 >214
>ファイル生成のコストがそれなりにかかりますよ。
「1つのファイル作成」と「数百のプロセス待機」のコストを考えるとどうだろ?
実況板とそれ以外の板でbbs.cgiの使い分けが必要になるかも
>>223
open(OUT, "+>>$DATAFILE");
とか? 試してみたが、他プロセスでファイルをopenしているときでも、chmodは効く。
パーミッションはopen時に判定で、print時は関係無いみたい。
となると、以下の部分で1000越えのメッセージいくつも書かれるのが納得いかないが、
もしかして別のところでchmodで書き込み可能にしてない?
if(-w $dattemp && $lognum > 999){
open(OVER, ">>$dattemp");
print OVER "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n";
close(OVER);
chmod(0555, $dattemp); >>117 で $DATAFILE なのに
>>140 で $dattemp なのが気になったり。 >>229
サブルーチンなので、変数名が変わってるだけかと。 >>228
あるbbs.cgiが「1000を超えました」を書いて、
そのbbs.cgiがdatをクローズして、chmodするまでのわずかな時間に、
別のbbs.cgiが書いていると。
典型的な競合状態ってやつではないかなと。
つまり、プログラミング的には「腕の見せ所」のはず。 228じゃないけど
あるプロセスがchmodを行って、完了する前に別のプロセスが書き込みモードでopenしてしまう。
すると、最初のプロセスのchmodが完了せず、別のプロセスの書き込み完了まで待たされる。
その間に、さらに別のプロセスがオープンして、、
という感じで、全プロセスがファイルをcloseしない限り、chmodが完了しないのかな。 でも、なんかおかしいな。
ファイルに対する実際の処理は、要求された順番に行われて欲しいのに
chmod完了待ちの間に、次のopenが成功してしまうというのはどうも・・
カーネル内部でこの辺の優先度がいじられてるのかな。
http://www.dd.iij4u.or.jp/~okuyamak/Documents/NetworkFileSystem.Tune.4.html
の真ん中ちょい下で「chmodを優先するのもアリ」と書いてあるけど
その逆に「chmodをあとまわし」にしているのかもしれない。 >>233 のリンク先にこんなのがありますね。
http://www.dd.iij4u.or.jp/~okuyamak/Documents/NetworkFileSystem.Tune.4.html より引用:
File System は、実は、順序による結果の一意決定性の保証をしなくても File System と
して動作するものを作ることができる。 たとえば、2つの process がほぼ同時に write() と
chmod() を リクエストしてきたとしよう。 一応、順序的には『write→chmod』だとする。
この場合、File System は、
「んー。なんかこの write、時間がかかりそうだな。 先に chmod やるか」
と言って、内部で順序を入れ替えてしまっても、 実は バレナイ 。 ばれないということは
(公平性には欠けるかも知れないが)、 File System の実装としては「あり」だと言うことになる。
しかし、write() と chmod() の間の時間が十分に離れていれば、 そしてこの間にこれ以外の
リクエストがいっさい来なければ、 write() と chmod() はこの順序通りに実行される。
仮に、同一のファイルに対する write() 並びに chmod() で、 しかも chmod() されると
write() が実行できなくなるような場合、 外部から観察した場合のリクエスト順序 と
内部でのリクエスト順序 が一致しなくなる。 しかも、常に一定の結果になれば良いのだが、
その保証が無い場合、journal を利用しても結果が再現できなくなる。 上の例だと、
wirte と chmod が十分時間間隔を開けて到着したので write->chmod の順で
ファイルシステムに反映した結果を client に返したのだが、 この直後に system down
を起こしたとしよう。 journal を実行する際には write と chmod は十分短い間隔で
要求されるので、 chmod->write の順で実行してしまったら、 同じ結果を得ることはできない。
つまり、>>234の例とは逆に、chmod()が(コストが高いから等の理由で)
なかなかスケジュール(実行)されないということも、当然ありうるということになりますね。 chmodの後の
>$lognum++;
って、subject.txtに書き込むレス数で使われるはずで、実際subject.txtには
1000以上の数値が書き込まれているから、chmodで待つということは無いと
思うんだけど。 えと、>>197 あるいは >>212(←これは俺と別の人)の方法はどうでしょう。
これなら over 1000 判定されたら、 すでに 8) 以降にある別プロセスは蹴れないけれど
8) 以前のプロセスは蹴ることができるので、まあ 1050 位で止まると思う。
>>212 の人が言うように泥縄的アプローチではあるけれど。 >>238
chmodに成功しているけど反映に時間がかかると仮定すると
> ・chmod --- 成功したらロックディレクトリ消去
はマズいような。 >>238-239
>213-214にあるが
ファイルを作らないでやる方法を考える方が先らしい
>>239
じゃ、>>212 の方法で、ロックファイル(ディレクトリ)はそのまま残して
後で適当に消すってことで。
>>240
それは I/O 負荷的問題?それともポリシーの問題?
気になったんで、さらっとカーネルソースを読んでみた。
ひさしぶりなんで感覚がよみがえらないけど(ctagsの作り方をすっかり忘れていた私)、
chmod()やfchmod()すると結局、
setfmode()っていうカーネル内の関数が呼ばれて、
その中でvn_start_write(vp, &mp, V_WAIT | PCATCH)して、
それが正常終了しないとVOP_SETATTR(chmodの本体部分)に
いきつかないようになってるみたい。
vn_start_write()のコメントを読んでみると、
/*
* Preparing to start a filesystem write operation. If the operation is
* permitted, then we bump the count of operations in progress and
* proceed. If a suspend request is in progress, we wait until the
* suspension is over, and then proceed.
*/
int
vn_start_write(vp, mpp, flags)
なんてことが書いてあって、V_WAITといういやーなフラグ立ててるみたいだから、
すべてのペンディングになっているwrite()がいったん(カーネル的に)一区切りつかない限り、
VOP_SETATTR()が行われないような予感。
つまり、fchmod()にしても(>>139)だめっていうことになるすね。
というか、カーネル的にこうなっているということは、chmod()するアプローチでは絶対だめってことじゃん。
うーむ。 >>242
それって今までの処理(書込み禁止のチェック)は破綻ってこと?
だとしたら
(>212に処理順番を入れて書いた) >213を実行?
>>241-242
>>91もそうなんだけど、だからこそストップ(ロック)ファイルを作成してはと書いてみた。
あらかじめ作っておいてストップするときにリネームするという方法もあるが
ディレクトリ内のファイル数が増えるのが難点だなあ。
あと、I/Oを減らしたいなら1001以降のレス数を
subject.txtに反映するのを止めるという手もある。 chmodが完了して帰ってくるまでに時間がかかるとすると
> ・chmod --- 成功したらロックディレクトリ消去
がイイような。 >>243
超多数のwriteが超同時多発的に出たりすると、vn_start_write()でブロックされて、
VOP_SETATTR()に行かなくなるような気がします。
でも、今10分ぐらい読んでみただけなんで、
このへんは、もっと中身をよく知ってる人に確認すべきな気がしますが。
個人的には、書き込みできないことの判定=ファイルモードが555、というのは
いまのままでいいから、1000超えのところだけでも、NNNNNNNNNN.dame とかいう
ファイル「も」作ることにして、
書き込めない または そのファイルがあったら 書き込み禁止とかにすべきかなとも思ったり。
今日はそろそろ、おやすみの時間。 読んでみたのはFreeBSD 5.2.1-RELEASEのカーネルなんで、
Linuxでは同じところをどうやってるか、誰かおしえていただけるとうれしいかも。
おやすみなさり。 厳密に必ず1001で止めなきゃ行けないシステムならatomicなアプローチが絶対必要だけど
2chでは10や20オーバーする程度は全然平気なんだから
素直に「書き込む前にレス数を数えて、1000を超えてたら書き込まない」がよろしいかと。
つまり>>122系統のアプローチで、1001OVER書き込みではなく
レス内容の書き込みの前にレス数を判定すると。
問題は、追記モードでopenした場合に読み込みがうまく出来るかだけど、どうだったかな?
読み込みが可能なら問題なしだけど、不可能な場合、書き換えモードでopenしなくちゃいけない。
この場合、排他モードに(又はlock)しないと
レスを書き込む前に.datの末尾にseekしてから実際に書き込むまでの間に
別プロセスでの書き込みがはさまってしまうかもしれない。
すると末尾にゴミがついたり書き込みが消えると言うことが頻発してしまう。 で、perl全然知らないんだけど>>122を元に
if (open(OUT, "+>>$DATAFILE")) {
@logdat = <OUT>;
if (scalar @logdat > 999) {
print OUT "$outdat\n";
print OUT "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n";
close(OUT);
chmod(0555, $DATAFILE);
} else {
print OUT "$outdat\n";
close(OUT);
}
}
print $outdatやclose(OUT)が複数箇所で出て非常によろしくないけど
とりあえずwindows上では動作した。 で、そのchmodがうまく効いてくれないのが問題じゃなかったっけ?
1000レスを大幅にオーバーしちゃうのは。 だから、chmod完了待ちの間に大量のwriteリクエストが来ちゃうことが問題なの。
writeがあまり来なくなる(一段落する)と、chmodが完了するから大丈夫。
↑で動作したと書いたけど、
競合状態(複数プロセス)でどうなるかはテストしてない。
FreeBSD上でどうなるかも。 あ、違う。
すみません。私がアホでした。
さらに
if (1000over) {
そのままclose();
}
を入れないと意味無いんだった。 まとめ。
・chmodによるロックは高負荷時に効かなくなる。
対策案
まともな対処
・トランザクション処理をするDBDなどで1000ロック処理をする
分かりやすい対処
・ファイルシステムでロックファイルを使う
提案
・泥臭い処理を書くとバグるから、出来るだけCPANの.pm(Perl Module)を流用しよう >>249
if (open(OUT, "+>>$DATAFILE")) {
ってのがあるんだ。
入れてみよう。 #open(OUT, ">>$DATAFILE");
#print OUT "$outdat\n";
#close(OUT);
if (open(OUT, "+>>$DATAFILE"))
{
print OUT "$outdat\n";
my @logdat = <OUT>;
if(scalar @logdat > 999)
{
print OVER "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n";
close(OUT);
chmod(0555, $DATAFILE);
}
else
{
close(OUT);
}
}
>>256 版を全サーバに入れました
live5 を除く
live8/9 は root★さんのもじもじが必要 if(scalar @logdat > 1000)
{
close(OUT);
}
この文も入れたほうがいいかと、、 $lognum = @logdat を入れなくて大丈夫? if (scalar @logdat > 1000) {
DispError("ERROR!", "ERROR:このスレッドには書き込めません。");
} こうか?
#open(OUT, ">>$DATAFILE");
#print OUT "$outdat\n";
#close(OUT);
if (open(OUT, "+>>$DATAFILE"))
{
print OUT "$outdat\n";
my @logdat = <OUT>;
$lognum = @logdat;
if($lognum > 1000)
{
DispError("ERROR!", "ERROR:このスレッドには書き込めません。");
close(OUT);
}
if($lognum > 999)
{
print OVER "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n";
close(OUT);
chmod(0555, $DATAFILE);
}
else
{
close(OUT);
}
}
こうかな?
#open(OUT, ">>$DATAFILE");
#print OUT "$outdat\n";
#close(OUT);
if (open(OUT, "+>>$DATAFILE"))
{
print OUT "$outdat\n";
my @logdat = <OUT>;
$lognum = @logdat;
if($lognum > 1000)
{
close(OUT);
DispError("ERROR!", "ERROR:このスレッドには書き込めません。");
}
elsif($lognum > 999)
{
print OVER "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n";
close(OUT);
chmod(0555, $DATAFILE);
}
else
{
close(OUT);
}
}
$lognum が宣言してない変数なら、
$lognum = @logdat;
↓
my $lognum = @logdat;
でたぶんいいかと。 こうだった
#open(OUT, ">>$DATAFILE");
#print OUT "$outdat\n";
#close(OUT);
if (open(OUT, "+>>$DATAFILE"))
{
print OUT "$outdat\n";
my @logdat = <OUT>;
my $lognum = @logdat;
if($lognum > 1000)
{
DispError("ERROR!", "ERROR:このスレッドには書き込めません。");
close(OUT);
}
if($lognum > 999)
{
print OVER "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n";
close(OUT);
chmod(0555, $DATAFILE);
}
else
{
close(OUT);
}
}
たまに「このスレッドは1000を超えました〜」が書き込まれないような気はしますが、
1000を超えて書き込まれることはなくなるはずです。
……いいんだろうか。 if($lognum > 999)
↓
elsif($lognum > 999)
はなおしてもらわんと結局意味がないような、、 >>267
あー、DispErrorはexitしちゃうんで……。 さらに修正
#open(OUT, ">>$DATAFILE");
#print OUT "$outdat\n";
#close(OUT);
if (open(OUT, "+>>$DATAFILE"))
{
print OUT "$outdat\n";
my @logdat = <OUT>;
my $lognum = @logdat;
if($lognum > 1000)
{
close(OUT);
DispError("ERROR!", "ERROR:このスレッドには書き込めません。");
}
if($lognum > 999)
{
print OVER "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n";
close(OUT);
chmod(0555, $DATAFILE);
}
else
{
close(OUT);
}
}
またまた修正
#open(OUT, ">>$DATAFILE");
#print OUT "$outdat\n";
#close(OUT);
if (open(OUT, "+>>$DATAFILE"))
{
print OUT "$outdat\n";
my @logdat = <OUT>;
my $lognum = @logdat;
if($lognum > 1000)
{
close(OUT);
DispError("ERROR!", "ERROR:このスレッドには書き込めません。");
}
if($lognum > 999)
{
print OUT "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n";
close(OUT);
chmod(0555, $DATAFILE);
}
else
{
close(OUT);
}
} >>268
あ、DispErrorでexitするから結局elsifにしなくてもいい、ってことね、、
何か気味悪いなw print OUT "$outdat\n";
を1000over判定の後にして$lognumを++する方が。
もし書き込めなかったら狂っちゃうけど
chmod問題の原因はそっちっぽいから。 >>270
1000以上でも書き込みするような気がするけど? 狼で1000いったスレに
1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。
が書きこまれないです。
1000で止まってますけど あ、@logdatをhtml/*.html作成とかで使ってるのかな。 >>271
そうです。だから実はcloseも要らないです。
……まあたしかに行儀は悪いですが。 chmod(0555, $DATAFILE);
したファイルには書けないんだから
次のbbs.cgiは早めに判定した方がいいなぁ
512 超え判定と同時にやるのがいいのだろうか?
どやってやるの?
これはbbs.cgiのかなり前半
my $datsizeis =(stat("$DATAFILE"))[7];
unless( $datsizeis <= 512000){
DispError("ERROR!","ERROR:このスレッドは512kを超えているので書けません!");
}
>>272
あ、それ思った。
if (open(OUT, "+>>$DATAFILE"))
{
my @logdat = <OUT>;
my $lognum = @logdat;
++$lognum;
if($lognum > 1000)
{
close(OUT);
DispError("ERROR!", "ERROR:このスレッドには書き込めません。");
}
print OUT "$outdat\n";
if($lognum > 999)
{
print OUT "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n";
close(OUT);
chmod(0555, $DATAFILE);
}
else
{
close(OUT);
}
}
あと、各所で1001が消えてるみたいだけど、気にしない方向で。 変更
if (open(OUT, "+>>$DATAFILE"))
{
my @logdat = <OUT>;
my $lognum = @logdat;
++$lognum;
if($lognum > 1000)
{
close(OUT);
DispError("ERROR!", "ERROR:このスレッドには書き込めません。");
}
print OUT "$outdat\n";
if($lognum > 999)
{
print OUT "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n";
close(OUT);
chmod(0555, $DATAFILE);
}
else
{
close(OUT);
}
>>277
それって
unless( -s $DATAFILE <= 512000){
DispError("ERROR!","ERROR:このスレッドは512kを超えているので書けません!");
}
でよいような気がする。。あとで$datsizeisを別に使うならまだしも。
で、ファイルのパーミッションを取得するのは
(stat("$DATAFILE"))[2]
だそうです。 >>277
if (!-w $DATFILE) {
DispError("ERROR!","ERROR:このスレッドには書き込めません。");
}
とか? >>281
あっ、そっちのほうがスマートだね、、じゃあ、
unless( -w $DATAFILE){
DispError("ERROR!","ERROR:このスレッドには書き込めません。");
}
unless( -s $DATAFILE <= 512000){
DispError("ERROR!","ERROR:このスレッドは512kを超えているので書けません!");
}
こうだとよいのかな?(下はどうでもいいけど、、) 入れてこますか
unless( -w $DATAFILE){
DispError("ERROR!","ERROR:このスレッドには書き込めません。");
}
unless( -s $DATAFILE <= 512000){
DispError("ERROR!","ERROR:このスレッドは512kを超えているので書けません!");
}
でも 二回実行するより stat とったほうがいいのかな? http://www.kaimei.org/note/book_out/eff_perl.html
ここの56項にstatよりファイルテスト演算子のほうが
効率がいいと書いてあるぽ。2回だとどうかしらんけど、、 unless (-w $DATAFILE) {
DispError("ERROR!","ERROR:このスレッドには書き込めません。");
}
unless (-s _ <= 512000) {
DispError("ERROR!","ERROR:このスレッドは512kを超えているので書けません!");
}
でどうでしょ。 書き込み可能かの判定はaccess()でも出来るけど
サイズの判定はstat()じゃないと駄目なので、結局stat()は呼ばれる。
と思うのでstat()1回に一票。 つまり
if($lognum > 1000)
{
close(OUT);
DispError("ERROR!", "ERROR:このスレッドには書き込めません。");
}
これは保険で
unless( -w $DATAFILE){
DispError("ERROR!","ERROR:このスレッドには書き込めません。");
}
が通常のルートですなぁ
メッセージ変えておこうかな、 >>286
だと2回目の判定で前回のデータから読み込むんだね、、
statじゃなくてもそれが一番よさげ。 >>290-291
( ・∀・)つ〃∩ヘェーヘェーヘェー
if($lognum > 1000)
{
close(OUT);
DispError("ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!");
}
『1001』が書き込まれてないスレって、パーミションが
落ちてないような気がするけど大丈夫かな?
圧縮の時にパーミション見てたりしていない?
>>293
ニュー速の1001がいないスレにテスト書き込みしてみたけど、
「ERROR:このスレッドには書き込めません。」でした。
パーミションはちゃんと落ちてる模様。
>>294
パーミッションじゃなく1000overではじかれてるんじゃない?
1001の書き込みとchmodはセットでしょ?
大丈夫なの? >>292のメッセージ入りバージョンなら、外から判別できるみたいよ。 なにやら1001ストッパーがかかっているスレッドはsubject.txtに記録されているレス数が微妙に少ないような。
print OUT "1001<><>Over 1000 Thread<>このスレッド〜
のところに $lognum++ が必要な気がする……。 >>295
分かりづらくてすまん。>>296の言うとおり、
>>292のメッセージが入っているという前提でした。。 >>297
狼をしばらく見てたけど、どうやら
subject.txtに1001と書いてある→1001ストッパーがいない
subject.txtに1002と書いてある→1001ストッパーがいて、普通通り止まっている
になってるみたいです。 >>299
あ、多くなるんですか……。なんだろう。 1001がないスレをJaneで取得するとDATサイズエラー警告が出る。 試しに狼の1000超えスレッド15本を見ると、
subject.txtは1002、datは1001、1001ストッパーあり:8スレッド
subject.txtは1001、datは1001、1001ストッパーあり:3スレッド
subject.txtは1001、datは1000、1001ストッパーなし:4スレッド
でした。subject.txtの勝率2割。
Live2chだと実害はありませんが、
「新着あり」→「レス取得」→「新着あり」の永久コンボです。
そろそろ雑質スレや専用ブラウザスレが騒がしくなってきました。 >>301
どっちかと言うとJaneの不具合だから、こっち。
2ちゃんねる用ブラウザ「OpenJane」Part74
http://pc2.2ch.net/test/read.cgi/software/1075644934/
漏れもJane使いで同じ症状が出てるんだけどな。
ここのやりとりを起き抜けでぼおっと読みました。
作戦の趣旨は理解できたです。
あとは、超高負荷になった時にどうなるかということで。 >306
live8に入れないと分からない
1.( 1001 < $lognum) && ($lognum < 2000)の範囲内
2.datファイルが壊れる
3.鯖が落ちる
のどれか
もう仕事人さんがlive8に入れてありました。(Perl版)
さきほど私がperlccにかけて、バイナリ版にしました。
入れてあるから、1000までしかいかないんではないかと。
■2/29■ハロー!モーニング。スペシャル■Part3■
http://live8.2ch.net/test/read.cgi/dancesite/1078018021/ 924もパーミッションで止めるようにできるね(もうやってるのかな そもそも高速処理が要求されるのに
高コストなライトパーミッションクローズでとめられるのかというと・・・
キャッシュがされないDNSのようなしくみがあればいいんですが。 >>310
訂正。
>>191の案1で1000を越えていたときのみキャッシュするようにする。
たとえばこのスレを例にとり、
1076666901.oparete..qb3.tts.2ch.netなるホストの逆引きで
1000を越えているいないでキャッシュの許可権限を動的に変換できないかということ。 >>279 のどこが悪いんだ?
ここじゃなくて他のところが悪いの? >>313
>>279 だと、
確実に書き込みは止まると思うけど、
高負荷だと「このスレッドは1000を超えました」を誰も通らないことになると思う。
…つか、実際になってるか。 >>313
>>279
多分、
if($lognum > 999)
{
print OUT "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n";
close(OUT);
chmod(0555, $DATAFILE);
}
の部分を誰も通ってないのではないかと。。 今、live8/livecxのチェックを番組を未ながらやってるです。
この内容じゃ、速いの当たり前か。 subject.txtに書かれるレス数と実際のレス数が違うのなんでだろ〜 (1) bbs.cgi の序盤
unless( -w $DATAFILE){
DispError("ERROR!","ERROR:このスレッドには書き込めません。");
}
unless( -s $DATAFILE <= 512000){
DispError("ERROR!","ERROR:このスレッドは512kを超えているので書けません!");
}
(2) bbs.cgi の中盤の最後 (datへの追記)
if (open(OUT, "+>>$DATAFILE"))
{
my @logdat = <OUT>;
my $lognum = @logdat;
++$lognum;
if($lognum > 1000)
{
close(OUT);
DispError("ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!");
}
print OUT "$outdat\n";
if($lognum > 999)
{
print OUT "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n";
close(OUT);
chmod(0555, $DATAFILE);
}
else
{
close(OUT);
}
}
(3) bbs.cgi の終盤の始め
#==================================================
# ファイル操作(subject.txt & subback.html)
#==================================================
{
#サブジェクトパスを作成
my $rnd = int(rand(99999));
my $subject = $PATH . "subject.txt";
my $subtemp = $PATH . $rnd . $FORM{'time'} . ".tmp";
my $keyfile = $FORM{'key'} . ".dat";
use vars qw($FILENUM);
use vars qw($SUBLINE);
use vars qw(@newsub);
#サブジェクトファイルを読み込む
unless(-e "$subject"){
makesub();
}
open(SUBR,"<$subject");#SUBJECTを開く
my @SUBJECTLIST = <SUBR>;#内容を全て読み込む
close(SUBR);#閉じる
$FILENUM = @SUBJECTLIST;
MakeWorkFile($FORM{'key'});
if($FORM{'subject'} ne ""){
#subjectがあれば新規スレッド
my $subtm = "$keyfile<>$FORM{'subject'} (1)\n";
@newsub = ($subtm, @SUBJECTLIST);
++$FILENUM;
}else{
my (@tempsub, $transub, $frontsub, $rearsub);
if($FORM{'mail'} =~ /sage/){
$transub = join('<<>>', @SUBJECTLIST);#一本につなげる
($frontsub, $rearsub) = split(/$keyfile<>/, $transub);#keyでぶったぎる
@tempsub = split(/<<>>/, $rearsub);#後半ぶつ切り
$transub = shift(@tempsub);#タイトルを取り出す
$transub = $keyfile . "<>" . $SUBLINE;#タイトル入れ替え
@newsub = (split(/<<>>/, $frontsub), $transub, @tempsub);
}else{
$transub = $keyfile . "<>" . $SUBLINE;
@newsub = ($transub, grep(!/^$FORM{'key'}/, @SUBJECTLIST));
}
}
if(@newsub){
#SUBJECTに書き込む
open(SUBT, ">$subtemp");
#flock(SUBT, 2);
foreach(@newsub){
print SUBT $_;
}
#flock(SUBT,8);
close(SUBT);
my $resuc = 0;
until($resuc){ $resuc = rename($subtemp, $subject); }
}else{
@newsub = @SUBJECTLIST;
}
}
関連するサブルーチンに
makesub();
MakeWorkFile($FORM{'key'});
この二つがある
#==================================================
# subject.txtの補完
#==================================================
sub makesub{
my $bbs = $FORM{'bbs'};
my $path = "../"."$bbs"; #$where{$bbs};
my $datpath = $path."/dat";
open(DIR, "ls $datpath/|") || print HTM " cant' ls.";
my @dir = <DIR>;
close(DIR);
my %time;
my @pagefile;
foreach(@dir){
chop();
my $mtime;
my $pagemax;
my $mt = "$mtime"."$_";
($mtime) = (stat("$datpath/$_"))[10];
$time{"$mt"} = $_;
++$pagemax;
}
my @mtime = keys(%time);
my @sorting = sort by_number @mtime;
my $filenum;
foreach(@sorting){
push(@pagefile,$time{"$_"});
#print $time{"$_"};
++$filenum;
}
#@pagefile = reverse(@pagefile);
my $num;
my $subject;
while($filenum>=$num){
my $showpage = @pagefile[$num];
if($showpage eq ""){
}
open(IN, "$datpath/$showpage")||die "";
my $resnum = 1;
my $rr = 0;
while(<IN>){
$resnum++;
if($rr == 0){
$_ =~ s/\n//gi;
$_ =~ s/\r//gi;
my ($name,$mail,$time,$message,$subject);
($name,$mail,$time,$message,$subject) = split(/,/,$_);
$rr = 1;
}
}
close(IN);
open(OUT,">$path/subject.txt");
print OUT $showpage .",";
print OUT "$subject($resnum)\n";
++$num;
close(OUT);
}
}
#==================================================
# ファイル操作(HTML作成用作業ファイル更新)
#==================================================
#HTML用DATを作成
#MakeWorkFile(KEY-NUMBER)
sub MakeWorkFile{
my $key = @_[0];
my $workfile = $TEMPPATH . $key . ".html";
my $dattemp = $DATPATH . $key . ".dat";
my (@messx,@content,@logdat);
my ($lognum,$mailto,$time,$brmax,$topnum,$firstlog,$name,$mail,$subject,$message);
open(RDAT,"<$dattemp");
@logdat=<RDAT>;#ログを配列に読み込む
close(RDAT);
#ログのカキコ数を取得
$lognum = @logdat;
if(-w $dattemp && $lognum > 999){
#open(OVER, ">>$dattemp");
#print OVER "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n";
#close(OVER);
#chmod(0555, $dattemp);
$lognum++;
if(-w $dattemp){
my $datdat = $DATPATH . $key;
my $tmpdat = $DATPATH . $key . ".tmp";
my $success;
open(COPY, "cp $dattemp $datdat |");
close(COPY);
$success = 0;
until($success){ $success = rename($datdat, $dattemp); }
chmod(0555, $dattemp);
unlink($tmpdat);
}
}
#1つ目の要素を読み込む
$firstlog = $logdat[0];
#改行カット
chomp($firstlog);
#1つ目の要素を加工する
($name,$mail,$time,$message,$subject) = split(/<>/,$firstlog);
$SUBLINE = $subject . " (" . $lognum . ")\n";
open(SHTM,">$workfile");#ログテンポラリを開く
#flock(SHTM,2);
#サブジェクトテーブルを吐き出す(ここは必ず1行にまとめること(処理効率))
#-----------------------------------------------------------------------
print SHTM <<EOF;
<TABLE border=1 cellspacing=7 cellpadding=3 width=95% bgcolor="$SETTING{"BBS_THREAD_COLOR"}" align=center><TR><TD><DL><a name="\$ANCOR"></a><DIV ALIGN="right"><a href ="#menu">■</a><a href="#\$FRONT">▲</a><a href="#\$NEXT">▼</a></DIV><B>【\$ANCOR:$lognum】<FONT size=5 color="$SETTING{'BBS_SUBJECT_COLOR'}">$subject</FONT></B>
EOF
#-----------------------------------------------------------------------
#1つ目のメールへのリンクを作成
if($ENV{'SERVER_NAME'} =~ /bbspink\.com/i)
{#if(bbspink)
unless($message =~ /2ch\.net/ || $message =~ /bbspink\.com/){
$message =~ s/(https?|ftp|gopher|telnet|whois|news)\:\/\/([\w|\:\!\#\$\%\=\&\-\^\`\\\|\@\~\[\{\]\}\;\+\*\,\.\?\/]+)/<a href=\"http\:\/\/pinktower\.com\/$2\" target=\"_blank\">$1\:\/\/$2<\/a>/ig;
}else{
$message =~ s/(https?|ftp|gopher|telnet|whois|news)\:\/\/([\w|\:\!\#\$\%\=\&\-\^\`\\\|\@\~\[\{\]\}\;\+\*\,\.\?\/]+)/<a href=\"http\:\/\/$2\" target=\"_blank\">$1\:\/\/$2<\/a>/ig;
}
} else {#if(!bbspink)
unless($message =~ /2ch\.net/ || $message =~ /bbspink\.com/){
$message =~ s/(https?|ftp|gopher|telnet|whois|news)\:\/\/([\w|\:\!\#\$\%\=\&\-\^\`\\\|\@\~\[\{\]\}\;\+\*\,\.\?\/]+)/<a href=\"http\:\/\/ime\.st\/$2\" target=\"_blank\">$1\:\/\/$2<\/a>/ig;
}else{
$message =~ s/(https?|ftp|gopher|telnet|whois|news)\:\/\/([\w|\:\!\#\$\%\=\&\-\^\`\\\|\@\~\[\{\]\}\;\+\*\,\.\?\/]+)/<a href=\"http\:\/\/$2\" target=\"_blank\">$1\:\/\/$2<\/a>/ig;
}
}###
if($mail ne ""){
$mailto = "<a href=\"mailto:$mail \"><b>$name </b></a>";
}else{
$mailto = "<font color=$SETTING{'BBS_NAME_COLOR'}><b>$name </b></font>";
}
#1つ目の要素を吐き出す
print SHTM "<dt>1 名前:$mailto $time<dd>$message <br><br><br>";
#ログ数から、表示コンテンツをチェック
if($lognum > $SETTING{"BBS_CONTENTS_NUMBER"}){
#ケツの要素を0〜9番までコンテンツに格納
@content[0..$SETTING{"BBS_CONTENTS_NUMBER"}-1] = @logdat[@logdat-$SETTING{"BBS_CONTENTS_NUMBER"}..@logdat-1];
$topnum=@logdat-($SETTING{"BBS_CONTENTS_NUMBER"}-1);
}else{
#アタマの要素を1〜10番までコンテンツに格納
@content[0..($SETTING{"BBS_CONTENTS_NUMBER"}-1)] = @logdat[1..$SETTING{"BBS_CONTENTS_NUMBER"}];
$topnum=2;
}
foreach(@content){
chomp($_);#改行をカット
#要素を加工する
($name,$mail,$time,$message,$subject) = split(/<>/,$_);
unless($_){
$topnum++;
next;
}
#要素のメールへのリンクを作成
if($ENV{'SERVER_NAME'} =~ /bbspink\.com/i)
{#if(bbspink)
#if(bbspink)
unless($message =~ /2ch\.net/ || $message =~ /bbspink\.com/){
$message =~ s/(https?|ftp|gopher|telnet|whois|news)\:\/\/([\w|\:\!\#\$\%\=\&\-\^\`\\\|\@\~\[\{\]\}\;\+\*\,\.\?\/]+)/<a href=\"http\:\/\/pinktower\.com\/$2\" target=\"_blank\">$1\:\/\/$2<\/a>/ig;
}else{
$message =~ s/(https?|ftp|gopher|telnet|whois|news)\:\/\/([\w|\:\!\#\$\%\=\&\-\^\`\\\|\@\~\[\{\]\}\;\+\*\,\.\?\/]+)/<a href=\"http\:\/\/$2\" target=\"_blank\">$1\:\/\/$2<\/a>/ig;
}
}else {#if(!bbspink)
unless($message =~ /2ch\.net/ || $message =~ /bbspink\.com/){
$message =~ s/(https?|ftp|gopher|telnet|whois|news)\:\/\/([\w|\:\!\#\$\%\=\&\-\^\`\\\|\@\~\[\{\]\}\;\+\*\,\.\?\/]+)/<a href=\"http\:\/\/ime\.st\/$2\" target=\"_blank\">$1\:\/\/$2<\/a>/ig;
}else{
$message =~ s/(https?|ftp|gopher|telnet|whois|news)\:\/\/([\w|\:\!\#\$\%\=\&\-\^\`\\\|\@\~\[\{\]\}\;\+\*\,\.\?\/]+)/<a href=\"http\:\/\/$2\" target=\"_blank\">$1\:\/\/$2<\/a>/ig;
}
}
##
if($mail ne ""){
$mailto = "<a href=\"mailto:$mail \"><b>$name </b></a>";
}else{
$mailto = "<font color=$SETTING{'BBS_NAME_COLOR'}><b>$name </b></font>";
}
print SHTM "<dt>$topnum 名前:$mailto :$time<dd>";
my @messx = split(/<br>/,$message);#メッセージを行でカット
my $messy = @messx;#行数を計算
if($messy > $SETTING{"BBS_LINE_NUMBER"}){
my $messz = join('<br>',@messx[0 .. $SETTING{'BBS_LINE_NUMBER'}-1]);
print SHTM "$messz <br>";
print SHTM "<font color=\"$SETTING{'BBS_NAME_COLOR'}\">(省略されました・・全てを読むには<a href=\"../test/read.cgi/$FORM{'bbs'}/$key/$topnum\" target=\"_blank\">ここ</a>を押してください)</font><br>";
}else{
my $messz = join('<br>',@messx[0 .. $messy-1]);
print SHTM "$messz <br>";
}
$topnum++;
print SHTM "<br>\n";
}
#-----------------------------------------------------------------------
#flock(SHTM,8);
close(SHTM);
#パーミッション調整
umask(0);
chmod(0666,$workfile);
}
>>325
-w $DATAFILE or ( -s $DATAFILE <= 512 * 1024) or DispError("ERROR!","ERROR:このスレッドには書き込めません。");
エラーの単純化っでどうかしら?理由はどうあれ書き込めないのですから(^-^) chmodはされているのにOver1000がprintされていない、、、? そういえば、gethostbyaddr を二回やってるのはどうなんだろう。。。 >>331
追記および訂正。
our $Log_line = 1; # グローバル扱いで。以後レス数はこれを参照するとか。
if (open(OUT, "+>>$DATAFILE")) { $Log_line = join '', <OUT> =~ tr/\n/\n/ }
-w $DATAFILE or ( -s $DATAFILE <= 512 * 1024) or ($Log_line > 1000) or
DispError("ERROR!","ERROR:このスレッドには書き込めません。"); if (open(OUT, "+>>$DATAFILE"))
{
my @logdat = <OUT>;
my $lognum = @logdat;
if($lognum > 1000)
{
close(OUT);
DispError("ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!");
}
print OUT "$outdat\n";
++$lognum;
if($lognum > 1000)
{
print OUT "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n";
close(OUT);
chmod(0555, $DATAFILE);
}
else
{
close(OUT);
}
} >>334
条件が無茶苦茶ですね。ごめんなさい。
(-w $DATAFILE and ( -s $DATAFILE <= 512 * 1024) and ($Log_line < 1001)) or
DispError("ERROR!","ERROR:このスレッドには書き込めません。"); >>335
むしろそうするくらいなら、
++$lognum; を削除
だけで済むような。 質問。subject.txtに記録されるレス数は >>326 の $lognum ですか? >>339
うん。今そのことについて議論してるところかと。 >340
漏れも多分そうだと思って一応++$lognum;は残しておいてもた if($lognum > 1010)
{
close(OUT);
DispError("ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!");
}
にしてみた。 というか、datの書き込みのあとには、
#パーミッション調整
umask(0);
chmod(0666, $DATAFILE);
がきてますよー。 if($lognum > 1000)
{
++$lognum; #←これもいるかも
print OUT "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n";
close(OUT);
chmod(0555, $DATAFILE);
} ただ、>>344 みたいなアプローチがどのぐらい効果あるかだけど、、、。
それで、1001ストッパーが書かれるような気は、あんまりしないかも。
ちょっとお出かけ。 #MakeWorkFile(KEY-NUMBER)
sub MakeWorkFile{
my $key = @_[0];
my $workfile = $TEMPPATH . $key . ".html";
my $dattemp = $DATPATH . $key . ".dat";
my (@messx,@content,@logdat);
my ($lognum,$mailto,$time,$brmax,$topnum,$firstlog,$name,$mail,$subject,$message);
open(RDAT,"<$dattemp");
@logdat=<RDAT>;#ログを配列に読み込む
close(RDAT);
#ログのカキコ数を取得
$lognum = @logdat;
if(-w $dattemp && $lognum > 999){
#open(OVER, ">>$dattemp");
#print OVER "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n";
#close(OVER);
#chmod(0555, $dattemp);
#$lognum++; ← コメントにした
>>330の
#ログのカキコ数を取得
から
#1つ目の要素を読み込む
の前までがいらない。
この中の$lognum++;が最終的にsebject.txtに書かれているので
実際より+1された数が入ってしまう。 変更
if (open(OUT, "+>>$DATAFILE"))
{
my @logdat = <OUT>;
my $lognum = @logdat;
++$lognum;
if($lognum > 1010)
{
close(OUT);
DispError("ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!");
}
print OUT "$outdat\n";
if($lognum > 999)
{
print OUT "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n";
close(OUT);
chmod(0555, $DATAFILE);
}
else
{
close(OUT);
#パーミッション調整
umask(0);
chmod(0666, $DATAFILE);
}
}
>chmod(0666, $DATAFILE);
レス数が1000を超える原因と思われ 解決した?
最終的に subject <= 実際のカウント になればいいような
datの読み込みを2回やってるんですね〜……。
レスの書き込みとレス数の取得を同時にやる(>>353 の処理を >>350 に持ってくる)のがいいかも。
……大手術(汗)。 >>354
おいらもそう思ったですよ。
chmod 0555 しても、追っかけてきてるプロセスが chmod 0666 しちゃって、
そのプロセスが、chmod 0555 しても。。。
chmod 0666 を消したら解決だったりして。 >>357
chmodが効かないって変だと思ったんだよね。 でかける前に見た。
こりゃ、>>354がビンゴな気が。
でなきゃ、いくらひどいじょーきょーでも、4000とかいく原因とは考えにくい。
しばらくオフライン。たまーにPHSでチェックするかも。 というわけで、live8,9に
chmod(0666, $DATAFILE);
を消したやつを入れてみてくださいですー。 >>353
処理の順番が。。
これでどですか。
if (open(OUT, "+>>$DATAFILE"))
{
my @logdat = <OUT>;
my $lognum = @logdat;
if($lognum = 1000) #正常処理
{
print OUT "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n";
close(OUT);
}
if($lognum > 1000) #非常時処理
{
close(OUT);
DispError("ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!");
}
print OUT "$outdat\n";
chmod(0555, $DATAFILE);
}
else if($lognum < 1000) #1000未満時処理
{
close(OUT);
#パーミッション調整
umask(0);
chmod(0666, $DATAFILE);
}
++$lognum;
} 訂正。。
if (open(OUT, "+>>$DATAFILE"))
{
my @logdat = <OUT>;
my $lognum = @logdat;
++$lognum;
if($lognum = 1000) #正常処理
{
print OUT "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n";
close(OUT);
}
if($lognum > 1000) #非常時処理
{
close(OUT);
DispError("ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!");
}
print OUT "$outdat\n";
chmod(0555, $DATAFILE);
}
else if($lognum < 1000) #1000未満時処理
{
close(OUT);
#パーミッション調整
umask(0);
chmod(0666, $DATAFILE);
}
} >>351
テレビ朝日実況板より
スクープスペシャルその1 (1001)
http://live8.2ch.net/test/read.cgi/liveanb/1078030448/
1000 名前:名無しステーション 投稿日:04/02/29 14:52 ID:gFLAwWAx
(1001無し)
スクープスペシャル 警察の裏金疑惑第2弾 その2 (1000)
http://live8.2ch.net/test/read.cgi/liveanb/1078030554/
1000 名前:名無しステーション 投稿日:04/02/29 15:20 ID:LyiRwuOt
(1001無し)
この間に加えた修正によって、subject.txtに書かれるレス数と
実際のレス数が一致するようになりました。ありがとう! #ERROR!
#ERROR:このスレッドには書けません!
#修正ここまで。
# "ERROR:このスレッドには書き込めません。緊急緊急緊急!!" が出てこないけど今ソースはどうなってるのだろう。。
if (open(OUT, "+>>$DATAFILE"))
{
my @logdat = <OUT>;
my $lognum = @logdat;
++$lognum;
if($lognum = 1000) #正常処理
{
print OUT "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n";
close(OUT);
chmod(0555, $DATAFILE);
}
if($lognum > 1000) #非常時処理
{
close(OUT);
DispError("ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!");
}
print OUT "$outdat\n";
}
else if($lognum < 1000) #1000未満時処理
{
close(OUT);
#パーミッション調整
umask(0);
chmod(0666, $DATAFILE);
}
} >>364
それから、1001ストッパーを書き込む「前」に$outdatを出力しないとだめです(でないと書き込みが吸い込まれる)。 1001ストッパーが書き込まれないのは
・プロセスAが >>353 で1000レス目を書き込む
・プロセスBが >>330 で(1000レス以上なので)chmodする
・プロセスAが1001ストッパーを書き込もうとするもEPERM
と予想してみる。
ということで、>>353 を
if ($lognum > 1010) {
close(OUT);
chmod(0555, $DATFILE);
DispError("ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!");
}
にして、>>330 の chmod(0555, $dattemp); を削除する、というのはどうでしょ。 ……って、writeはEPERMなんか返さないか……。 これ全部いらないのか?
if(-w $dattemp && $lognum > 999){
#open(OVER, ">>$dattemp");
#print OVER "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n";
#close(OVER);
#chmod(0555, $dattemp);
#$lognum++;
if(-w $dattemp){
my $datdat = $DATPATH . $key;
my $tmpdat = $DATPATH . $key . ".tmp";
my $success;
open(COPY, "cp $dattemp $datdat |");
close(COPY);
$success = 0;
until($success){ $success = rename($datdat, $dattemp); }
chmod(0555, $dattemp);
unlink($tmpdat);
}
}
ファイルロックの名残?
総帥に事情聴取してからにしてください。
こないだのiスクリプト消滅騒ぎのような事態は避けないと。 あらためて
・複数のプロセスが999レス目のつもりで書き込む→1000オーバー(ただしストッパーは書かれない)
・1000オーバーなので >>330 でchmod
と予想してみる。
ってことで、>>330 の1001ストッパー書き込みも復活すれば……。
……泥縄だなぁ。 ええとこれとまったく同じメッセージが書いてある部分のソースがないのですがどの部分でしょうか
↓
ERROR:このスレッドには書けません!
あと $outdat っての値が代入されている部分のソースもないし。。 ええとこういう風になっているはずなのですけど。
DispError("ERROR!","ERROR:このスレッドには書き込めません!");
----
ERROR!
ERROR:このスレッドには書けません! >>377
なんか重複してるけど、一緒です。
#.datが存在してないか書けないならばいばい
unless(-w $DATAFILE){
DispError("ERROR!","ERROR:このスレッドには書けません!");
}
#my $datsizeis =(stat("$DATAFILE"))[7];
#unless( $datsizeis <= 512000){
#DispError("ERROR!","ERROR:このスレッドは512kを超えているので書けません!");
#}
unless( -w $DATAFILE){
DispError("ERROR!","ERROR:このスレッドには書き込めません。");
}
unless( -s $DATAFILE <= 512000){
DispError("ERROR!","ERROR:このスレッドは512kを超えているので書けません!");
} あ間違えたました、、こうです
DispError("ERROR!","ERROR:このスレッドには書けません!"); >>370
chmod 0555 が失敗したときか、
chmod 0555 の後に書き込めるようになっちゃったときの処理ですかねー、
あんまり意味がないような気もする、、 >>378
別にどうでもいいんだけど
512k超えの処理ってunlessでやる意味あるんだろうか >>370 でunlinkしている $DATPATH . $key . ".tmp" というファイルはどこで作ってるんでしょ? こんなに謎だらけでもなんとなく動いているところがすごい・・・(´Д`;) ようし、外してみよう。
#if(-w $dattemp && $lognum > 999){
##open(OVER, ">>$dattemp");
##print OVER "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n";
##close(OVER);
##chmod(0555, $dattemp);
##$lognum++;
#
#if(-w $dattemp){
#my $datdat = $DATPATH . $key;
#my $tmpdat = $DATPATH . $key . ".tmp";
#my $success;
#open(COPY, "cp $dattemp $datdat |");
#close(COPY);
#$success = 0;
#until($success){ $success = rename($datdat, $dattemp); }
#chmod(0555, $dattemp);
#unlink($tmpdat);
#}
#} http://鯖.2ch.net/板/dat/key.tmp作ってソコで処理して、
http://鯖.2ch.net/板/dat/key.datにコピーして、
http://鯖.2ch.net/板/dat/key.tmpをあぼーんしてる? >>391
何人の人がそう思いチャレンジしてきたことか・・・
いまだ勝者は一人としていない、暗黒の世界から生還したものはいない。 >>390
たぶん
/dat/key.dat に書き込んで
/dat/key.dat を /dat/key にコピーして ←たぶん無駄
/dat/key を /dat/key.dat にリネームして ←たぶん無駄
/dat/key.dat を書込み禁止にして
/dat/key.tmp をあぼーんしている ←たぶん無駄
かと……。 >>392
まぁチャレンジできる人が限られてるし…。
ここの暇人たち(←おい)なら軽く片付けちまいそうな気も…w >>392
というか、ソースが(NDAでもいいから)完全公開されれば(ry 芸スポなんですけどいいですか?
【サッカー】日本代表選手7人が合宿中に規則違反で飲酒★2
http://news6.2ch.net/test/read.cgi/mnewsplus/1077996750/
1001ストッパーが壊れてるのか
ストップしないんですか。 >>400
で、どうするんです?
と聞いてみるテスト。 これが期待通りの動作をしていないってことっすね
if (open(OUT, "+>>$DATAFILE"))
{
my @logdat = <OUT>;
my $lognum = @logdat;
テストとしてだけど1000を超えたらあらゆる変数を出力しまくってみては 1010のやつを生かしておいて,変数を色々出力して検証してみてはどうでしょ? >>398
>>399
>>403
チッ。記念カキコしに行ったのにどこもかけなかった! 現状>>403が一番凄い。
3000突破してる・・・
でもどうやら止まったみたいですね。 >>403は、他の人が書きこめたてた時もオレはユーザー情報が消失してますとか言われて書き込めなかった うーん。。。とりあえず各種変数を出力するようにしてみたら? >>416
>>404を確かめるために
試験的に >>353 の if($lognum > 1010) を if($lognum > 300) とかにして
300を超えたスレッドに書き込んでみて
「緊急緊急緊急!!」が出るかどうかを見てみるのはどうでしょか。 >>424
それは危険過ぎるとおもうなぁ>300にする >>425
いや、いきなり全鯖に配るわけじゃなくて、(金) でテストするだけでも、と……。 qbのbbs.cgi更新すると一気に全鯖いくんじゃなかったっけ?(わからん >>426
(金)ではやり辛いでしょ。
いっそのことN速で実験しましょ。 いろんなとこにフラグ立てまくって出力させてみてほしいです
どこが実行できていて、どこができてないのかよく分かんない >>404のレス数チェックが効いてるかどうかは、このスレに1回書き込むだけで判明するかな、と。
http://qb.2ch.net/test/read.cgi/operate2/1068621844/
このスレがいま350レスなので……。 ん?
もう解ったんでないのか?
違うところで戦っていたということが、 ひょっとしたら my @logdat = <OUT>; の前に seek(OUT, 0, 0); を入れるといいかも(←自信なし)。 うちのwindowsだと、
if (open(OUT, "+>>$DATAFILE"))
{
#この時点でファイル末尾にseekされてる
my @logdat = <OUT>;
my $lognum = @logdat;
これだと@logdatは空になっちゃうんだけど、、、
if (open(OUT, "+<$DATAFILE"))
my @logdat = <OUT>;
my $lognum = @logdat;
じゃないすかね >>436
うちのcygwinだと"+>>"でopenした時点でファイル先頭にseekされてました。
あと、追記モードじゃないと書き込みがぶつかったときにヤバいです。 なんか…ニュー速+も1001ストッパー壊れてるのね。
なにがなんだか… >>433
ええと>>330に手を加えていたものが>>350で
その後>>353でテストして>>330あたりに戻ったということなのかな。。
どのソースを元にやればいいのか、、
ちょっとゆっくりやってほしい、、
今試したら、Windows(ActivePerl)でもsysopen使ったら先頭だった。 >>249だけど、>>438と同様、
cygwin+perl5.8.2で、読み込み時は先頭から
同じくlinux(redhat8かな)+perl5.8.0でも。 思ったんだけど
bbs.cgiを置き換えちゃうと不具合が出たときに面倒だし
変数を表示しようとしてもなかなか難しい。
そこで、bbs_test.cgiにして実験する。
で、こいつにPOSTするのも面倒だから
POST先だけを変えたread_test.cgiを作り
テスト用の鯖に入れる。
で、書き込みテストはそっちでやって、内部の変数や状態をずらずらと表示する。
ただ、1000到達時のテストは難しいかな。 open(OUT, ">>$DATAFILE");
print OUT "$outdat\n";
close(OUT);
dat 追記部分は元にもどす。 そして、
ここに持ってくる
sub MakeWorkFile{
my $key = @_[0];
my $workfile = $TEMPPATH . $key . ".html";
my $dattemp = $DATPATH . $key . ".dat";
my (@messx,@content,@logdat);
my ($lognum,$mailto,$time,$brmax,$topnum,$firstlog,$name,$mail,$subject,$message);
open(RDAT,"<$dattemp");
@logdat=<RDAT>;#ログを配列に読み込む
close(RDAT);
#ログのカキコ数を取得
$lognum = @logdat;
if($lognum > 1010)
{
DispError("ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!");
}
if($lognum > 999)
{
open(OUT,"<$dattemp");
print OUT "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n";
close(OUT);
chmod(0555, $dattemp);
}
else
{
#パーミッション調整
umask(0);
chmod(0666, $dattemp);
}
>>447 を見て気づいたこと。
・「緊急緊急緊急!!」が書き込み終わった後になる
・1001ストッパー書き込み時のオープンモードが読み込みモード >>453
ども 、
直してみた
if($lognum > 1010) # ここはこないと予想
{
DispError("ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!");
}
if($lognum > 999)
{
open(OUT,">>$dattemp");
print OUT "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n";
close(OUT);
chmod(0555, $dattemp);
}
else
{
#パーミッション調整
umask(0);
chmod(0666, $dattemp);
}
>>447
open(OUT,"<$dattemp");
print OUT "1001<><>Over 1000 Thread<>この
鰓がでるよね?
もっと餅付いてくだちい。。。 chmod(0666, $dattemp);がchmod(0555, $dattemp);よりあとに実行されるとは考えにくいけど、
念のため、
if($lognum > 1010)
{
chmod(0555, $dattemp);
DispError("ERROR!", "ERROR〜");
}
としてもいいかも。 ウスターの一部しか開示されないので
処理の流れがわからない。。。
あと、別のところで問題がある場合も
思い込んでる場所のみを開示&思考なので発見が遅れる。。。
な予感('-') if (open(OUT, "+>>$DATAFILE"))
{
my @logdat = <OUT>;
my $lognum = @logdat;
----
この部分ですけど実際にファイルをopenしているのはどこなんだろう、、
そして$outdat には何が入っているのだろう、、
こんな風に変更したら、どですか。>>330
と思ったらまたやり直し、、、 subback.htmlが1000になってるのはいいのかな? 1000超えたスレッドをreadonlyにするってことですかな。 >>468
あー、1001ストッパー書き込み時に++$lognum;が必要ですね……。 open(RDAT,"<$dattemp");
@logdat=<RDAT>;#ログを配列に読み込む
close(RDAT);
#ログのカキコ数を取得
$lognum = @logdat;
if($lognum > 1010)
{
DispError("ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!");
}
if($lognum > 999)
{
open(OUT,">>$dattemp");
print OUT "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n";
close(OUT);
chmod(0555, $dattemp);
$lognum++;
}
else
{
#パーミッション調整
umask(0);
chmod(0666, $dattemp);
}
>>457
#パーミッション調整
umask(0);
chmod(0666, $dattemp);
って必要なの? $SUBLINE = $subject . " (" . $lognum . ")\n";
$SUBLINE がグローバルになっていて
あとで subject.txt を更新するのに使うと予想。
オープンソースは荒らしに利用されるからダメだそうな >>445
実況板だったらテストでいちなり導入してもOk。
というのが2chノリ 未承諾さんあたりを拉致して缶づmうwあおまえなにすrあwせdrftgyふじこlp;@ 作り直したほうが性能よくなるけど管理人が弄れなくなるからいまのやつ使ってるんだよな>bbs.cgi たぶんバイナリ化せずにソースを入れてるんじゃないかと。
バイナリ化するのはroot ★さんの仕事。 悪いことは言わん。
1000チェックだけでも、別ロックファイルとして*.dat以外にしないとchmodヘルになると思う。
ファイルI/Oを嫌って1ファイルでゴニョゴニョしているほうがパフォーマンスが悪くなると思う。
ERROR!
ERROR:このスレッドには書けません!
---
>>491のスレは1000のチェックではなくてパーミッションチェックで弾かれている予感。
あとは高負荷がかかった時でも大丈夫ならOKなのかな、、 ↑
1000行ってしまった後にあらため書き込もうとした時の話です。
なんかあまり役に立てなかった悪寒 _| ̄|○ >>498
subject.txtが1002になってる >>498
subject.txtではレス数が1002になっている……。
ミナカッタコトニシヨウ 1000越え判定の時の$lognumに直接1001を叩き込んじゃだめですか?>判るひと >>502
それ以前に本文書き込み動作が畳み込まれているので、、、(哀) if($lognum > 999)
{
if (open(OUT,">>$dattemp")) {
print OUT "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n";
close(OUT);
$lognum++;
}
chmod(0555, $dattemp);
}
これでどうでしょ。
>>502
レス数がきっかり1000で止まる保証がないので、直接1001をいれるとマズいです。 >>503-504 サンクスコ。
むうー。修行しよう。 >>504
そね
#ログのカキコ数を取得
$lognum = @logdat;
if($lognum > 1010)
{
DispError("ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!");
}
if($lognum > 999)
{
if(open(OUT,">>$dattemp"))
{
print OUT "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n";
close(OUT);
$lognum++;
}
chmod(0555, $dattemp);
}
else
{
#パーミッション調整
umask(0);
chmod(0666, $dattemp);
}
まとめ(メモメモ)
処理の流れは
1) とにかく色々チェック。
2) dat に追記。
3) MakeWorkFile で html/xxxxxx.html を作る
この時に 1,000 超えを判定、 1,001 を書き 0555 にする。
この関数内で $SUBLINE = $subject . " (" . $lognum . ")\n";
を作りあとで subject.txt の書き換えに使う。
4) subjext.txt 書き換え
5) ふぅ終了。 問題は 2) で追記したあと 0666 にしていたので
せっかく 0555 で書き込めなくしたのに書き込めていた。
あと bbs.cgi の最初のほうで
unless( -w $DATAFILE){
DispError("ERROR!","ERROR:このスレッドには書き込めません。");
}
を行い、なるべく負荷をさげようと。 大幅なオーバーランはなくなったか → たぶん
前よりも処理は軽くなったか? → たぶん
要観察ですなぁ
なんか、あまり変わってない気がするのは気のせいに違いない。
#dat追記部分
if (open(OUT, ">>$DATAFILE"))
print OUT "$outdat\n";
close(OUT);
} else {
DispError("ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!");
}
#ログのカキコ数を取得
if($lognum > 1010)
{
chmod(0555, $dattemp);#念のため
}
elsif($lognum > 999)
{
if(open(OUT,">>$dattemp"))
{
print OUT "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n";
close(OUT);
$lognum++;
}
chmod(0555, $dattemp);
}
else
{
#パーミッション調整
umask(0);
chmod(0666, $dattemp);
}
にしたほうがいいかも。 最大書き込み数がてんでばらばらなのはなんとか
ならないのか?
全レス取得できたのかどうか,すっきりしないんだが。 >>484
>オープンソースは荒らしに利用されるから
誤解されるようなことを振りまかないでー。
ApacheやFreeBSDはオープンソースですが荒らしに利用されていますか? こうしたらどうなる?
open(RDAT,"<$dattemp");
@logdat=<RDAT>;#ログを配列に読み込む
close(RDAT);
#ログのカキコ数を取得
$lognum = @logdat;
if($lognum > 1010)
{
DispError("ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!");
}
if($lognum > 999)
{
if(open(OUT,">>$dattemp"))
{
print OUT "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n";
close(OUT);
#$lognum++;
open(RDAT,"<$dattemp");
@logdat=<RDAT>;#ログを配列に読み込む
close(RDAT);
$lognum = @logdat;
}
chmod(0555, $dattemp);
}
else
{
#パーミッション調整
umask(0);
chmod(0666, $dattemp);
}
>>515
レス数のカウントがより確実になって、ちょっと重くなる? 各種cgiテスト専用の板を作ったほうがよさげな悪寒。 >>517
いちおう運用情報(金)がそれにあたってます。
でも、1000レスとかそういった実験にはむかんとですよ。 >>515
その「ログのカキコ数の取得」ルーチンがレス書き込みより後にある限り
はほとんど変わらないと見た 悪い
上のログ読まずに書いてしまった
いろいろいじった後だったのね if($lognum > 1010)
{
DispError("ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!");
}
if($lognum > 999)
{
if(open(OUT,">>$dattemp"))
{
ここを
if($lognum > 999)
{
if($lognum > 1010)
{
DispError("ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!");
}
else
{
if(open(OUT,">>$dattemp"))
とかだめかな。 >>521
if($lognum > 999)
{
DispError("ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!") if($lognum > 1010);
if(open(OUT,">>$dattemp"))
{
・・・書いてみたかっただけなの
昨日は本業超多忙につき、>>360 から未処理。
急ぎで何かしなきゃいけないことある?live8/live9のbbs.cgiの更新とか。
12:00ごろまた来るので、誰かレス番で教えてちょ。
# 午後は少し時間とれる見込み。 ERROR!
ERROR:このスレッドには書き込めません。緊急緊急緊急!!
ホスト*
名前: 2chtubo愛用者〜ヘ(゚д゚ヘ))))))〜61 ◆2CHTUBOC5A
E-mail:
内容:
きねんかきこ。
こちらでリロードしてください。 GO!
分からないことがあったら2ちゃんねるガイドへ。。。
-------------------------------------------------------
ちゃんとでてるね。。。 >>522
前 if と後ろ if を混ぜたらややこしいがな と、思ったら、書きこまれてるし。だめじゃん、仕事人。 警察板( http://society.2ch.net/police/ )が困った状態なので、お知らせしておきます。
subject.txt上は1011なのに、実際は2000オーバースレ有り
(IEで)各スレッドURLでは、1001ストッパーまで表示、書き込み欄なし
(〃)板トップでは、実際の最終レスまで表示、書き込み欄あり
(専用ブラウザで)スレ一覧のレス数がずれるものの、書き込み可能
http://society.2ch.net/test/read.cgi/police/1058340116/2917 など
ちなみに、レス数1000近くのスレをageて、次々にお祭りを始めているようです。
http://society.2ch.net/test/read.cgi/police/1040783990/962
他板で宣伝も見つけました。
http://live8.2ch.net/test/read.cgi/livenhk/1078104752/190 つまり >>519 かつ 999 判定より 1010 判定が前にあるせいで
書き込まれてから緊急緊急が出てるわけだな
>>523
急ぎで society の bbs.cgi を元に戻してくださいw >>528
society(=oyster17)って、私ログインできるのかな。 ログインできにゃいのか?
つーかもしかして全板この仕様なのか? でもよく読むと 515 のとおりなら 1010 判定のあとに 999 判定も
通ってるはずだから、止まるんじゃないのかな?
&DispError って、中で exit してるのかな 変更してみる
#ログのカキコ数を取得
$lognum = @logdat;
if($lognum > 1010)#念のため暴走ストッパー
{
chmod(0555, $dattemp);
DispError("ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!");
}
if($lognum > 999)
{
if(open(OUT,">>$dattemp"))
{
print OUT "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n";
close(OUT);
$lognum++;
}
chmod(0555, $dattemp);
}
else
{
#パーミッション調整
umask(0);
chmod(0666, $dattemp);
}
close(OUT);
chmod(0555, $dattemp);
DispError("ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!");
のほうがいいかも (´-`).。oO(いつdatに書き込んでるんだろう…) >>537
(´-`).。oO(たぶん別の場所でやってて、そこは今大人の都合で書いてないだけなんだよ、とか言ってみるテスト。) >>539
ご苦労様です。
お茶でもどうぞ。
ζ
旦 ⊆⊇ んで
現状は 1,000行ったスレッドは
dat = 1,001 まである
index.html = 1,000 までしか出ない(以前と使用違うけど、がまんの方向で)
subject.txt = 1,001 まである
今回の改修の目的は
2,000 とか 3,000 まで書き込めてしまうのを 1,000 近辺で止める。
なのでどうなるか観察しよう。 >>541
>2,000 とか 3,000 まで書き込めてしまうのを 1,000 近辺で止める。
何が何でも1,000ぴったりで止めるのか
1050ぐらいまで放置するか決めよう
>>542
1,000 「近辺」というぐらいだから1050でもアリじゃないかな……。 ちょっとくらいはオーバーしてもいいという方針だったと思うのだが、、
過去ログorソースコード読んだ? 1000を書いたbbs.cgiさんが、責任持って1000ストッパーを書いて、
chmod/fchmodしてから終わる、というのはどうなんでしょう。 それに挑戦したのが >>255 あたりからだったりして、 >>545
それだと「999を書いたbbs.cgiさん×2+1001以降を書くbbs.cgiさん」な場合に
ストッパーが効かなくなる気がするです。 >>548
そっか。当然そうだよね。
なんだか、某DJBに「フーン」って笑われそうな議論だよなぁ。ここでのあがきって。
もちろん、私も含めて。 1000 近くになると
my @logdat = <OUT>;
のコストがバカにならないんだよね
読み進めてる間に他のプロセスがガンガン書いてる
やっぱ 1 レスにつき 1 バイト追記するレス数ファイルを
持つのがいいんじゃなかろうか *.datでなんでもかんでもやろうとしないで、専用ロックファイルに任せたほうがかえって早くなるに一票。
大改造しているところ大変申し訳ないのだが、
単純に最初のソースの
#パーミッション調整
umask(0);
chmod(0666, $DATAFILE);
の部分を
if($FORM{'subject'} ne ""){#新規スレ立て時
#パーミッション調整
umask(0);
chmod(0666, $DATAFILE);
}
とすればいいような気がする。 >>559
>>534 かと。
それなら一回555にしたパーミッションが戻ることもないし。
とPerlよく知らないけど口出ししてみる。 >>558
なるほど。パーミッション調整って新規作成したときのものだったのか。 >>558
もとのソースだと書きこみが失敗したときでもchmod(0666,)が実行されてたみたい?なので、
if (open(OUT, ">>$DATAFILE"))
print OUT "$outdat\n";
close(OUT);
} else {
DispError("ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!");
}
これだけでもいいかもしれない。 DATファイル作成後、DATファイルが666で変わらなければ、レス追加時に666を
設定するのは意味が無いし、>>357 >>508にもあるように、555にしたファイル
が666に戻るのは元々想定していないと思います。
DATファイルが666で変わらないことは、実際のDATファイルや全てのソースを
見ないと分からないので、分かる方お願いします。 >>563
FTP で入って chmod 555 しようとおもったら
permition ないって怒られた。
だれの持ち物になっているんだ?
良く起こることなのか?
たまたまなのか? 1000を超えていることを示すファイルを別に作るのは駄目ですか?
if (1000越ファイルアリ)
{
}
else
{
if (1000超えた) {
1000越ファイル作成
}
}
1000超えファイルを物凄い勢いで更新する悪寒(素) >>567
cgiから作成されたファイルはcgi経由でないと変更出来ない場合ありです。 >>562は{が抜けてた。
if (open(OUT, ">>$DATAFILE"))
{
print OUT "$outdat\n";
close(OUT);
}
else
{
DispError("ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!");
} CGI のプロセス ID 付き書き込みデータを、書き込みやさんに渡す。
書き込みやさんから、その結果を SIGNAL として呼ばれるのを待つ。
成功したら SIGUSR1 とか失敗したら SIGTERM とか。(現状の bbs.cgi では SIGNAL は単純に exit; ですよね?)
でもって 10 秒以上経過しても結果が帰ってこなかったら、DispError("ERROR!","ERROR! (゚∀゚)アヒャヒャヒャヒャ")
せっかくのうに環境なんだから。。。 >>573
OJDでテストしてみたら、書けちゃいました・・・
これを試してみてくれないかなぁ。。。
----
#ログのカキコ数を取得
$lognum = @logdat;
if($lognum > 1010)#念のため暴走ストッパー
{
chmod(0555, $dattemp);
DispError("ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!");
chmod(0555, $dattemp);#←ここに、これ入れたらどですか
}
if($lognum > 999)
{
if(open(OUT,">>$dattemp"))
{
print OUT "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n";
close(OUT);
$lognum++;
}
chmod(0555, $dattemp);
}
else
{
#パーミッション調整
if($lognum < 1000)#666は1000以下で
{
umask(0);
chmod(0666, $dattemp);
}
} >>578
DispErrorはexitするので、2つ目のchmodは実行されないです……。 >>579
あらら直前にあるのに今気がついた。。。
もう少し考えてみますです。。 if($FORM{'subject'} ne ''){#新規スレ立て時
#パーミッション調整
umask(0);
chmod(0666, $DATAFILE);
}
これも組み込んだらいいかと >>558でいいと思うんだけど、通常の書きこみ時にsubjectが送られたときのことを考えて、
>>562と合わせて、
if(!-e $DATAFILE){
1の書きこみ&パーミッション調整
}elsif(open(OUT,">>$DATAFILE")){
通常の書きこみ
}else{
エラー
}
でどうか。
ところで、今どれが入っているの? if($lognum > 1010)#念のため暴走ストッパー
{
chmod(0555, $dattemp) or DispError("ERROR!", "ERROR:chmodできないよ?緊急緊急緊急!!");
DispError("ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!");
}
chmod(0555, $dattemp)が失敗してるのか、
それともどこかで666にchmodされてるのか調べてみるとか >>567
suexecって、たまに「抜けてくる」ことがあります。
ひょっとして、chmod()できないのって、それが原因? うーん
実況の各板たらーっと見てきたけど 1,001 で止まっているなぁ
>>563
のスレッドだけの問題なのかどうなのか。 もちろんまずは自分を疑えってことで
それは見てみたのでしたー >>590
もしかしてnews6/news7配り忘れていない どうだろ、、
自動で配布しているからなぁ
version 番号付けて配ってみるです < こんど 警察板
ERROR:このスレッドには書き込めません。緊急緊急緊急!!
のエラーはでますが、いくらでも書けますよ
>>567
oyster100/200/900番台ならroot師におながいしてchownしてもらえばいいのではないかと。 if (-e $DATFILE && (!-w $DATFILE || -s _ > 512 * 1024)) {
DispError("ERROR!", "ERROR:このスレッドには書き込めません。");
}
#中略
my $lognum = 0;
if (open(IN, "< $DATFILE")) {
$lognum = (join('', <IN>)) =~ tr/\n/\n/;
close(IN);
}
if ($lognum > 1010) {
chmod(0555, $DATFILE);
DispError("ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!");
}else{
if (-w $DATFILE && open(OUT, ">>$DATFILE")) {
print OUT "$outdat\n";
++$lognum;
if ($lognum > 999) {
print OUT "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n";
++$lognum;
close(OUT);
chmod(0555, $DATFILE);
}
close(OUT);
}elsif (!-e $DATFILE) {
# スレ立て処理
chmod(0666, $DATFILE);
}else{
DispError("ERROR!", "ERROR:このスレッドには書き込めません。");
}
}
#(´-`).。oO(テストまでしちゃったよ…) >>534
http://society.2ch.net/test/read.cgi/police/990121724/
>"ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!"
↑これが出ているのに上のスレに書き込めるということは bbs.cgi の序盤のここ↓を通り抜けているということなので
パーミッションがどこかで再変更されているはず。
>#.datが存在してないか書けないならばいばい
>unless(-w $DATAFILE){
>DispError("ERROR!","ERROR:このスレッドには書けません!");
>}
----
http://society.2ch.net/test/read.cgi/police/1040783990/
このスレは現在パーミッションではなくてここ↓で止まっているもよう。
>unless( -s $DATAFILE <= 512000){
>DispError("ERROR!","ERROR:このスレッドは512kを超えているので書けません!");
>}
なので一番ぁゃιぃここをこの↓ように追加修正すれば現在書き込めるものも含めて
再度パーミッション変更されるので書き込み出来なくなるはず。
#パーミッション調整
umask(0);
chmod(0666, $dattemp);
}
if($lognum > 1010)#1011以上なのに666の暴走ストッパー
{
chmod(0555, $dattemp);
DispError("ERROR!", "ERROR:このスレッドには書き込めません。禁止禁止禁止!!");
}
#禁止と表示されればここ↑で再設定されたはずなので書き込めていないはず。。 WebProg板だと「情報を小出しにするな」って怒られるんだな
規制とかクリティカルな部分を除いて公開、でもダメ? まぁ普通はブラックボックス部分は除いて公開するのが良いよね。
規制のあたりはサブルーチン化してパラメーターと返り値だけ提示すりゃいいんじゃないの。 一応転載。
467 :動け動けウゴウゴ2ちゃんねる [] :04/03/03 03:44 ID:rxiuKiD1
http://pc.2ch.net/test/read.cgi/mac/1057421491
1000を越えても止まらないので対応をよろしくお願いします。 現在の bbs.cgi の version
20040301
どこがどう変わったのか変更点がよくわからないですがまだ書き込めます そうですか。。
ではまたしばらく待機しておきます。。。 >>606
そこで確認できる範囲では、news7だけ更新されませんね。
live5はまた別だろうし。 おおーっ
news7 も配布先リストに加えました。 >>606
そこ新しくできたnews10が入ってないね。 >596
みたいにdatに書き出すタイミングを考慮しないとだめぽ? datディレクトリをls -lで見てみたらなにか分かるかしらん。 ∧_∧
( ・∀・) <忙しそうだし、催促せずに待ちますね。。
( つ旦)
と__)__) ギコナビでレスを2325まで確認。
WinXP+IE6SP1では1001 :1001 :Over 1000 Threadが出て終わり。
山本寛斎の制服でPC自作できたよ〜♪
http://pc3.2ch.net/test/read.cgi/jisaku/1055561893/l50
ためしになつかしドラマ板の1000近いスレをいくつか埋めてみたんだけど
どれも1000突破した。もしかして板、というか鯖によって突破したり突破しなかったりするのか? sub MakeWorkFile{
に最後の手段を追加してみた。
my $key = @_[0];
my $workfile = $TEMPPATH . $key . ".html";
my $dattemp = $DATPATH . $key . ".dat";
my (@messx,@content,@logdat);
my ($lognum,$mailto,$time,$brmax,$topnum,$firstlog,$name,$mail,$subject,$message);
open(RDAT,"<$dattemp");
@logdat=<RDAT>;#ログを配列に読み込む
close(RDAT);
#ログのカキコ数を取得
$lognum = @logdat;
if($lognum > 1020)#最後の手段
{
if(-w $dattemp){
my $datdat = $DATPATH . $key;
my $tmpdat = $DATPATH . $key . ".tmp";
my $success;
open(COPY, "cp $dattemp $datdat |");
close(COPY);
$success = 0;
until($success){ $success = rename($datdat, $dattemp); }
chmod(0555, $dattemp);
unlink($tmpdat);
}
DispError("ERROR!", "ERROR:このスレッドには書き込めません。最後の手段!!");
}
if($lognum > 1010)#念のため暴走ストッパー
{
umask(0);
chmod(0555, $dattemp);
DispError("ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!");
}
if($lognum > 999)
{
if(open(OUT,">>$dattemp"))
{
print OUT "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n";
close(OUT);
$lognum++;
}
umask(0);
chmod(0555, $dattemp);
}
else
{
#パーミッション調整
umask(0);
chmod(0666, $dattemp);
}
>>626
これのこと?
http://qb3.2ch.net/test/read.cgi/operate/1069525567/
479 名前:動け動けウゴウゴ2ちゃんねる[] 投稿日:04/03/05 18:09 ID:Oh96gKaq
1000を超えても延々と書き込めるようです
http://bubble.2ch.net/test/read.cgi/natsudora/1040055595/
481 名前:サザン ★[sage] 投稿日:04/03/05 18:37 ID:???
>>479
とめましたー 何故か bubble サーバは、
昔立てられたスレッドの所有者が nobody になっているもより。
ということは・・・
↓ この↓あたりも変更直後くらいからパーミッションが変わって書き込めなくなっているもよん
【TBS】うちの子にかぎって・・・【田村正和】
http://bubble.2ch.net/test/read.cgi/natsudora/1047211834/
【チュー】マウススレ【チュー】
http://pc.2ch.net/test/read.cgi/mac/1057421491/
----
ERROR!
ERROR:このスレッドには書けません!
>>628
chmodは一切効いてなかったってことね… 引越し時に chmod で 777 にするんじゃなく
chown(でしたっけ?) 後 666 にすべきなのか?
ということは、引越し後の正しい呪文は
↓ chown("ch2あぼんあぼん");
chmod($filename,0666); 一般ユーザ(にsuexecされたCGI)がchownなんてできないと思うなぁ。 1000越えて書き込めていたのは確認した範囲では
去年以前に建立てられたスレのようだったし
今年に入ってから立てられたもので、1000ストッパーが
効いていないものってなかったような、、
サザンさんの>>628あたりに謎の答えがありそう、、、 古いスレを中心に、オーナーがおかしいやつがあるから、そいつら修正すればいいってこと?
(ストッパーが効かない原因のひとつ)
ディレクトリの持ち主がその人であれば「消す」ことはできるから、
例えばnobodyとかが持ち主のファイルを探して、一斉にこんなかんじにすればいいのかな。
(1000000000.dat のオーナーがおかしいとする)
cp -p 1000000000.dat tmp1000000000.dat
rm -f 1000000000.dat
mv tmp1000000000.dat 1000000000.dat
2行目でいきなりmv -fしてもいいけど、なんだかいやな予感がするんで。
find -user nobody とかして、該当のファイルについて一斉にやればよさそうな気がする。 FreeBSDでは、
cp -p 1000000000.dat tmp1000000000.dat
mv -f tmp1000000000.dat 1000000000.dat
でOKでした。Linuxでもやってみるか。 あ、そっか。Linuxでsuできる環境もってないや。
どなたか、実験きぼんぬ。
% mkdir test
% cd test
% sudo touch A
% cp -p A A.tmp
% mv -f A.tmp A
で、そのユーザのAになれば無問題。 >>637
古いスレでオーナーがおかしいやつの中で
1000間近なスレのURIがいくつか分かりますか? >>641
例えばbubbleサーバのnatsumeloj板なら、
find ./public_html/natsumeloj -user nobody -name \*.dat -print
なんてのを流せば、すぐわかるかと。
これをサーバの数分、板の数分やればいいかな。
ひまをみて、_service/を見て板名とってきてfindかけて、
オーナーをfixするためのshell scriptでも書いてみましょ。
できたら、各マシンで手分けして流していただくということで。 止まらなかった原因は単にchmodが効いてなかったってだけなのかー。 >>644
引っ越しのときにdatをchownするだけではダメですか? 移転の時は普通にファイルを移動してるだけなので、chownしなくてもいいはずです。>>647
というか、普通はこんなこと起きない気がしますね。< オーナが違う
途中でsuexec環境に変わった場合にのみ、起こるはず。
あるいはsuexecがバグっていて、「httpdのオーナーが抜けてきちゃった」場合とか。
# 経験したことあります。 移転しても移転しても書き込めるもよう。
>>645
これは「調子の悪い」とは違うと思うが。 >>648 補足。
> 移転の時は普通にファイルを移動してるだけなので、chownしなくてもいいはずです。>>647
理由: マシンをまたいだファイル移動の時に、オーナーが変わるから。 >649>651
ここで同じような報告を繰り返されてもご迷惑になるだけかと
>>639
drwxr-xr-x 2 (・∀・)ニヤニヤ users 4096 Mar 5 21:13 ./
drwxrwxrwx 15 root root 4096 Mar 5 21:11 ../
-rw-r--r-- 1 root root 0 Mar 5 21:12 A
-rw-r--r-- 1 (・∀・)ニヤニヤ users 0 Mar 5 21:12 A.tmp
[(・∀・)ニヤニヤ test]$ mv -f A.tmp A
[(・∀・)ニヤニヤ test]$ ls -la
合計 8
drwxr-xr-x 2 (・∀・)ニヤニヤ users 4096 Mar 5 21:14 ./
drwxrwxrwx 15 root root 4096 Mar 5 21:11 ../
-rw-r--r-- 1 (・∀・)ニヤニヤ users 0 Mar 5 21:12 A
[(・∀・)ニヤニヤ test]$
>>644
色々と考えられる事はあるのですが順番にやっていかないと
どれが原因か分からなくなりそうなので、まずこれから。。
見つかったスレに1000番目を書き込んだ時にこれ↓が表示されるかどうかが知りたかったんですよ。
>"ERROR!", "ERROR:このスレッドには書き込めません。最後の手段!!"
で、おそらく表示されるだろうとは思うのですが
1000 over を判定しているのはこれ↓を書き込む為にしているような、、
>"1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n"
cgiの最初の方でこれ↓しか見ていないのは負荷軽減の為だと思うのですが
1000を越えているかどうかを最初に見ればパーミッションがどうなっていようと
1000を越えているスレには書き込めないと思うのですけど、既出の問題なのかしら、、
>#.datが存在してないか書けないならばいばい >>653
drwxr-x--- 24 root root 4096 Mar 5 21:09 ./
drwxrwxrwx 21 root root 4096 Feb 25 12:56 ../
[(・∀・)ニヤニヤ root]$ mkdir test
mkdir: ディレクトリ `test' を作れません: 許可がありません
[(・∀・)ニヤニヤ root]$
>>653
さんくす。Linuxでも問題なさそうですね。
んじゃ、shell script作ってみます。
今日はJimさんデーの2日目なんで、明日以降になるかもしれませんが。 ここまで読んだ
引越し屋バンバンが地方営業なのがわかった 902のカーネルだけ、5.2.1-RELEASE-p1に上げてみた(i386モード)
しかし、状況は変わらず。 options AAC_DEBUG=3
とか入れてみるか。 うひょ。>>659-660 は派手な2連続誤爆だ。 1000越えて書き込まれてたスレ発見。
真・スレッドストッパーのガイドライン
http://that.2ch.net/test/read.cgi/gline/1022203584/l50
試しに書き込もうとしたら
ERROR:このスレッドには書き込めません。緊急緊急緊急!!
と出ました。
このスレが建ったのは2002年、>>636で書かれている去年以前に建ったスレ。
手を加えるならXXX 名前:書けませんよ。。。 投稿日:停止
真・スレッドストッパー。。。( ̄ー ̄)ニヤリッ と本当にスレッドストッパーかけてくださいと冗談言ってみる。 ギコナビで書き込もうとしたら
ERROR:このスレッドには書き込めません。緊急緊急緊急!!
と表示されているが実際には書き込まれてます。
こっちに誘導されて来ました
yournet.ne.jpの規制が先ほど解除されたのですがlive10の規制が解除されていないようです。
解除の方よろしくお願いします。
規制絡みの設定のひとつF22が入ってないんじゃない?>live10
【Project peko】2ch特化型サーバ構築作戦 Part8
http://qb3.2ch.net/test/read.cgi/operate/1078972549/
19 名前:root ★ 投稿日:04/03/11 13:36 ID:???
live10, f22への登録おながいします。>サザンさんかな。
【実況板】 live5/7/8/9 鯖 【専用スレッド】その4
http://qb3.2ch.net/test/read.cgi/operate/1078921755/359
まとめると1001突破するけどそのうち止まるってこと? >>625 ソース
>if($lognum > 1020)#最後の手段
↑
これを超えたら
>DispError("ERROR!", "ERROR:このスレッドには書き込めません。最後の手段!!");
それ以降は↓になるわけです。
>DispError("ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!"); 最後の手段が効いてるけど緊急緊急緊急は効いてないってことか
最初から$lognum > 1000で判定しない理由は何だっけ? 効いてないのは古いファイルが chmod(0555, $dattemp); 出来ていないから。
そこで 1020を超えた時点で条件に引っ掛けて、datファイルを新しいファイルにコピーして
そのファイルを chmod(0555, $dattemp); している。
その後今までの古い datファイルは消去。
新しいファイルはパーミッションが 0555 になっているので今度は「緊急緊急緊急」で分岐するというわけ。 http://qb3.2ch.net/test/read.cgi/operate/1069525567/528-
最近スレ移動の後のストッパーが聞いてなくて
書き込めてしまうのが続出してるみたいなんですが、
これもここに報告でいいんでしょうか? >>685
たぶん移転するためのcgiはbbs.cgiじゃないから
ここじゃないほうがいいかなぁ、、
まあ、もう書いちゃってるんで言ってもしょうがないですが。 う〜ん、ここで1000ストッパーの改造がはじまってから、
>>685の現象が多発するようになったので、
関係あるのかな?って思ったんですが、、、
ハテサテ >>685 >>687さんに同意で。。。
格段に多いですよ 移転痕ストッパー外れ。 スレスト、ゴミ箱移転跡が移転すると書き込めるようになるのは仕様です 1000ストップの判断をしたあとで書き込んだ方がいいと思うんだけど
そうしない理由って何かあるの? Perlで書けよな。
高速だし、柔軟性あるし、大抵のサーバーで動くし、機能的にも問題ない。
PHPでは絶対書くな。 >>691
2chのスクリプトはCじゃありませんでしたか?
俺の勘違いなのかのぅ。 実況鯖だけかもしれないけど、bbs.cgi は perlcc で C にしてたような。 ひぇ〜ごめんなさい。C というよりはバイナリ実行形式でした < perlcc
ちなみにオプションをつければ C のコードも出せるようで。半可通でスミマソン >>695
(巨大な).cファイルに変換されて、Cコンパイラでコンパイルされますです。
.cファイルも取り出せますが、読めたもんじゃありません。 停止済みのスレッドの移転の場合は再停止(もってなければお願い)
停止前のスレッドの停止+移転の場合は移転してから停止。
が正しい措置と思われ。
>>697
そーなるとperlccで吐くコードではまだまだ無駄がありそうでつね。
やはりC(++)で最適コードを書いたほうがいいのかな・・・? >>699
ひ(ry がさわれなくなるからCで書くのはダメ、なんじゃなかったかな。
ただ、トラックバック機能のためにread.cgiをちょっと改造してたところを見ると
もしかしたらCもさわれるのかもしれないけど。 >>689 >>698
>>687-688の意味がちゃんと伝わってない希ガス
>スレスト、ゴミ箱移転跡が移転すると書き込めるようになるのは仕様です
「移転すると」ってのは鯖移転だと言いたいようだけど、
>>687-688の指摘はそうじゃなくて
削除人が移転やスレスト呪文唱えた直後のスレッドなのに、スレストが効いてない
=パーミッションが書き換わってない ってことです。
>>686に同意しつつも一応念押し。
>>702
触らせないようにすれば、その人に全面的にお任せ になるだけかと。 >>700
なるほど。
>>702の意見も正解かもしれませんな。
C言語版のしっかりしたメンテナがいればひ(ryは触る必要はないと思われ。 >>703マジで多いです
スレ移動した後、移転後をさらに停止させなきゃならないので
2回スクリプトを走らせなきゃならないし、ログも2倍溜まってるような・・・・・
ソースは無くて感覚だけど、ここで1000ストッパーいじりがはじまってから
増えたのは確かだと思う
>>686だとしても、どこに書きゃいいんだか
管理人に連絡か? >>707
安定性に問題があるだろ、氏ね。ウザイ。
ここまで斜め読みでカキコ。
dat書き込み時にレス数を数えて1000達成したら、
その場でストッパーかけないと本来はダメでしょうね。
理由は、数える→1001スレストの間に
他のプロセスがdatに書き込む可能性がありますから。 >>712
flock処理周りの実装バグったんじゃねーの?
過去のバグを前提にシステムのポリシー決めてたら
ろくな方向に向かわんぞ。
「OSによって問題がある」とかなら
symlinkで代替してもいいしさ。
そもそも書き込みは排他を前提にしないと
単純に設計がおかしいってことになる罠
排他無しは
ときどきリセットされるアクセスカウンターと同じ設計で
それは直すべきもの
そもそもサーバー構成がまともじゃねぇよ。
表側に位置するCGIサーバー群は全て同じ仕様と内部構造にして
DNSラウンドロビンにて負荷分散。
データ管理は裏方のDBサーバー。
DBはMySQLみたいな汎用RDBMS使ってもいいし、
NFS使ってUnix FSだけで管理してもいいし(その扱いは今とほとんど同じ)
裏と表の間でやりとりする専用プロトコルと専用メソッドを開発してもいいし。
でもって、クライアント側からのリクエストが閲覧だけのとき(書き込みではないとき)
の処理を徹底的に減らす必要があるな。
閲覧処理で行われる「いつもやってる計算」の中の「いつも結果が変わらない処理」
は書き込みのときに全て終らせてキャッシュさせておく。
主にHTMLに対する整形があるだろう。
書くレス番ごとのHTML整形されたファイルを作ったり
1-100を選ばれた場合の整形済HTMLを用意したり。
あと最も激しい負荷の矢面に立たされる読込処理のCGIは
C/C++で書いておく。そしてstatic link。
もしくはC/C++で書かれたプログラムをapache module化する手もある。
ここ数年仕様がほとんど変わってないんだから
これからも仕様は変わらないだろう。
「変更容易だが速度は遅い」という特性のスクリプティング言語を使っても
あまりメリットないよ。
「えー。Cわかんないよ。Perlならわかるけど」
とかいうなら、おまえんちのApacheはPerlで書かれてるのかと問いたい。 CGIとしてのperlを高速化したいなら
mod_perlにするかprelinkを使うのをおすすめ。
prelinkツールにてperl本体を前処理しておけば
perlの起動が高速化される。 鳥インフルエンザキャリアの人?(w
だったら焼却漏れがありますよと伝えなきゃ(嬉)@T波町 最近過去ログ周りに注力しているせいか放置されている最寄ですが、
bbs.cgiのmod_perl化は検討されています。
ただ今はperlccによるバイナリ化で
それなりに効果を挙げているようなので現状でとまっているようです。
しかし吐くCコードとバイナリが巨大なので
メモリを圧迫しているということはあります。
理想はC化なのですが、そうするとひ(ryが扱えないということらしいです。
read.cgiは既にCです。
I/Oのはげしいスレはdatは常時オンメモリです。
NFSマウントはセキュリティ上あまり好ましいものではありません。
余計なポートを空けることになるからです。
# NFS over HTTPはできそうですが、結局負荷増につながりそう。 >>719
続き。
2chにおける一番の負荷はディスクI/Oです。
そして一プロセスあたりで一番使うのがbbs.cgiです。
root師の言葉を借りるならば、「1にI/O、2にI/O・・・」だとか。 >理想はC化なのですが、そうするとひ(ryが扱えないということらしいです。
こうゆうところがひろゆ子らしいとゆーかなんとゆーか。。。 後このスレで議論されまくっていますが、
bbs.cgiは仕様変更が多いのでチューンがめちゃくちゃ甘いですね。
コードの整理とC化で倍速になりそうな悪寒。 >>722
1,000倍になると思われ、
で、現在不具合はあるのかな? < bbs.cgi >>723
個人的には、サーバ落ちによるものを除いても、復帰依頼の回数がやや増えた気がしますね。
ただ、復帰屋さんにまめに動いていただけているので、運用でカバーできているような気もします。 現行のbbs.cgiのソース公開は無理でも、Cで一から作り直すのは駄目なんですか?
それこそ、オープンソースで遣れば荒らし対策とかもちゃんと出来そうな気もするし。
ひろゆきの気持ちとしては、弄れなくなるのは「嫌」なのかも知れないけど、運用とし
ては別に良いんじゃないかぁ。現行だって随分人任せみたいだし(w >>725
そこは管理人から何回も名言されているので
私はその言葉を聴いて私として行動していくだけです。
あなたはあなたの道を行けばいいだけかと、
誰も邪魔しないと思います。
前進あるのみ。 ひ(ry はPerlしか使えないんだっけ?
でも最近「弄った」とか言っているの見たことないし、
ひそかにC化しちゃってもいいんじゃないの?ばれないって (w
で、flockが使えないから 排他処理全くしていないって本当なの?
本当ならすごいね。 1ディレクトリーの中にファイルは多くて何個ある?
数千個越えてくるとディスクI/Oの負荷が高くなりやすい。
それを防ぐために1階層か2階層はサブディレクトリーによる分類が必要。
squidのキャッシュディレクトリーを参考にな。
メモリ搭載を増やしてディスクキャッシュに頼るという逃げもあるが
根本的には「必要とされないデータをディスクから読む」という
動作を減らす設計が必要。
URLの末尾"l50"でアクセスするユーザーが大半なのに
毎回読まれるたびに1番レスから全部読んでいたら無駄が大きい。
その場合l50専用のファイルを「書き込み時」に生成するとか
逃げ方はいろいろある。
インデックスファイルと本文ファイルを分けて
インデックスファイルを読むことによってレス番からオフセットを求めて
本文ファイルを読むときはオフセット使って一気にfseekする手もある。
mysqlでも使っておけとと言いたいところだが、
ファイル使うにしてもおかしな設計だと
その負荷の大半は「無駄な負荷」になるんだよ。
ていうかflockはしておかなきゃ。 flockを使わない実装のほうが負荷が低いですよ。
$ /usr/bin/time perl -e 'open(F,">>/tmp/xxx");for($i=0;$i<100000;$i++){flock(F,LOCK_EX);flock(F,LOCK_UN)}'
0.16user 0.07system 0:00.22elapsed 100%CPU (0avgtext+0avgdata 0maxresident)k
flockはたいした負荷じゃないべ >>719
> NFSマウントはセキュリティ上あまり好ましいものではありません。
> 余計なポートを空けることになるからです。
NFS通信するホストは物理的に近隣に配置して
それぞれLANカードを1枚余計に搭載してプライベートアドレスを割り当てて
HUB経由直結でプライベートネットワークを構築して
そちら側からだけ通信許可すれば外向きにポートが開かないので
セキュリティー上の問題は無いと考えて良い。
それが困難ならipchains等によるフィルターも有り。 ていうかbbs.cgiとread.cgiのソースはどこよ? bbs.cgiはひどいスパゲティソースで、見た人が次々に消えてしまう
らしいから、一から作ったほうが早いかもよ。
ということで、がんばれ。>>736 >>736
いわゆるNASなどを使ったソリューションではよくある形ですね。
10.0.0.0/8とかつけとけばいいと。
でも、NFSとflockって大抵の場合、きわめて仲が悪かったり。
(私は何度も痛い目にあいました)
いずれにせよ、細かなI/Oが多数発生するような系では、
flockはともかくNFSを使う気は全くないですね。
NFSだと、Apache的にEnableMMAPやEnableSendfileとかがうまくないので、
パフォーマンス的に激しくつらいです。
例えばhome directoryの共有みたいな用途には便利だし、
うまくやれば管理も楽なので、NFSという技術そのものを否定するものではありませんです。
単純にライブな掲示板システムには、ちょっとなぁというだけで。
で、flockは >>735 みたいなやり方の負荷は、確かに高くなりません。
でも、他の人を「待たせる」ことが、そもそも負荷というか、重荷というか、コスト高になります。
掲示板システムって、もう、待たせちゃいけない。システムも、ユーザも。
待たせるぐらいなら、他の手段(rename()をうまく使うとか)を使うですね。
某氏じゃないけどNFSはこういう用途に使う場合には、
Network Failure Systemだぐらいに思っていたりして。 >>740
またせちゃいけないからflockはつらいってか。
じゃあ手段1。書き込む先のファイルを分けることだな。
$thread_num = スレ番号;
$pid = $$;
open(WRITE,">$base_directory/$thread_num/$pid");
でもって、これらをマージするのは別のデーモンが行う。
もしくは手段2。デーモンがunixソケットの口を開けて待っていて
bbs.cgiはそのデーモンに向かって次々と書き込みリクエストを投げつける。
実際のファイルへの書き込みはデーモン1プロセスが行うので
排他処理は不要。
ていうか俺が作れってか >>741
> ていうか俺が作れってか
期待してますです。
私は「作られたものの性能をできるだけ発揮させる」とか
「既にある仕組みを用途に合わせて適用する」とかいうのは
なんとかやれますけど、スクラッチから作るのは正直苦手なんで。 NFSとflockの両方を提案したがこれは両方の組み合わせを提案したわけじゃないのであしからず。
NFSは「読込負荷の分散のためラウンドロビン化された表向きCGIサーバー群」が
データを抱える裏方のサーバーに読みに行く場合のみ。
flockは書き込みに関してだけで、これは単一のホストがローカルドライブに対して行う。
俺が考えている構成は以下のような感じ。
まず表向きのCGIサーバー群を用意してラウンドロビン化。
裏方サーバーはデータの管理専用で板ごとに分散。
表と裏の通信はTCP上の独自プロトコル。
表サーバーについて: read.cgiは直接裏のサーバーに問い合わせるのではなく
表サーバー内で動作するキャッシュ機能提供のデーモンを経由する。
キャッシュ能力を持つデーモンは逆proxyの効果を上げる。
裏サーバーについて: 読込と書込の2つのデーモンを走らせてTCP listen。
書込デーモンはTCP口のところである程度バッファ能力を持たせておけば
過去flockを使ったとき発生した「待ちのための負荷増加」を減らせるはず。
読込デーモンの処理を極限まで減らすため、
HTML化やl50分の切り出し等、読込時によくある動作は書込デーモンが
あらかじめ行ってファイルへ書き出す。
本当は読込デーモンと書込デーモンを一体化させて
できるだけファイルを経由しないオンメモリ動作にした方がさらに効率的なのだが
開発に時間がかかるしバグ取りが大変だしメンテできる人が減ってしまうことになる。 743続き
書込時の流れ:
[表鯖]bbs.cgi
↓
[表鯖]書込デーモン
(チェックやフィルタなどはこことbbs.cgiだけで行い裏の負荷を下げる)
↓
[裏鯖]書込デーモン
読込時の流れ:
[表鯖]read.cgi
↓
[表鯖]読込デーモン
(キャッシュ能力を持たせて逆proxy状態に)
↓
[裏鯖]読込デーモン
表鯖はデータを抱えない同一構成のマシンを大量に並べてラウンドロビン化。
そうすりゃ表鯖にいくら負荷をかけても数の力でごまかせる。
ていうかこれだとNFSは不要か。 そうそう、書きこむ人 (bbs.cgi) がイパーイいるから 3000 超えちゃったり。
dat 直読みも表面的には「直読み」だけど本当は DB アクセスにしちゃうとかね。
AddTypeapplication/x-httpd-cgi.dat
AddHandlercgi-script .dat
とかとか。 そして次の世代の2ちゃんねるが生まれて来るんですね、
みんながんがれ 途中で書き込みしてしまいました。1時間ほど前からhuman3dでます、対策よろしく 見習い▲ = 仕事人 = 夜勤 = Z社員 でしたっけ?
ラウンジとかの人の多いところには排他入れたいけど、
入れると負荷が高まるというトレードオフをどう克服するか
楽しみに待っていますよ 書き込みデーモンの話題とか見ると、去年の暮れから話がループしているな。
実際のコードを書くためには、bbs.cgiをサブルーチン単位で公開できるところだけでも提示してくれないと書けないと思う。
どうなんですか? root★氏やひろゆき氏的にそのあたりの書き込みサブルーチン公開は? >>751
んー、だから鶏と卵問題で前進していないから、いいかげん最初の一歩を踏み出しましょうということで。
wikiに公開できる部分を張ってもらうのがいいと思う。
まあ予想されるひろゆき氏の答えは「どの部分を非公開にしなくちゃいけないかも分からない」だったりして。 >>753
その程度もわからないのだったら、いっその事c化しても問題なさそうだな(w >>755
みたいですよ。
もっとも、公式見解が聞きたいところだけどw >>757
一応連携しているはず、と信じたい。
見習い師いわく、「bbs.cgiは完全な挙動をしている」。
しかしながら、
・perlccの吐くCソースとバイナリが大きいのでシェイプアップの余地がある。
・スパゲティソースであることが過去の議論から明白なので、
処理過程も見直せば大幅な負荷軽減が期待できる。
・ディスクI/Oまわりの見直しでディスク負荷が軽減可能。
今のソースはコストのかかるfopen()コールが不必要に多い模様。
などの理由から、私はCでやれるんならそうしたほうがいいんじゃない?という意見。 結局1から作り直すことも出来ず
ソースを全部公開することも出来ず
一部分を公開して→直すの繰り返しで
スパゲティ状態を直すことも出来ず
これじゃとても再開発とは呼べない気がします
と禿外な事言ってみる 運営が欲しいのは
沢山のプログラマーではなく一人の天才プログラマー とりあえず
use warnings;
use strict;
つけて動くようになったら
mod_perl化… じゃあ、オブジェクト指向で書き直してみるとかw
以後、部分公開も楽になるかな サザン★さん お呼び出しです
F22 で proxy999 を取っていると思いますが
全く同じルートで proxy998 も取ってください。
各サーバが BBQ の proxy998 も取りに行きます。 >>765
かんりょうでーす
999 と同じ場所に 998 がおいてありますー >>766
どもども
中身はなにもしなくていいですー
たぶんなにもしていないとおもうけど 某ぶぇらさんみたいな喋り口の人が来て、改造案で気を吐いていますね
ここじゃ押してばっかりだと、オシモドサレマスヨーヾ('-')ノ for some reason
bbs.cgi を更新したので peko サーバよろしくー > root★さん >>771
live8/9/10/news11 done. >>768
あうーん
やっぱりあちこち欠けて(編集されて)配られるので
F22(各サーバ)が直接 qb4 の 998 を見るようにしました。
ということで、 bbq 側(f22本体)からは 998 はずしてくださいー >>772
どもです
これで ほとんど bbs.cgi を更新しなくても済むようになりました。
>729
そんなしょぼいコードを参考にしたら2ちゃんねるは壊滅しますよ、と。 GoogleもUTF-8が標準になったことだし2ちゃんねるも
ログとかhtmlとかUTF-8にしてみましょうYO!
別にメリット無いっすね…(´・ω・`) 別に無い事もないけどUTF8への変換ってコストかかるしやめといた方が良いんでは。
あとサイズもでかくなるような。
2chブラが全部作り直しですよ
もしShift_JISのログとUTF-8のログが混じるとその判別も必要になるし メリットが無いどころかデメリットが特盛りなのだった そいやスクリプト側でわざと負荷かけてディスクI/Oの負荷を減らそうって話が
途中出てなかったっけか。
Unicodeは好きになれない。
でも、そこに未来があるのは否めない。 こちらへも。
【Project peko】2ch特化型サーバ構築作戦 Part11
http://qb3.2ch.net/test/read.cgi/operate/1082990543/800-807
800 :root ★:04/05/08 02:29 ID:???
で、ここの過去スレでも書きましたが、どうもbbs.cgiはたまに暴走することがあるので
(FreeBSDだけじゃなくてLinuxなマシンでも見たことあり、理由は不明)、
何か対策をする必要がある予感がします。
なおuma/pekoサーバでも以前からこの症状起こっているので、
(以下略)
サザン★さんに質問でーす
qb2 にある板は他の板との共存は可能ですか?
つまり何を目論んでいるかというと
BBQ , qb2 ,qb3 qb4 等を一台のサーバでまかなおうと、
BBQ , qb5(qb2+qb3) qb6(qb4) ってな感じで、 初めて書き込みするのでこっそり怖がりながら書き込みます。
# 某所で鯖管理をやっていた関係でつい提案したくなってしまって。
2chのサーバはなんとなくホストによって板が分割されていますが
実際には一つのホスト名で、全すれが運用できるように思えます。
たとえば、
+--------------+ +---------+
| | | |
| 負荷分散装置 |------| L3switch |------- ....多数のread.cgiサーバ(Apache)
| (LVS) . | | |
+--------------+ +---------+
|
|
+------------------+
| Cluster NFSサーバ |
| OpenAFS・Coda |
| もしくはRawDB関係 |(もちろんこれも多数)
+-----------------+
・LVS-DR(Linux Virtual Server Direct Routing)構成でL3switchにデータ負荷分散を
行い
・dat関係は、ClusterNFSもしくはOpenAFS、Codaを利用して分散ファイルシステム化
もしくは、データベースを利用してHDDアクセスの効率化。
・データベースもPostgreSQL系であれば(最近MySQLもそうかな)、負荷分散構成をくめたと
思います。
・すべての書き込みは負荷分散装置を利用すること。
このようになると、ハードディスクのアクセス速度が落ちると思われるようですが、
実際にはIDEのサーバであれば一般的なL3スイッチの処理速度以上に処理を行うなんてこととは
難しいようですし(というよりプログラムの効率あげないと無理)。
などというのはどうでしょうか? 詳しく構成をくむ必要があればもう少し考えますが・・・。 >>786
このへんは、何度となく提案されてますね。
たぶん、「お、こりゃいいかも」と思えるような*具体的な*システム構成
(>>787のような概念図レベルではなくて)を提案できるとよいのかも。
特に管理人が納得できるようなのだと、より望ましい気がするです。 >>788
あ、レス番号間違えた。両方とも>>787で。 板移転がうざいと言う人が少なからずいるわけで(これが原因でメインをギコナビへ移行中)
p://鯖名.2ch.net/板名/〜ではなく
p://板名.2ch.net/板名/〜にした方がいい感じ
板移転した場合はDNS側でIP(鯖)変更する >>791
D:\katjusha_2ch\log\pc2.2ch.net\mysv\
D:\katjusha_2ch\log\pc5.2ch.net\mysv\
D:\gikoNavi\Log\2ch\mysv\
D:\jane\log\ネット関連\mysv\
*janeは多言語環境の場合(削除不可能な)文字化けフォルダを作る為論外
何か? >>794
なじぇ〜?
と聞くのはやめよう
なんとなく分かった
それなら
www.2ch.net の鯖を大量に作る
*download.windowsupdate.com をnslookupして下さい
これが外部と接続できる鯖
リダイレクトで内部鯖の内容を返す
www.2ch.net/sec2ch/ => qb3.2ch.net/sec2ch/の内容を出す
www.2ch.net/mysv/ => pc5.2ch.net/mysv/の内容を出す
この時qb3.2ch.net・pc5.2ch.netは外部から直接の接続不可 ( ゚Д゚)ポカーン
鯖分割するいみないじゃん。 >>799
>板移転がうざいと言う人が少なからずいるわけで(これが原因でメインをギコナビへ移行中)
これでしょ。負荷分散の考えとは別かと 確かにユーザとしては板移転への対応はわずらわしい。
板移転はユーザの手間を考えると、管理側としてもおいそれとは
できないんじゃないかな。
DNS 使えば解決できるよね。 かちゅーしゃのために2chが存在するのかよ、という話ですな、、
>>790 >>792 これじゃあ反感もたれてもしゃあない。>>787とは別の話ですよ、 >>787
これをやろうとすると2chの現状のアーキを相当いじくらないといけない予感。 bbs.cgiの話じゃないな。
批判要望板にでもスレ立ててね。
意見ありがとうございます。
そですね、もう少し具体的な案にしてから持ち寄りたいかなと思います。
私が一番メリットとしたいのは、負荷分散装置を介することによって、
プログラム的には一つのホストに対しての書き込みを行うのみ(クッキーとかありゃあしますが・・・)
を行うように見せるだけでよく、言ってみればread.cgiやbbs.cgiを
すべてシングルソース化が行うことができるように思えます。
つまり、多数のサーバ環境を考えるのではなくて、
一つのソースコード(実行ファイル)が複数のホストにコピーされているだけで
2chの運営が行えればいいかなと。
そうなれば、削除人分担とかサーバ管理分担とかすごく楽になると思います。
機能的には、HTTPサーバとファイルサーバ(DB?)の二つになるだけですから。
あと、負荷分散機にかかる負荷はほとんど無いと思ってください。
実際テストしている環境の中では、6000セッションを行った場合でも
負荷率は0.00でした。平均アクティブセッションはだいたい300を越えることもあまり無かったですが。
えーとというわけなんですが、スレをたてるほど意見も固まっていないので
いちど意見が固まってからもう一度投稿します。
そのときにスレたての話と言うことで・・・・。 あと、どうせアーキテクチャとインフラ周りをいじるなら
可能な限り現状を無視しつつ、可能な限り互換性(データぐらい?)を
取ろうぜというのが方針だったりもします。
どうせなら早く・管理楽のほうがあとあといいもーんといい感じです。
ではでは。 787氏
とりあえず2chのデータまわりで一番重要なのがdatの互換性ですからね。
そのあたりさえどうにかなれば後はいかにして負荷を減らすかという問題になりますから。
直接メールであなたの提案を総帥に伝えたほうがいいかも。 どうもです。
>> ▲:/usr/local/bin/ch2 -o i686 ◆P8fXJj6wwo さん
いやぁ、そこまで行くようなものでは・・・。
本気でやるなら死ぬほど本気でやりますが、
まだそこまでのこととは思っていませんので。
今のところせいぜい土日の暇つぶし程度のものです。
それに現状がよくわかっていない中で特攻かけてもこわいし。
あと、アーキテクチャとネットワーク周りについてですが
たぶんデータ周りについての互換性保証はまぁー時と場合によるかと。
面倒ならば、分散ファイルシステムで共有フォルダでも作った方が早いし、
データベースの限界を試すのなら、データベースを作った方がいいし。
その辺はもう少し2chのサーバ現状知ってからかなぁと。
ではでは。 SFでも取り組みがあるみたいです。
apache_modと通常バイナリとどっちが早いんだろ。
http://sourceforge.jp/projects/mod-bbs/ he.netのスイッチの帯域問題について検索したか?
L3バランサーの超具体的な設定法(confファイルをそのままソースで貼るぐらいのレベル)
このあたりを解決して提案するのはいかがだろうか?
だんだん関係ない方向に言っているような悪寒
>>810
見習い師いわく、「8月までにheからは撤退」だそうで。 >>786
削除系の板(saku、saku2ch)とそれ以外の普通の板を同じサーバ置くってことですかー? >>812
qb5 = qb2 + qb3 をやろうかなって思っているけど
ちゃんと動くかな? が知りたいのです qb2 削除要請/削除整理/削除議論
qb3 運用情報/規制情報/規制議論
がqb5配下に集約するわけですね。 >>814
qb2 の bbs.cgi は他のサーバと統一しているので、いけるはずですー
そのサーバには sakubbs.cgi 入れないといけないですけど、 >>809
誰がやってるのかと思ったら本7でワロタ >>740
利用者を(見かけ上)待たせない小技。
処理の最初で標準出力と標準エラー出力を閉じると
利用者のブラウザには結果がすぐに表示される。(htttpd依存?)
成否が分からないのが難点ですが...
-----------------
#!/usr/bin/perl
print "Content-Type: text/html; charset=shift_jis\n\n";
print "処理を受け付けました";
close STDOUT;
close STDERR;
# 時間の掛かる処理
>>816-817
doronpo.cgiも入れてくださいね。。。。 >>819
書き込み後にウエイトを置いてるように、
利用者をわざと待たせるようにしていたり、、、
>最近のbbs.cgi >>821
途中経過を表示させるってのはいかが?
アクセス規制チェック中。。。 OK
連投規制チェック。。。 OK
ごにょごにょチェック中。。。 NG
ERROR!
お布団干したままですよ( ̄ー ̄)ニヤリッ
みたいな。 途中経過を表示することになんか意味あるのかなぁ、、、 >>822
エラーメッセージ全部で何種類あるんだ… >>823
リロード抑止にならないかなって。
何も表示されることなくただ待たされるとなると F5 押したくなるっていうのが一般的心理かと。 あと蛇足になるんだけれども、書き込み後の自動ジャンプは切れないかな?
わざわざ100KB以上もある板トップに強制移動したところで無駄な転送が発生するし、
誰もが板トップに戻ることを期待していない(書き込み元のスレッドに戻りたい場合もある)かもしれないし。
板トップの広告に関しては、「書きこみました」画面に入れてもいいんじゃないかな? それだったら
「書き込み処理しています、しばしお待ちください。。。」
(エラーならここで表示)
(処理が終わった)
「終わりました。5秒後にトップページへ飛びます」
(直後にmetaタグを仕込む)
(終わり)
でいいような気がしますが。>提案者&総帥 「歯みがいたか?」
↓
「宿題やったか?」
↓
「風呂はいったか?」
↓
「妹の様子はどうだい?」
↓
「肛門の調子はどうよ?」
でいいような気がしますが。 >>825
少しくらい表示してもイイが、ひろゆきの嫌いな広告スクリプトにも情報を提供することになるわけで。
自動じゃんぷきれー、
っつのは前からさんざんがいしゅつきしゅつだった希ガス元素。 本題とは逸れるが自動ジャンプなんて要らないと思う。
-------------------------
書き込みが終了しました。
・○○板(リンク)
・にちゃんねる(リンク)
-------------------------
これくらいで良いっしょ。
>>825
2ちゃんブラウザーには効かないぜ
書き込みウィンドウが固まって本体まで固まる奴があるからイライラするだけさ >805
そこそこ使えるL4 ロードバランサって300万円ぐらいするよね、Alteonとか
F5とかServer Ironとか。
それを海の向こうに設置して運営するコストは馬鹿にならんと思う。
このての保守契約は24h365dayにすると極端に高くなるから 負荷分散機のパフォーマンス調査を行っていました。
むちゃくちゃ返信遅れていますし、ややスレ違いな場所に返信してごめんなさい。
・・・そろそろスレたてた方がいいのかな・・。
>835
そうなんですよね。高すぎるんですよ。
ただいま、負荷分散機のパフォーマンス調査を行っているんですが、
やたらと古いデータしかないんですよね・・・。
ttp://www.veritest.com/clients/reports/f5/layer4_layer7_comparison.pdf
ttp://www.linuxvirtualserver.org/Joseph.Mack/performance/single_realserver_performance.html
やっぱりソフトウェアベースでは無理かなぁ。
となると一度実験してみないとだめかも、どこかでこっそりとやってこよう。
ttp://slashdot.jp/articles/04/05/17/0833224.shtml?topic=2 こっちにも関りがあることなのでコピペ。
22 :動け動けウゴウゴ2ちゃんねる :04/05/21 10:54 ID:/Wl6bf1i
AirH"PHONEセンター特認IPアドレス帯域追加おながいします
AirH"PHONEセンターIPアドレス帯域
http://www.ddipocket.co.jp/p_s/products/airh_phone/ip.html
61.198.167.0/24
61.198.253.128/25
追加
>>827
seikou=0
sippai=1
era=1
if(kakikomi=0)
{
mes "書き込み処理しています、しばしお待ち下さい。。。"
seikou=seikou+1
}
elseif
{
mes "エラーですよん。。。( ̄ー ̄)ニヤリ"
}
if(seikou=2)
{
wait 500
mes "終わりました。五秒後にトップページへ飛びます。"
goto *top
}
stop 119 名前:サザン ★ 投稿日:04/05/27 23:15 ID:???
むぅ
bbq.2ch.net
148 processes: 1 running, 147 sleeping
120 名前:動け動けウゴウゴ2ちゃんねる メェル:sage 投稿日:04/05/27 23:15 ID:ThpJLAhB
C:\WINDOWS\デスクトップ>ping bbq.2ch.net
Pinging bbq.2ch.net [206.223.147.35] with 32 bytes of data:
Reply from 206.223.147.35: bytes=32 time=118ms TTL=46
Reply from 206.223.147.35: bytes=32 time=119ms TTL=46
Reply from 206.223.147.35: bytes=32 time=120ms TTL=46
Reply from 206.223.147.35: bytes=32 time=137ms TTL=46
Ping statistics for 206.223.147.35:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 118ms, Maximum = 137ms, Average = 123ms
?
121 名前:南アルプス ◆28UfbftxkA 投稿日:04/05/27 23:16 ID:AFwyjLAs
>>119
それは直ってないとの見解で宜しいでしょうか?
123 名前: ◆f0.zuburi6 メェル:sage 投稿日:04/05/27 23:17 ID:Wg2kMH9n
>>119
一度に一個しかプロセスが走らない?
124 名前:動け動けウゴウゴ2ちゃんねる メェル:sage 投稿日:04/05/27 23:18 ID:K2FslckF
BBQが止まったなら、、、(ry
125 名前:未承諾広告 ◆TWARamEjuA メェル:sage 投稿日:04/05/27 23:19 ID:JtwbarS8
>>119
media: Ethernet 10baseT/UTP <full-duplex>
これってまずくないですかねぇ(汗)
127 名前: ◆Reffi/bQ.c メェル:sage 投稿日:04/05/27 23:21 ID:nGsxpDn8
>125
あ〜ひゃひゃひゃ
それじゃぁ、めちゃくちゃ重くて当たり前のような(滝汗
128 名前:動け動けウゴウゴ2ちゃんねる メェル:sage 投稿日:04/05/27 23:22 ID:l+Xr0uKn
なんでmulch-proccessingができないんかな・・・。<bbq
rootさんはいないのかな。 超カメレスで悪いが、随分前にあった「IO::File使え」という意見。
IO::FileをuseするとIO::SeekableだのFile::Specだの余計なモジュールを
中で読みまくるので、激しく重くなるよ。
open my $fh, '<', './unko.txt';
...
close $fh;
オブジェクト指向でファイル操作するのは諦めて、こうやった方が軽い。 それ以前に、mod_perlしていなけりゃ起動コストがアホみたいにかかる >>843
mod_perlはhttpdプロセス一つごとにcgiが起動するからメモリ食う。
FastCGIの方がいいよ。 >>844
read.cgi以外の*.cgiを処理するmod_perl有効のhttpdと。
*.gif|*.htmlなどの固定ファイル専用のSTATICビルドしたhttpd。
その二つを別ポートもしくはaliasした別IPで立ち上げて。
poundで分岐するってのはどうだ? おそらく>>844は理解できていないか失敗した厨房
Apache拡張ガイドでも嫁
>>846
2chにそのような運用を期待するのは浅はかだと思わんかね そもそも、httpd数とプロセス(コネクション)数は1対1にする必要ないんだけどね。
httpdが数百個も動いてメモリが気になるなら、マルチスレッドで動かせばいいだけでしょ。
apache2を使っているんだから。 >>848
MPM workerで安定動作しているところってどこか知ってる?
ヤフーとかgoogleとかはどうなんだろうなぁ。 my $ripfile = $PATH . "内緒";
my (@IP, @IIP, $TIP);
if($FORM{'subject'} ne ""){
#スレッド立てすぎチェック
my (@IP, @IIP, @ZIP, $TIP, $VIP, $SIP, $JIP, $HIP);
$TIP = $HOST;
$TIP =~ s/<(.*)>//g;
$VIP = $TIP;
if($FLAG == 5){
$TIP = $FORM{'sid'};
$TIP =~ s/\W/\\$&/g;
}else{ my @ippart = split(/\./, $TIP);
$JIP = $ippart[0];
if($TIP !~ /[a-zA-Z]/o){
$TIP =~ s/[0-9]+$//o;
$TIP = "^" . $TIP;
}elsif($JIP =~ /[x\-\.\d]{12}/o){
$TIP =~ s/([x\-\.\d]{5})([x\-\.\d]*)/$1\.\*/o;
}elsif($JIP =~ /\d{8}/o){
$TIP =~ s/(\d{3})(\d*)/$1\.\*/o;
}else{
if(@ippart < 5){
$TIP =~ s/\d+/\.\*/g;
}else{
if(($ippart[@ippart-6] =~ tr/\d/$&/) > 4){
$TIP = $ippart[@ippart-6];
$TIP =~ s/\d.*/\.\*/g;
}else{
$TIP = "";
}
$TIP .= "$ippart[@ippart-5].$ippart[@ippart-4]";
$TIP =~ s/\d+/\.\*/g;
$TIP .= ".$ippart[@ippart-3].$ippart[@ippart-2].$ippart[@ippart-1]";
}
}
$HIP = "$ippart[@ippart-3].$ippart[@ippart-2].$ippart[@ippart-1]";
} # 書き込みログファイル
open(RIP,"<$ripfile");
@ZIP = <RIP>;
close(RIP);
# 書き込みホスト保存
open(WIP,">$ripfile");
#flock(WIP,2);
print WIP ("$HOST,$FORM{'sid'},$FORM{'key'}\n", @ZIP)[0..$SETTING{'BBS_THREAD_TATESUGI'}-1];
close(WIP);
} RIPファイル内緒って。。。(汗
普通に知られてると思うんだけどな。。。(汗 >>853であれこれやってるものが>>854のどこにも使われてないように
見えるんだが >856
なんか他の色々なところに使ってて、
すれたて規制には使ってないらしらし、 112 名前:FOX ★[] 投稿日:04/06/12(土) 17:25 ID:???
bbs.cgi に入れることに成功した
んじゃ 実際に呼んでみよう。。。 cgi以外に、通常ブラウザを制御できるプログラムはないのですか?
>>862
どうぞこちらへ
WEBプログラミング@2ch掲示板
http://pc5.2ch.net/php/
サーバーサイドプログラミング関連の話題を扱っています。
Perl, PHP, Java, Ruby, C, Tcl といった言語処理系の話、
Apache, CGI, JSP/Servlet, ASP, ColdFusion といったアプリケーション実行環境の話、
Oracle, PostgreSQL, MySQL といったデータベースの話などをテーマにしています。
スレタイトルは言語がハッキリわかるようにしてください。(言語を特定する場合)
配布中止/配布元不明スクリプトが欲しい人はダウンロード板へ
JavaScript、VBScript等クライアントサイドの話題はWeb製作板へ
で、質雑スレで bbs.cgi が云々と宣ってた香具師はどうした?(哀) Apacheモジュールのmod__bbsならあるけど2chで使うにはコアすぎるかな? NGワードのことだけんども
"&r"を削除するんでなくて、"&r"に変えるようにできないかな。
現状の抜け穴対策と、通常の投稿として"&r"がある時の救済策。
スレッドタイトルのNGワードも同様の処理にして欲しい。
現在の、"&"を全て削除する方法では誤爆が多すぎる。 一応書いとくと、bbs.cgiにもNGワードがございまして、
特定の文字列があると投稿できなかったり、或いは
別の文字列に変えられたり、削除されたりするのですね。 &rが削除されるのは、名前欄だけじゃないのか?
ここに→&r←来た 要望はここでいいのかな?
https://で始まるURLもリンク形式にして欲しいんだけど bbs.cgiがdatに記録するのは素のURLで
リンクにしてるのはread.cgi(or専用ブラウザ)ですね bbs.cgiが処理するvalue値、形式は何なんでしょか?
<input type=hidden name=time value=1095940962>
初歩的な質問ですみませんが、どなたか <(_)> スレ一覧生成するときに、1行1スレにして、可読性を高めることはできますか? ソースきたないなぁ>>852-854
これはメモリをいっぱい使う典型的な例じゃない? Perlわからんのに下手なことやる★がいるからな。
2chにワケワカランおまけ機能つける奴とか それで負荷がどうのこうの言って制限とかやめてよ
先にやることあるでしょ 思ったんだがPerl使うより
サーバサイドJAVA使ったほうが比較処理早いと思うんだが・・・ とりあえずさ、どう考えても今のやつに手を加えるのが現実的ではないだろうか
誰か有能な人を雇用してよ。
俺とか。 不動楽さんが手を入れて、明らかに板飛びが減ったですね。 共有メモリ使ってはいかがですか?
共有メモリ上にスレッド毎のメッセージ数入れておいて、共有メモリを更新する数msecだけ
SYSVセマフォ(若しくはPOSIXのセマフォ)で排他。
1000を多少越えても良いのだから参照に排他は不要。
SYSV共有メモリで足りなければmmapの共有メモリで。
処理フロー
1.規制確認
2.レス数確認
3.共有メモリロック
4.レス数インクリメント
5.共有メモリロック開放
6.datにアペンド。
mod_cgidso入れさせてテストさせて見たいといってみるテスト
せっかく5.3Rもでたことですし、exで実験!と振ってみるテスト
>>900
つーことは今のbb.cgiソース管理者は不動楽さんということでFA?
>>901
mmapはかなりコストを食うということで却下された経緯があったはず >>902
管理者というか、いじっている人の一人かと。 >>903
ふむ、では今いじれるのはrootさんを除くと(一部はその気になればいじれるため)
ひ(りゃ(ほとんど触っていなさそうだけど)
見習い
不動楽
あとだれがいましたかね。 read.cgi はともかく bbs.cgi で mod_cgidso を使うとなると,
普通の実行可能バイナリじゃなくて共有オブジェクトにしなきゃいけないとか,
自前でリソース解放してくれないとどんどんリークしていっちゃうとかで,
perlcc で直接バイナリ作るんじゃなくて,生成された C コードを
手作業で直さなきゃならないんでしょうけど......
まぁ bbs.cgi に関しては,fork() させないようにするなら
mod_perl の方が現実的かなとは思います.
あとは,suExec の代替措置も必要なんでしょうけど,
perchild MPM よりも安定して動くと言われているのがこれ.
Metux MPM http://nibiru.borg.metux.de:7000/wiki.mpm/
**********************************************************************
個人的に bbs.cgi 関連で気になっているのは,まずは ftp のリンク URL が
おかしくなること (ex. ftp://core.ring.gr.jp/pub/ ).これは ime.nu で
ftp リンクを扱えるようになっていなければ,ime.nu を入れず直リンに
した方がいいのかも知れませんけど.
あとは,NAME/MAIL の Cookie の問題ですね.設定がサーバサイド,
読み出しがクライアントサイドという不整合のため,Mozilla 等では
文字化けしてしまうと.現状では Set-Cookie ヘッダで設定していますが,
これを JavaScript の方で設定すればいいのではないかな,と.
とはいえ,bbs.cgi 出力に Cookie 設定用 JavaScript コードを入れると,
" や \ を \ でエスケープさせる必要がありますが,Shift JIS だと
漢字等の2バイト目が \ になることもあるんで,この判定をきっちりやるのも
結構大変か......むしろ bbs.cgi 出力では行わず,投稿フォーム側の
onsubmit() でこの処理をやらせた方が安全ですかね. その場合の各板トップ及び read.cgi 出力の JavaScript コード変更案.
----------------------------------------------------------------------
onload = function(e) {
var N = getCookie("NAME"), M = getCookie("MAIL"), i;
with (document)
for (i = 0; i < forms.length; i++)
if (forms[i].FROM && forms[i].mail) {
forms[i].FROM.value = N;
forms[i].mail.value = M;
if (forms[i].addEventListener)
forms[i].addEventListener("submit", setCookie, false);
else
forms[i].onsubmit = setCookie;
}
};
if (!Date.prototype.toUTCString)
Date.prototype.toUTCString = Date.prototype.toGMTString;
function setCookie(e) {
var exp = new Date();
exp.setMonth(exp.getMonth() + 1);
document.cookie = "NAME=" + escape(this.FROM.value) + "; path=/; expires=" + exp.toUTCString();
document.cookie = "MAIL=" + escape(this.mail.value) + "; path=/; expires=" + exp.toUTCString();
}
function getCookie(key, tmp1, tmp2, xx1, xx2, xx3, len) {
tmp1 = " " + document.cookie + ";";
xx1 = xx2 = 0;
len = tmp1.length;
while (xx1 < len) {
xx2 = tmp1.indexOf(";", xx1);
tmp2 = tmp1.substring(xx1 + 1, xx2);
xx3 = tmp2.indexOf("=");
if (tmp2.substring(0, xx3) == key)
return unescape(tmp2.substring(xx3 + 1, xx2 - xx1 - 1));
xx1 = xx2 + 1;
}
return "";
} もう今はスクリプト配布してないんだっけ?
4.2ぐらいのころのは持ってるよ。 MySQL使えないんでしょうか?
ファイルシステムでこの規模なんて自分では考えられないです。
DATを返すインターフェイス作っておけば問題ないと思うのですが・・・。 DBとの連携ってどこらへんで×だったんだっけ。
過去ログ引っ張り出すのもまんどくせ。 別に技術的な理由で×というのは無かったような。
強いて言えばめんどくさいってだけ。 >>914
DMDM と MDMD の MD5 を算出して、DB(MySQL) と照らし合わせて合致すれば桶だと思うので、
その部分以外は使い回しかと思われんこん。 >>915
そもそもMD5があやしい疑惑があるんだが・・・・ >>911
過去ログ検索とかではDBは有効だけど、ライブスレッドなら
ファイルのが負荷少ないしベストな選択のように思うけど、
どうなんだろう。 負荷ってどうなるのかなぁ・・・
PHPで試しに作ってみる。 >917
ファイルシステムにするとキューだのロックだのを同期する必要がある。
MySQLだと、そのあたりはデータベースに任せられる。
また、MySQLをバックエンドにして、閲覧系を複数にして負荷分散するのが非常に楽になる。 そうか書き込みのことを忘れてた・・・スマソ
MySQL速いらしいいいかもね。 ひ(ryがいぢれないと採用してもらえなかった希ガス >>920
というかbbs.cgiはそもそも書き込み用途のはずではw datをDBにするとread.cgiも変えざる得ないから、読み書き両方を考える必要があるのか・・・ そーゆーんじゃなくってさ、
bbs.cgi の改良でだいぶよくなる気がする。
だって何あのソース??
おっきく仕様変えなくても。。 >923
Perl DBIでインターフェースを作っとけば、仮にCで書きなおしたりしてもインターフェース部分だけ変えればよいと。
んでDBはDBで切り離してチューニングが出来ると。
閲覧系のキャッシュ同期とかがけっこうノウハウあるらしいので高負荷サイトはそれなりに難しいらしいけど。 関連ページをクリックして、Pingを発射したとき
どう足掻いてもスレッドのURLの末尾の/が相手先に送れないのですが
この問題もこちらでよろしいでしょうか?
2ちゃんねるpingβのスレがあるといいのですが、見あたらないので・・・ これから質問しまくるんで
優しく教えてください。
つまり Perl を知らないぼんくらなんです sub bbs_main
{
our$version = "BBS.CGI - 2005 (for SpeedyCGI)";
&DispError2("FOX ★","<font color=green>FOX ★ ふふふっ</font>");
return;
}
とやって $version を DispEooro2 というサブルーチンで参照したいのですが
どうすれば参照できるんですか?
$version は SpeedyCGI に対応した、いわゆるグローバルな変数ではなく
ローカルな変数です。
ちなみにこうやって失敗しています(500 error)
print <<EOF;
version = $version
EOF
■ bbs.cgi(SpeedyCGI)の巻 part1 (2004/12/01-)
http://dso.2ch.net/test/read.cgi/myanmar/1101890385/48
500エラーになって、書けないっす。
たぶん Premature なんちゃら、って言って、えらーログに残っているはず。 >>930
この例だと
-------------------
#! /usr/local/bin/speedy --r1
our $version = "BBS.CGI - 2005 (for SpeedyCGI)";
sub bbs_main
{
&DispError2("FOX ★","<font color=green>FOX ★ ふふふっ</font>",$version, $errnum);
return;
}
-----------
Dispの第2引数にversionを渡すようにしています。
errnumはエラー番号(たとえばapacheのエラーコードとか) FOX ★
FOX ★ ふふふっ
ホストHOST
FORM{'subject'}
名前: FORM{'FROM'}
E-mail: FORM{'mail'}
内容:
FORM{'MESSAGE'}
こちらでリロードしてください。 GO!
分からないことがあったら2ちゃんねるガイドへ。。。
アクセス規制・プロキシー制限等規制は、2ちゃんねるビューアを使うと回避できることがあります。BBS.CGI - 2005 (for SpeedyCGI)
が出る時と、出ないで500 Internal Server Errorになる時がありますね。 >>930
あ、まちがい、ローカル変数だったですね。スマソorz
# 実は私もperlはあまり詳しくない・・・むしろPHPのほうが強い
printはdisperror内でですかね。 http://dso.2ch.net/test/bbs.txt
現時点での全ソース
今つまずいているところ【2】
$NOWTIME がローカルな変数になっていない
起動されるたびに変わらない
私の言っているローカルと一般的に言うローカルの意味が違うのかも、
別に私が言っているわけじゃないけどサ でも、たまに変わるなぁ
ちょっと時間を置くと換わるのか?
http://dso.2ch.net/myanmar/
ここでやってます >>939
1分以上バックエンドにリクエストがないと、バックエンドをexitするようにしてあるので、
その時には元に戻ります。
やめる場合、bbs.cgiの1行目の-t60をやめればよいです。 なるほど、
-t60 なしでデバッグしたほうがいいっすね、 #!/usr/local/bin/speedy -- -b1048576
にした > グローバル変数の初期化をしてないようなので
my $NOWTIME = time;
↓
my $NOWTIME;
$NOWTIME = time; PID=$$ も書くようにした
当然のことながら、いつも同じPID、、、
さてさて〜、どうすればいいやら なるほど、、、。
常識的に(というか半ば無意識に)使っていたものが、使えなくなるですね。
代替手段は大体あるに違いないけど、こむずかしそうだ。 Time::time なんてのもあるんですか? < Perl こういうノリではいかがでしょうか。
&bbs_main;
exit;
sub bbs_main {
my $GB = {};
$GB->{version} = "BBS.CGI - 2005 (for SpeedyCGI)";
$GB->{NOWTIME} = time;#現在時刻
$ENV{'TZ'} = "JST-9";#日本
#$ENV はそのまま使う
my %FORM;
$GB->{FORM} = {};
&foxReadForm($GB);#$FORM を読み込む
&DispError2($GB, "FOX ★","<font color=green>FOX ★ ふふふっ</font>");
return;
}
sub DispError2
{
my ($GB, $title, $topic) = @_;
print "Content-type: text/html; charset=shift_jis\n\n";
#-----------------------------------------------------------------------
print <<EOF;
<html>
<head>
<title>$GB->{title}</title>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
</head>
<body bgcolor="#FFFFFF"><!-- 2ch_X:error -->
<font size=+1 color=#FF0000><b>$GB->{topic}</b></font>
<ul>
<br>ホスト<b>HOST</B><br><b>GB->{FORM}->{'subject'} </b><br>
名前: $GB->{FORM}->{'FROM'}<br>E-mail: $GB->{FORM}->{'mail'}<br>
内容:<br>$GB->{FORM}->{'MESSAGE'}<br><br>
</ul>
<center>こちらでリロードしてください。<a href="../$GB->{FORM}->{'bbs'}/index.html"> GO! </a><br>
分からないことがあったら<a href="http://info.2ch.net/guide/">2ちゃんねるガイド</a>へ。。。<br><br>
アクセス規制・プロキシー制限等規制は、<a href="http://2ch.tora3.net/">2ちゃんねるビューア</a>
を使うと回避できることがあります。
</center>
<p>
time=$GB->{NOWTIME}<br>
$GB->{version}
</body>
</html>
EOF
#-----------------------------------------------------------------------
exit;
} >>949
おおっ そういうほうが好き好き
$GB は構造体(クラス)と思えばいいのかな?
要素(メンバー)を追加するのは、たんに $GB->なんとか
とやれば追加されるのかな?
んで my で宣言されていても使い方がグローバルなら
結局はグローバルな変数になっちゃうということなのかしら? sub init_onceを書いて、初期化ルーチンを押し込めましょう。
そして初期化ずみフラグを見てrace condition回避も忘れずに。 >>949
my %FORM; を消し忘れた……。
>>950
よくは分からないですけど
外側のmy変数はコンパイル時に実体が作られるんでしょうか。 SpeedyCGIインストール完了
なんとなく離してみた
なぜか動いた
なぜだ〜〜〜
my $NOWTIME;#現在時刻
&bbs_main;
exit;
#########################################################
sub bbs_main
{
my $version = "BBS.CGI - 2005 (for SpeedyCGI)";
$NOWTIME = time;#現在時刻
>>952
なんでしょうねぇ
my しても、実際に使い方が悪かったらどっかに(CS?) 実態が
作られちゃうんでしょうねぇ んもう、書き直すならオブジェクト指向で書き直せばいいのに。
オブジェクト指向ならmod_perlの道が見えるのに。 >>955
それは大変すぎるですよ、私にとっては
次の世代の方々への贈り物ということで、
SpeedyCGI でかなり改善することが知りたいというのが目的なもんで
「かなり改善」が望めないならお蔵入りという話し。 http://dso.2ch.net/test/bbs998.txt
現在の bbs.cgi
こまっているところ【3】
&foxReadForm($GB);#$FORM を読み込む
安易に代入しただけじゃ駄目なの?
$GB->{FORM} = %FORM; ← この部分
>>957
foxReadFormの頭で
my $FORM = $GB->{FORM};
として、代入の方は
$FORM->{$name} = "$value";
とするのがよいかと。 sub foxReadForm
{
my ($GB) = @_;
my $query_string = undef;
my (@m_elements, $m_element, $name, $value);
my %FORM = $GB->{FORM};
で駄目だった。 (my $FORM だと 500 error だった) うひょ。
sub foxReadForm
{
my ($GB) = @_;
my $query_string = undef;
my (@m_elements, $m_element, $name, $value);
my $FORM = $GB->{FORM};
#環境変数からPOSTのでーたをもらう〜
if ($ENV{'REQUEST_METHOD'} eq "POST") {
read(STDIN, $query_string, $ENV{'CONTENT_LENGTH'});
@m_elements = split(/&/, $query_string);
foreach $m_element (@m_elements) {
($name, $value) = split(/=/, $m_element);
$value =~ s/\0//g;
$value =~ tr/+/ /;
$value =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg;
$value =~ s/</</g;
$value =~ s/>/>/g;
$value =~ s/\r\n|\r|\n/<br>/g;
$value =~ s/<br>/ <br> /g;
$value =~ s/[\0\x00-\x1f]//g;
$FORM->{$name} = "$value";
}
}
#1行データからは改行を削ってタグを閉じます
$FORM->{'subject'} =~ s/\#//g;
$FORM->{'subject'} =~ s/ <br> //g;
$FORM->{'subject'} =~ s/&//g;
$FORM->{'FROM'} =~ s/"/"/g;
$FORM->{'FROM'} =~ s/ <br> //g;
$FORM->{'mail'} =~ s/"/"/g;
$FORM->{'mail'} =~ s/ <br> //g;
$FORM->{'bbs'} =~ s/\|//g;
$FORM->{'bbs'} =~ s/\\//g;
$FORM->{'key'} =~ s/\|//g;
$FORM->{'bbs'} =~ s/\.//g;
$FORM->{'key'} =~ s/\.//g;
$FORM->{'bbs'} =~ s/&//g;
$FORM->{'key'} =~ s/&//g;
$FORM->{'time'} =~ s/\D//g;
$FORM->{'bbs'} =~ s#/##g;
$FORM->{'key'} =~ s#/##g;
$FORM->{'subject'} =~ s/&r//g;
$FORM->{'FROM'} =~ s/&r//g;
$FORM->{'mail'} =~ s/&r//g;
} >>955
さすがにつらすぎるでしょう。
でも最終手段としての書き直しは軽く心に留め置いておいたほうがいいかもしれないと振ってみる sub bbs_main
{
use CGI::SpeedyCGI;
my $sp = CGI::SpeedyCGI->new;
my $spv = $sp->i_am_speedy ? 'yes' : 'no' ;
$ENV{'TZ'} = "JST-9";#日本
#$ENV はそのまま使う
my $GBX = {};
$GBX->{version} = "BBS.CGI - 2005 (SpeedyCGI = $spv)";
$GBX->{NOWTIME} = time;#現在時刻
$GBX->{PID} = $$;#pid
$GBX->{FORM} = {};#
&foxReadForm($GBX);#$FORM を読み込む
require "./bbs-main.cgi";
&DispError2($GBX,"FOX ★","<font color=green>FOX ★ ふふふっ</font><br><br>これが表\示されるということは・・・<br>本体requireしたのにそっちへ行かないと、、、");
print "Content-type: text/html; charset=shift_jis\n\nWOWOWOWOWOW-----\n";
return;
} require "./bbs-main.cgi";
で本体に処理を移そうとしたら・・・
最初の起動時は本体へ行った
しかーし、二回目以降はだめだった、、、
どうする? bbs-main.cgiの処理を関数に括りだしておいて
その関数を陽に呼び出せばいいような。 >>968
わたし・・・
理解不能なんです
>>969
そんなふうにしてみた
sub bbs_honati
{
my ($GB) = @_;
&DispError2($GBX,"FOX ★","<font color=green>FOX ★</font> いよいよ本体");
}
1;
んで &bbs_honati ; で呼び出してみた。 ホストが違う・・・
ERROR:ユーザー設定が消失しています!
ホストU178***.ppp.dion.ne.jp
名前:
E-mail:
内容:
こちらでリロードしてください。 GO!
分からないことがあったら2ちゃんねるガイドへ。。。
アクセス規制・プロキシー制限等規制は、2ちゃんねるビューアを使うと回避できることがあります。 どうも前にエラーを出した人のを出してるような・・・
まあゴニョゴニョしてる途中だからかな 僕ちんは
ERROR:サブジェクトが存在しません!だた。 いろいろやっているだす
sub bbs_hontai
{
my ($GB) = @_;
my $FORM = $GB->{FORM};
my $NOWTIME = $GB->{NOWTIME};
&DispError2($GB,"FOX ★","<font color=green>FOX ★</font> いよいよ本体($GB->{FORM}->{bbs} , $FORM{'bbs'})");
$FORM{なんたら} ってのが沢山あるんで
my $FORM = $GB->{FORM};
と関数に入ったところで宣言してそのまま使おうと思ったんだが・・・
うまくいかんのだ
どすればいいのだろう my %FORM = $GB->{FORM};
とか?
といい加減に答えてみる $GB->{FORM} は「ハッシュ」じゃなくて「ハッシュへの参照」なので
$FORM{なんたら} を $FORM->{なんたら} に変えないとダメっす。 >>979
やったけどだめだったっす、、
>>980
やっぱそうなんすか・・・
死ぬほどあるんだよなぁ
一気に置き換えるのは恐いしなぁ >>981 50%乙
FOX★氏はiijか・・・
ERROR:ユーザー設定が消失しています!
ホストh***.p***.iij4u.or.jp
名前: FOX ★
E-mail:
内容:
ffffcce
ffffcsvxxxxx
fffff
gggg
hhhh
my %FORM = %{$GB->{FORM}}; # として
# ここで$FORM{hoge}に対してごにょぎょんして
%{$GB->{FORM}} = %FORM; # として返すとか? しかーし
結局 ホスト情報やらhtml名やらは元々グローバルだったから
ちゃんと $GB に入れてやら無いとまずいという話しかな、
結構大変そうだ、
まずは HOST 関係だけやってみよう。 ・●はまだかな
・本文梨でも書き込める
・IDが???
がんばれ〜〜 ワロタ
どのような形の削除依頼であれ公開させていただきます
2ちゃんねる(+Samba)
アニメ | CM | ゲーム | 映画 | 音楽 | テレビ | 日記(+Samba)
アニメ | CM | ゲーム | 映画 | 音楽 | テレビ | このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。 レス数が1000を超えています。これ以上書き込みはできません。