LWP::UserAgent::WithCache

ごくたまに、思いつきでLWPを使ったコードを書くことがある。そんな時は、wgetとかcurlで、対象のファイルをローカルに落として、ゴソゴソとテストを繰り返し、最後にLWPをくっつけるというちょっと無駄が多いやりかたをしていた。最近さすがに嫌になってきて、なんとなく気になっていたLWP::UserAgent::WithCacheというモジュールを使ってみた。

なんも考えなくてもキャッシュされるので便利!

キャッシュがある限りそれを読めばいいし~~
って、キャッシュの読み込みどうすればいいんじゃろか?

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
#!/usr/bin/perl

use strict;
use warnings;
use LWP::UserAgent::WithCache;

my %cache_opt = (
                'namespace' => 'lwp-cache',
                'cache_root' => "/tmp",
                'default_expires_in' => 60 * 60 * 24 * 7 );
my $ua = LWP::UserAgent::WithCache->new(\%cache_opt);
my $response = ua->get('http://www.potschi.de/svmtut/svmtut.html');

if ($response->is_success) {
    print $response->content;  # or whatever
} else {
    print $ua->{cache}->get('http://www.potschi.de/svmtut/svmtut.html')->{content};
}

$uaでできたcache::fileのオブジェクトを引っ張り出してきてgetしたのを出力させてみた。あんまりいい方法とは言えない気がするけどこんな感じでいいのか。

CDK使ったモジュールを書いてみた

Inline::JavaでCDKのニ次元構造立ち上げをperlでやれるようになったんだけど、やっぱuseして使いたいのでモジュール化してみた。

最初、Inlineでモジュールを書く方法の通りに書いてみたらエラーを吐いて動かないので、どうしたもんかと。
で、少し探してみたら、あまり深く考えなくて、普通にコンストラクタだけ用意してやればOKということらしい。

use 5.008008;
use strict;
use warnings;

our $VERSION = '0.01';

use Inline Java => "DATA";

sub new {
    my $class    = shift;
    return CDK::Simple::smi2mol->new();
}

1;

__DATA__
__Java__
import java.io.StringWriter;
import java.io.IOException;
後はjavaコードがジャヴァジャヴァと。

で、使ってみる。

my $parser = CDK::Simple->new;    
my $smiles_string = "C(=O)O";
print $parser->convert($smiles_string);

お~、モジュールだ。実行すると無駄にタメがあるのはjavaだから~。ところで、newでblessする必要はないのかな?とか気になる。

実際に作ってみて、Inline::Java使ったモジュールは意外に簡単だった。

PharmGKBはWeb ServiceAPIつき

PharmGKBAPIつきでperlのサンプルもある。

というわけで早速ダウンロードして動かしてみたけど、こんなデータのdetailにアクセスできないので、イマイチ使えん。半減期とかVdとかProtein Binding Dataとかにさくっとアクセスできればいいんだけど。

あと、perlのサンプルwsdl読みに行くようになってないんだよね(あるにも関わらず)。

use Data::Dumper;

$wsdl = 'http://www.pharmgkb.org/services/PharmGKBItem?wsdl';
$serv = SOAP::Lite -> service($wsdl);

my $res = $serv->searchDrug("PA452624");
print Dumper($res);

こんなんで、いいような気がするんだけど。

いまのとこdrugのエントリーが400ちょいしかないけど、もっとデータが増えてきてAPIも充実してくると面白そう。

相変わらずモナドが

モナドで躓いて以来、ちょっとご無沙汰していたhaskellだが、ちょっとまとまった時間ができたので、この週末でじっくり考えてみた。

モナドだけに、読むたび必ず睡魔に襲われる(参照透明性確保!)でも理解度はちょっぴり向上してるっぽい(つまり副作用)。

檜山正幸のキマイラ飼育記はjavascriptを例にして、純関数にすること(参照透明性の確保?)と型を揃えることが重要っぽいあたりが理解できた。
で、HaHaHa!では思考をもうチョイ広げて、とりまく環境の変化ということに思いをめぐらせればいいということを理解した。特に図がわかりやすくて、かなり理解が進んだと思う。
で、それから、実際にperlの例を見るとを~とか思う。

変数の代入をIOと考えればtieって参照透明性を確保しつつ、副作用を発生させることができるのね。この場合にいわゆるモナド則は成り立つのかなと考えてみたけど、なんとなく成り立つのかなと思ったり。

と、ここらへんまで理解した気になって、再度ふつうのhaskellを。

ProductName ふつうのHaskellプログラミング ふつうのプログラマのための関数型言語入門
青木 峰郎
ソフトバンククリエイティブ / ?円 ( 2006-06-01 )


なんとなくわかってキテルっぽいが、じゃぁ、MaybeモナドとかListモナドって何なのヨっていうか、モナドって一体何さ?っていうあたりがわからなくなってきた。さらにperlのtieなんかで実装できるってことは、モナド則っていうのは結局なんなのってのがよくわからん。

