markdownでコードを貼り付けるのは

markdownは行の先頭にスペース4文字を入れればcodeブロックになるので、

perl -ne 'print "    " . $_' file

とやった出力をblosxomのエントリにペーストしてるんだが、もうちょい楽な方法はないもんだろうか?
とか思った。

手軽にモジュールのバージョンを得る(Winで)

perlのモジュールのバージョンを知りたくなったときは、手軽にモジュールのバージョンを得る方法をよく使うんだけど、さっきActivePerlで同じことしたら動かなかった。

でなくて"でスペースを囲めばよいみたい

DBIx::Class version 999 required--this is only version 0.07002.
BEGIN failed--compilation aborted.

wikiを導入した

cgiじゃなく、phpとかでmarkdownが使えるwikiが欲しかったのだけど、ヨサゲなのがみつからなかったので、結局Kwiki入れた。(職場で)使い慣れているPukiWikiも考えたんだけど、やっぱKwikiのほうが色々遊べそうなので。

KeroWiki

Kwiki::Theme::Bluepoleのテーマ使って、Kwiki::DoubleClickToEditでダブルクリックでeditするようにしてる。

subversionでコードリーディング

ソースコードを読むための技術

ソースコードを読みなさい、あるいは読んでいく、という話題はわりとあるけども、どう読んだらいいか書いたものは見たことがない。プログラマならプログラムの読みかたは当然わかっているものだということなのだろうか。

しかし自分には人の書いたプログラムを読むことがそんなに簡単なことだとは思えない。プログラムを書くのと同じくらい、読むことにだって技術や定石があるはずだし、必要だと思う。そこで、コードをどう読むべきか、とりあえずは C 言語を前提として、無意識のうちにやっていることを明示的に整理してみる。

ソースコードを読むのはおもろいし勉強になる。で、学習の過程をとどめておくのにいい方法はないものかと思案していたら、plaggerのソース読みをtracで管理してたのを思い出して、僕もsubversionでやることにした(FC1だとtrac入れるのは面倒なので)。

最近色々ごちゃごちゃやってるグラフ関係のコードはC++が多いので、C++のコードリーディングをしてますが、subversionで管理するとなかなか調子が良いことがわかって満足。

あとはググっても興味をそそるサンプルが少ないので、なんか本でも買うかナァと思ってたら、mixiの[C言語とC++言語コミュニティ]が酷すぎる件に付いてであげられてたC/C++の課題丸投げメールマガジン『Perlクイズ』みたいで楽しかったり。

おい、丸投げしすぎだろうってのも結構あるけど、問題選べばいいだけ。あともうちっとC++の割合増えると嬉しいかも。

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 )


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はいいと思った。

belongs_toとhas_oneとmight_haveの関係

DBICのMLより

[Dbix-class] Difference between belongs_to and has_one

Belongs to is a child -> parent relationship Has one is a sibling <-> sibling relationship?

has_oneはちょっと違うんじゃないかと。

101号室より愛をこめてに詳しい解説があった。

家族の関係、核家族とか最近の4人家族のイメージだと

  • has_one,has_many
  • 親からみた子
  • might_have
  • 兄弟姉妹みたいな関係(いるかもしれんしいないかもしれん)
  • belongs_to
  • 子供からみた親の関係

ぐらいに捉えておけばいいのか。

h2xsからModule::Starterに変えた

最近テストファーストの楽チンさがわかってきた気がしてテストから書き始めるのが楽しい今日この頃。

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


いつもh2xs -AXnでモジュールを作成してたけど、なんとなくmodule-starterに変えようかと。

module-starterはh2xsと違ってboilerplateのテストが組み込まれているので、最初のmake testはいきなり失敗する。なんで、全OKを出すために、最初にPodのボイラープレートつぶしするし。その際、synopsisちゃんと考えながら、メソッドとかインターフェースとかとりあえずの形を念頭におけるのがいい。

最近のTDDの話も追っかけてて参考になった。Test::Baseも使おうと思った。

chemicho

昔作ったコードが気に入らなかったので書き直したら、そこそこ動くようになったので、Chemicho-0.01.tar.gzとしてダウンロードできるようにしておいた。これはPerlMolを使って実装された化合物にランダムに変異を入れていくツールで、例えば、H2Lでヒット化合物に修飾を軽く加えてみたりとかしてくれる、ケミストチックな小人さんに育つことを期待してるわけだ。

  • AddCarbon(メチル基付加)
  • Aromatize(ジエンを芳香環化)
  • DeAromatize(芳香環をジエン化)
  • DecreaseBondOrder(結合次数を減らす)
  • GenerateRing(環化)
  • Halogenize(メチルをハロゲンに)
  • IncreaseBondOrder(結合次数を増やす)

設定はYAMLで。

Generationは世代数で、cycleは世代で生成される化合物の数。ちなみに第0世代は親。例えばcycle3で第三世代まで発生させると3^3で27化合物で4世代目には3^4で81化合物できる。ランダムな置換の頻度はweightで変えられるようになってる。

reactionはSMARTS使ってこんな感じで反応させてる。

いまんとこ、変異用のモジュールが少ないのでバリエーションが少ないのだけど、これから増やす予定。あと、cycle間で重複を許しているのでこの部分は改善する。

TODO

  • コンバーター作成
  • c1ccccc1 をc1cscc1に変える
  • 極性基の導入、削除
  • エステル化
  • 芳香環に極性基の導入
  • その他
  • 重複チェック
  • オブジェクトをsmilesにしてsqliteで管理する
  • QSAR的なツールと絡めて、変異の頻度を自由に変えられるように。(例えばclogpがでかくなったら極性導入の頻度を高くしたり、MWTが大きくなりすぎたら、大胆に削るとか)
  • wikiかなんかにちゃんとしたドキュメントとか書く。