UPS(無停電電源装置)を導入した

雷の多い今日この頃。そろそろ台風までバンバンやってくるわけで、subversion使ってin houseでコードのバージョン管理してたり、davでデータのやり取りしている今の状況では、自宅サーバーが落ちるのはかなり困る。

というわけで、家にもUPSを導入することにした。

とりあえず、家庭の財布に優しく10Kぐらいには押さえたい(制約というよりは規約と言っときたい)わけで、おのずと候補はAPC ES 500OMRON BZ50T のどちらかに絞られた。

まず、最初の選択肢は職場でも使ってるAPC社のES 500。フリーのUPS管理ソフトのapcupsdなんかはインストール慣れしてるし。でもES 500ってバッテリ交換も回収ないらしい、何でじゃ?バッテリの処分は結構面倒なので、うーん困る。

対するBZ50Tは約3kgと軽めだが(重いほうが心理的な安心感がある)、バッテリの交換にも対応している。ただし、Linux用のシャットダウンソフトがないのがちょっとな。ドライバなんか用意すればいいのにとか思ったりするが、SOHO向けなのかな?

結局

  • 瞬停対策がメインなので、自動シャットダウンがかからなくても我慢できる。
  • バッテリ交換、回収してもらわんとかなり困る。

という理由により、BZ50Tを購入

ProductName OMRON BZ50T UPS(無停電電源装置)

オムロン / ?円 ( 2004-05-29 )


バーチャルホストの設定状況を調べる

tracとかwiki用に新しいホスト名が欲しくてバーチャルホストを導入することにした。

apachectlだと、構文が正しいかどうかだけしかわからないが、

httpd -S

で、VirtualHostの設定状況を調べることができる。

興味ベースだけならpoundとかも触ってみたい気もするが。

eijiro.pl

plaggereijiro.plのソース眺めててFindBinとFile::Specの使い方を学んだ。

use FindBin;
use File::Spec;
use lib File::Spec->catdir($FindBin::Bin, '..', 'lib');

$FindBin::Binで実行されたスクリプトのpathを取得しておいて、File::SpecでOSに依存しないようにパスの組み立てをする。

確かに、use libと組み合わせて使うとスマートだ。

ちなみに、このスペックのマシンで、eijiro.pl用の内部データを作成するのに8時間ほどかかったが、コマンドラインでも辞書引けると何かと便利。

朝霧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とか違いがでるかな?うーん、やってみないとちょっとイメージできないかも。