ふつうのhaskellに
モナドを定義の観点からみるならばモナド則がすべて
とあるように、モナド則を感覚で理解しなければならんのかな。

All About Monads

ほんとうにモナドを理解するには、モナドを使ったコードを経験することが最良 の方法です。

というわけで、コードを書こう。

朝霧JAMのタイムテーブル発表されましたな

朝霧JAM - It's a beautiful dayのタームテーブルが発表されましたな。

元ちとせ-くるり-ムーンステージになりそうだけど、INDIVIDUAL ORCHESTRA捨てがたいからずっとムーンかも。

二日目は最後までいるかナァ。いつも15時くらいに退散するので、最後までいると帰りがどうなるのか予測できん。

pydocって-pオプションでWebサーバーになるのね

pydoc って

pydoc -p 8020

で、ドキュメントのウェブーサーバーとして動くということを知った。あとは

from pydoc import writedoc
import os, sys
import os.path

sys.path.append("../lib")

writedoc('PyModule')

とかやるとドキュメントがhtmlで書き出されるのね。pythonはここらへんが標準なので使い勝手がよい。perlだと pod2htmlでよいが、サーバーはPod::Webserverをインストールして

podwebserver

で動かせるらしい。

これはperl hacksで知った。

ProductName Perl Hacks: Tips & Tools for Programming, Debugging, And Surviving
Damian Conway
Oreilly & Associates Inc / 2163円 ( 2006-05-30 )


最初、を~便利かもとか思ったけど、ブラウザ使わないでperldoc とかperldoc -m で端末から眺めるほうが一番な気がしてる。

FANNとperlバインディング

ちょっと遊んでみたくなってFast Artificial Neural Network LibraryPerl wrapperを入れてみた。

perlで割と簡単に書けるので、手軽にニューラルネットで何かをしたいときには重宝しそう。

他にもAI::NeuralNet::Simple(POEのヒトが作者っぽい)とかAI::LibNeuralとかAI::NNFlexとか探してみると結構ある。

Rのtempdirは変更できないっぽい

R-2.3.1を立ち上げると/tmp/RtmpXXXってな感じにテンポラリのディレクトリができる。

R 2.3.0 の変更点 - RjpWiki

The R session temporary directory is now set in C code using the same algorithm whether or not the shell front-end is used and on all platforms. This looks at environment variables TMPDIR, TMP and TEMP in turn, and checks if they point to a writable directory.

環境変数変えてみてもその下にRtmpXXXができてしまう。

> tempdir()
[1] "/tmp/Rtmpoo9Vt4"

tempdirでテンポラリのディレクトリを返すことはできるが、任意のディレクトリをセットすることができないし、Rを起動してからテンポラリのディレクトリを変更できなさげ。必要な関数を探すこつを見ながら組み込み関数探してみたけどやっぱないっぽい。

pythonモジュールのバージョンは

pythonモジュールのバージョンってどうやって調べるんだろうとか。
versionとかいう属性に統一されてると思ったんだけどそういうわけでもないのね。

>>> import rpy
>>> import re
>>> [x for x in dir(rpy) if re.search('version',x)]
['rpy_version']
>>> rpy.rpy_version
'0.4.6'
>>> import SOAPpy
>>> [x for x in dir(SOAPpy) if re.search('version',x)]
['__version__', 'version']
>>> SOAPpy.__version__
'0.11.6'

あと正規表現もモジュール読み込まないといけないのね。

追記

あ、別に正規表現使わなくてもfindでもいいのか。

>>> [x for x in dir(rpy) if x.find('ver') > -1]

perl5.8で日本語を扱うこと

昨日の続き

  • フォームが文字化け
  • 正規表現の部分がよくわからなかった。

丸ごとperlで紹介されていたDevel::Peekを使ってみた。MFPMによるとやっぱ、UTF-8フラグ探知モジュール的な使い方が多いのか。こういうのはプリントデバッグ的で好き。#の行が無駄に増えるけど。

ProductName まるごとPerl! Vol.1
小飼 弾
インプレスコミュニケーションズ / ?円 ( 2006-08-24 )


で後者の正規表現のマッチがよくわからんという部分は、mecabのパース$m->parseToNode($word)でutf8フラグがたたないことが原因だった。わかってみればそりゃそうだと思えるが。

my $n = $m->parseToNode($word);

while ($n = $n->{next}) {
    my $devword = decode("utf8",$n->{feature});
    #   if ($devword =~ /^\345\220\215\350\251\236/) { # 名詞
    #    if ($devword =~ /^\x{540d}\x{8a5e}/) { # 名詞
    if ($devword =~ /^名詞/) { # 名詞

        my $w = $n->{surface};
        print $w,"\n";
    }
}

use utf8しとけばx{540d}x{8a5e}でも名詞でもマッチした。なんとなく体で理解したっぽい。以下参考にしたページ。

で、前者のフォームが文字化けの部分はさっぱりわからん。どうも、HTML::Template通るときに文字化けしてるっぽい。うーん。