RSOAP

Rをネットワークで使うには、CGIwithRで十分だろうと考えていたが、まぁいろいろあって(単にSOAPいじりたくなっただけともいう)RSOAPを入れてみることにした。

正直なところがパイソンいじったことがないので、ちょっと避けてたのもあるヨ。

用意するものは結構多い

  • fpconst-0.7.2.tar.gz
  • PyXML-0.8.4.tar.gz
  • logging-0.4.9.5.tar.gz
  • R-2.1.0.tar.gz
  • session_1.0.1.tar.gz
  • rpy-0.4.2.1.tar.gz
  • SOAPpy-0.11.6.tar.gz
  • RSOAP-1.1.3.tar.gz

まずRはrpyのために--enable-R-shlibオプションをつけてインストールしなければならない。ということで勢いtarボールから。

#./configure --enable-R-shlib #make #make install

いやー、Rのコンパイルは長い。RH4xあたりでのカーネルコンパイルくらい(古い?)こんなにかかるとは思わず、昨晩makeしたら、U隊長に大不評(僕のマシンは寝室においてあるので排気音とガリガリ音がうるさい)。で朝起きてからセッションいれとく。

#R CMD INSTALL session_1.0.1.tar.gz

tar xvfz して、パイソン関係のモジュールを順番に入れます。

#python setup.py build #su #python setup.py install

rpy だけちょっとメンドイ。まず、libR.soへのパスを通す。READMEだとbinに通してるけどlibでしょ。

#su #vi /etc/ld.so.conf ## /usr/local/lib/R/lib を記述 #ldconfig

ちなみに、setup.py も適当に書き換えないといけなかったりする場合もあるよ。-lR が見つからんぜよみたいなエラーの場合は、setup.py中の記述のbinをlibに変えるといい(まぁすぐわかる)。あとRのライブラリもtar xvfzする。僕の場合はR-2.1.0なので、

#tar xvfz R-2.1.0.tar.gz R-2.1.0/src/include #su #python setup.py install

最後にRSOAPのインストールは、普通

#python setup.py build #su #python setup.py install

ローカルでテストしたかったら、SimpleExample.pyというのを探してきて、ホスト名をlocalhostに書き換えておく。

#su #RSOAPManager

で、サーバーを立ち上げといて、別の端末から

#python SimpleExample.py

結果が戻ってくればOK

TCP/IPでやりたければ

#su #RSOAPManager --tcp-ip

ここまではうまくいったヨ。今朝、作業したわりには記憶が曖昧なので順番が前後してるかもしれん。

BiopythonはbioperlよりもPDBファイルの処理が速かった

みんなのpythonも読んだし、フレームワークでも試してみるかと、djangoとかTurbogearsに手をだしたら、火傷した。

djangoは一通りサンプル動作をさせることができたけど、Turbogearsはコントローラのあたりからさっぱりわからん。
いきなりフレームワークは無謀すぎたかなということで、Biopythonでも入れて、もう少しpython慣れすることに。

easy_install numpy

wget http://www.egenix.com/files/python/egenix-mx-base-2.0.6.tar.gz
python setup.py install

svn co http://www.reportlab.co.uk/svn/public/reportlab/trunk
python setup.py install

wget http://biopython.org/DIST/biopython-1.42.tar.gz
python setup.py install

easy_installはperlでいうところのcpanコマンドみたいで楽チンです(ちゃんと動けば)。動かないのは地味にダウンロード、展開、setup.pyを行なった。

さて、インストールも無事に終了したところで、bioperlと比べてみた。比較したのはpdbファイルの処理。というのは、FMO用のインプット作るときに使っているPDBパーザーつまりBio::Structure::IOがやたらと遅く、不満だったからというありがちな理由。

コードはこんな感じで、1fatっていうpdbファイル読み込んでCalphaを出力してみた。

python

from Bio.PDB.PDBParser import PDBParser

parser=PDBParser(PERMISSIVE=1)
structure=parser.get_structure("1fat", "1fat.pdb")
for model in structure.get_list():
    for chain in model.get_list():
        for residue in chain.get_list():
            if residue.has_id("CA"):
                ca_atom=residue["CA"]
                print ca_atom.get_coord()

perl

use strict;
use Bio::Structure::IO;

my $pdb_file = "1fat.pdb";
my $structio =  Bio::Structure::IO->new(-file => "$pdb_file",
                            -format => 'PDB');

my $struc = $structio->next_structure;
for my $chain ($struc->get_chains) {
    for my $res ($struc->get_residues($chain)) {
        for my $atom ($struc->get_atoms($res)) {
            print join " ",$atom->xyz,"\n" if $atom->pdb_atomname eq " CA ";        
        }
    }
}

で、ベンチマーク

$ time python test.py
real    0m1.161s
user    0m0.996s
sys     0m0.116s

$ time perl pdbtest.pl
real    0m3.183s
user    0m3.056s
sys     0m0.044s

平均とってないけど、何回か実行してみてもpythonのほうがbioperlよりも3倍くらい速かった。bioperlのコードってなんだかなと思うことがままある。pdb_atomnameなんかも4文字で前後にスペース入ってるし。というわけで、SBDD周りのプログラミングはbiopythonのほうが扱いやすい感じがしてる。

ProductName みんなのPython
柴田 淳
ソフトバンククリエイティブ / ?円 ( 2006-08-22 )


余談だが、Turbogears普通に触れる程度までpython覚えてやる(意地でも)とか思ったので、Dive Into Pythonも読み中。

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