16022006 静岡
久々に神龍いってみた。
いつもいつもワンタンメンを注文してしまう。というわけで、今回も。
麺はやや平べったくて、歯ごたえ少なめの麺。もうちょっと硬くてもいいかと思うが。スープはあっさりしてて好き。ワンタンのチュルチュルッっぷりも喉越しよいです。
中華鍋を振るう音が気持ちよく、
ああ、街の中華料理屋だなぁ
って思う。
15022006 perl designpattern
結城さんの本には、委譲と継承の二通りの方法が記載されていたが、その二つの違い(メリット、デメリット)がイマイチ理解できなかったので、ググって見ると、YukiWikiに。
継承はそのインスタンスのなかの変数を使用するのに対し、委譲では委譲先のインスタンスの中の変数を使用する。(この説明は単に動作の違いを言っているだけかな。) 継承はインスタンスの振る舞い方を規定し、委譲はインスタンスの実装となる。 インスタンスの振る舞い方が変わると、そのインスタンスを利用するほうにも影響が出る。 インスタンスの実装は、使われ方で変わるが、利用するほうには影響が出にくい。
なんとなくわかったような、わからないような。
継承はそのインスタンスのなかの変数を使用するのに対し、委譲では委譲先のインスタンスの中の変数を使用する
というあたりをよく考えてみるといいのだろう。
perlで確認してみると、 サンプルは委譲を使っているので、僕はちょっと継承を用いたperlサンプルを書いてみた。
main.plとBanner.pmはサンプルのものをそのまま使用。interfaceにあたるprinter.pmは使わなかった。
package PrintBanner;
use strict;
use base qw(Banner);
sub new {
my $class = shift;
my $string = shift;
my $self = $class->SUPER::new($string);
bless $self, $class;
}
sub printweak {
my $self = shift;
$self->show_with_paren;
}
sub printstrong {
my $self = shift;
$self->show_with_aster;
}
1;
結局AdapteeとTargetの違いの大きさで使い分ければいいのかな?このサンプルだとメソッド名しか変わってないから、委譲を使ったほうがすっきりするのだろうか?
このエントリは結城浩さんの本と、それに載っているサンプルをPerlで書いた例をみながら考えたことをメモってます。あとは、はてなの伊藤さんのjavascriptでの例も参考にしてます。 間違いの指摘とか、もっといいやり方教授してくれたらとても嬉しいゾ。
15022006
山歩きとか朝の犬の散歩とかしていると、色々撮りたいものが増えてくる。そんなわけで、久々に自分用のデジカメをゲットすることにしたヨ。
ターゲットは、携帯性のよいものというよりは、もうチョイ高級路線で、写真撮ってる気がするもの、でもあんまり高すぎないやつという条件で。いくつかの候補の中から二つに絞り込んだ。
光学3倍+800万画素(S80)か光学12倍ズーム+500万画素(S2IS)で、どちらもキャノン製品だが。
実物みないとわからんというわけで、近くの家電で実際に触ってみたけど、S80は手軽に持ち歩くようなコンパクトじゃなかった。これだったらEXILIMのほうが、、、
ってことで、S80の魅力が薄まったので、一度家に帰ってゆっくり考えてみることに。
やっぱ光学3倍ズームじゃ、ほんの近くしか取れないからなぁ
どうせ、持ち歩く気で携帯するんだから多少でかくても気にならんし、大口径レンズの12倍ズームのほうが面白いよナァ。あと手ぶれ補正もついてるし。
というわけで、Amazonでポチッとな。
Power Shot S2ISを購入です。
まだ到着してから二日もいじってないが、ズームも速いしマクロも綺麗に撮れるし、おおむね満足。
ただし、電池が単三電池四本ってのがどーもねぇ。ずっとEXILIM S1使ってたからクレードル式の充電+画像取り込みに慣れちゃってて、わざわざUSBケーブル挿したり抜いたりはとても面倒に感じる。
はなを撮ってみた。
14022006 静岡
ヨコゼキのブログをながめていたら、芝川に今昔というなかなかよさげな店があるらしい。それをU隊長に伝えたら、
あー今昔?あそこなかなか美味しいよ。行ったことなかったっけ?
なに!?僕は行ったことないですヨ。
というわけで、先週のお昼は芝川の今昔さんにお邪魔したわけだ。
くぐり戸くぐって中にはいると、古い民家を造り替えたっぽくてナカナカいい雰囲気。その代わりというか、、、、ちと寒い。
メニューはコース(予約)と弁当が二種類。今昔べんとうを注文
黒米のご飯に、右のほうは胡麻豆腐の揚げだし。ちびますの開きのと蕗のてんぷらが旨かった。おもてなしな感じの時にちょっと連れて行くと喜ばれるかもしれない。
結構満足したゾ。
14022006 music
ライブ音源らしく、臨場感あふれるこもった感じが気持ちいい。
Poor Leno (Istanbul Forever Take)は切なさはそのままで、モサモサボスボスとモッテカレ感50%増しな感じのドラムがヨイ。
ボードトリップには欠かせない一枚。
12022006 chemruby
早速0.9.3にあげて描画じゃ。
irb(main):001:0> require 'RMagick' => true irb(main):002:0> require 'chem' => true irb(main):003:0> mol = Chem.open_mol("diene.mol") ... irb(main):004:0> mol.save("rbtest.png") => [rbtest.png PNG 370x370 DirectClass 16-bit 8kb]
ヘテロも出るが枠もでる(140x140にリサイズした)。

