読者です 読者をやめる 読者になる 読者になる

Mozilla24でLiveCodingしてきました

はるばる滋賀から帝都におりたち、Mozilla24に参加してきました。参加したみなさんおつかれさまでしたー。いろんな方面からきたいろんな人がいて、とてもおもしろかった。

名刺持って行かなかくて申し訳なかったんですが、"はこべ"とか"hakobe"とか id:hakobe932とか名乗っていたはうちでした。お会いしたみなさん、楽しかったです。また、お会いする時まで。

今回は、一般参加者として物見遊山と決めてかかっていたのですが、急遽LiveCodingにCoderとして参加することになりました。あまりに急遽すぎて、プレッシャー×のフラグが常に立っている、うちとしましては、テンパる他なく、いろいろと迷惑おかけてしまいましたが、まぁ、なんとかなってよかった。

ちょうど、Mozilla24の会場に向かう前に、以下の本をちょうど読んでいて、さらに、解説がdankogaiさんだということだったで、本の内容に少し会ったセルオートマトンをお題に選んでみました。

心はプログラムできるか 人工生命で探る人類最後の謎 (サイエンス・アイ新書 31)

心はプログラムできるか 人工生命で探る人類最後の謎 (サイエンス・アイ新書 31)

「一次元セルオートマトンWebサービス」というのを作成したのですが、プログラムとしては全然難しくなくて、一次元セルオートマトンのパラメータを受け取って結果のテーブルをJSONPで返すというだけです。LiveCodingで作成したCGIのコードは、以下。会場でつくったまんまなので、あやしげなコメントアウトも残っています。

#!/opt/local/bin/perl
use strict;
use warnings;
use JSON::Syck;
use CGI;

my $q = CGI->new;
print $q->header(-type => 'application/javascript');

my $rule = $q->param('r') || 30;
my $callback = $q->param('callback') || 'callback';

my $row = [(0) x 40, 1, (0) x 39 ];
my $grid = [$row,];

my @rule_table = reverse split //, (unpack("B8", pack("C", $rule)));

for (0..30) {
    my $new_row = [];
    for my $i (0..@$row-1) {
        #print $row->[$i];
        my $bits = '00000';
        $bits .= $i - 1 < 0        ? 0 : $row->[$i-1];
        $bits .=                         $row->[$i];
        $bits .= $i + 1 > @$row -1 ? 0 : $row->[$i+1];

        my $rule_index = unpack("C", pack("B8", $bits));
        $new_row->[$i] = $rule_table[$rule_index];
        #print $new_row->[$i];
    }
    $row = $new_row;
    push @$grid, $row;
    #print "\n";
}

#for my $x (@$grid) {
#    for my $y (@$x) {
#        print $y;
#    }
#    print "\n";
#}

print $callback . '(';
print JSON::Syck::Dump($grid);
print ');';

動作は、http://www.douzemille.net/labs/ca/ca.htmlで確認できます。デモした時はもうすこしきれいなお星様だったのですが、使っていい素材かわかんなかったので、ちょっと寂しい表示です。Javascriptがてきとーでなんかやたら重いので、Firefoxが警告出すやも。

ruleというパラメータをいじってdrawすると表示がかわります。90とかがおすすめです。

このPerlのコードで一見わかりにくいのはpackとunpackが出てくるですが、"Perl 2進数"でググってコピペしました。使えるところは、がんがんコピペで。

コピペを恐れるな(don't be afraid to be a copycat)