朝霧JAMS'06行きます

今年は朝霧Jamの抽選が当たったので参加します。

02,03,04,06という感じになるかな。

dynamic_cacheプラグインで静的なキャッシュを

うちのマシンは非力でcgiの起動は結構負荷がかかるので、以前からどうにかしたいなぁと思っていた。いま使っているdynamic_cacheプラグインで、負荷軽減はかなりされたんだが、それでも最初にcgiを起動してしまうので、どうにかして静的なキャッシュの仕組みを作れないかと四苦八苦してみた。

現在、サーバーの設定は.htaccessでファイルとかディレクトリがない場合に、blosxom.cgiを実行するようになっている。

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ blosxom.cgi/$1 [L,QSA]

だから、blosxomのディレクトリとdynamic_cacheのキャッシュ先を一緒にすれば、キャッシュされたファイルは次回からは直接httpdにより処理される。

ここまでは以前試してあったのだが、これだと問題が3つある。一つは設定に関することで、残りの二つはプラグインをいじらないといけない問題だ。

  1. rootのindex.htmlとblosxom.cgiがバッティングしてえらいことになる。
  2. dynamic_cacheはヘッダーも含めてキャッシュするので、キャッシュ表示の際にContent-Typesとか表示されてしまう。
  3. recache=allでキャッシュディレクトリ以下のすべてのファイルが消去されてしまうため、キャッシュ先をルートに設定するとblosxomのサブディレクトリ以外の画像ファイルとかも消してしまう。

1に関しては先日発見した通りに適当なディレクトリを用意してそこにRewriteするようにすればよい。うちだとこんな感じ。

DirectoryIndex index.html
RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule   ^([^.].*)$        .bldir/blosxom.cgi/$1 [L,QSA]

で、残りの二つはdynamic_cacheプラグインを修正して対応。2はヘッダー除いて保存するようにdynamic_cacheを書き換えた。

    # キャッシュファイル出力
    if ($fh->open("> $cache_dir/$cachefile")) {
            $blosxom::output =~ s/^Content-Type: .*?; charset=.*?\r?\n\r?\n//;
            print $fh $blosxom::output;
            close $fh;
            logput("SAVE ");
    }

3に関しては、dynamic_cacheで使っているFile::Pathって知らなかった。
ドキュメント読んだら、消したいディレクトリとかファイルのリストのリファレンスを与えればよいらしい。
dynamic_cacheだとキャッシュ用ディレクトリを消すようになっていたので、ここを書き換えた。

    # キャッシュ全クリア
    # 【flavourの記述例】<input type="hidden" name="recache" value="all">
    if($recache=~/all/i){
        require File::Path;
        my @del_dir = map {$cache_dir . "/" .$_} ("Computer", "Etc", "daily", "Food",
                                                  "trekking", "index.rss10", "index.html",
                                                  "2004", "2005", "2006",
                                                  "index.rss", "index.xml");
        File::Path::rmtree(\@del_dir) and logput("CLEAR","ALL");
    }

こんな感じで、今のところ静的にキャッシュされている感じだが、このせいで、taggingプラグインみたいにgetで処理するプラグインが動かなくなってしまった。

これもRewriteRuleでうまく処理できるのだろうか?

Search::Estraierを使うことを考えたほうがよいかなと思ったりもしてるが。

Python Developers Campは近場開催だ

Python Developers Camp 2006 夏 参加者募集

9月末に静岡県富士市でPythonに特化した合宿を計画しています。プログラムもPython初学者向けの内容から、最近注目のLLフレームワークを題材としたスプリントなど、非常に多彩なものがそろっておりますので、Pythonにご興味のある方はふるってご参加ください。

Python初学者ってどのくらい参加するんだろうか。うーん、結構気になる。

perlでパイプつきopen文

今まであんまパイプ付きopen使わずに、system()とかbackticsばかりだったので、ちゃんと理解しておくことにした。

perlipc - Perl のプロセス間通信

open()関数は "-|" や "|-" といったファイル引数を非常におも しろいことを行うために受け付けます: これはあなたがオープンしたフ ァイルハンドのための子プロセスをfork()するのです。その子プロセス は親プロセスと同じプログラムを実行します。

if ($pid) {  # parent
    print KID_TO_WRITE @some_data;
    close(KID_TO_WRITE) || warn "kid exited $?";
} else {     # child
    ($EUID, $EGID) = ($UID, $GID); # suid プログラムのみ
    open (FILE, "> /safe/file")
        || die "can't open /safe/file: $!";
    while (<STDIN>) {
        print FILE; # 子プロセスの STDIN は親プロセスの KID
    }
    exit;  # これを忘れてはいけません
}

