2010-04-29

Bloggerの新しい投稿エディタに変えたら改行設定が変わった

投稿エディタのヘルプを見たら、以前の改行設定ではなく「投稿オプションで設定」するように書いてあった...。
スクリプトを投稿に載せる都合上、自動改行されると困るケースの方が多いのでOFF。

今さらRhinoのsync()について知った

引数として関数オブジェクトを渡すと、Javaでいうsynchronized(this)な関数に変換してくれる。
1. 書いてみる
// よくある何とかHolder
var numHolder = function(initNum) {
    this.out = java.lang.System.out;
    this.num = initNum;
    // 加算と減算
    this.incNum = function() {
        for (var i = 0; i < 10; i++) {
            this.out.print(" inc:" + this.num++);
        }
    }
    this.decNum = function() {
        for (var i = 0; i < 10; i++) {
            this.out.print(" dec:" + this.num--);
        }
    }
    // sync()を使って同期関数を用意する
    this.incNumSync = sync(this.incNum);
    this.decNumSync = sync(this.decNum);
};
// Holder一個だけ作っておく
var theHolder = new numHolder(0);
// 別スレッドで、ひたすら加算する
var runner  = new java.lang.Runnable() {
    holder: theHolder,
    run: function() {
        this.holder.incNum();
        // *sync()を使う場合*
        //this.holder.incNumSync();
    }
};
new java.lang.Thread(runner).start();
// メインスレッドで、ひたすら減算する
theHolder.decNum();
// *sync()を使う場合*
//theHolder.decNumSync();
2. sync()を使わない場合の動作
js> load("synctest.js");
 dec:0 dec:-1 dec:-2 dec:-3 dec:-4 dec:-5 dec:-6 inc:-7 in
:-3 inc:-2 inc:-1 inc:0 inc:1 inc:2 dec:3 dec:2 dec:1js>
3. sync()を使う場合の動作
js> load("synctest.js");
 dec:0 dec:-1 dec:-2 dec:-3 dec:-4 dec:-5 dec:-6 dec:-7 dec:-8
c:-9 inc:-8 inc:-7 inc:-6 inc:-5 inc:-4 inc:-3 inc:-2 inc:-1js>