X



■ bbs.cgi(SpeedyCGI)の巻 part1 (2004/12/01-)

0001root ★
垢版 |
04/12/01 17:39:45ID:???
■ bbs.cgi(SpeedyCGI)の巻 part1 (2004/12/01-)

とりあえず、SpeedyCGI化は成功。
しかし、先は長そう。さてどうすべきか。

1) bbs.cgi の改良(再入可能化?)により、speedy -- -r1 以外で起動可能にする
2) speedycgiの設定チューニング(並列度とかいろいろ)

あたりから詰めていくことになるのかなと。

参考スレ:
■ read.cgi(DSO味)の巻 part1 (2004/12/01-)
http://dso.2ch.net/test/read.cgi/myanmar/1101888913/

【Project peko】2ch特化型サーバ・ロケーション構築作戦 Part15
http://qb5.2ch.net/test/read.cgi/operate/1093068260/
0002root ★
垢版 |
04/12/01 17:41:09ID:???
…しかし、私はPerlがからっきし(りゃ なので、
Itadaいたり不動の楽しみをお持ちだったりする方々などのお力を、
ぜひお借りしたいところかも、かも。
0003FOX ★
垢版 |
04/12/01 17:42:08ID:???
あっしも、、、
Perl はワからンのです、はい
0005FOX ★
垢版 |
04/12/01 18:07:28ID:???
私なりに考えてみると

1) main はどうかけばいいのか、
2) 変数(とくにグローバル)はどう書けばいいのか、

あたりなんです。
枠組みが理解できれば、書き直す人も増えるかも、
0006FOX ★
垢版 |
04/12/01 18:10:16ID:???
現在の流れは(bbs.cgi)

test/bbs.cgi ← 小さい導入部、なるべく叩き落せるのはここでやる。
require '本体bbs.cgi' 以降処理は'本体bbs/cgi'へ
ほとんど(多分全部かも)は戻ってこない、どっかで exit;

本体bbs.cgi
いろんな処理をして、どっかで exit; されている
0007▲:/usr/local/bin/ch2 -o i686 ◆P8fXJj6wwo
垢版 |
04/12/01 18:21:43ID:???
>>6
まずtest/bbs.cgiは

1)環境変数を整理
2)setting.txtを読み込む
3)ふるい落とし処理
バーボンハウスチェック>bbqまたはbbmチェック>sambaチェック>rockチェック
# バーボンとsambaが機能的に一部かぶっている希ガスのですが・・・

4)その他処理?(なんかあったっけ)

ですかね
0008▲:/usr/local/bin/ch2 -o i686 ◆P8fXJj6wwo
垢版 |
04/12/01 18:30:56ID:???
>>7
3)のところ(bb?チェックまで)

if(barbon(ip)){
error(barbon);
exit;
}
endif;
if(けーたい)
if(callbbm(id)==だめぽ){
error(bbm);
exit;
}endif;
else
if(callbbq(ip)==だめぽ){
error(bbq);
exit;
}endif;
endif;
0009▲:/usr/local/bin/ch2 -o i686 ◆P8fXJj6wwo
垢版 |
04/12/01 18:42:44ID:???
あ、これ(>>7)じゃちとまずい。いろいろ軽め且つはじき要素が入ってない。
特にrockは本文のチェックが入るから処理が重いと思われなので後回し。

処理の原則は環境変数>別途ファイルに格納されている設定値>本文の順かな
0010FOX ★
垢版 |
04/12/01 18:44:32ID:???
というか
目的は SpeedyCGI のフル機能を実現するには
どのようにコーディングすればいいか? なんですよ。
0011名無しさん@お腹いっぱい。
垢版 |
04/12/01 18:51:09ID:???
http://perldoc.jp/docs/modules/CGI-SpeedyCGI-2.21/SpeedyCGI.pod

