webからインタラクテイブに蛋白質をいじるつもりだったが

今日は終日、javascript+activeXObjectでWEBからインタラクティブに操作できるビューアーがないか調べていたヨ。開発中が多くていまいちいいのが見つからないというか、javascriptもactiveXもほとんどいじったことがないでよくわからないというのが正直なところ。

pyMOLもcueMOLもスクリプトで制御できるのでWSHとかperlとかでガリガリやればできるとは思うんだがこれだとまぁ、インタラクティブではないよなぁ。

あー、javascriptとかactiveXまじめに取り組もう。

JavaScript

Perlだけじゃなくて、JavascriptとかPythonも覚えナキャってことで、ちゃんと本を買って読んでみました。

ProductName JavaScript
デイビッド フラナガン
オライリー・ジャパン / ?円 ( 2000-12 )


さらっと流しただけだが、なんとなくJavascriptがどういう言語なのかは理解した(つもり) でも、実際にクックブックとか見ながら手動かしてみないといけないなぁ。

DBICのSingleメソッド

というか、findとの違いがいまいち。searchは分かるのでいいとして、

DBIx::Class::ResultSet - Responsible for fetching and creating resultset. - search.cpan.org

Inflates the first result without creating a cursor if the resultset has any records in it; if not returns nothing. Used by "find" as an optimisation.

カーソルを作らずに最初の結果をインフレートする、ただし結果がない場合はなにも返さない。

じゃぁ、findって何?ってことになるわけだが。

findって主キーから探すときにしか使ってなかったけど、ユニーク制約かけてあるとこから探してもいいのね。知らんかった。

DBIx::Class::ResultSet - Responsible for fetching and creating resultset. - search.cpan.org

Finds a row based on its primary key or unique constraint.

singleだと

Return Value: $row_object?

と?がついているのに、findは

Return Value: $row_object

となっているということは、singleはオブジェクトを返すかもしれないし返さないかもしれないのに対し、findの場合は必ずオブジェクトが返ってくるということか。

じゃぁ、ユニーク制約はどこでどうすんの?ってことだけど、 add_unique_constraintにあるようにDBICに制約属性ふっておけばいいらしいので、DBICが制約が張られているのをチェックしてよきに計らってくれるのだろう。(確認してないけど)

というわけで、多対多とか一対多の場合に制約属性ふっておくと検索するときに楽になるのね。

cutとcolをいつも間違えてしまう

コマンドでちょっと列だけいじりたいときについcolと打ってしまう。

日経Linux [Linuxコマンド集] cut : テキスト・ファイルの各行から文節を取り出します

ファイルの各行から指定した文節を取り出す。取り出すとき,指定する数字は複数指定できる。また,"m-n"のように数字の間にハイフンを入れるとmからnまでのバイト,文字およびフィールドを指定でる。

Text::CSV::Simpleとか使って簡易コマンドつくると便利かもと思った。

DBICでprefetchとjoin

ありがたい。色々勉強になりました。

Hatena::Diary::Neko::kak 500 Internal Server Error - CatはしらんけどSledgeなら

基本コントローラーでRSを作りまくってstashにぶち込みまくって Viewの方で実際にクエリを実行する感じですね。

というわけでcookbookみながら悩んでみた。いじってるのは、こんな感じのテーブルなので、

多対多対多

user_bookmarksテーブルに対してイテレータをまわすことにした。 あとcatlystだとautoっていう最初(のほうに)に呼ばれるメソッドがあるので、そこにユーザーが存在するかどうかのバリデーション書いた。

sub auto : Private {
    my ($self, $c, $action, $username) = @_;

    $c->stash->{user} = 
      $c->model('PblDB::User')->single({name => $username});

    unless (defined($c->stash->{user}) || $c->req->path =~ m!^bookmarks/?$!) {
    $c->response->redirect($c->uri_for('/'));
    return 0;
    }

    return 1;
}

sub default : Private {
    my ( $self, $c ) = @_;

    $c->stash->{user_bookmark_it} = 
    $c->model('PblDB::UserBookmark')->search(
          {user_id => $c->stash->{user}->id},
          {       
             prefetch => [qw/user bookmark/],
             join => [qw/user bookmark/],
             order_by => 'me.id DESC'
           }
           );
}

あと、ユーザーバリデーションしてる件に関しては、

livedoor クリップ - Hatena::Diary::Neko::kak 500 Internal Server Error - CatはしらんけどSledgeなら

個人的には、バリデーションでユーザがいるかどうかはチェックしないなー。 そこでユーザの存在がわかっちゃうとあれかなと。まぁ、場合によるね。

とか

ってやった場合に、ユーザがいない場合にそんなメソッドがないよってエラーになっちゃうので、バリデーションしたというのが経緯なのだが、join使えば、

sub default : Private {
    my ( $self, $c, $action, $username ) = @_;

    $c->model('PblDB::UserBookmark')->search(
          {'user.name' => $username},
          {
             prefetch => [qw/user bookmark/],
             join => [qw/user bookmark/],
             order_by => 'me.id DESC'
          }
          );
}

