bbs.cgi再開発プロジェクト 3
レス数が1000を超えています。これ以上書き込みはできません。
不動楽さんが手を入れて、明らかに板飛びが減ったですね。 共有メモリ使ってはいかがですか?
共有メモリ上にスレッド毎のメッセージ数入れておいて、共有メモリを更新する数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を超えています。これ以上書き込みはできません。