あと、SDF読み込みのときに
となり、読み込み処理が行なわれないようです。sdfが良くないのか?はたまたメソッドか?irb(main):005:0> sdf = Chem.open_mol("test.sdf") => #<Chem::MDL::SdfParser:0xbf189a24 @input=#<File:test.sdf>>
あんま、エラー報告ばっかりしてもあらーんな感じなので、もうちょいまともな報告がでしたいなぁと。と、突然rubyも勉強しようと思い立って、近所の本屋に走ってrubyの本を買ってきたゾ(でもコレしかなかった)。
ルビイストへの半歩くらいを踏み出したかな?
週末かけてこの本は大体読んじゃったけど、これ以降は何を読んで勉強するのがいいのでしょうか?
ココのエントリでの構造描画は流れ的にChemrubyで描くべきなんだけど。
そもそも画像描画のステップには
が必要で、smilesのような座標情報のない形での構造情報は、何かで構造立ち上げしないといけない。chemrubyは立ち上げ処理できないらしいので、この作業は他の何かに任せるわけだ。 ちなみに、perlmolは芳香環が含まれない場合には、座標のついた形でmol形式に保存してくれるんだが、座標があったりなかったりとかはかなり使いにくいし、普通芳香環のない構造扱うことってあんまないでしょ?
な感じなので、CDKを使うのがデフォルト。
で、CDKで"OC=C-C=C"をmol形式にするとこうなる
CDK
5 4 0 0 0 0 0 0 0 0999 V2000
0.0000 0.0000 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0
1.2990 -0.7500 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
2.5981 -0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
3.8971 -0.7500 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
5.1962 -0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
2 1 1 0 0 0 0
3 2 2 0 0 0 0
4 3 1 0 0 0 0
5 4 2 0 0 0 0
M END
うまく座標が割り当てられてますな。これをchemrubyを使ってpngに変換するとこうなる
irb(main):001:0> require 'RMagick'
=> true
irb(main):002:0> require 'chem'
=> true
irb(main):003:0> mol = Chem.open_mol("diene.mol")
irb(main):004:0> mol.save("rbtest.png")

水酸基の情報が落ちてしまったヨ。
smilesから二次元座標を立ち上げるには、CDKを使う。openbabelとかperlmolはここらへんが未実装。
StructureDiagramGenerator sdg = newStructureDiagramGenerator(); sdg.setMolecule(someMolecule); sdg.generateCoordinates(); Molecule layedOutMol = sdg.getMolecule();
これで二次元座標が起こせる。
さらに、org.openscience.cdk.rendererで構造をpngやjpgに書き出せる。

でもCDKでも画像サイズを小さくするとサイズにあわせてダブルボンドの幅を小さくしたりフォントも綺麗に見えるように小さくなったりというような親切設計ではないんだよね。

こんな風になってしまうな。今回eclipse使ってjavaで書いたけど、今後はこれをjythonで書き直す予定ダ。
11022006 perlmol
PerlMolで化学反応のルーチンってどう書けばええの?と聞かれたことはないが、こんな感じで僕は書いてマスヨってことで、ひとつDiels-Alder反応をさせてみる。