と書けばよいのでこれでもいいかもしれんと思った。

あと、実際のサービスでそういった場合の処理はどうしてんのかなと気になったので僕が使っているSBSで調べてみた。

  • はてなブックマーク
  • トップページに飛ばされる
  • livedoor clip
  • unregistration.html
  • del.icio.us
  • エラーページ

ふむー。

桂キャンパスいってきた

学生の時にお世話になった教授が今年で退官されるのだが、主催のシンポジウムがあるので、最初で(おそらく)最後の桂キャンパスに行ってきた。

僕が卒業してから何年か経ってからキャンパスが移ったのだが行くのは初めて。

建物 建物

建物は綺麗、でも、、、、

京都タワーちっちゃすぎ

かなり田舎だ。僕の頃は百万遍のすぐ近くで、飲みに行くにも本屋に行くにも便利だった。よく理学部前の焼き鳥屋台でアホほど呑んでたっけ。あと、やたらと量の多いカレー屋もよく行った(ダブカツ中とかよく言ってたけどそれより上のレベルは食えんかった)。

あとは交通が不便で、京都駅からのバスって一時間に一本くらいしかないのな。余裕をもってでたつもりが結局タイトなスケジュールになってしまい。昼飯食い損ねたし、帰りもやたらシビアで、電車に飛び乗ったので結局、京都グルメはせずにただ行ってただ帰ってきただけになってしまった。

セミナー後の懇親会では10年くらいぶりの同期にあったりとか、よく一緒にzettai-mu行ったりした後輩にあったりとかしていろいろ話せて楽しかった。オープンソースのオフィスソフトにかかわってたりとか、プレステの超有名レーシングソフトのプログラマーしてたりとか、みんな頑張ってんだナァと刺激を受けた。

むー僕もブーたれてばっかいないでとりあえず前向きに頑張らんと。とりあえずは今シーズン中に540くらいいけるようになりたい。

というのは冗談で、まぁ僕もいろいろと頑張らねばと思った次第。


あと、ここでも出てたけど、いろんなとこで量子化学のできるヒトが欲しいって話を最近よく聞くけど、量子化学というか理論的にきちんと考察できるような人材を製薬企業(だけじゃないけど)が求めてるってのは、研究ロジックが発見的なものから工学的に制御していく(していくべきだ)って方向にシフトしつつあるのかなとか思った。

というようなことはFDAも言ってんだっけ?

ことひらのさぬきうどん

協和発酵前のことひらにうどんを。座敷があるのと、子供が小さくてもうどんなら一緒に食べれるので、饂飩屋は重宝する。

ことひら

駐車場は店の目の前にあるけど、狭いのでとめるのにちょっとくろうするポジションがあったりする。

野菜うどんは、いりこの効いた出汁に、野菜がいっぱい。檸檬が謎な感じを醸してるけど、実際は入ることでかなり引き締まる感じ。、まぁ、ポン酢とかそういうのりで。

野菜うどん

肉うどんは肉が甘く味付けしてあるので全体的にコクのある感じ。

今まで、ことひらでは肉うどんか海老天カレーうどんが一番だと思ってたけど、野菜うどんかなり美味かった。

ことひら

amon tobin

最近zeroDBを筆頭にニンジャとジャズトロばっか聞いてる。

amon tobinのbloodstone EPをiTMSで。

unjam ARCHIVE: Amon Tobin

2007年3月リリース予定のAmon Tobinの待望のNew Album「Foley Room」のメイキング映像が2本公開されていますが、いやいやいや、このセンスは驚愕に値します。 一見一聴、硬くて無機質っぽく思えるんだけど、肉感があって絶妙に艶かしいいぃぃぃ。

ビデオクリップもカッコよい。

Template Toolkitで正規表現マッチ

セッションのユーザー名と、パスに含まれているユーザー名が同じ場合にeditのリンクを出したいときとか、^/kzfm$みたいなマッチをさせたかったので調べた。

こんな風にmatchというメソッドを使うといいそうだ。

[% name = 'Larry Wall' %]
[% matches = name.match('(\w+) (\w+)') %]
[% matches.1 %], [% matches.0 %]        # Wall, Larry

Template ToolkitのVMethodってほかにも結構いろいろあんのね。

Image::Magickのリサイズ

FC5のyumでいれたImageMagick,ImageMagick-perlはCrop,Resizeしても正方形にならずに3:2のまま縮小されてしまう。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
#!/usr/bin/perl

use strict;
use warnings;
use Image::Magick;

my $i = Image::Magick->new;

$i->Read("test0.jpg"); # 640x480

$i->Crop(geometry => '480x480+80+0');
$i->Resize(geometry => '48x48');

$i->Write("test2.jpg");

バグか。FC6だと解消されてるみたいだけど。結局

$i->Resize(width => '48', height => '48');

と書くことで望む結果は得られたが、無駄に手間取った。