エラトステネスの篩のストリーム

HOPの6章は無限ストリームを扱っているのだけれど、SICPの無限ストリームの章にあるエラトステネスの篩が出てこないので書いてみた。

HOPだとcar,cdr,consがそれぞれhead,tail,nodeとなってるのでそれにあわせてある。promiseは計算を遅延させるためのクロージャ。

use strict;
use warnings;
no warnings 'recursion';

sub promise (&) { $_[0] }

sub node{
  my ($h, $t) = @_;
  [$h, $t];
}

sub head {
  my ($ls) = @_;
  $ls->[0];
}

sub tail {
  my ($ls) = @_;
  if(is_promise($ls->[1])){
    $ls->[1] = $ls->[1]->();
  }
  $ls->[1];
}

sub is_promise {
  UNIVERSAL::isa($_[0],'CODE');
}

sub drop {
  my $h = head($_[0]);
  $_[0] = tail($_[0]);
  return $h;
}

sub filter (&$) {
  my $f = shift;
  my $s = shift;
  until(! $s || $f->(head($s))){
    drop($s);
  }
  return if ! $s;
  node(head($s),promise {filter($f, tail($s))});
}

sub sieve {
  my $s = shift;
  node(head($s),
       promise {sieve(filter {$_[0] % head($s)} tail($s))});
}

sub upfrom {
  my ($m) = @_;
  node($m, promise{ upfrom($m+1)});
}

sub show {
  my ($s,$n) = @_;
  while($s && (! defined $n || $n-- > 0)){
    print head($s), $";
    $s = tail($s);
  }
  print $/;
}

my $primes = sieve(upfrom(2));
show($primes,300);

これで、素数のストリームが生成される。

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

ProductName Higher-order Perl: A Guide To Program Transformation
Mark Jason Dominus
Morgan Kaufmann Pub / ¥ 7,608 (2005-05-30)
通常24時間以内に発送

無限ストリームは楽しい

スキルの"見えない階段"

見えない階段って上ったことのあるヒトにしか見えないよなぁと。

perlの grep $_, @_;

HOP6.5でなんだコレは?と。($_,@_)なんてありなのかと思ったがどうも違った。

sub test {
  my ($h, @s) = grep $_, @_;
  print "h:\t$h\n";
  print "s:\t";
  print join ",",@s,"\n";
}

test(3,undef,1,4,5);

実行結果

h:      3
s:      1,4,5,

配列の中からundefを除く、($_,@_)っていう配列ではなくて grep {$_} @_みたいな感じのgrep tipsだった。

vxでタグが入れられるようにしてみた

Voxクライアントが便利だが、タグ付けできなくてちょっと不便なので入れられるようにしてみた。それぞれのエントリみると

<category term="test" label="test" />

みたいに組めばよさそうだったので、blog.nomadscafe.jpを参考に。

my $entry = XML::Atom::Entry->new;
$entry->title($title);
my $category = XML::Atom::Category->new(Version=>1);
$category->term('life');
$category->label('life');
$entry->category($category);
$entry->content($content);

これだと、なぜかタグが反映されない。なんでかなーと調べてたらSix Apartの野良プラグインにヒントが あった。

<dc:subject xmlns:dc="http://purl.org/dc/elements/1.1/">life</dc:subject>

が正しいらしい。なので修正したら動いた。

use constant NS_DC => 'http://purl.org/dc/elements/1.1/';

...

my $entry = XML::Atom::Entry->new;
$entry->title($title);
$entry->content($content);
my @tags = split /,/, $category;
my $dc = XML::Atom::Namespace->new( dc => NS_DC );
foreach my $tag (@tags) {
  $entry->add( $dc, 'subject', $tag);
}

オプションでタグを選べるようになった

$ vx -t 英語ネタ -c english,life "fortranner の goto は \
ロードランナーの穴掘り。たまに掘った穴に埋まる"

vx (Vox用のCLI)

vox用のCLIを作った。post用のURIはこんな感じで探した。本当はhttp://www.vox.com/services/atomにGETして返ってきたXMLをパースすんのがいいんだろうけど、これはそのうちやる。今回は直接指定した。

#!/usr/bin/perl

use XML::Atom::Client;
use XML::Atom::Entry;
use Getopt::Long;

# --- configure --- #
my $user = vox_user;
my $password = vox_passwd;
my $title = "'(my memo)";
my $PostURI = posturl;

# --- main --- #

GetOptions ("title=s"   => \$title);
my $content = shift @ARGV;

die "content not found\n" unless $content;

my $api = XML::Atom::Client->new;
$api->username($user);
$api->password($password);

my $entry = XML::Atom::Entry->new;
$entry->title($title);
$entry->content($content);
my $EditURI = $api->createEntry($PostURI, $entry);
print $api->errstr if $api->errstr;

これをvxって名前で保存しておく。以下使用例

$ vx "なんか思いついたことを書くとよさげ"

