神龍

久々に神龍いってみた。

神龍

いつもいつもワンタンメンを注文してしまう。というわけで、今回も。

ワンタンメン

麺はやや平べったくて、歯ごたえ少なめの麺。もうちょっと硬くてもいいかと思うが。スープはあっさりしてて好き。ワンタンのチュルチュルッっぷりも喉越しよいです。

中華鍋を振るう音が気持ちよく、

ああ、街の中華料理屋だなぁ

って思う。

神龍

Adaptor ( デザパタPerl )

結城さんの本には、委譲と継承の二通りの方法が記載されていたが、その二つの違い(メリット、デメリット)がイマイチ理解できなかったので、ググって見ると、YukiWikiに。

委譲 - Delegation

継承はそのインスタンスのなかの変数を使用するのに対し、委譲では委譲先のインスタンスの中の変数を使用する。(この説明は単に動作の違いを言っているだけかな。) 継承はインスタンスの振る舞い方を規定し、委譲はインスタンスの実装となる。 インスタンスの振る舞い方が変わると、そのインスタンスを利用するほうにも影響が出る。 インスタンスの実装は、使われ方で変わるが、利用するほうには影響が出にくい。

なんとなくわかったような、わからないような。

継承はそのインスタンスのなかの変数を使用するのに対し、委譲では委譲先のインスタンスの中の変数を使用する

というあたりをよく考えてみるといいのだろう。

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での例も参考にしてます。 間違いの指摘とか、もっといいやり方教授してくれたらとても嬉しいゾ。

ProductName 増補改訂版Java言語で学ぶデザインパターン入門
結城 浩
ソフトバンククリエイティブ / 3990円 ( 2004-06-19 )


デジカメ購入した

山歩きとか朝の犬の散歩とかしていると、色々撮りたいものが増えてくる。そんなわけで、久々に自分用のデジカメをゲットすることにしたヨ。

ターゲットは、携帯性のよいものというよりは、もうチョイ高級路線で、写真撮ってる気がするもの、でもあんまり高すぎないやつという条件で。いくつかの候補の中から二つに絞り込んだ。

光学3倍+800万画素(S80)光学12倍ズーム+500万画素(S2IS)で、どちらもキャノン製品だが。

実物みないとわからんというわけで、近くの家電で実際に触ってみたけど、S80は手軽に持ち歩くようなコンパクトじゃなかった。これだったらEXILIMのほうが、、、

ってことで、S80の魅力が薄まったので、一度家に帰ってゆっくり考えてみることに。

やっぱ光学3倍ズームじゃ、ほんの近くしか取れないからなぁ

どうせ、持ち歩く気で携帯するんだから多少でかくても気にならんし、大口径レンズの12倍ズームのほうが面白いよナァ。あと手ぶれ補正もついてるし。

というわけで、Amazonでポチッとな。

Power Shot S2ISを購入です。

ProductName Canon PowerShot S2 IS PSS2IS

キヤノン / ?円 ( 2005-06-02 )


まだ到着してから二日もいじってないが、ズームも速いしマクロも綺麗に撮れるし、おおむね満足。

ただし、電池が単三電池四本ってのがどーもねぇ。ずっとEXILIM S1使ってたからクレードル式の充電+画像取り込みに慣れちゃってて、わざわざUSBケーブル挿したり抜いたりはとても面倒に感じる。

はなを撮ってみた。

はな

今昔

ヨコゼキのブログをながめていたら、芝川に今昔というなかなかよさげな店があるらしい。それをU隊長に伝えたら、

あー今昔?あそこなかなか美味しいよ。行ったことなかったっけ?

なに!?僕は行ったことないですヨ。

というわけで、先週のお昼は芝川の今昔さんにお邪魔したわけだ。

今昔

くぐり戸くぐって中にはいると、古い民家を造り替えたっぽくてナカナカいい雰囲気。その代わりというか、、、、ちと寒い。

メニューはコース(予約)と弁当が二種類。今昔べんとうを注文

今昔弁当

黒米のご飯に、右のほうは胡麻豆腐の揚げだし。ちびますの開きのと蕗のてんぷらが旨かった。おもてなしな感じの時にちょっと連れて行くと喜ばれるかもしれない。

結構満足したゾ。

今昔

LIVE EP-ROYKSOPP’S NIGHT OUT

ライブ音源らしく、臨場感あふれるこもった感じが気持ちいい。