> speedyが他のリクエストを開始したとき、どのくらいの量のperlの状態が保持されますか?
> グローバルはその値を保持していますか?リクエストの後にデストラクタが走りますか?
>
> グローバルはその値を保持します。リクエストの後は何も破壊されません。 STDIN/STDOUT/
> STDERRはクローズされます -- 他のファイルはそうではありません。 %ENV と @ARGVだけが
> リクエストの間で変更されるグローバルになります。
0012▲ 某ソレ511
垢版 |
04/12/01 18:59:07ID:???
ファイルハンドルは基本的に毎回クローズすべき、
変数も初期化しないとだめ、か。
%ENVと@ARGVは呼び出された時に
ソースの処理の前に値が代入されるからな、
0013FOX ★
垢版 |
04/12/01 19:02:25ID:???
bbs.cgi が呼び出されて
その処理が終らないうちに次ぎづぎにbbs.cgi が立ち上がる(呼ばれる)ので
都度初期化するというよりは、完璧に分離しなきゃならないってことかと

つまり スタックを使うしか無いんだと思うんだな、
Perl ではどうやってやるの?
0014▲:/usr/local/bin/ch2 -o i686 ◆P8fXJj6wwo
垢版 |
04/12/01 19:04:29ID:???
>>12
setting.txtとsamba設定、rockワードリストの読み込みぐらいしかできることがなさそう・・・
固定値はこれらだけのはず・・・
# これらもあやしかったりするけど・・・

perlでスタックはこんなんありました。
http://www2u.biglobe.ne.jp/~MAS/perl/waza/stack.html
0015名無しさん@お腹いっぱい。
垢版 |
04/12/01 19:09:07ID:???
んにゃ、こっちか。

> 私のperlアプリケーションがspeedyで動くためには変更する必要があるかは、どうすれば判断
> することができますか?あるいは何も変更は必要ないのでしょうか?
>
> 変更する必要があるかもしれません。
>
> グローバルが実行の間で保持されます。例えば永続的なデータベース・ハンドルを保つという
> ことではいいことかもしれませんが、あなたのコードがそれらが未定義であることを想定して
> いればよくありません。
>
> また、グローバル変数を"my"で作成するならば、サブルーチンの中からそれらの変数を参照し
> ようとするべきではありません - その代わりにそれらをサブルーチンに渡すべきです。ある
> いは完全に問題をさけるために、単にmyの代わりに"use vars"でグローバル変数を宣言したほ
> うが、まだましです。
>
> ここに、この問題についての素晴らしい説明があります - これはmod_perlについてですが同
> じことがspeedycgiにも当てはまります:
>
> http://perl.apache.org/faq/mod_perl_cgi.html#Variables_retain_their_value_fro
>
> 全てが失敗するのであれば、MaxRunsを1に設定することにより常駐を無効にすることができま
> す。これが通常のperlに比較しての唯一の利点は、speedyがスクリプトを事前にコンパイルす
> ることにあります。
0016▲ 某ソレ511
垢版 |
04/12/01 19:14:20ID:???
my @stack = ();
push @stack, '1';  #@stack=('1')
push @stack, '2';  #@stack=('1', '2')
pop @stack;    #@stack=('1')
push @stack, '3';  #@stack=('1', '3')
pop @stack;    #@stack=('1')
pop @stack;    #@stack=()

かねぇ。これがスタックではなくキューだと、popじゃなくてshiftか。

----
push 末尾に要素(スカラー変数/リスト変数)を追加、追加後のリストの要素数をリターン
pop リストから末尾の1要素を取り除く、取り除いた要素をリターン
shift リストから先頭の1要素を取り除く、取り除いた要素をリターン
0018FOX ★
垢版 |
04/12/01 19:18:42ID:???
>>17
使わないとすれば
たとえばどんなコーディングすればいいのかなぁ
(すんません Perlしらんもんで)
0020▲ 某ソレ511
垢版 |
04/12/01 19:22:54ID:???
sub{ } でくくってないところでは変数を極力使わない方向で、ってところですかね。
あと、sub{ } のなかでも変数宣言なしでの変数の使用はしちゃいけないとか。
0022FOX ★
垢版 |
04/12/01 19:27:00ID:???
私の至らなさを簡単にいえば