タイトルを変えたいときには

$ vx -t todo "ビリーでダイエット"

とか。

AtompubでVox用のクライアントを作ろうとしたが

自分のVox用にCLIが欲しくて、Atompubでつくろっかなと思ったので。

use Atompub::Client;
my $service_uri = 'http://kzfm.vox.com/library/posts/atom.xml';
my $client = Atompub::Client->new;
$client->username('xxx@gmail.com');
$client->password('mokyumokyu');

my $service = $client->getService( $service_uri );

さてこれがエラー。

$ perl atomc.pl
Bad Content-Type: text/xml at /usr/lib/perl5/site_perl/5.8.8/Atompub/Client.pm line 220.
Can't call method "collections" on an undefined value at atomc.pl line 14.

Atompub::MediaTypeあたりを触ればいいんだろうか?エンドポイント間違えてるだけだったりして、、、、

ちょっと興味があるのでソースを読んでみる。あとdraft-ietf-atompub-protocol-17.txtも併せて読む

追記 07.09.18

色々ボケてた。

rsd.xmlに記述されているAtomのAPIにGETしないといけない。

$ wget --http-user=user --http-passwd=XXX \
http://www.vox.com/services/atom

で戻ってきたxmlの中見てservice.postにPOST

ここへのPOSTはXML::Atom::ClientでもAtompub::ClientでもどちらでもOK

あめや鮨にいってきた

なんとなく、いってみたかったあめや鮨にコースを。

IMG_1309

3.5Kのコースは鮨+色々。結構満腹になる。

IMG_1302 IMG_1303

茶碗蒸しに胡桃が入ってたり、干し柿のマーガリン?詰めとか個人的にちょっとマッチしないんじゃないのかなぁと思うものもあったが、おおむね満足。料理の説明とか聞きたかったりしたいのもあったんだけど、二階は会合向けだからかしらんけどまぁそんな雰囲気ではなかったかも。おばちゃんは結構いい味出してよかった。

帰りに寄った三島大社の亀の多さにびびった。

IMG_1313

鯉の餌を取り合いしてた。

HOP 5章終了

三連休は読みまくった。あと、家族が留守のため集中できたので、再帰をイテレータに変えるという章を読み終えた。

ProductName Higher-order Perl: A Guide To Program Transformation
Mark Jason Dominus
Morgan Kaufmann Pub / ¥ 7,625 (2005-05-30)
通常24時間以内に発送

この章は後半が大変面白い。末尾再帰とかの話で末尾再帰にできればwhile,until,forみたいなループにすることができるって話題から、最後にフィボナッチ数みたいに再帰が複数ある場合に再帰を排除するっていうネタで10pageくらい割いてる。

特にフィボナッチから再帰を剥ぎ取る部分が非常に面白かった。再帰をperlの内部スタック表現を配列使って明示的に触れるようにすることで排除するヨっていう流れをステップバイステップで進んでいくんだけど、ついていくのに非常に苦労して、時には紙に書いたり、時には何度も読み返したり、そして時には犬の散歩をしたりと結局半日費やしたが、読み終えてそれだけの価値があったと思う。

次、無限ストリーム。楽しみな章。

Tough Guys Don't Dance / High Contrast

前作は僕的にいまいちだったのだけど、今作はイイ。特に後半

ProductName Tough Guys Don't Dance
High Contrast
Hospital / ¥ 2,352 (2007-10-01)
近日発売 予約可

  • Eternal Optimist (feat. J'nay)
  • Chances (feat. Linda Gail Lewis)

あたりの流れが好き。

High Contrastのアルバム買っといてアレだけどリキッドファンク~ってのは実は苦手。あのチャカチャカ感がダメだな。

第7回オープンバイオ研究会はビジュアライゼーション

おー、おもしろそうだ。

第7回オープンバイオ研究会

バイオインフォではゲノムからメタボロミクスまで幅広いデータを扱いますが、これらの大規模なデータを理解するためには適切なビジュアライゼーションと使いやすいユーザーインターフェイスが欠かせません。 そのような状況の中で、ネットワークの可視化を行う Cytoscape や、複雑な系のシミュレーション結果を可視化する E-Cell 3D など魅力的なアプリケーションが開発されてきています。また、Web2.0 時代を迎え AJAX などの技術を活用した効果的なインターフェイスも普及してきました。そこで、今回は「ビジュアライゼーション」にフォーカスを絞った研究会を開催したいと思います。

データの量と種類が増えたときに目という(中途半端な)デバイスにどうやって認識させるかというのはかなり興味がある。

ケモインフォだとなかなかSAR表から先にいかないのが不思議で仕方ない。多次元最適化とかいってexcelの表がZ列超えんのが普通なのに、、、よく読めるなと感心する。

あとbioflashとかどうなってるんだろうか?あれもAjaxよりも視覚にうったえる力が強いと思うので面白そうだなと思ってたんだけど。