12042009 life
娘とお絵描きをして遊ぶために買ったんだけど、最近はメモをとるのに使っている。難点をいえば、USBのケーブルが邪魔。どうにかならんもんかね。
Inkscapeが便利

参考
12042009 life
やさしい Lisp の作り方 by Java and by C#を参考に書いてみる。リストの構成にはシンボルが出てこない。

名前を付けるということがちょっと分かったような気がした。
シンボルは Lisp の最も重要なデータタイプの一つです。「記号」とか単に「名前」または「識別子」とも呼ばれていました。
シンボルは (1) 1 個以上の値を持つことができる、(2) シンボル名により唯一性が保障されます。(2) の唯一性とは同じ名前のシンボルは同じであることを表しています。もっと正確に言えば、同じ名前のシンボルは、ある等価関数によって必ず T を返す、つまり等価であることを保障します。
とりあえず、動くとこを見たかったので、色々端折ってる。
package Moosp::Atom;
use Moose;
__PACKAGE__->meta->make_immutable;
no Moose;
1; # End of Moosp::Atom
package Moosp::Number;
use Moose;
extends 'Moosp::Atom';
sub str {}
no Moose;
1; # End of Moosp::Number
package Moosp::Integer;
use Moose;
extends 'Moosp::Number';
with 'Moosp::Sexp';
has 'value' => (is => 'rw',isa => 'Int');
sub add {
my ($self, $i) = @_;
my $new_value = $self->value + $i->value;
__PACKAGE__->new({value => $new_value});
}
sub subt {
my ($self, $i) = @_;
my $new_value = $self->value - $i->value;
__PACKAGE__->new({value => $new_value});
}
sub mul {
my ($self, $i) = @_;
my $new_value = $self->value * $i->value;
__PACKAGE__->new({value => $new_value});
}
sub div {
my ($self, $i) = @_;
my $new_value = int($self->value / $i->value);
__PACKAGE__->new({value => $new_value});
}
sub ge {
my ($self, $i) = @_;
if ($self->value >= $i->value){
return Moosp::T->new();
}
else {
return Moosp::Nil->new();
}
}
sub str {
my $self = shift;
return $self->value;
}
__PACKAGE__->meta->make_immutable;
no Moose;
1; # End of Moosp::Integer
package Moosp::Cell;
use Moosp::Nil;
use Moose;
has 'car' => (
is => 'rw',
default => sub{ Moosp::Nil->instance }
);
has 'cdr' => (
is => 'rw',
default => sub { Moosp::Nil->instance }
);
__PACKAGE__->meta->make_immutable;
no Moose;
1;
package Moosp::List;
use Moose;
use Moosp::Nil;
extends 'Moosp::Cell';
sub BUILD {
my ($self, $car, $cdr) = @_;
$self->car(Moosp::Nil->instance);
$self->cdr(Moosp::Nil->instance);
return $self;
}
sub serialize {
my $self = shift;
my $str = "(";
$str .= $self->car->serialize;
if (ref($self->cdr) eq 'Moosp::Nil') {
$str .= ")";
}
elsif (ref($self->cdr) eq 'Moosp::List') {
$str .= " " . $self->cdr->serialize . ")";
}
else {
$str .= " . " . $self->cdr->serialize . ")";
}
return $str;
}
1; # End of Moosp::List
my $int3 = Moosp::Integer->new(value => 3);
my $int5 = Moosp::Integer->new(value => 5);
my $list = Moosp::List->new();
$list->car($int3);
$list->cdr($int5); # (3 . 5)
my $list2 = Moosp::List->new();
$list2->car($int3);
$list2->cdr($list); # (3 (3 . 5))
print $list2->cdr->car->value # cadr -> 3
11042009 Arduino
当初思ってたよりも、意外にヘビーに読んでる。
先週秋月でCdSを購入してきたのでちょうどいいサンプルを。
#define LED 13 int val = 0; void setup(){ pinMode(LED, OUTPUT); } void loop() { val = analogRead(0); digitalWrite(LED, HIGH); delay(val); digitalWrite(LED, LOW); delay(val); }
明るさに応じて点滅の間隔が変化する。