#!/usr/bin/perl
#
$aaa = "";
my $bbb = "";

&gogo($aaa,$bbb);

sub gogo
{
my $ccc = "";
print "$aaa $bbb $ccc";
}

exit;

なんてコード書いて $aaa , $bbb , $ccc はどみに実態があるの?
というのを私が知らないんです。
$bbb , $ccc はスタックのような気もするのですが・・・
$aaa はグローバル? (static , CS←コードセグメント?)
うーん、誰か教えてちょ
0023FOX ★
垢版 |
04/12/01 19:28:23ID:???
× どみに
○ どこに
0025▲ 某ソレ511
垢版 |
04/12/01 19:34:06ID:???
>>22
(;´д`)

その例だと、$aaa、$bbbはグローバル変数、$cccはローカル変数ですね、(コード全般にわたって)
それで、&gogo($aaa,$bbb); は&gogo; としても挙動は変わんないかと、

サブルーチンを呼び出す時、&gogo($aaa,$bbb); では、($aaa,$bbb)を引数として
gogoという関数を呼び出している、という意味になるわけですが、
それをsub gogo でどう引き出すか、というと、sub gogoの中で my ($a,$b) = @_; あたりにするんですよね。
つまり、サブルーチンに渡された引数はPerlでは@_ に入ってるんですね、

しかし、@_を使わないで直接$aaa,$bbb と書くと、直接グローバル変数のほうを見に行くんですよね。
0026FOX ★
垢版 |
04/12/01 19:41:13ID:???
ということは まず最初にやる実験は
>>21 さんの言うような感じになるのかな? どなのかな?

$aaa , $bbb がグローバルなら
数十個あると思われ。。。
どこでどう使われているかもとっても不明なのだ、

あと、これはどうなるんだろ
use strict 'vars'; が宣言されていて
use vars qw($version);
$version ='20041104';
こんな感じになっているやつ
0028FOX ★
垢版 |
04/12/01 19:51:44ID:???
$version は定数ですけど・・・
定数はこれくらいで、他は全部変数だったり
リモホ引いておいて置くやつとか、各種状態フラグとか、、、

use strict 'vars'; が宣言をやめて、
use vars qw($version); の宣言もやめれて

sub main_bbs
{
}
なんてので囲んじゃえばローカルになる?
いちいちmy 付ける必要あり?

0029名無しさん@お腹いっぱい。
垢版 |
04/12/01 20:10:45ID:???
>>28
そうやって全部にmyをつければ一応ローカルにはなるけど、
外側のmy変数にアクセスするのはいけないらしいっすよ。
0030FOX ★
垢版 |
04/12/01 20:12:25ID:???
うまく行くという保障の無いものに
工数掛ける仕様になっとらんのです < わたし

うまくいく = 劇的に負荷が軽減する

という光が見えなきゃ・・・
真剣にやってもしょうがないかと、
0031名無しさん@お腹いっぱい。
垢版 |
04/12/01 20:13:22ID:???
・ファイルハンドルは毎回ちゃんと閉じる
・グローバル変数は our で(そのリクエスト固有の情報を入れてはだめ)

use strict;
use warnings;
use sigtrap;

をつけても動くようにする。(変数初期化とか)
・サブルーチンのなかから外のmyにアクセスしてはだめ。ourはよい。
・サブルーチンのなかから外のmyで宣言された変数を書き換えるときは、サブルーチンを呼び出すときに参照を渡す。
0032FOX ★
垢版 |
04/12/01 20:16:20ID:???
うーん

簡単に試してみることはできなそうだな、、、
0033FOX ★
垢版 |
04/12/01 20:18:47ID:???
sub main_bbs
{
$xxx = ""; ←これはローカル? (stack?)
&subsub1();
}
sub subsub1
{
print "$xxx"; ← サブルーチンで親のローカルを参照できる?
}
0034名無しさん@お腹いっぱい。
垢版 |
04/12/01 20:23:39ID:???
サブルーチンに親子関係は無いです。

多分こうすれば…

sub main_bbs
{
my $xxx = "";
&subsub1($xxx);
}
sub subsub1
{
my $xxx = shift;
print "$xxx"; #書き換え不可
}

かもしくは

sub main_bbs
{
my $xxx = "";
&subsub1(\$xxx);
}
sub subsub1
{
my $xxx = shift;
print "$$xxx"; #書き換え可
}
0035▲ 某ソレ511
垢版 |
04/12/01 20:26:10ID:???
>>28
use strict 'vars';
これは特にやめる必要はないと思うです。

use vars qw($version);
これは宣言するとグローバル変数になるから、
それをやめたければ、mainでやるのはやめたほうがいいですね。

myはプライベート変数であることの宣言なんで、
サブルーチンでやるならつける必要はあるかと、
0036名無しさん@お腹いっぱい。
垢版 |
04/12/01 20:26:36ID:???
>>33
> これはローカル?
no. myかourをつければローカル。

> サブルーチンで親のローカルを参照できる?
myは不可。ourなら可。
0039未承諾広告※ ◆TWARamEjuA
垢版 |
04/12/01 21:29:51ID:???
とりあえずグローバルな配列かハシュを1つ作っておいて、
あとはリファレンスで操作すると、すぴでぃーの方も気持ちよくなるのかな?
0041FOX ★
垢版 |
04/12/02 00:57:59ID:???
ところで、
実際に実験するときはどうやればいいんですか?
0042root ★
垢版 |
04/12/02 01:36:00ID:???
>>41

親bbs.cgiの1行目を、

#!/usr/local/bin/speedy -- -r1 -t60 -b1048576

から、

#!/usr/local/bin/speedy -- -t60 -b1048576

にして、書き込んでみると。
0043FOX ★
垢版 |
04/12/02 01:39:49ID:???
おっ 簡単に出来るのか・・・

どもですどもです
0044FOX ★
垢版 |
04/12/02 03:11:11ID:???
>>42
それは現在のところ
dso.2ch.net だけですよね?
0045root ★
垢版 |
04/12/02 03:18:43ID:???
>>44
他のtigerサーバもspeedyで動いているので、
dso.2ch.netで動作確認した後、他のtigerな掲示板サーバでも同じ要領で試せます。
0048FOX ★
垢版 |
04/12/02 14:07:48ID:???
現在
#!/usr/local/bin/speedy -- -t60 -b1048576
になっとるです (>>42)

何が問題なのかな?
0049FOX ★
垢版 |
04/12/02 20:08:59ID:???
ついに SpeedyCGI モードで書ける所まできたー
0053名無しさん@お腹いっぱい。
垢版 |
04/12/03 19:34:49ID:1STUt0eo
age
0054不動楽 ★
垢版 |
04/12/03 22:37:10ID:???
なんだか携帯からだとformの値が(送られて|受け取れて)ないみたいですね
0055不動楽 ★
垢版 |
04/12/03 23:53:02ID:???
>>2-3
あまり時間が取れない状況ですが、お手伝いできるところはさせて頂きますー
と亀レス。
0057名無しさん@お腹いっぱい。
垢版 |
05/03/23 19:10:03ID:???
【 html化されたこのスレを読んでいるお前へ 】

おい、お前。そう、お前だよ。
「このスレおもろいから見てみ」「2ちゃんの歴史に残る名スレだぜ」とか言われてホイホイと
このhtml化されたスレを見にきた、お前のことだ。
どうだ?このスレおもしれーだろ。
でもな、お前はこのスレを読むだけで、参加することはできねーんだよ。
可愛そうにな、プププ。
俺は今、ライブでこのスレに参加してる。
すっげー貴重な経験したよ。この先いつまでも自慢できる。
まあ、お前みたいな出遅れ君は、html化されたこのスレを指くわえて眺めてろってこった。
レスを投稿する


ニューススポーツなんでも実況