2012/06/06


JSX - a faster, safer, easier alternative to JavaScript

faster JSX performs optimization while compiling the source code to JavaScript. The generated code r...

http://jsx.github.com
DeNAさんがマルチデバイス向けに高速なjavascriptを吐き出せる言語を開発。github上でオープンソースで開発されておられます。
僕も何か作りたいー、という事で作ってみた。

画面内をゴキブリが這い回ります。ソースは大丈夫ですが、デモは閲覧注意かもしれません。
import "js/web.jsx";

final class Roach {
    var x : number;
    var y : number;
    var d : number;

    function constructor(x : number, y : number, d : number{
        this.x = x;
        this.y = y;
        this.d = d;
    }

    function move(view : View) : void {
        this.d += (Math.random() * 3as int - 1;
        if (this.d >= 360this.d = 0;
        if (this.d < 0this.d = 359;
        var a = this.d * 2 * 3.141592 / 360.0;
        this.x += Math.cos(a);
        this.y -= Math.sin(a);
        if (this.x < 0this.x = view.width - 1;
        if (this.y < 0this.y = view.height - 1;
        if (this.x >= view.width) this.x = 0;
        if (this.y >= view.height) this.y = 0;
    }

    function render(view : View) : void {
        view.context.drawImage(
            view.images[((this.d * 24 / 360as int)],
            (this.x - 12as int,
            (this.y - 12as int);
    }
}

final class View {
    var width : number;
    var height : number;
    var count : number;
    var context : CanvasRenderingContext2D;
    var roaches = [] : Roach[];
    var images = [] : HTMLCanvasElement[];

    function constructor(canvas : HTMLCanvasElement, count : number{
        this.context = canvas.getContext("2d"as CanvasRenderingContext2D;
        this.width = canvas.width;
        this.height = canvas.height;
        this.count = count;
    }

    function init() : void {
        for (var i = 0; i < this.count; i++) {
            this.roaches[i] = new Roach(
                (Math.random() * this.width) as int,
                (Math.random() * this.height) as int,
                (Math.random() * 360as int);
        }
        var count = 0;
        var loaded = function(e : Event) : void {
            var image = e.target as HTMLImageElement;
            var canvas = dom.createElement("canvas"as HTMLCanvasElement;
            var context = canvas.getContext("2d"as CanvasRenderingContext2D;
            context.drawImage(image, 00);
            this.images[image.dataset["name"] as int] = canvas;
            if(++count == this.images.length) {
                this.start();
            }
        };
        for (var i = 0; i < 24; i++) {
            var image = dom.createElement("img"as HTMLImageElement;
            var index = ("00" + (i * 15as string).slice(-3);
            image.addEventListener("load", loaded);
            image.src = "img/roach" + index + ".gif";
            image.dataset["name"] = i as string;
        }
    }

    function start() : void {
        dom.window.setInterval(function() : void {
            this.update();
        }50);
    }

    function update() : void {
        this.context.fillStyle = "rgb(255, 255, 255)";
        this.context.fillRect(00this.width, this.height);
        for (var i = 0; i < this.roaches.length; i++) {
            this.roaches[i].move(this);
            this.roaches[i].render(this);
        }
    }
}

final class Application {
    static function main(canvasId : string, count : number) : void {
        var canvas = dom.id(canvasId) as HTMLCanvasElement;
        var view = new View(canvas, count);
        view.init();
    }
}
以下に置いてあります。
mattn/jsxroach - GitHub
https://github.com/mattn/jsxroach
型を拘束する事で安全なコードが出力でき、パターンにハマった高速化が見込めるのでしょうね。

そしてデモです。

お食事中の方はご遠慮下さい。
Posted at by



2012/05/31


やったーJavaScriptの動くMySQLできたよー - 愛と勇気と缶ビール

しばらく 積ん読 していたこの本をちょっと眺めてみたら、 MySQL のUDFって簡単に作れるんだなー、と思った && そういや V8 って ライブラリ として簡単にリンクできるはずだな、と思い出した...

http://d.hatena.ne.jp/zentoo/20110925/1316961032
Big Sky :: やったーJavaScriptの動くSQLiteできたよー

正誤表を書くのにしばらくこの本をちょっと眺めてみたら、SQLiteのUDFって簡単に作れるんだなー、と思った && そういやV8ってライブラリとして簡単にリンクできるはずだな、と思い出した ので、つい...

http://mattn.kaoriya.net/software/lang/c/20110926141218.htm
まぁ、単なるUDFですが。
mattn/mysql-mruby - GitHub
https://github.com/mattn/mysql-mruby
これをコンパイルしてpluginとして配置すると mysql> SELECT mrb_eval('[1,2,3].map {|x| "hello" + x}');
+-------------------------------------------+
| mrb_eval('[1,2,3].map {|x| "hello" + x}') |
+-------------------------------------------+
| ["hello1", "hello2", "hello3"]            |
+-------------------------------------------+
1 row in set (0.00 sec)

こんな事出来て幸せ!

あなたも matz テーブルの mruby フィールドに何か書き込んでみませんか!
Posted at by



2012/05/30


ソーシャル化したbit.lyの恥ずかしいリンクの消し方 - ぼくはまちちゃん!(Hatena)

こんな記事がありました! Big Sky :: bit.ly がソーシャルに生まれ変わって、皆とっても恥かしい事になる...

http://d.hatena.ne.jp/Hamachiya2/20120530/bitly
既に800件以上あるのでやってられなかったの巻。
今年もYAPC::Asiaは盛り上がりそうですね。僕行った事無いけど...
use strict;
use warnings;
use LWP::UserAgent;
use HTTP::Request;
use Config::Pit;
use JSON;

my $config = pit_get('bit.ly'require => {
    username => 'username on bit.ly',
    password => 'password on bit.ly',
});

my $req = HTTP::Request->new(
    POST => 'https://api-ssl.bitly.com/oauth/access_token');

$req->authorization_basic(
    $config->{username},
    $config->{password},
);

my $ua = LWP::UserAgent->new;
$ua->env_proxy;

my $res = $ua->request($req);
my $access_token = $res->decoded_content;

my $offset = 0;

my $base_url = "https://api-ssl.bitly.com";
my $url = "$base_url/v3/user/link_history?access_token=$access_token&limit=100";
while (1) {
    my $history = from_json $ua->get("$url&offset=$offset")->decoded_content;
    my @items = @{$history->{data}->{link_history}};
    last unless scalar @items;
    for my $item (@items) {
        unless ($item->{private}) {
            my $link = $item->{long_url};
            print "$link\n";
            #$res = $ua->get(
            #    "$base_url/v3/user/link_edit"
            #    ."?access_token=$access_token&link=$link&edit=private"
            #    ."&private=true");
        }
    }
    $offset += 100;
}
コメント外したらprivateになる予感。
試したこと無いので誰か試して...
あとsleep入れた方がいいと思うよ(最初から入れろコラ)。
Posted at by