HTML::Selector::XPath::Simple

他のサイトをゴニョゴニョやって欲しいデータだけ抜き出すのに、Template::Extractとか正規表現つかったりするわけですが、今回HTML::Selector::XPathを使ってみた。

その流れでcpanサーチしてた時に、Simpleってのを見つけたが、これはHTML::TreeBuilder::XPathでHTMLをパースし HTML::Selector::XPathのCSS セレクタをXPath に変換して、ノードを探すってのをやってくれるげなモジュール。

というわけで、Hatena::Diary::Naoyaの例だと、

use strict;
use warnings;

use URI::Fetch;
use HTML::Selector::XPath::Simple;

my $id = shift or die "usage: $0 <id>";
my $res = URI::Fetch->fetch(sprintf 'http://b.hatena.ne.jp/%s/', $id)
    or die URI::Fetch->errstr;

my $selector = HTML::Selector::XPath::Simple->new($res->content);
my @nodes = $selector->select('ul.bookmarkinfo li.favorited');

printf "User '%s' is favorited from %d users\n", $id, $nodes[1];

で書けた、シンプル。

三島図鑑が三島のblogをアグリゲートしていて便利

早速、RSSリーダーに登録。ナイス、三島図鑑!

でも、RSSフィードはタイトル(エントリ、フィードともに)のあたりがちょっと微妙。どのblogのコンテンツなのかはっきりしないのがちょっと不便だけど、、、まぁフロー読みする分にはあまり問題ないかも。

AvogadroでPOV-Ray

POV-Ray でレイトレできるとやっぱ調子いい。

Avogadro

drkcore todo

やることリスト

  • trackback ping打てるようにしとく
  • Tagのサジェスト機能をつける
  • 二重投稿を防ぐ

SARの不確定性原理

構造活性相関(2D,3D-QSAR)とかで、アッセイ系の精度が気になって仕方がない。なんか生データはもちろんだし、さらに実験者の手技まで気になって数字をまともに受け取れない。

と同時に、構造も厳密に求めたくなり、量子化学計算でいちいち構造最適化しないと安心できない。

そんな感じで深みにはまっていった結果、一つの確信を得た。

活性の不確かさΔActを厳密に求めようとすると、構造の不確かさΔConfが増えていく、まだその逆も然り

これを、SARの不確定性原理と名付けてみた。

僕らは、予測モデルの精度を上げるために、厳密に活性コンフォメーションを求めたいし、ノイズのないアッセイデータを使いたい。でも常に、どちらかのノイズが邪魔をして満足のいく予測モデルはつくれない。

というわけで、QSARなんてばらつきを許容するような手法でやってるぐらいがちょうどいいのかもねーという結論に達し、同時にDrugDesignへのモチベーションがやや失せてきた。

という夢を見た。

ナナフシをみた

家の網戸に張り付いてた。

ナナフシ

そういえば去年もみた。子供のころは山の中で虫捕りばっかしてたけどナナフシを捕ったことは一度もなかったので、なんか嬉しい。なんといっても森の忍者!ナナフシですからな。

今の世知辛い世の状況だと、童心に返ってクワガタ捕りに林に入ると変質者と間違われて通報されるので困ると、職場のおっさんが言っていたのを思い出した。

Catalyst::Model::Net::Amazonでキャッシュ

昨日ちょっと気になったので触ってみた。

ヘルパーがあるので

script/myapp_create.pl create model Net::Amazon Net::Amazon

でモデル作成。yamlに

Model::Net::Amazon:
  token: 'amazon_token'
  locale: 'jp'

を設定して、Root.pmに

sub default : Private {
    my ( $self, $c ) = @_;
    my $ua = $c->model('Net::Amazon');

    my $response = $ua->search( asin => '4873112109' );

    if ( $response->is_success ) {
      $c->response->body( $response->as_string );
    } else {
      $c->response->body( $response->message );
    }

}

で、ルートにアクセスすると