soaplibにはCherryPyが組み込まれているので簡単にウェブサービスがつくれる。さらにrpy2を使えばRのウェブサービスがお手軽に構築できて便利。
以下のコードをsoapr.pyというファイル名で保存する。これは与えた数字の数だけRがrnormして返すという簡単なサービス。
from soaplib.wsgi_soap import SimpleWSGISoapApp
from soaplib.service import soapmethod
from soaplib.serializers.primitive import String, Integer, Array, Float
import rpy2.robjects as robjects
class RService(SimpleWSGISoapApp):
@soapmethod(Integer,_returns=Array(Float))
def rnorm(self,num):
r = robjects.r
y = r.rnorm(num)
return [i for i in y]
if __name__=='__main__':
from cherrypy.wsgiserver import CherryPyWSGIServer
server = CherryPyWSGIServer(('localhost',7789),RService())
server.start()
実行するとサーバが立ち上がりhttp://localhost:7789/soapr.wsdlにアクセスするとwsdlを出力する。
テスト用のクライアント
>>> from soaplib.client import make_service_client
>>> from soapr import RService
>>> client = make_service_client('http://localhost:7789/',RService())
>>> print client.rnorm(5)
[-0.40538156526399999, 0.45889158855099998, -0.67243766066699995, 2.6881017757299999, 0.113257266309]
>>> print client.rnorm(3)
[-0.16610789340500001, 0.66591497139099998, -1.74812066455]
参考
11042009 Python
CPANのアップデートは追いかけているのに、PyPIのアップデートを追いかけないのは如何なものかと思い、PyPI recent updatesをLDRで購読した。
が、他に誰も購読してないが、なんか購読するサイト間違ってる?
間違ってた。RSS autodiscoveryだとhttp://www.python.org/をさすようになってた。
やさしい Lisp の作り方 by Java and by C#を参考に書いてみる。進行中のメモなのであちこち修正するかも。というか修正しまくりで全然進まないのでメモることにしたという。もう少しまとまったらLISPをみんなで勉強しよう!に投稿したい。
ちなみにMooseでlispなのでMoosp(ムースプ)だ。
まずNilとTはMooseX::SingletonでSingletonにした。
package Moosp::Nil;
use MooseX::Singleton;
with 'Moosp::Sexp';
sub str {"NIL"}
__PACKAGE__->meta->make_immutable;
no MooseX::Singleton;
1;
Tも一緒。
package Moosp::T;
use MooseX::Singleton;
extends 'Moosp::Atom';
with 'Moosp::Sexp';
sub str {"T"}
__PACKAGE__->meta->make_immutable;
no MooseX::Singleton;
1;
javaでlispだとSexpはインターフェースなのでMoose::Roleのクラスにしてみたけどこれでいいのかはわからない(まだ最後まで動かしてないので)。
package Moosp::Sexp;
use Moose::Role;
requires 'str';
sub print {
my $self = shift;
print $self->str;
}
sub serialize {
my $self = shift;
return $self->str;
}
no Moose::Role;
1;
Moosp::Atom
package Moosp::Atom;
use Moose;
__PACKAGE__->meta->make_immutable;
no Moose;
1;
モダンperl入門が手放せない
09042009 git
gitのバージョンを1.6.1から1.6.2にあげた
sudo port upgrade git-core
これで、いままでうまくいかなかったpushがOKになった。(バージョンのせいではないかもしれないけど)
08042009 life
Pokenみたいな電子名刺ガジェットみたいなものこそ、研究ネットワークにのせてもよいんではないかと思った。特にポスターみたいに、スペースが限られていて、アテンション獲得が目的みたいな場所ではPokenはなかなかよいのではないかと。
というわけで、今年の前半にポスター発表かなにかするチャンスがあればPokenをぶら下げてみることにした。
興味をもった、研究者のPokenにハイタッチしとけば興味を持ったよっていう意思表示にもなるしね。
そういう使い方は、現実系でのトラックバックみたいなもんか。
07042009 富士
杉山フルーツの生ゼリー

美味しいことは美味しいが、、、、感動するかと言われれば想定の範囲内なのかなぁ。他のも食べてみたいが。
娘は自分の分を一つ食べたくせに、さらに僕のをはんぶんこしようとか言ってきた。
モダンperl入門のp.28で
+------+ +--------+
| Bird | <--- | Winged |
+------+ +--------+
|
|
+--------+
| Pigeon |
+--------+
とあるので、BirdにwithでロールをつけてPigeonがBirdを継承すればよかろうと思ったが、それだと'Winged' requires the method 'fly' to be implemented by 'Bird'とBirdクラスでflyが実装されてないよっていうエラーになる。
package Animal;
use Moose;
package Winged;
use Moose::Role;
requires 'fly';
package Bird;
use Moose;
extends 'Animal';
# with 'Winged'; ここだとエラー
package Pigeon;
use Moose;
extends 'Bird';
with 'Winged'; # ここに記述
sub fly { print "Pigeons fly in the day\n" }
package main;
Pigeon->new->fly;
つまり、個別にwithしないといけないのかな。
+------+
| Bird | --------------------------------------------------+
+------+ |
|\__________________________ |
| | |
+------+ +--------+ +------+ +--------+ +------+ +--------+
| Bird | <--- | Winged | | Owl | <--- | Winged | | Hawk | <--- | Winged |
+------+ +--------+ +------+ +--------+ +------+ +--------+
こんな感じ?。それとも鳥は翼を持つからflyメソッドをBirdクラスに直接書いてしまっても良いのだろうか?(ペンギンとかはここでは無しの方向で)
一応上の図には載せてないのだけどサンプルでは Animal->Mammal->Batという(鳥ではないけど飛ぶことのできる)コウモリクラスがあることを想定している。