確かに、openした後は親子な処理になってます、waitって勝手にするんだろうか?おそらくするんだろうなと思うが、waitしてるかってどうやって確かめればよいんだろう?

また、ここまで理解すれば、次のサンプルもなかなかすっきりしてると思えるようになる。

日本語 perl texinfo - open

コマンド -' を用いてパイプを open する場合、 すなわち|-' または`-|' の場合、 暗黙の内に fork がなされ、 open の返り値は親プロセスでは子プロセスの pid、 子プロセスでは 0 になる。

||がif ($pid) {} else {}と同じだということはわかる。

open(FOO, "|-") || exec 'tr', '[a-z]', '[A-Z]';

ということはこの式も実はforkしているのか。

open(FOO, "|tr '[a-z]' '[A-Z]'");

あと、Higher-order Perlのp.152の例だとtacの出力を"|-"でつないでるんだよな。おかしいなぁと思ったらやっぱ間違ってた。ちなみにいま6章読んでる。

MOODORAMA

アマゾンのギフト券2K分を消費するために買ったんだけど、ドープ目(dark&ややnegative)でヨイ。基本的に低音が効いていて、上モノに綺麗なストリングス被せていって、オプションで嗄れ声がのっかっているような曲が好きなんです。

というわけで、特にラスト二曲最高デス!。

  • Mono Luu
  • Mindless Moments 3

Music for Collapsing People
Music for Collapsing People

「Cold Water Music - Air」とか「It's Only - Herbert」好きだと気に入ると思ふヨ。あーあと、lamb好きにもオススメ。ガブリエルで泣けるヒトに。

Cold Water Music
Aim

Import 2000-05-23
売り上げランキング : 56,733


Amazonで詳しく見る by G-Tools
Bodily Functions
Herbert

K7 2001-06-05
売り上げランキング : 5,620

おすすめ平均
コイツわっ!!
マシューについて
大人のハウス・ミュージック!

Amazonで詳しく見る by G-Tools

File::Remoteのファイルハンドルを動的生成したかった

rshが必要な古いマシンで動くプログラムって、引数にファイルをとることが多い。つまり、インプットファイルをリモートに書き込む必要があるわけだ。nfsマウントでもいいかもしれないが、fstabが無駄にごちゃごちゃしてくるので好きではない。潔くNet::FTPでもよかったのだけど、この際File::Remoteを使ってみた。

で、このモジュールはなぜか

use FileHandle ();
my $fh = FileHandle->new();
open($fh, "test.txt");
close($fh);

みたいな書き方ができないし、じゃぁこれでどうだと

        $rh->open(RH, ">remote:/tmp/$rfile") or die $!;

これはuse Strictしてると

Bareword "RH" not allowed

とか怒られる。で結局、下の感じでフニュケたコードになってしまった。

{ # Bareword "RH" "LH" allowed
    no strict 'subs';

    my $lh = File::Remote->new();
    $lh->open(LH, "$file") or die $!;

    my $rh = File::Remote->new();
    $rh->open(RH, ">remote:/tmp/$rfile") or die $!;
    local $/;
    my $f = <LH>;
    print RH $f;
    $rh->close(RH);

    $lh->close(LH);

}

どう使うのが賢いやり方なんだろう。

$rh->open(*RH, ">remote:/tmp/$rfile") or die $!;

とでもするのがいいのか?

Rでタンパク質の立体構造を扱う

Rで蛋白質の立体構造とか配列を扱えるパッケージをdel.icio.us経由で発見。

Bio3D: Home

Bio3D is an R package containing utilities for the analysis of protein structure, sequence and trajectory data.

Structure Biologyっぽい関数が多くて、MDの解析したりとか。あまり凝ったことはできないみたいだけど、Rからpdbのデータ読めるのはかなり便利。DistanceMatrix綺麗に描いてくれるだけでも、ちょっとした用途に使える。

> library(bio3d)
> pdb <- read.pdb(system.file("examples/1bg2.pdb", package="bio3d"))
[1] "HEADER    MOTOR PROTEIN                           04-JUN-98   1BG2              "
> k <- dm(pdb, selection="calpha")
> plot(k)

distance_matrix

この勢いで膜貫通予測とかできるようにならんかな。あとリガンドとのDistanceMatrixを作るにはマトリックス少しいじればよいかな。というか、こうやって作ったマトリックスそのものをfingerprintに変換してplsとかpcaとかにまわせられたら素敵かも。

この場合、CoMFAとか違いがでるかな?うーん、やってみないとちょっとイメージできないかも。

Net::Rshはrootでないと動かん

昔からkondaraで使ってたrshスクリプトをSOAP対応にしてもう少し使いやすくしたいと思ったんだが、、、

kondaraってSOAP::Liteモジュールが入らんし、5.8のコンパイルも通らん。しかもsshも入ってないので、Net::SSHもつかえん。

ただ、Net::SSHがあるってことはNet::Rshもあるかなあと探したらNet::Rshを発見。

こいつを使ってperlスクリプトを書いてみた。

書いてみたけどなぜか動かん。何故ー?と小一時間悩んだ結果

Net::Rsh - perl client for Rsh protocol - search.cpan.org

Rsh protocol requires that the program be run as root or that the program be setuid to root

うげ、これじゃ使えねぇとか思いつつrootで実行したらあっさり動いた。

結局、perlスクリプトでsystem関数使うのもアレなので、

my $cmd = "rsh $host $rsh_cmd";

open my($fh), "|-", "$cmd" or die $!;

while(<$fh>){
    print;
}

とかやったけど、|-とか-|とかちゃんと理解してないので調べないといけないゾ。

またもやblosxomの遅さが気になってきたヨ

ココ何日か、blosxomの遅さが気になりはじめてきた。クライアントでページを表示させるのに10秒以上かかると、さすがに遅いナァって思うし、サーバー状況をtopで眺めてると、5つくらいのblosxom.cgiでスワップしそうになるので精神衛生上もよくない。 やっぱ静的なキャッシュにしたいなぁという思いが強まってきた。とりあえず気休め程度にページングとかのキャッシュ対象にしていないプラグインをはずしてみたり、last.fmのやたらと遅いjsをやめてみたりしている。

以前dynamic_cacheで試した方法だとうまくいかなかったからなぁと何気に検索かけてみたら、

をを~cgiはドットなディレクトリに配置すればいいんだ

と。

昔参考にしたのにちゃんと理解してなかったヨ。

新しいサーバーはこの設定で動かしてみよう。

あと、google sitemaps使ってるけど、ヒットしないページが結構あるので、ついでに検索はSearch::Estraierに変更したい。

METAMORPHOSE

去年に引き続き、今年もいってきましたヨ、METAMORPHOSE 06ちなみに去年はこんな感じ1&2

今年は開場よりも30分ほど早い16時には着いたのだが、既に長蛇の列。

長蛇

去年よりも早く着いたのに、列長すぎ。
17時過ぎには入場できて、キャンプサイトを目指す。結構歩くといっても朝霧ほどじゃない。プラネットの近くが空いてたので、大体去年と同じ場所にテントを張った。

そして近くのミラーボール塔

ミラー

夜になると、スモークとかがバンバン噴出してきて、ちょっといい感じのスポットに。

去年はゴミがえらいことになっていて、場所貸すほう的にはイヤだよなとか話していたのだけど、今年も修善寺開催(ナイス)。今年はデポジット制(買うときに100円多く集めて、皿や空き缶等のゴミを持っていくと返金)だったので、去年と比べものにならないくらいゴミが少なくてよかったヨ。

というわけで、アーティストの感想など。

AKI

ムンベー好きにははずせない選択、もちろん最前列。AKIってハード目なのね。あっという間の30分。

GOTH TRAD

初めて聴いた。やばすぎ、カッコイイ。新鮮度的には今回一番。最初から最後まではしゃぎまくった。はじめのほうは、かっこいい曲かけるナァとか思ってたんだけど、レコードじゃないことにすぐ気付いた。

インタビューみっけたので読んだら、グライムなの?

うーん、グライム食わず嫌いだったかも。

SLEEP WALKER feat PHAROAH SANDERS

jazzのヒトって知らなかっただけに、テントから聴こえてきてうおー良すぎってなった(今回の連れは去年と一緒のjazz好きだったので)。しかもHMVテントでCD衝動買いしちゃったし。

井上薫

朝日が昇る前の井上薫はやばすぎ。しかも一眠りしてやたらテンション高かったし。人力ミラーボール回しとか雨上がりでちょっぴり気温がさがってたとか、今年のプラネットステージは白のヒラヒラが幻想っぽさを醸し出してたりとか、色々な要素があいまって、はまった。

ラストのcalmは気持ちよく踊れてたのだが、high tech jazzのあとにマッタリ曲が流れたあたりで、ちょっと疲れちゃったので最後を待たずにテントに戻って寝転がってたら、ソラーステージで演奏してたSUNSHINE JONEESがカッコよくて、いけばよかったかもとか。

百笑いの湯に寄って、反射炉の奥の三つ割り菊で蕎麦。田舎を注文

久々のうまい蕎麦。

フェス->温泉->蕎麦のパターンはイイ(ボード->温泉->蕎麦みたい)。