ProductName LIVE EP-ROYKSOPP’S NIGHT OUT-(来日記念盤)(CCCD)
ロイクソップ
EMIミュージック・ジャパン / ?円 ( 2006-02-01 )


Poor Leno (Istanbul Forever Take)は切なさはそのままで、モサモサボスボスとモッテカレ感50%増しな感じのドラムがヨイ。

ボードトリップには欠かせない一枚。

Chemrubyネタ x 2

早速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にリサイズした)。

rbtest2

あと、SDF読み込みのときに

irb(main):005:0> sdf = Chem.open_mol("test.sdf")
=> #<Chem::MDL::SdfParser:0xbf189a24 @input=#<File:test.sdf>>
となり、読み込み処理が行なわれないようです。sdfが良くないのか?はたまたメソッドか?

あんま、エラー報告ばっかりしてもあらーんな感じなので、もうちょいまともな報告がでしたいなぁと。と、突然rubyも勉強しようと思い立って、近所の本屋に走ってrubyの本を買ってきたゾ(でもコレしかなかった)。

ProductName Ruby プログラミング基礎講座
広瀬 雄二
技術評論社 / 2079円 ( 2006-01-13 )


ルビイストへの半歩くらいを踏み出したかな?

週末かけてこの本は大体読んじゃったけど、これ以降は何を読んで勉強するのがいいのでしょうか?

CDKで吐かせたmolはChemrubyでの構造描画が?だヨ

ココのエントリでの構造描画は流れ的にChemrubyで描くべきなんだけど。

そもそも画像描画のステップには

  1. 2次元座標を保持したオブジェクトの生成
  2. 画像描画

が必要で、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")

rbtest

水酸基の情報が落ちてしまったヨ。

CDKで構造描画

smilesから二次元座標を立ち上げるには、CDKを使う。openbabelとかperlmolはここらへんが未実装。

StructureDiagramGenerator sdg = newStructureDiagramGenerator(); sdg.setMolecule(someMolecule); sdg.generateCoordinates(); Molecule layedOutMol = sdg.getMolecule();

これで二次元座標が起こせる。

さらに、org.openscience.cdk.rendererで構造をpngやjpgに書き出せる。

dopamine

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

dopamine

こんな風になってしまうな。今回eclipse使ってjavaで書いたけど、今後はこれをjythonで書き直す予定ダ。

Diels-Alder Reaction (PerlMol)

PerlMolで化学反応のルーチンってどう書けばええの?と聞かれたことはないが、こんな感じで僕は書いてマスヨってことで、ひとつDiels-Alder反応をさせてみる。

dareact

適当に用意したこんな反応だ。

#!/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で確認してみると

daproduct

ちゃんと環まいとるヨ。

さて、スクリプトをくどくどと書いたけど、処理の流れは単純でわかりやすいのですヨ。

  • 基質の用意と反応する部分構造のパターン定義
  • 生成物のオブジェクトを作成し基質を放り込む(combine)
  • パターンマッチさせたら、原子と結合に位置のマップ
  • マップされた結合と原子に対して処理
  • 結合新しく作ったり、切り離したり
  • 原子オブジェクトの削除とか

エッジとノードで表現するせいなんだと思うがマップされた結合と原子に対して処理するルーチンが結構煩雑になり気味で、デバッグは大抵ココに集中したりする。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反応

Diels-Alder付加体の二つの置換基はオルト位/パラ位を占めるように位置選択的に付加することが有機電子論から経験的に予測される(オルト-パラ則)。詳細にはFrontier軌道のローブ係数を求めて比較することで説明がなされる。すなわち、下図のようにHOMO/LUMOの係数が大きい点同士が重なるように付加する。

とあるように、軌道の計算してやればどっちが出来やすいか予測することは可能なので、反応処理ルーチンにPyQuanteみたいな量子化学計算モジュールを組み込んで判断させてやれれば素敵かなぁと思っている。

ケモインフォの日本語書籍

ケモインフォマティクスの日本語の書籍が出ていることを知った。

というかかなり高くないか、コレ。内容どうなんだろう、うーん悩む。中見てからじゃないと手が出しづらいなぁ。

で、2005/02にでてるのに、ケモインフォマティックスとかchemoinfomatics とか書いてあるから、今まで検索してもヒットしなかったのね。

ざっと調べたらこんな感じでしたぞ(by google)

  • cheminformatics : 216000
  • chemoinformatics :144000
  • cheminfomatics : 259
  • chemoinfomatics : 216

僕はケモ派だヨ。

© kzfm 2003-2021