適当に用意したこんな反応だ。
#!/usr/bin/perl
use strict;
use warnings;
use Chemistry::File::SMILES;
use Chemistry::File::SMARTS;
use Chemistry::Ring 'aromatize_mol';
#反応させる基質を用意
my $react1 = Chemistry::Mol->parse('ClC=C dienophile', format => 'smiles');
my $react2 = Chemistry::Mol->parse('OC=C-C=C diene', format => 'smiles');
#dieneとdienophileのパターンをSMARTSで定義
my $dienophile_pat = Chemistry::Pattern->parse("C=C", format => 'smarts');
my $diene_pat = Chemistry::Pattern->parse("C=C-C=C", format => 'smarts');
#まずおまじない
aromatize_mol($react1);
aromatize_mol($react2);
#生成物に名前をつけ,基質をくっつける。
my $name = $react1->name . "+" . $react2->name;
my $prod = Chemistry::Mol->new(name => $name);
$prod->combine($react1, $react2);
#dieneとdienophilieのパターンを探し、みつかったら各オブジェクトにマップ
$dienophile_pat->match($prod);
my @atom_map1 = $dienophile_pat->atom_map;
my @bond_map1 = $dienophile_pat->bond_map;
$diene_pat->match($prod);
my @atom_map2 = $diene_pat->atom_map;
my @bond_map2 = $diene_pat->bond_map;
#反応用の原子が揃っているかチェック
if ($atom_map1[0] && $atom_map1[1] && $atom_map2[0] && $atom_map2[3]) {
#結合の作成
$prod->new_bond(atoms => [$atom_map1[0], $atom_map2[0]], order => '1');
$prod->new_bond(atoms => [$atom_map1[1], $atom_map2[3]], order => '1');
#dieneとdienophileの結合次数を変える
$bond_map1[0]->order(1);
$bond_map2[0]->order(1);
$bond_map2[1]->order(2);
$bond_map2[2]->order(1);
my $smi = $prod->print(format => 'smiles', unique => 1, name => 1);
#SMILESで出力
print "$smi\n";
}
早速実行してみると、
$dareac.pl
OC1C=CCCC1Cl dienophile+diene
jchempaintで確認してみると

ちゃんと環まいとるヨ。
さて、スクリプトをくどくどと書いたけど、処理の流れは単純でわかりやすいのですヨ。
エッジとノードで表現するせいなんだと思うがマップされた結合と原子に対して処理するルーチンが結構煩雑になり気味で、デバッグは大抵ココに集中したりする。dieneの端っこ結合作ったら、pな軌道が隣り合うから間は二重結合になるだろって思うが $bond_map2[1]->order(2)って明示しないと、ラジカルとして表現されちゃったりとか。sp2,sp3の情報入れとけば自動で判別するようにできるような気がするが難しいのだろうか?
あとは、サンプルなのではしょってますが、この反応ではpara体も生成させることは出来ます。
#結合の作成 $prod->new_bond(atoms => [$atom_map1[0], $atom_map2[3]], order => '1'); $prod->new_bond(atoms => [$atom_map1[1], $atom_map2[0]], order => '1');
って書けばpara体出来上がり。
というわけで、普通は二通りの生成物を提示するんだろうけど、
Diels-Alder付加体の二つの置換基はオルト位/パラ位を占めるように位置選択的に付加することが有機電子論から経験的に予測される(オルト-パラ則)。詳細にはFrontier軌道のローブ係数を求めて比較することで説明がなされる。すなわち、下図のようにHOMO/LUMOの係数が大きい点同士が重なるように付加する。
とあるように、軌道の計算してやればどっちが出来やすいか予測することは可能なので、反応処理ルーチンにPyQuanteみたいな量子化学計算モジュールを組み込んで判断させてやれれば素敵かなぁと思っている。
10022006
ケモインフォマティクスの日本語の書籍が出ていることを知った。
というかかなり高くないか、コレ。内容どうなんだろう、うーん悩む。中見てからじゃないと手が出しづらいなぁ。
で、2005/02にでてるのに、ケモインフォマティックスとかchemoinfomatics とか書いてあるから、今まで検索してもヒットしなかったのね。
ざっと調べたらこんな感じでしたぞ(by google)
僕はケモ派だヨ。