X

bbs.cgi再開発プロジェクト5

■ このスレッドは過去ログ倉庫に格納されています
04/12/20 07:38:07ID:KYFJjC4V
peko鯖の稼動によりボトルネックの一つである事がより明らかになった
bbs.cgi作り直しプロジェクトです。

【開発環境の工事現場】
また挑戦。@2ch掲示板  http://dso.2ch.net/myanmar/
また挑戦2。@2ch掲示板 http://dso.2ch.net/yangon/

関連スレなどは >>2-5 くらい
108ひろゆき@どうやら管理人 ★
垢版 |
04/12/22 12:32:47ID:???
リモホは参考程度でいいんでないすか?
結局はIPで作業するわけで、、
3回作業コストかけるのはもったいないような。。
109root▲ ★
垢版 |
04/12/22 13:05:28ID:???
>>108
ふむ。了解。
元のIPアドレスが内部的に記録されるんであれば、それで十分と。
110ひろゆき@どうやら管理人 ★
垢版 |
04/12/22 13:21:14ID:???
もしくは、fusianasanのときにIPも出すようにするとか。
111FOX ★
垢版 |
04/12/22 13:23:30ID:???
IP「も」ってことね、
やってみるかな、

問題があるとすれば名前欄の長さ制限かな?
04/12/22 13:27:14ID:hgyGSa7K
X_FORWARDED_FOR(だよね?)を使うのをやめるとか。
113FOX ★
垢版 |
04/12/22 13:28:51ID:???
fusiana の時だけ特例で「ちょっと」のばすとか・・・
04/12/22 13:30:29ID:hgyGSa7K
>>113
あー、それはいいかも。
現状でも長いホスト名の人だとfusianasanができないこともわりとあるし。
04/12/22 13:51:57ID:tTVdYtRU
fushianasanのIP(0.0.0.0)化ですか。
hostname知りたい人は各自でgetbyhostnameとかしてください。と。

いいんじゃないですかね。
116root▲ ★
垢版 |
04/12/22 13:57:13ID:???
>>115
生IPアドレス「も」出すってことなのではないかと。(>>111)
04/12/22 14:35:42ID:tTVdYtRU
>>116
>>114への反応なんですけどw
04/12/22 15:31:55ID:vJ+dVRH1
>>117
>>114>>113への反応なんですけどw
119動け動けウゴウゴ2ちゃんねる
垢版 |
04/12/22 17:11:27ID:SPbx5oi3

