Perl Testing

perlのテストのやり方って、みんなどうやって覚えるんだろうか?と疑問に思ってる(今でも)。そっち系の会社だと教育みたいなのあるんだろうなとか?
でも、僕の場合は周りにプログラミングするヒトがいなかったので、テスト技法っていまいちよくわかってなかった。続・初めてのperlにもちょろっとしか書いてないし、あれじゃぁ、実際のテストコード書けるようにならんよなぁとか思ってた。そういうわけで、なかなかプリントデバッグから先に進まない。しかもよくわからんので、モジュールのソースは読むけど.tは読まんみたいな。

というわけで、テストは覚えたいけど、何を勉強すればよいのかわからんという状態だったが、最近、Perl Testingが色々なところで薦められていたのでこれはいかねばと、買って読んでみた。

ProductName Perl Testing: A Developer's Notebook (Developers Notebook)
Ian Langworth
Oreilly & Associates Inc / ?円 ( 2005-08 )


かなりわかりやすくて、さくさく読めた。事例から学ぶノートブックというスタイルで、最初のほうは基本的なことから始まり、徐々にデータベースのテストとかwebアプリのテストまで押さえてある。読み終えたら、あとはドンドコ書いて、cpanの.tをドンドコ読むと。

というわけで、最近は.tのファイルも読んでて楽しい。もちろんデバッグも楽になった。

planet chemoinformatics をちょっと修正

planet chemoinformaticsのRSS Auto Discoveryが微妙におかしい(/が抜けてた)ので修正。これで、livedoor readerとかbloglinesに登録できる。ま、直接rssを放り込んでも良いんだけど。僕はwebでほとんどみないので、デフォルトのテンプレートをいじって綺麗にしたいという欲求が沸いてこない(今のとこ)。だからRSSリーダーで読んだほうが良いと思うヨ。ちなみに、一日3回更新するように設定してます。

あと、docking.orgも追加した。rssが日付と本文を含まないので、Filter::EntryFullTextを書いてみた。

author: kzfm
handle: http://docking.org/.*?article\.pl\?
extract: (<TABLE WIDTH="100%" BORDER="0" CELLPADDING="5" CELLSPACING="0">
<TR><TD BGCOLOR="#FFFFFF">.*?                  </TD></TR></TABLE>)
.*?NAME="returnto" VALUE="//docking.org/article.pl\?sid=(\d\d/\d\d/\d\d)/\d+">
extract_capture: body date
extract_date_format: %y/%m/%d

なかなか快適になってきた。

InSilicoSpectro

プロテオミクス関係のモジュールCPANに登場しました。

  • Mass list file format conversions.
  • Protein modifications.
  • Protein sequences digestion with a large choice of possible enzyme types.
  • Peptide mass computations with fixed and variable modifications. Match with experimental PMF data.
  • Fragment mass computations for modified peptides and with neutral losses. Match with experimental MS/MS data. Possibility to define new types of fragments.
  • Text/graphical output in many formats of MS/MS spectra and match with experimental data.
  • Peptide HPLC elution time prediction.
  • Protein pI estimation.

pIは別にEMBOSSでも予測できるんだけどHPLC周りとかMS/MSなんかちょっと気になりますな。あとphenyxともなにが違うのかも気になるヨ

Mixinとpackage

Class::DBI::Loader::Relationshipが便利そうなので、ドキュメント眺めてたら、

Class::DBI::Loader::Relationship - Easier relationship specification in CDBI::L - search.cpan.org

This module acts as a mix-in, adding the relationship method to Class::DBI::Loader.

とかいう記述があったので、何してるんだろかとソース眺め。

結局Class::DBI::Loader::Relationship自体は何もしてナイっぽくて、Class::DBI::Loader::Genericの名前空間でrelationshipメソッドが記述されてた。

うーんpackageって同じ名前空間を複数回宣言していいのか?と不思議だったので、試したのが以下のコード。

package A;

sub a1_test { print "a_1\n";}
sub a2_test { print "a_2\n";}

1;
package B;

sub b1_test { print "b_1\n";}
sub b2_test { print "b_2\n";}

1;
package C;

sub c1_test { print "c_1\n";}
sub c2_test { print "c_2\n";}

1;
package A;

sub a3_test { print "a_3\n";}

1;

package Main;

A::a1_test();
B::b1_test();
C::c2_test();
A::a3_test();

で、実行。果たしてa3_testは呼び出されるんだろうか?

$ perl packtest.pl
a_1
b_1
c_2
a_3

うーん、これでもいいのね。

ただmix-inに関してはどっかから借りてくるのをmix-inって呼ぶのかナァと漠然と感じていたので、こういうやり方をmix-inと呼ぶのが, アイスクリームにアイスクリームを混ぜ込んでるみたいで、ちょっと不思議な感じがするんだよなぁ。

THE VOYAGE

メタモでやられたSLEEP WALKERよいです。

ProductName THE VOYAGE
Sleep Walker
ヴィレッジアゲイン / ?円 ( 2006-07-19 )


踊れるjazz、そして渋め。

  • AFLOAT feat.Yukimi Nagano
  • KAZE

が好き。

月とくるりと富士山のシルエット

朝霧jamに行ってきた。

2,3,4,6と四回目の朝霧だけど、一昨年よりも早く行ったにもかかわらず、キャンプサイトMがほぼ一杯。奥のほうにスペースみっけてテント張った。思い起こせば2003なんて(これまた同じくらいの時間帯だったけど)Mサイトなんてヒトもまばらで好きな場所取れたのに。富士ロックっぽくなってくるのはしょうがないのかもしれんにゃぁと。

