google videoのgvp形式のダウンロードがない?

SICPの4章とか読み始めたらDSLが気になってきてJesse Vincent - Abusing Domain Specific Languages for Fun and Profitをちゃんと見ようと。

で、気付いたんだがgoogle video playerってどうなっちゃったんだろうか?

まぁいいかってことで、mp4で落とそうとすんだけどなぜか10Mぐらいでこけてしまう。

perlでパスカル三角形

位置を指定するとその位置のパスカル三角形の値を返す。再帰で。

sub pascal{
 my ($n,$r) = @_;
 $n<2?1:$r==0?1:$n==$r?1:pascal($n-1,$r-1)+pascal($n-1,$r);
}

print pascal(0,0);
print "\n";
print pascal(1,0);
print pascal(1,1);
print "\n";
print pascal(2,0);
... 
print pascal(4,3);
print pascal(4,4);
print "\n";

三角形

$ perl pascal.pl 
1
11
121
1331
14641

この関数を利用して、最小完全ハッシュ関数を。

sub cn {
 my @table = @_;
 my ($hash,$n,$r) = (0,5,2);
 for (my $i=0;$n>$r && $r>0;$i++){
   $n--;
   $hash += pascal($n,$r--) if ($table[$i]);
 }
 return $hash;
}

が、「組合せ型の最小完全ハッシュ関数」の逆関数に持っていけなかった。再帰でパスカル三角形を右斜め下から左斜め方向に足していく組み合わせをつくっていって問い合わせの数値になったところのリストを返せばよいと思うんだけど、うまい書き方がみつからなかった。

塩を取り除くコマンド

職場でいつものようにGUIをチマチマいじってたら、隣で塩を取り除くコマンドがないっちゅよと困っていた。openbabelにあるんじゃねーの?どれどれと探してみたけどなかった。さらに、いやあるだろふつーはとかいってググってもcgiみたいなもんしかみつからなかった。

smilesだったら.でsplitしてゴニョればOKなんだけど、座標情報落っこちるから、perlmolとかopenbabelで実装して任意のフォーマットにできるようなコマンドが欲しい。

それを仮にwashmolとすれば

washmol -i input.sdf [-o out.smi]

みたいに。デフォルトではインプットと同じフォーマットで返すような、調子いいコマンドが欲しくなった。

僕は塩を取り除くのはwashと言ってるんだけど、desaltとか色々と呼び方があんのね。

perlでPageRank

動かないのでこっちに書いておく。

どう書く?のお題でPageRankの計算を解いてたんだけどうまく動かない。

use Math::MatrixReal;

my $data = {
           1 => [2, 3, 4, 5, 7],
           2 => [1],
           3 => [1, 2],           4 => [2, 3, 5],
           5 => [1, 3, 4, 6],
           6 => [1, 5],
           7 => [5],
           };

sub pagerank {
 my $data = shift;
 my $rows = scalar(keys %$data);
 my $mat = Math::MatrixReal->new($rows,$rows);;

 while(my ($i, $link) = each %{$data}){
   for my $j (@{$link}){
     $mat->assign($j,$i,1/scalar(@{$link}));
   }
 }
 #print $mat;
 $det = $mat->det();
 print "det: ",$det,"\n";
}

pagerank($data);

実行結果

$ perl pr.pl 
det: -0

detが-0ってことは、複素数の計算ができてないとかそういうことかなぁ。全然わからんので書きかけで放り投げた。

SICP 2章終了

今週は朝も夜も週末も集中して読めたため、2章を読み終えた。最後の2.5はなんかいい加減に読んだので後々読み返すことになりそうな気もするが。

ProductName 計算機プログラムの構造と解釈
ジェラルド・ジェイ サスマン,ジュリー サスマン,ハロルド エイブルソン
ピアソンエデュケーション / ¥ 4,830 (2000-02)
通常24時間以内に発送

p.109のメッセージパッシングとOOPって関連するよな。と思って調べてみたけどいまいちうまい表現が見つからなかった。

あとperlでOOPやるときのblessとmy $self = shift;みたいに第一引数が自分自身なのとperlのオブジェクトがblessされたハッシュリファレンスなこととか、もうすこしでちゃんと理解できそうな感じなんだけど、Perl におけるオブジェクト指向を読んでちょっと前進。

おもしろいですな、SICP

perlの標準モジュールを調べるには

どう書く?はじめました。kzfmだけど、いきなり標準モジュールでないautoboxでhello worldをといたのは不適切だったか(単に使ってみたかった)。

というわけで、標準モジュールの調べ方。

man perlmodlib

perlでaccumulate

最近朝起きてSICPを読んでる。で、SICPの2章も中盤を越えて、accumulateを使って行列の演算を定義した。

