Perl Debugger Pocket Reference

これ読んでブレークポイントの使い方がわかってデバッグが楽になった気がする。

ProductName Perl Debugger (Pocket Reference (O'Reilly))
Richard Foley
Oreilly & Associates Inc / 882円 ( 2004-01 )


Devel::Baysideで公開されてる資料もわかりやすくてよいですな。

PerlMolで構造分割

PerlMolにはseparateメソッドがあるので、SMARTSで適当にマッチさせて結合を壊してからseparateすると化合物の構造を分割できる。

芳香環の炭素原子とヘテロ原子の間を切って、分割した構造をsmilesで出力するスクリプトはこう書ける。

use warnings;
use strict;
use Chemistry::File::SMARTS;
use Chemistry::File::SMILES;
use Chemistry::Ring 'aromatize_mol';

my $SMILES = shift;
my $react = Chemistry::Mol->parse($SMILES, format => 'smiles');
my $SMARTS = 'c-A';
my $pattern = Chemistry::Pattern->parse($SMARTS, format => 'smarts');

aromatize_mol($react);
molsplit($react);

sub molsplit {
 my $mol = shift;

 if($pattern->match($mol)){
   my @nbd = $pattern->bond_map;
   my @nfg = $pattern->atom_map;

   $nbd[0]->delete;
   for my $fg (@nfg){
     my $hcnt = $fg->implicit_hydrogens();
     $fg->implicit_hydrogens(++$hcnt);
   }

   for my $frag ($mol->separate){
     molsplit($frag);
   }
 }else{
   print $mol->print(format => 'smiles', unique => 1, name => 1),"\n";
 }
}

試しにpioglitazoneを分割してみると

$ perl molsplit.pl "CCC1=CN=C(C=C1)CCOC2=CC=C(C=C2)CC3C(=O)NC(=O)S3"
CC      
c1ccncc1        
CCO     
c1ccccc1        
CC1SC(=O)NC1=O

オレオレamazon記法

Amazonのアフィリエイトにも対応した。

[ASIN : 4873112028]

という記法で、

ProductName Perlクックブック〈VOLUME1〉
トム クリスチャンセン,ネイザン トーキントン
オライリージャパン / ¥ 5,145 (2004-09)
通常24時間以内に発送

みたいな感じに。

utf8のprintデバッグ

perlで文字化けするときにutf8フラグが立ってるとか立ってないとかプリントデバッグすることが多い。特にCatalystいじってる場合とかはブラウザに表示させてる。

print utf8::is_utf8("知りたいもの") ? 'UTF-8 Flag' : 'not UTF-8 Flag';

Perl 5.8.x Unicode関連が参考になった。

HTML::Selector::XPath::Simple

他のサイトをゴニョゴニョやって欲しいデータだけ抜き出すのに、Template::Extractとか正規表現つかったりするわけですが、今回HTML::Selector::XPathを使ってみた。

その流れでcpanサーチしてた時に、Simpleってのを見つけたが、これはHTML::TreeBuilder::XPathでHTMLをパースし HTML::Selector::XPathのCSS セレクタをXPath に変換して、ノードを探すってのをやってくれるげなモジュール。

というわけで、Hatena::Diary::Naoyaの例だと、

use strict;
use warnings;

use URI::Fetch;
use HTML::Selector::XPath::Simple;

my $id = shift or die "usage: $0 <id>";
my $res = URI::Fetch->fetch(sprintf 'http://b.hatena.ne.jp/%s/', $id)
    or die URI::Fetch->errstr;

my $selector = HTML::Selector::XPath::Simple->new($res->content);
my @nodes = $selector->select('ul.bookmarkinfo li.favorited');

printf "User '%s' is favorited from %d users\n", $id, $nodes[1];

で書けた、シンプル。

Catalyst::Model::Net::Amazonでキャッシュ

昨日ちょっと気になったので触ってみた。

ヘルパーがあるので

script/myapp_create.pl create model Net::Amazon Net::Amazon

でモデル作成。yamlに

Model::Net::Amazon:
  token: 'amazon_token'
  locale: 'jp'

を設定して、Root.pmに

sub default : Private {
    my ( $self, $c ) = @_;
    my $ua = $c->model('Net::Amazon');

    my $response = $ua->search( asin => '4873112109' );

    if ( $response->is_success ) {
      $c->response->body( $response->as_string );
    } else {
      $c->response->body( $response->message );
    }

}

で、ルートにアクセスすると

[1] マーク ルッツ/デイビッド アスカー, "初めてのPython 第2版", 2004, ¥ 5,040, 4873112109

と表示される。あとは/ASIN/XXXXXXのURLでJSON返すようにすればMochikit(javascript)からいい感じで扱えるはず。うーんナイス!

さらに、Net::Amazonはキャッシュが使えるのでCatalyst::Model::Net::Amazonでもキャッシュを効かせたい。C::M::Net::Amazonに直接書いた。

use Cache::File;

use base qw/ Catalyst::Model::Net::Amazon /;

my $cache = Cache::File->new( 
                         cache_root        => '/tmp/amazon_cache',
                         default_expires   => '30 min',
                            );

__PACKAGE__->config(cache => $cache);

Net::AmazonがCache::Fileオブジェクトをとるので、このようにModelに直接書いたのだけど、cache_rootとかdefault_expiresを設定ファイルに追い出すことはできないのだろうか?

math perl

404 Blog Not Found:グラフィックに役立つ数学的事実

回転行列

これはたしかにグラフィックでめっさ使う。

perlだとMath::VectorRealMath::MatrixRealなのかな。

pythonだとSciPy

こういう計算はpythonのほうがやりやすい気がするけど、PerlMolでもやってるからなぁ。

TODO: PerlMolのソースを読む

Test::LectroTest

Perl Hacks読んでたら目にとまった。

ProductName Perl Hacks ―プロが教えるテクニック & ツール101選
chromatic
オライリー・ジャパン / 3150円 ( 2007-01-23 )


specification-based testing systemらしい。

Needle in the Haystackってあるように合致するすべての条件に対してテストするようだ。

境界条件とか考えなくてもいいのでとりあえずテストをつくりたいときとかにはいいかもしれん。

今の仕事だと、モデリング用のツール作ってるときとかにアミノ酸のキャッピング(N末端、C末端)のテスト書いたりとか,S-S結合の確認テストしたりとかに使えそう。

アミノ酸とか核酸だと組み合わせのテストしたいし、化合物いじってってもC,N,O,S,Fなんかの組み合わせテストしたいってこと多いし。

という感じでそのうち使ってみそうなのでメモ。

Want.pm

追突された車を修理に出しているので、ここ1週間以上、電車通勤。 もっと英語漬けをやったり、本を読んだりといつもの1.5倍はかかる通勤時間をフルに活用している。

で、今朝電車の中でパラパラとPerl Hacksをめくっていたら、

use Want 'howmany'

と。Wantって、wantarrayを一般化するモジュールらしい。

howmany()を使うと返すリストの要素が何個かわかったりと、呼び出し側がどんな値を返すことを期待しているかを知るための便利な関数セットって感じ。

ProductName Perl Hacks ―プロが教えるテクニック & ツール101選
chromatic
オライリー・ジャパン / 3150円 ( 2007-01-23 )


AtomPPがわかってきた気がする

「中途半端にでかいBlast」みたいなルーチンっぽいけど割とレスポンスタイムの長い仕事はTheshwartz->xmlrpcでwikiへ。という流れで省力化を図るのが定着してきて結構いい感じなんだけど、xmlrpcだと送り手も受け手もできることが限られちゃうので、図とか表みたいな補助資料を送るのが結構手間。

で、そういうことも考えるとAtomPPって良くできているよなぁとしみじみと。っていうかWikiこそAtomが必要かもんと思った。会社の中にいると図表のほかにもExcel,Wordを添付しないといけないからね。

あとは、旗ピラピラ~にどっぷりな会社だと

<link rel="alternate" type="application/msword" mmmmm />

なんつーのも必要だと思うのです。

イントラでWikiを入れてみて、まぁなんとなく感じるのはpdfのフォーマッタは要らんからwordで出力できないの?みたいな無言の圧力だったりする。