さて1日目はクラムボン-INDIVIDUAL ORCHESTRA-くるり-JUSTICE-EROL ALKAN-MIRROR SYSTEM(触りだけ)という流れで。

BBQしているうちに、クラムボンが始まってしまい、聴けたのは終わりのほうだけ。まぁ、サラウンド聴けたからよかった。

一回テント戻って、更にBBQってから、INDIVIDUAL ORCHESTRA。やっぱ田中フミヤ最高。最後にhoodrumの曲かっこよすぎ。続いてRYUKYUDISKOは、ちょっとテクノすぎて、、、最近テクノあかんです。というわけで、くるりのほうへ。

くるりは最初の3曲凄かった。月がちょうど顔出して、富士山のシルエットが浮かびあがるというシチュエーションでくるりこれが一番感動した。

月

途中、けだるい曲が続いたので、くるりはそこで打ち切って、justice始まるまでちょっと寝た。

JUSTICE-EROL ALKANの流れが今回僕的にベスト。ケミカルブラザーズ聴けるなんて。盛り上がった。ってか、盛り上がりすぎてあんまちゃんと覚えてないナァ、

MIRROR SYSTEMはちょっと聴いててまったりしてきたのでテントに戻ってその日は終了。

結構防寒してたけど、夜がやたらと寒かった。登山用の寝袋必要だったかも。

二日目は、Chris Pierce-COOL WISE MEN-SOIL & "PIMP"SESSIONS-NIGHT JUNGLE-1945 a.k.a. KURANAKA

という、まったりめの構成で。soilがなかなかよかった。NIGHT JUNGLEの途中で帰ることにしたけど、どうしても、1945聴きたかったので、連れを待たせてムーンにちょっとだけ。低音最高。行っといてよかった。

赤富士

赤富士ってホントに赤いのね。今回はよく晴れてとても楽しかった。

抽選当たれば、来年も行きたいナァと思うが、マウントフジ・コーリング・イン・山中湖も気になる。

1 while てなんだヨ

どっかで、

1 while (unlink $file)

っていう記述を見つけたので、何これ?と調べてみたら定番だった。

数字に「,」をいれるには?

つまり、「~が失敗するまで~を続ける」という定番の 書き方ですね。

openbabelって簡易DBっぽくつかえるのね

知らんかった。Zincの drug-likeのsmiを使ってみた。200万件くらいあるので、結構でかめ。

babel druglike.smi -ofs

でインデックス作成する(結構かかる、athron3000+mem512Mで2時間くらい)。 インデックスが作成できたら、SMARTSで検索してみる。

$ babel druglike.fs -osmi -s 'N#Cc1cccc(F)c1C#N'
2 candidates from fingerprint search phase
C(#N)c1c(c(c(c(c1C#N)F)F)F)F    ZINC00155214
C(#N)c1c(c(c(c(c1C#N)F)F)N)F    ZINC01507036
2 molecules converted

おお、7秒くらいで結果を返すので結構速い。
っていうか、babelのwikiみたら書いてあった。

babelはIDで検索はできないようだが、これはsmilesをsqliteにでも突っ込んでおけばいいので、Catalyst使えばお家いじり用のcompounds_dbが出来上がるな。

plaggerでChangeLog(3)

少し色々やってみた。
CustomFeed::ChangeLog
Filter::ChangeLog

  • markdownのフィルターは教えてもらったplaggerのplugin使うように変更
  • clmemoのタグでフィルタリングするようなプラグインも用意した(とりあえずtodoだけGMailに送ればよいので)
  • Filter::BreakEntriesToFeedsでエントリ毎に送信
  • Filter::Ruleで重複チェックをしたいために、偽のpermalinkを生成するようにした。

というわけで、今はこんな設定で動かしてます。

plugins:
  - module: CustomFeed::ChangeLog
    config:
      changelog_file: /home/kzfm/clmemo.txt

  - module: Filter::ChangeLog
    config:
      tag: TODO

  - module: Filter::Rule
    rule:
      module: Deduped
      path: /tmp/dedupe-changelog.db

  - module: Filter::Markdown
    config:
      empty_element_suffix:  />
      tab_width: 4

  - module: Filter::BreakEntriesToFeeds

  - module: Publish::Gmail
    config:
      mailto:   kppppq@gmail.com
      mailfrom: kppppq@gmail.com
      mailroute:
        via: smtp_tls
        host: smtp.gmail.com:587
        username: kppppq@gmail.com
        password: ppppppppppp

これで、TODOのタグつけたアイテムのみGmailに送られるようになる。

2006-10-04 kzfm  <kzfm@teketou.com>
    * TODO: perl
    まるパーのcatalystの章激読み返す
    ====
    Jiftycheck

publishのプラグインを変えれば、blosxomもOK(下書き書いておくのに便利そう)。

さて、気になってるのは、重複チェックの為に用意した嘘っこパーマリンクは駄目だよなと。そもそもパーマリンクのないようなものを扱うのはどうしたらいいんだろうか?と。この際、wikiとかchalowみたいなのにpublishするようにしたほうがよいのか。

かなりやっつけなFilter::ChangeLogなんて作ったけど、ホントは既存のフィルタで対応できるんだろうなと。あとでちゃんとプラグイン調べないといけない。

変更検知して自動でplagger動くようにしたいが、POE使えばよいんだろか?またはmeadowだったらキーバインド指定しておくのが使いやすいんだろうか。

過去のエントリ