ふむーこれはpythonでやってみたいなと思ってたら、ちょうどタイミングよくpythonでやってる人がいた。

ので、perlで。

sub accumulate{
 my ($op, $init, $list) = @_;
 @$list == () ? return $init :
   return $op->(shift(@$list),accumulate($op,$init,$list));
}

my $test_func = sub {return $_[0]+$_[1];};
my $test_list = [1,2,3,4,5];

print accumulate($test_func, 0, $test_list);

で、SICPみたいに、たたみこむだけじゃなくてリストを戻したい。

my $cons = sub {return [@{$_[1]},$_[0]];};
XXX accumulate($cons, [], [1,2,3,4,5]);

List::Utilでも同じことできるみたいですが。自分で書いてみたかったということで。

perlで一気読みモード

すぐわすれるので、探した

my $data = do { local $/; <$file> };

あとでPBP読み返す。

ProductName Perl Best Practices
Damian Conway
Oreilly & Associates Inc / 2922円 ( 2005-08 )


日本語版も欲しいかも。

リストの要素の親の要素を知りたい場合

さて、bioinformaticsとかchemoinformaticsとか言われてるようなアレは、化学とか生物学に対して情報学的観点からアプローチしたりするわけです。こういう点から見ると、薬ってもんは蛋白質にうまいことはまる鍵みたいなもんで、蛋白質の穴にいい感じではまるような化合物を(コンピュータを駆使して)設計していくのが(コンピュテーショナルな)ドラッグデザイン(CADD)という分野だヨ。

で、蛋白質というものは複数のアミノ酸から構成され(100から数百)そしてアミノ酸は20種類程度存在し、それぞれ数十の原子から構成されているわけだ。要するに一対多の階層構造をとる。

protein -> amino-acid -> atom

みたいな。

蛋白質の階層

でそれぞれprotein aminoacid(aa) atomみたいなクラスを用意すれば

$atom1 = Atom->new({name => 'C1', type => 'C'});
...
$aa1 = AminoAcid->new({name => 'GLY', atoms => [$atom1, $atom2, ]})
...
$protein = Protein->new({name=> 'ProteinA', aminoacids => [$aa1,$aa2,$aa3...]});

みたいにそれぞれ配列に突っ込めば蛋白質を表現できて、あるatomオブジェクトを与えられた場合にそれがどのアミノ酸に属しているのか調べるのに

for my $aminoacid ($protein->aminoacids){
    for my $atom ($aminoacid->atoms){
        return $aminoacid if $qatom == $atom;
    }
}

みたいにdepthfirstで探索していけばいいんだろうけど、ちょっと探索効率が悪いので、atomオブジェクトに $atom->{parent} = $parent_aminoacidみたいに親のアミノ酸オブジェクト返すような属性追加したんだけど、これだと構造が複雑になってなんか気持ち悪い。

他にうまいやり方ってあんのかなと思ったお盆の夏2007。

pngのメタデータにmol形式の文字列を埋め込む

OSRAがええよとか言ってたわけだが、そもそも画像のメタデータに構造情報埋め込めばいいやん的発想なのがこのエントリ。

use Image::ExifTool qw(:Public);
use XXX;

$info = ImageInfo('rosiglitazone.png');

XXX $info;

で実行

$ wget http://depth-first.com/demo/20070801/rosiglitazone.png
$ perl etest.pl rosiglitazone.png 
---
BitDepth: 8
ColorType: RGB with Alpha
Compression: Deflate/Inflate
Directory: .
ExifToolVersion: 6.90
FileModifyDate: 2007:08:01 21:18:16
FileName: rosiglitazone.png
FileSize: 8 kB
FileType: PNG
Filter: Adaptive
ImageHeight: 109
ImageSize: 327x109
ImageWidth: 327
Interlace: Noninterlaced
MIMEType: image/png
PixelUnits: Unknown
PixelsPerUnitX: 1
PixelsPerUnitY: 1
molfile: |-
  name
  params
  comments
   25 27  0  0  0  0  0  0  0  0  0 V2000
      1.6910   -6.1636    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
      2.5571   -6.6636    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
      3.4231   -6.1636    0.0000 N   0  0  0  0  0  0  0  0  0  0  0  0
      3.4231   -5.1636    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
      2.5571   -4.6636    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
      1.6910   -5.1636    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
      4.2891   -4.6636    0.0000 N   0  0  0  0  0  0  0  0  0  0  0  0
    ...
   23 19  1  0  0  0  0
   22 24  2  0  0  0  0
   20 25  2  0  0  0  0
  M  END
...
  at etest.pl line 6

論文のpdfとかもこういう感じで画像を埋め込んでくれればちょっとはデータが取り出しやすくていいかも。