( ´,_ゝ`)プッ
04/12/22 17:18:36ID:Jfl3/xyi
つ▲
04/12/22 17:25:00ID:RRXo9eDP
っ▲

(゚〜゚)モグモグ


IP付きふしあなて名前欄じゃなきゃだめなん?
04/12/22 17:42:42ID:Px5MejiF
おっ!
04/12/22 18:35:23ID:tTVdYtRU
あのーそれは私が装備ですか?>>120
04/12/22 18:42:11ID:SyUueS0P
全部もらった!
04/12/22 18:44:22ID:tTVdYtRU
あらとられちゃったと。

以後はこちらで
質問・雑談スレ86@運用情報板
http://qb5.2ch.net/test/read.cgi/operate/1103460767/l50
04/12/22 21:42:05ID:HciIbquA
そういや mokorikomo はどうなったの?あれの復活だめなの?
127root▲ ★
垢版 |
04/12/23 03:32:58ID:???
携帯→2ch運用情報スレッド14
http://qb5.2ch.net/test/read.cgi/operate/1103457589/126-134

ということで、Vodafoneの携帯UAの変化にとりあえず対応したです。
128FOX ★
垢版 |
04/12/25 02:09:43ID:???
お題「SpeedyCGI(Perl)でタイムアウトはどう捕まえるの?」
129FOX ★
垢版 |
04/12/25 02:33:58ID:???
bbs.cgi のバージョン表記(各板のindex.html下部)に
SpeedyCGI=yes と表示したのは大失敗だった。
ぐーぐるに大量に引っかかる〜
130root▲ ★
垢版 |
04/12/25 02:37:16ID:???
>>129
うはは。
131FOX ★
垢版 |
04/12/25 02:46:40ID:???
世界中でさがしたら ロシア語ばっかり引っかかるし
途方にくれてきたぞ、
132素人
垢版 |
04/12/25 02:54:35ID:KlxOWqE1
表示設定をクリックするのだ。

(クリスマスじゃなくてHappy Holiday なんだなー。)
133FOX ★
垢版 |
04/12/25 02:54:57ID:???
> root ★さん

timeout の処理の実験するとき
たとえば bbs.2ch.net. のかわりに適当に
BBB.2ch.net. なんてのを使えばいいですかねぇ
134root▲ ★
垢版 |
04/12/25 02:57:47ID:???
>>133
それだと、すぐに結果が返っちゃうですね(ないよ、と言って)。

タイムアウトするようにするには、ひとつ子供のゾーンを切らないとだめです。
peko.2ch.netの下にわざとタイムアウトするドメイン名をひとつ作りますので、
それを使ってくださいです。
135FOX ★
垢版 |
04/12/25 02:58:57ID:???
わーい
136root▲ ★
垢版 |
04/12/25 03:04:14ID:???
timeout.peko.2ch.net ってのを作りました。
ここの配下は必ずタイムアウトします。

bbs.2ch.net のかわりに、timeout.peko.2ch.net をつけて
gethostbyname() するようにしてください。
137FOX ★
垢版 |
04/12/25 03:05:13ID:???
挑戦 !!
138FOX ★
垢版 |
04/12/25 03:06:08ID:???
ccc
139FOX ★
垢版 |
04/12/25 03:07:26ID:???
ccc
140FOX ★
垢版 |
04/12/25 03:08:08ID:???
timeout が timeout しないような。。。
141FOX ★
垢版 |
04/12/25 03:08:41ID:???
と 思ったら

このスレでテストしていた。

ぎゃふん
142root▲ ★
垢版 |
04/12/25 03:08:54ID:???
>>140
このコマンドどうなります?

dig -t a a.b.c.d.timeout.peko.2ch.net.
143root▲ ★
垢版 |
04/12/25 03:09:07ID:???
>>141
ありゃー。
144FOX ★
垢版 |
04/12/25 03:19:15ID:???
In start_perl, use a poll() timeout instead of an alarm to implement the timeout
while waiting for an accept. It's cleaner than a signal.

らしいんだが、Perlでpoll() ってどうやって使うんだ?
145root▲ ★
垢版 |
04/12/25 03:22:14ID:???
適当にGoogle。
http://perl.active-venture.com/lib/IO/Poll.html
146FOX ★
垢版 |
04/12/25 03:36:29ID:???
どもども
わたしもぐるぐるとぐるぐるしています
147root▲ ★
垢版 |
04/12/25 04:16:52ID:???
poll() っていうぐらいで、select() のように fd ベースでやる時に使うのかな。
とすると、gethostbyname() の待ちには使えないのかな。

んでは、どうすべきか。
148root▲ ★
垢版 |
04/12/25 04:17:32ID:???
待ちじゃなくて、タイムアウトでの抜け出しと。

今こうやっててうまく動かない、ってのを、
まずは書き出してみるといいのかも。
149root▲ ★
垢版 |
04/12/25 04:19:00ID:???
適当に貼ってみる。
http://www.futomi.com/lecture/signal/alrm.html
150root▲ ★
垢版 |
04/12/25 04:24:49ID:???
あと、これとか。これは逆引きの例かな。
http://www.tohoho-web.com/lng/199905/99050053.htm

ねむくなったんで、Googleの検索結果をそのまま貼ってみる。
http://www.google.com/search?num=50&hl=ja&c2coff=1&q=Perl+alarm+%E3%82%BF%E3%82%A4%E3%83%A0%E3%82%A2%E3%82%A6%E3%83%88&lr=
151root▲ ★
垢版 |
04/12/25 04:26:01ID:???
で、こういったalarm()を使う手法がSpeedyCGI配下では使えないとすると、、、さて、どうすべか。
ってことですね。
152FOX ★
垢版 |
04/12/25 04:42:42ID:???
>>147
いろいろ読んでみたけど
どうもそのようなんです < fd
153FOX ★
垢版 |
04/12/25 04:43:32ID:???
>>149

現在はそのまんまそれです
154root▲ ★
垢版 |
04/12/25 04:48:46ID:???
>>153
サザンさんバージョンですね。

この手法が使えないとすると、、、。
どうやるんだろう。

$SIG{ALRM} = \&timeout;

のところの指定を、SpeedyCGI 流にしないといかんのだろうか。

わたしは斜めにしか理解してないけど、例のグローバルバリュー問題とか。
まとはずれだったらごめんなさい。
155FOX ★
垢版 |
04/12/25 05:00:45ID:???
IO::POll はいわゆるハンドルだったら使えるみたい
たとえば IO::Socket で作ったオブジェクトのハンドル
もちろん IO::File で作ったファイルハンドル

IO::Socket でオブジェクト作って getHostbyName と等価なことできないのかしらん?
156root▲ ★
垢版 |
04/12/25 05:01:54ID:???
Net::DNS がよいと思います。
157FOX ★
垢版 |
04/12/25 05:02:40ID:???
>>154

たぶんシグナルは発生するんだと思うけど、、、
SpeedyCGI配下では伝わってこないんだと思う(推測)
よって捕まえることはできない、、

もしくは eval がどのようにコンパイルされているのかとか、
158root▲ ★
垢版 |
04/12/25 05:06:49ID:???
http://www.net-dns.org/docs/
http://www.net-dns.org/docs/Net/DNS.html

で、該当名のAレコードがあるかどうかというのが、
gethostbyname() と等価ですね。

tigerには入れてあるけど、bananaはどうかな。
ちょっとみてきます。
159root▲ ★
垢版 |
04/12/25 05:07:54ID:???
qb6には入ってますね。
たぶん、全banana/tiger/cobraで使えるでしょう。< Net::DNS
160FOX ★
垢版 |
04/12/25 05:08:07ID:???
Net::DNS あたりは
あらかじめタイムアウトの設定が入っているのかな?
そんな気がするが、
161root▲ ★
垢版 |
04/12/25 05:10:06ID:???
で、、、Net::DNS って、いわゆる Dynamic update にも対応してるから、
クライアント側からサーバ側へのダイナミックな登録
(例えばbbs.cgiからのダイナミックなDNS DBへの登録)とかも、できるはずですね。

もちろんその場合、サーバ側がDynamic Updateに対応している必要があります。
162root▲ ★
垢版 |
04/12/25 05:11:36ID:???
ここのサンプル見ると、入っているように見えますね。

http://www.net-dns.org/docs/Net/DNS.html

つか、まさにこれ?

Send a background query and use select to determine when the answer has arrived.
use Net::DNS;
use IO::Select;


my $timeout = 5;
my $res = Net::DNS::Resolver->new;
my $bgsock = $res->bgsend("host.example.com");
my $sel = IO::Select->new($bgsock);


# Add more sockets to $sel if desired.
my @ready = $sel->can_read($timeout);
if (@ready) {
foreach my $sock (@ready) {
if ($sock == $bgsock) {
my $packet = $res->bgread($bgsock);
$packet->print;
$bgsock = undef;
}
# Check for the other sockets.
$sel->remove($sock);
$sock = undef;
}
} else {
warn "timed out after $timeout seconds\n";
}
163root▲ ★
垢版 |
04/12/25 05:13:46ID:???
もう、わたし限界っす。

Net::DNS使う方針なら、たぶんかなりエレガントに書けるですね。
あとはマニュアル・ドキュメントを読んでいただけると、うれしいっす。

というか、こういうモジュールを柔軟に使えるのも、PIEに移ったおかげかもですね。
164FOX ★
垢版 |
04/12/25 05:14:28ID:???
tcp_timeout
print 'TCP timeout: ', $res->tcp_timeout, "\n";
$res->tcp_timeout(10);


Get or set the TCP timeout in seconds. A timeout of undef means indefinite. The default is 120 seconds (2 minutes).

udp_timeout
165FOX ★
垢版 |
04/12/25 05:15:02ID:???
ほいほーい

んではまた >>163
166FOX ★
垢版 |
04/12/25 05:15:29ID:???
>>164

http://www.net-dns.org/docs/Net/DNS/Resolver.html

ここよんでます
167root▲ ★
垢版 |
04/12/25 05:16:15ID:???
>>164
通常のDNSの場合UDP使っているので、UDPのタイムアウトも指定する必要ありです。
というかたぶん、>>162 の例をアレンジする方針がよさげ?

おやすみです。
168root▲ ★
垢版 |
04/12/25 05:18:47ID:???
>>166
はい、了解です。

でもなんか、糸口がつかめそうな予感。

banana238ですが、
live8 に激しく来た時もバッファ溢れしなかったし、
思い切ってバッファでかくしたのは、効果あったかも。
なにせCPUもディスクも遊んでいるから、もうちょっとあがいてみたいなと。
169FOX ★
垢版 |
04/12/25 05:29:45ID:???
ccc
170FOX ★
垢版 |
04/12/25 05:38:03ID:???
その1

これでうまく行った

use Net::DNS;
my $res = Net::DNS::Resolver->new;
$res->tcp_timeout(1);
$res->udp_timeout(1);
my $ans = $res->query($BHOST);

tcp/udp の timeout をそれぞれ 1(sec) にした。
0だとどうかなと思ってやってみたら、だめだった。
もっと短くする方法は無いものか
171FOX ★
垢版 |
04/12/25 05:52:16ID:???
http://www.net-dns.org/docs/Net/DNS/Resolver.html

ここの達人になるといいのかも、
172FOX ★
垢版 |
04/12/25 05:52:49ID:???
専用のサブルーチンを作った

sub foxDNSquery
{
my ($host) = @_;
use Net::DNS;
my $res = Net::DNS::Resolver->new;
$res->tcp_timeout(1);
$res->udp_timeout(1);
$res->retry(1);
my $ans = $res->query($host);
#we don't need answer.
}
173FOX ★
垢版 |
04/12/25 05:53:26ID:???
新スレ立ったとき

my $AHOST = "$GB->{NEWTHREAD}.$GB->{FORM}->{'bbs'}.$ENV{'SERVER_NAME'}.bby.2ch.net.";
&foxDNSquery($AHOST);
174FOX ★
垢版 |
04/12/25 05:53:56ID:???
全ての投稿(成功時)

my $BYTES = length($GB->{FORM}->{'MESSAGE'});
#my $BHOST = "$GB->{NOWTIME}.$$.$ENV{'REMOTE_ADDR'}.$GB->{NEWTHREAD}.$BYTES.$GB->{FORM}->{'key'}.$GB->{FORM}->{'bbs'}.$ENV{'SERVER_NAME'}.bbs.timeout.peko.2ch.net.";
my $BHOST = "$GB->{NOWTIME}.$$.$ENV{'REMOTE_ADDR'}.$GB->{NEWTHREAD}.$BYTES.$GB->{FORM}->{'key'}.$GB->{FORM}->{'bbs'}.$ENV{'SERVER_NAME'}.bbs.bbs.2ch.net.";
&foxDNSquery($BHOST);
175FOX ★
垢版 |
04/12/25 05:58:35ID:???
ここまでを全サーバに配布ー
176FOX ★
垢版 |
04/12/25 06:00:13ID:???
配布完了。
とくに苦情が無ければ BBS , BBY を落として
ちゃんとタイムアウトするかの実験が可能でーす > root ★さん
177root▲ ★
垢版 |
04/12/25 06:00:16ID:???
おふろ入ったら、ちょっと目がさめちゃった。
でももうねるる。

>>170
$res->bgsend って、どうなんだろう。
http://www.net-dns.org/docs/Net/DNS/Resolver.html
178root▲ ★
垢版 |
04/12/25 06:00:46ID:???
うわ、すごいー。

今、1秒バージョンですか。
179FOX ★
垢版 |
04/12/25 06:00:59ID:???
どなんですかね、
ぼちぼち研究してみるです
180root▲ ★
垢版 |
04/12/25 06:01:44ID:???
まずは、DNS queryがちゃんと出てるか、サーバのほうを見てきます(w。
181root▲ ★
垢版 |
04/12/25 06:05:21ID:???
BBS/BBYにはquery来ている模様です。
BBQとBBMはまだ元の状態ですか。
182root▲ ★
垢版 |
04/12/25 06:07:42ID:???
んじゃ、BBSを落としてみるかな。
これ書いたら、BBS止めます。
183root▲ ★
垢版 |
04/12/25 06:08:07ID:???
今、止まっています。
184root▲ ★
垢版 |
04/12/25 06:08:18ID:???
おぉ、いいかんじ。
185root▲ ★
垢版 |
04/12/25 06:08:54ID:???
6:10 まで止めておいてみよう。
186FOX ★
垢版 |
04/12/25 06:10:03ID:???
おおっ

>>181
BBQ,BBM 等答えが要る系はもちっと勉強してからになるです、、
187root▲ ★
垢版 |
04/12/25 06:10:53ID:???
>>186
なるほど、Net::DNS::Packetの解析方法すね。
ちょっぴりDNSの知識が必要すね。でもそんなに難しくないです。
188root▲ ★
垢版 |
04/12/25 06:11:08ID:???
んじゃ、BBS戻します。
189FOX ★
垢版 |
04/12/25 06:11:30ID:???
一回タイムアウト検出したら
その船からは二度と聞きに行かないという実装もありかもかも
190root▲ ★
垢版 |
04/12/25 06:11:51ID:???
戻しました。また、ひとつ進歩したですね。
191FOX ★
垢版 |
04/12/25 06:12:08ID:???
ですね、
192root▲ ★
垢版 |
04/12/25 06:12:44ID:???
>>189
二度と、はつらいかな。
しばらくの間、ってのがよさげ。

で、Net::DNS::Packetのやり方をちょっと書いておくです。
193FOX ★
垢版 |
04/12/25 06:12:58ID:???
#we don't need any answer.
だったっすね、
194FOX ★
垢版 |
04/12/25 06:13:23ID:???
>>192
寿命10分だし
195FOX ★
垢版 |
04/12/25 06:25:37ID:???
>>177
The program must なんたらが気になるっす
196root▲ ★
垢版 |
04/12/25 06:27:26ID:???
#! /usr/bin/perl

use Net::DNS;

my $res = Net::DNS::Resolver->new;
my $ans = $res->query('2ch.net');
@answer = $ans->answer;

print "address = ", $answer[0]->address, "\n";

BBQやBBMは、このパターンでOKかと。
というか、Perlぜんぜんわかんないんで、超みようみまね。
197root▲ ★
垢版 |
04/12/25 06:30:08ID:???
で、undefだったらBBQやBBMにはひっかかってなくて、
127.0.0.1だったらひっかかってる、って判定すればいいはず。
198root▲ ★
垢版 |
04/12/25 06:33:00ID:???
127.0.0.2 だった。
199FOX ★
垢版 |
04/12/25 06:33:20ID:???
はいはーい
明日以降挑戦してみるです、

それにしてもPerlの達人が居ればねぇ
200root▲ ★
垢版 |
04/12/25 06:39:53ID:???
たしかに、、、。

で、DNSのことは少しは知っているので、ちょっとやってみた。
なるほど、数はこうやってとればいいのね。
(c.2ch.netはアドレス2つ)

#! /usr/bin/perl

use Net::DNS;

my $res = Net::DNS::Resolver->new;
my $ans = $res->query('c.2ch.net');
@answer = $ans->answer;

print "count = ", $ans->header->ancount, "\n";

print "address = ", $answer[0]->address, "\n";
print "address = ", $answer[1]->address, "\n";
201root▲ ★
垢版 |
04/12/25 06:42:59ID:???
ということで、

undefになった場合 または undefじゃなくても、ans->header->ancountが0の場合

は、BBQ/BBMにひっかかってないとみなし、

ans->header->ancountが1以上で、配列の中身が127.0.0.2なら
BBQ/BBMにひっかかっているとみなせばいいのか。

ここまでわかれば、あとはFOXさんならすぐできるんじゃないかなと思います。

んでは、あとは明日にでも。
04/12/25 09:14:43ID:zOyY3ofo
すごく乗り遅れ?(泪)

では風呂入りますm(_ _)m
04/12/25 18:51:22ID:???
現在こんな感じ

use Net::DNS;
my $res = Net::DNS::Resolver->new;
$res->tcp_timeout(1);
$res->udp_timeout(1);
$res->retry(1);
my $query = $res->query($host);

my $adr = "ANS =";
if($query)
{
my @ans = $query->answer;
foreach(@ans)
{
$adr .= $_->address;
}
}
else
{
return "127.0.0.0";
}
04/12/25 18:54:06ID:???
my $query = $res->query($host);
の答えは Net::DNS::Packet でその中のanserが配列になっている模様。

my @ans = $query->answer;
foreach(@ans)
{
  $adr .= $_->address;
}

これは一個しかないという決めうちでコード書いたらまずい?
複数個あるならどれを見ればいいの?
205root▲ ★
垢版 |
04/12/25 18:54:57ID:???
よさげな気がするです。

で、127.0.0.2なら焼かれてて、127.0.0.0なら焼かれてないってかんじですか。
206root▲ ★
垢版 |
04/12/25 18:55:59ID:???
>>204
BBQ/BBMでは、Aレコード(IPアドレス)は1個しかないので、きめうちでOKです。
(DBをそういうふうに作っています)
04/12/25 18:58:37ID:???
了解でーす

整形してから実験してみよう。。。
04/12/25 19:00:34ID:???
くくく
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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