MeadowでPerlのデバッグ

今までデバッグ環境というものにあまりこだわったことがなくて、Meadowで書いてコマンドプロンプトでデバッグという作業環境だったが、Meadowにsvnクライアント(psvn)入れた勢いにのってperlのデバッグもMeadowでやってみようと。

ちなみに僕が使っているMeadowのバージョンは3.00-devで、cperl-modeは最初から用意されていた。 mode-compile.elはダウンローしてきて、適当なディレクトリに放り込む。

.emacsの設定

;; perl-mode -> cperl-mode
(defalias 'perl-mode 'cperl-mode)

;; mode-compile
(autoload 'mode-compile "mode-compile"
   "Command to compile current buffer file based on the major mode" t)
(global-set-key "\C-cc" 'mode-compile)
(autoload 'mode-compile-kill "mode-compile"
   "Command to kill a compilation launched by `mode-compile'" t)
(global-set-key "\C-ck" 'mode-compile-kill)

例えばこんな感じに6行目でわざとエラーがでるようなコードを用意する。

use strict;
use warnings;

my $name = $ARGV[0];

print hello $name\n"

デバッグするときにはCPerlモード上でC-ccでperlを実行させる(その際引数をきいてくるので必要に応じて入力)

perldebug

実行結果は下の画面に表示される。エラー行の表示されている領域をクリックすると実際のコードの該当行にカーソルが移る。

おー快適!

SWIGのシャドークラス

SWIG使ってフラクタル図形を書いた際にshadowってオプションをつけたのだけどよくわかってなかったのでちゃんと調べた(というか実用Perlプログラミングに書いてあったんだけど)。

C/C++のオブジェクトのメンバ属性、メンバ関数に対し、perlのハッシュ記法でアクセスできるようにするメカニズムだそうだ。

class Shape {
public:
    int x, y;
    int w, h;
    drwaw();
};
class Poligon : public Shape {
public:
    polygon(int x, int y, int w, int h);
    draw();
};

とやると

use Graphics;
$poly = new Polygon(10, 10, 30, 40);

print $poly->{x}, $poly->{y};

みたいにアクセスできるようにするオプションだそうだ。

ProductName 実用Perlプログラミング
スリラム スリニバサン
オライリー・ジャパン / ?円 ( 1998-11 )


IRCを始めてみたヨ

なんとなくIRCもという気運が高まってきたので、ここらでいっちょと思い立ったのが(何ヶ月前だっけ?)で、思い出したようにここ何日かいじってみてる。

ChatZilla使ってみたけど、他のクライアントも試してみようとLimeChatに替えてみた。

my に \つけるのありなのか

perlのデータ構造をDFSするモジュール探してたら、Data::Traverseというモジュールを見つけた。

で、ソースを眺めてたら、こんな記述が。

no strict 'refs';
local(*{$caller."::a"}) = \my $a;
local(*{$caller."::b"}) = \my $b;
use strict 'refs';

おーなんか気持ち悪い。

my $a;
\$a;

を縮めると

\my $a;

になるのか。

学習テスト

いまさら感があるが読んだ。

というか、エントリとか見ると欲しくなって書店に行くんだけど、売ってないんだよね(田舎ゆえに)。あと、うちの近くだと売ってるところが限られててちょっと足をのばさないと買えないという。

ProductName WEB+DB PRESS Vol.35

技術評論社 / ?円 ( 2006-10-21 )


テスト駆動開発のとこがやっぱ面白かった。特に興味をひいたのが5章の学習テストという未知のライブラリの調査、習得の為にテストを書くってやつ。

perlの場合だとモジュールにはtestがついてくるから、.tを読むとかモディファイしつつprove でテストすれば学習テストになるのかな。とか、そんなこと書いてないかナァと探したけどみつからなかった。perlの.tの面白い使い方もっとありそうなんだけどナァ。

と、色々探してる中で、プログラミング中に湧くアイデアを書き留めるというエントリは面白そう。僕もSKIP, TODOをアイデア置き場として使ってみよう。

ポスター出します

またもや、個人的ネタで恐縮ですが、今週末のスポッポファイアーのユーザー会でポスター出します(多分)。

しかも名前だけで発表はしないでうろうろします。単なる質問要員としてノミネート。

発表自体は、ITインフラ系構築ネタになる予定。明日から2人で作り始めます。Ajaxとかバリバリ取り入れてるので、そこらへんの話になるかなぁ。か、いわゆる(インフォマティクス的に)テックレイヤーの人達に如何にデータトラッキングの重要性とか、一元管理を浸透させたかとかそういう苦労話メインになるかなぁ。明日、オーバービュー書きながらどっちに転ぶか決めまする。

ホントは、スポッポファイア meets Ajaxとかいうネタがやれればよかったんだけど、手動かす暇なくて。僕の頭の中で腐りかけてル。

はな二歳

ウェットフードで豪華にお祝い。キャンドルに見立てたスティックチーズが二本刺さってる(U隊長作)

gSpan

テキストいじったり、化合物検索したりとグラフ構造いじることが多いのでgSpan をちゃんと覚えようと。

gspan-del.icio.us

DFS-CODEとか枝刈りのあたりとか断片的には理解できるけど、全体としてイメージできてないな。

ちゃんと理解するために、あとでperlで書いてみよう。で、 Chemruby使ってこんなこともやれるみたいなので、同じことをPerlMol使ってできないかなとか思った。gSpanPPで。

Jiftyはスイスイッと気持ちヨサゲ

DjangoTurbogears ってsql文を書いたりしなくていいので楽だナァと。djangoだとクラス定義して

$ python manage.py syncdb

ってやればいいし、Turbogearsも同様に

$ tg-admin sql create

でうまくやってくれる。で、そういえばYAPCJiftyもそんなこと発表してたのを思い出して、大量のモジュールと共にインストールしてみた。

練習用に使ったサンプルはJifty::Manual::Tutorial。ちなみにJiftyのバージョンは0.60912。

最初の流れはCatalystと違って、アプリケーションだけつくれば、ビューとかコントローラー作る必要ないみたい。いきなりモデルをつくりはじめるわけだが、もちろんデータベースの設定はSQL文など書かなくてよくて、

column title =>
      type is 'text',
      label is 'Title',
      default is 'Untitled post';

column body => 
      type is 'text',
      label is 'Content',
      render_as 'Textarea';

とハッシュっぽく記述しておいて、

jifty schema --setup

これだけ。あとはテンプレートまわりをいじるわけだが、僕の使ったバージョン(0.60912)だとwebではなくshare/web/だった。また、テンプレートシステムにMason利用しているので、実用Perlプログラミングなど読み返しながら。

ProductName 実用 Perlプログラミング 第2版
Simon Cozens
オライリージャパン / 3360円 ( 2006-03-01 )


%でperl式を挿入する場合%は行頭から始めないといけない(間にスペースとかをいれてはいけない)ことを理解していなくてちょっとはまった(下の部分)。

% while (my $post = $posts->next) {
 <dt><%$post->title%></dt>
 <dd><%$post->body%></dd>
% }

Masonってなんかphpっぽいな。今回Jiftyの触りしかいじってないけど、アプリ作成すると、オンラインドキュメントも一緒に作られるので、これを読むのがなかなか面白い感じ。あとMasonも暇があればなんかで使ってみよう。でもMason使うとビューとコントローラーの切り分けが曖昧になってきちゃうような気がするんだよナァ、、、

あーめんどうだ、テンプレートに直接書いちゃえ!

みたいな(うーん実際はどうなんだろうか)。

というわけで、一通りサンプルを作ってみて、感想を。Jiftyは(RoR,djangoもそうだけど)フルスタックなのでサクサク開発できそうで、なにより使っていて気持ち良い。

Catalystと使い分けできれば生産性は上がるかな。ちょっとしたもの作る場合にはJiftyはいいと思った。

MT距離ってのがいまいちつかめてない

CRANのNewsletterが更新されていたので、一昨日の帰りの新幹線の中で読んでたら、fingerprintっていうパッケージが追加されてた。

CRAN - Package fingerprint

This package contains functions to manipulate binary fingerprints of arbitrary length. A fingerprint is represented by an object of S4 class 'fingerprint' which is internally represented a vector of integers, such that each element represents the position in the fingerprint that is set to 1. The bitwise logical functions in R are overridden so that they can be used directly with 'fingerprint' objects. Distances metrics are also available. Fingerprints can be converted to Euclidean vectors (i.e., points on the unit hypersphere)i and can also be folded using XOR. Arbitrary fingerprint formats can be handled via line handlers. Currently handlers are provided for CDK, MOE and BCI fingerprint data.

CDKとかMOE,BCI用のハンドラがついてるようです。で、Similarity metricは何使えんのかな?とマニュアル読んでみると、

  • tanimoto
  • euclidean
  • mt
  • dice

の4つ。このなかで、MT係数って聞いたことないナァ。ちょっと調べてみたけどわからなかったので直接ソースを読んでみることにした。はじめてのパッケージイントロスペクション。

で読んでみたら、あー、Rのパッケージ読むの単なる食わず嫌いだったかも。思ったよりややこしいことはしてませんな、これからは積極的に読んだほうがいいかもと思った。

というわけで、ちょっとまとめておいた。前提としてフィンガープリントの共通のビットが立つかどうかを下の表であらわしておく。

fp1 bitありfp1 bitなし
fp2 bitありCB
fp2 bitなしAD

tanimoto

まずはわかりやすいタニモト係数から。

 dist <- c / (a+b+c)

dは考慮されない、つまりビットの立たないもの同士は類似とみなされない。

euclidean

dist <- sqrt((d+c) / (a+b+c+d))

ユークリッド距離はお互いビットが立ってないという情報も似ていると判断されるわけですな。

dice

dist <- c / (.5*a + .5*b + c)

diceの距離も基本的にはタニモトと一緒。僕はあまり使わない。

mt

size <- length(fp1)

t1 <- c/(size-d)
t0 <- d/(size-c)
phat <- ((size-d) + c)/(2*size)
dist <- (2-phat)*t1/3 + (1+phat)*t0/3

t1はc/(a+b+c)、t0はd/(a+b+d)とかける。phatは全フィンガープリントでのビットの立っている割合(ビットの密度)。ビットの密度を考慮してるのはわかったんだが、t1,t0の分母の意味がちょっと理解できてないかも(aとbの情報を考慮してんだろうな)。おそらくビットの密度に偏りがある場合にできるだけ補正できるような距離なのかなとか思った。タニモトにビットが立たない場合の情報の扱いを加えた感じか。

と、ここまで考えてやっと気付いた。

MTってもしかしてModified Tanimoto?

ビンゴだった。