[1] マーク ルッツ/デイビッド アスカー, "初めてのPython 第2版", 2004, ¥ 5,040, 4873112109

と表示される。あとは/ASIN/XXXXXXのURLでJSON返すようにすればMochikit(javascript)からいい感じで扱えるはず。うーんナイス!

さらに、Net::Amazonはキャッシュが使えるのでCatalyst::Model::Net::Amazonでもキャッシュを効かせたい。C::M::Net::Amazonに直接書いた。

use Cache::File;

use base qw/ Catalyst::Model::Net::Amazon /;

my $cache = Cache::File->new( 
                         cache_root        => '/tmp/amazon_cache',
                         default_expires   => '30 min',
                            );

__PACKAGE__->config(cache => $cache);

Net::AmazonがCache::Fileオブジェクトをとるので、このようにModelに直接書いたのだけど、cache_rootとかdefault_expiresを設定ファイルに追い出すことはできないのだろうか?

Catalystでamazonアフィリエイト

blosxomでいうところのawsxomみたいなのが欲しいんだけど、コントローラーからNet::Amazonを使ってASIN:XXXXXXっていう部分を直接書き換えるようにするのがいいのか、それともCatalyst::Model::Net::AmazonのModelと適当なクラス名を用意して、Javascript+JSONで扱ったほうがよいのだろうかと考えていた。

後者だとMochikitでいろいろやれそうな感じになってよさげな気がするが、後で試してみよう。

ブラッスリームギでカレー

三島のヤオハンのつぶれた跡地(ネクステージっていうの?知らんけど)に立った高層マンションの隣にあるみずほ銀行の細い通りにひっそりと、ムギは在る。

ブラッスリームギ ブラッスリームギのブラックベリー

ディナーは何度がいっているが、今回初ランチ。というのも、子育て優待カードが使えるということをU隊長が発見したからだ。子育て優待カードというのはここらへんの市町村が発行している、子供連れだと色々特典がつくというものだそうだ。ムギだと子供にオレンジジュースがもらえる。

普通にランチセットを頼もうと思っていたのに、メニュー見て何故かカレーを注文。

サラダ カレー

カレーはシーフードカレーで、温泉玉子がのってた。突き崩しながら食べていくとまろやかでうまい。

ジェラート

ジェラートはさっぱりな感じで重くなくていい。うちの子どもにも一個おまけしてくれた。ナイスっていうかかなりうまそうに食べてた。

はてなスターつけたヨ

個別のエントリのページでタイトルがエントリータイトルでなくDrkcoreとなっている部分を修正。あと、新規投稿をCtrl-.に変更。ちなみにDrkcoreはDrum'n'Bassのダークコアからとったわけですなこれが。

今回さらに、ピコピコ押す感がちょっと楽しげなはてなスター付けてみた。

はてなスター日記みながら、

Hatena.Star.headerTagAndClassName = ['h2','entry-title'];

で上書きかませばいいらしいんだけど、なんか上書きされてナイっぽい。

ので、Hatena.Star.EntryLoader.loadEntriesを上書きしたらOK。というより、サンプルちょこちょこといじって済ませた。かなりやっつけ。

Hatena.Star.Entry.Drkcore = new Ten.Class({
    initialize: function(doc) {
        this.doc = doc;
        var h2 = doc.getElementsByTagName('h2','title')[0];
        this.title = Ten.DOM.scrapeText(h2);
        var widget = \ 
        Ten.DOM.getElementsByTagAndClassName('div','widget_bottom',doc)[0];
        this.uri = widget.getElementsByTagName('a')[0].href;
        this.comment_container = \
        Hatena.Star.EntryLoader.createCommentContainer();
        h2.appendChild(this.comment_container);
        this.star_container = Hatena.Star.EntryLoader.createStarContainer();
        h2.appendChild(this.star_container);
    }
});

ただ、comment_conteinarとstar_conteinarをDOMの好きなところにぶら下げれば別にタイトルの隣じゃないところに持っていくことができるな(コメント欄とか)。