2006-08-05 [長年日記]
@ [apache] Apache 2.2.3をインストール
この日記が動いているmod_proxyサーバを2.2.0から2.2.3にしてみました。というわけでいつもの覚書。
$ export CFLAGS="-O3" $ ./configure --prefix=/usr/local/httpd_proxy \ --with-mpm=worker \ --enable-shared \ --enable-so \ --enable-modules='rewrite action ssl host-alias proxy headers proxy_balancer proxy_http deflate' $ make # make install
実験的にコンパイルオプションに-O3付けてみましたが大丈夫かな。。。
2006-08-10 [長年日記]
@ [cpan] CGI::Session::Memcached
これが実装されたら結構喜ぶ人いるだろうなぁ。要望としては上がっているみたいだけど、放置されているのでしょうか?ちなみにApache::Session::Memcachedはある。
今実装したらヒーローになれる予感。
2006-08-11 [長年日記]
@ ループカウンタはなぜに i とか j?
for (int i = 0; i < max; i++) {
...
}
CやJavaを筆頭に、上記のようなfor文で使用されるループカウンタはなぜ i とか j という変数名なんだろう、とふと疑問に思ったので「ループカウンタ 変数名 i なぜ」でぐぐってみると
いや、きっとFORTRAN 77(もっと前のFORTRANからあったかも)からの伝統でしょう。
#FORTRAN 77ではi-nは宣言無しでIntegerだったので、ループカウンタとして非常によく使われています。
という解説が。なんとなく「単に短くてわかりやすいから?」かなぁと思ってたんですが、なるほど、FORTRANまで遡るんですか。ちゃんと理にかなった理由があって気持ちよく納得できました。
@ [perl] MakeMakerによるPerlプロジェクトのビルド
ExtUtils::MakeMakerについて。今風なやり方だとModule::Build使うんでしょうか。
2006-08-16 [長年日記]
@ [perl] CGI->redirectでSet-Cookieのヘッダーを出す
CookieでID管理するセッションに何かセットしてリダイレクト、という処理は良くあると思うのですが、この辺り自前でやるのはちょい面倒なのでCGIで出来ないか調べてみたところ、ドキュメントには載ってないっぽいのですが、下記のコードでリダイレクトのヘッダと共にSet-Cookieのヘッダーを出すことが出来ます。
use strict;
use CGI;
use CGI::Cookie;
my $q = CGI->new;
my $cookie = CGI::Cookie->new(
-name => 'hoge',
-value => 'VALUE',
-path => '/',
);
print $q->redirect(-uri => '/', -cookie => $cookie->as_string);
HTTP/1.x 302 Moved Date: Wed, 16 Aug 2006 09:20:52 GMT Server: Apache Set-Cookie: hoge=VALUE; path=/ Location: / Content-Length: 272 Connection: close Content-Type: text/html; charset=iso-8859-1 X-Pad: avoid browser bug
なんでドキュメントに載ってないんだろう。。。
@ [apache] mod_fastcgi -> mod_fcgid
mod_fastcgiよりもmod_fcgidの方が速いとあったのでこの日記を動かしているアプリケーションサーバのモジュールを変えてみました。確かにベンチレベルでは少し早くなったけど、体感的には変わらずという感じです。まぁIOが完全にボトルネックになってるんだったら関係ないんで、そこら辺のプロファイリングが必要そうな感じ。
2006-08-17 [長年日記]
@ [fswiki] URL生成関数を活用した標準プラグイン群
Wiki->create_url, Wiki->create_page_urlのメソッドってAPI上は定義されているけど全然使われてないよなー、{ページ名}.htmlみたいに対応させるのって結構色んなところ直さなきゃいけないなー、とか思っていたのですが、このパッチで全て解決!素晴らしいです。CVS上では取り込まれているらしいので早速週末ダウンロードしてみよう。
2006-08-20 [長年日記]
@ [apache] mod_cache,mod_disk_cacheで高速化
Apache 2.2からはそれなりに安心して使えるようなので、この日記を動かしているmod_proxyサーバに試しにインストールしてみました。staticに組み込むのもどうかと思ったのでDSOでコンパイル。
$ export CFLAGS="-O3" $ ./configure --prefix=/usr/local/httpd_proxy \ --with-mpm=worker \ --enable-shared \ --enable-so \ --disable-asis \ --disable-cgid \ --disable-proxy-connect \ --disable-proxy-ftp \ --disable-proxy-ajp \ --enable-modules='rewrite action vhost-alias proxy proxy_balancer proxy_http' \ --enable-mods-shared='ssl headers deflate cache disk_cache mem_cache'
ちなみにこの日記のサーバは↓みたいな感じでmod_proxyサーバとmod_fcgidサーバに分散されています。mod_fcgidサーバが生成した動的コンテンツをmod_proxyサーバでキャッシュしてしまおう、というのが今回の狙いです。
diary.lampetty.net ---> +-- mod_fcgidサーバ1
|
+-- mod_fcgidサーバ2
httpd.confはこんな感じで設定。
LoadModule cache_module modules/mod_cache.so
LoadModule disk_cache_module modules/mod_disk_cache.so
<IfModule mod_cache.c>
<IfModule mod_disk_cache.c>
CacheEnable disk /
CacheRoot "/var/cache/httpd_proxy/disk_cache"
CacheMaxFileSize 128000
CacheMinFileSize 64
CacheDirLevels 4
CacheDirLength 5
</IfModule>
</IfModule>
んで、キャッシュの設定する前と後で ab でベンチを取ってみました。以下はキャッシュ設定前。
$ ab -n 50 -c 3 http://diary.lampetty.net/ This is ApacheBench, Version 2.0.41-dev <$Revision: 1.141 $> apache-2.0 Copyright (c) 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Copyright (c) 1998-2002 The Apache Software Foundation, http://www.apache.org/ Benchmarking diary.lampetty.net (be patient).....done Server Software: Apache/2.0.55 Server Hostname: diary.lampetty.net Server Port: 80 Document Path: / Document Length: 23978 bytes Concurrency Level: 3 Time taken for tests: 43.483784 seconds Complete requests: 50 Failed requests: 1 (Connect: 0, Length: 1, Exceptions: 0) Write errors: 0 Non-2xx responses: 1 Total transferred: 1190600 bytes HTML transferred: 1175994 bytes Requests per second: 1.15 [#/sec] (mean) Time per request: 2609.027 [ms] (mean) Time per request: 869.676 [ms] (mean, across all concurrent requests) Transfer rate: 26.72 [Kbytes/sec] received (略)
キャッシュ設定後
$ ab -n 50 -c 3 http://diary.lampetty.net/ This is ApacheBench, Version 2.0.41-dev <$Revision: 1.141 $> apache-2.0 Copyright (c) 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Copyright (c) 1998-2002 The Apache Software Foundation, http://www.apache.org/ Benchmarking diary.lampetty.net (be patient).....done Server Software: Apache/2.0.55 Server Hostname: diary.lampetty.net Server Port: 80 Document Path: / Document Length: 23978 bytes Concurrency Level: 3 Time taken for tests: 2.642869 seconds Complete requests: 50 Failed requests: 0 Write errors: 0 Total transferred: 1214651 bytes HTML transferred: 1198900 bytes Requests per second: 18.92 [#/sec] (mean) Time per request: 158.572 [ms] (mean) Time per request: 52.857 [ms] (mean, across all concurrent requests) Transfer rate: 448.75 [Kbytes/sec] received (略)
ご覧の通り、43秒→3秒弱なので爆速です。ディスクにキャッシュするだけでもこんなに速いとは。20%ぐらい速くなればいいかなーなんて控えめに思っていたので本当びっくりです。あとは安定して動いてくれることを祈るのみ。
2006-08-24 [長年日記]
@ [cpan] HTML::Templateの便利な機能
Perlのテンプレートエンジンの一つにHTML::Templateというものがあるのですが、ドキュメントを今までちゃんと読んでなくって気付かなかった便利な機能があったのでメモ。
HTML::Template->new()に loop_context_vars というフラグをセットすると、
use HTML::Template;
my $tmpl = HTML::Template->new(
filename => 'hoge.tmpl',
loop_context_vars => 1,
);
$tmpl->param(list => \@somelist);
print $tmpl->output;
<table> <TMPL_LOOP NAME=list> <tr style="background-color:<TMPL_IF NAME=__odd__>white<TMPL_ELSE>#ffffdd</TMPL_IF> <td><TMPL_VAR NAME=hoge></td><td><TMPL_VAR NAME=fuga></td> </tr> </TMPL_LOOP>
みたいな感じ。
会社では当たり前のように使っているモジュールなのに、入社1年強でようやっと気付きました。。。よく使うモジュールのドキュメントは隅々まで読んどけ、ってことですね。
追記: $tmpl->param(list => @somelist); となっている部分を $tmpl->param(list => \@somelist); に修正しました。
2006-08-25 [長年日記]
@ LAMP vs. LAMP──mod_perlとmod_phpのパフォーマンス比較
なんかテストしている環境が微妙に古いのが気になります。あとmod_perlはModPerl::PerlRunを使ったのか、ModPerl::Registryを使ったのかが書いていないですねー。そもそも、あのレベルのプログラムでは偏った結果しか出ないと思われますが、それで出てきた結論が
PerlでもPHPでも、どちらでもよい。
って、、、いったいどうなんでしょう。
2006-08-29 [長年日記]
@ [perl] qr演算子
Perlでqrといういわゆる正規表現のパターンを生成する演算子があるのですが、これをrefしてみると'Regexp'というものが返ってくることを今日始めて知りました。
$ perl -e 'print ref(qr/hoge/),"\n"'; --> Regexp
これを利用すると
#!/usr/bin/perl
my @list = ('/index.html', qr#^/abc#, qr#^xyz#);
for my $pattern (@list) {
if (ref($pattern) eq 'Regexp') {
if ($ENV{REQUEST_URI} =~ $pattern) {
...
}
}
else {
if ($ENV{REQUEST_URI} eq $patern) {
...
}
}
}
みたいな感じで正規表現による部分一致とeqによる完全一致をごちゃまぜにリストに突っ込んでおけるのでちょっとだけ便利。
# kabayama [GJ!!!]
# おいぬめ [どもー。早速某サイトでも使いたいと思います(笑)]