gappend-map を gconcatenate で / Re: 特定のビット列が現れる場所を探す (Gauche)

Gauche の最新 HEAD で gconcatenate 手続きが追加されました。

というわけで、gappend-map と byte-generator->bit-generator は以下のように書き直せます。
ただし、gappend-map は proc 内で返す物がリストではなくジェネレータになります。

(define (gappend-map proc . gens)
  (gconcatenate (apply gmap proc gens)))

(define (byte-generator->bit-generator gen)
  (gappend-map (^x (list->generator (integer->list x 8))) gen))

特定のビット列が現れる場所を探す (Gauche)

ジェネレータ、遅延シーケンス、パターンマッチングを使ってみました。
書いた後に気づいた、Shiro さんによる gappend-map (& byte-generator->bit-generator) の別解 (http://blog.practical-scheme.net/shiro/20120217-nash-cipherer, bytes->bools)。継続が使用されない分、こっちのほうが速そう。

最後のテストで "hogefuga" という文字列の (Gauche 内部エンコーディングな) ビット列から、010110 というパターンを探しています。
その結果、3 バイト目の 1 (= 7 - 6) ビット目に見つかったことが分かります。
遅延シーケンスを用いているので、その先のビット列は読み込まれないため、巨大なファイルでも安心。
ちなみに Gauche リファレンスの遅延シーケンスの項目に書かれている内容そのままです。てへぺろ

IronScheme を使ってみた

C# から手軽に Scheme のコードを呼び出したくて。


IronScheme をインストールした後、.NET なプロジェクトに IronScheme.dll と IronScheme.Closures.dll を参照設定に追加すれば一通り使えました。

using System;
using IronScheme;
using IronScheme.Runtime;

static void Main(string[] args) {
    Console.WriteLine("(+ 1 2)".Eval()); // => 3
    Console.ReadKey();
}

あっけなく。


次に Scheme 側の手続きを C# で呼び出してみます。

"(define (add-one-func i) (+ i 1))".Eval();
var addOneFunc = "add-one-func".Eval<Callable>();
Console.WriteLine(addOneFunc.Call(0)); // => 1
Console.WriteLine(addOneFunc.Call(5)); // => 6
Console.WriteLine(addOneFunc.Call(10)); // => 11

あっけなく。


最後に C# 側の関数 (Func) を Scheme で呼び出してみます。

int i = 0;
Func<int> incrementFunc = () => i++;

"(define increment-func {0})".Eval(incrementFunc.ToSchemeProcedure());

が、no expression in body と怒られてしまいます。
IronScheme の Eval() が悪さをしているっぽいのですが (引数で渡したオブジェクトがいったんシンボルになってる)、Scheme レベル 0 なのであんまり深く追っていません。

"(define increment-func '())".Eval();
"(set! increment-func {0})".Eval(incrementFunc.ToSchemeProcedure());
Console.WriteLine("(increment-func)".Eval()); // => 0
Console.WriteLine("(increment-func)".Eval()); // => 1
Console.WriteLine("(increment-func)".Eval()); // => 2
Console.WriteLine("(increment-func)".Eval()); // => 3

とすると、とりあえず動きました。


他にも、

foreach (var val in "'(1 2 3 4 5)".Eval<Cons>()) {
    Console.WriteLine(val);
}

のように、Cons が IEnumerable だったりして面白いです。


IronScheme 自体の初期化が重いのが難点ですが、常駐系のアプリであれば結構使えそうです。

Vista, 7 以降の環境で LR2 をリフレッシュレート 120Hz で動かす方法 (GeForce, RADEON 共通)

LR2 に限らず、リフレッシュレート 60Hz で固定されてしまうのをなんとかする方法です。
XP 時代はグラフィックカードのドライバからリフレッシュレートの固定ができたのですが、Vista 以降のドライバからは軒並み削除されているようです (DX10以降のアプリケーションが、外部からのリフレッシュレート強制変更にそもそも対応しないようです。MS方針?)。
そのような事情もあり、DirectX9 世代のアプリケーションにしか効果はありません。


昔は dxdiag でリフレッシュレートの固定ができていましたが、今はありません。
というわけで、レジストリを弄ってしまいましょう。


32bit の場合 (と、64bit の場合のネイティブ 64bit アプリ向け)
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\DirectDraw に ForceRefreshRate (DWORD) を作成。値は固定したいリフレッシュレート。


64bit の場合の 32bit アプリ向け (LR2 の場合はこちら)
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\DirectDraw に ForceRefreshRate (DWORD) を作成。同上。


レッツぬるぬる!

Pure Javascript な jQuery Templates

Web プログラミングを行う場合、さまざまなテンプレートエンジンを使うことになると思います。
ただ、サーバサイドなテンプレートエンジンだと、ajax バリバリなページを作る場合に DOM との相性が悪く、冗長なコードになりがちです。(なりますよね?)


というわけで、Javascript なテンプレートエンジン、jQuery Templates を使ってみましょう。
jQuery Templates は現在β版で、 jQuery 1.5 にマージされるはずだったのですが、結局 1.5 には入っていないようです。
ダウンロード・ドキュメントはこのページから。
http://api.jquery.com/category/plugins/templates/


百聞は一見にしかずということで、簡単に書いてみます。

<script id="tmplUser" type="text/x-jquery-tmpl">
<li>${name} (${age})</li>
</script>

<ul id="users">
</ul>
$(function() {
    var users = [
        { name: 'foo bar', age: 20 },
        { name: 'hoge fuga', age: 30 }
    ];
    $('#tmplUser').tmpl(users).appendTo('#users');
});


ね、簡単でしょ?
.tmpl に配列を渡すと、自動的に複数のテンプレートに展開してくれます。


さて、ここまでは序の口。
次はテンプレートからテンプレートを呼び出します。

<script id="tmplUser" type="text/x-jquery-tmpl">
<li>
    ${name}
    <ul>
        {{tmpl(items) "#tmplUserItem"}}
    </ul>
</li>
</script>
<script id="tmplUserItem" type="text/x-jquery-tmpl">
<li class="item">${name}</li>
</script>

<ul id="users">
</ul>
$(function() {
    var users = [
        {
            name: 'foo',
            items: [
                { name: 'ひのきのぼう', power: 2 },
                { name: 'ラグナロク', power: 10000 }
            ]
        },
        {
            name: 'bar',
            items: [
                { name: 'エクスカリパー', power: 1 },
                { name: 'エクスカリバー', power: 10000 }
            ]
        }
    ];
    $('#tmplUser').tmpl(users).appendTo('#users');
});


ね、簡単でしょ?
さて、この謎のアイテムをクリックすると、power を alert するようにしてみましょう。
変更箇所は Javascript の最後の行だけです。

$('#users')
.delegate('.item', 'click', function() {
    var item = $(this).tmplItem();
    alert(item.data.power);
})
.append(tmpl)
;


ね、簡単…ですよね?
テンプレートごとに割り振られた値を $(this).tmplItem().data で取得できます。
ここでは {{tmpl(items) "#tmplUserItem"}} により、items が(勝手に)展開され、1つ1つのアイテムが取得できているかんじです。


また、tmpl() を実行した結果は jQuery object ですので、append する前にごちゃごちゃと操作することもできます。

var tmpl = $('#tmplUser').tmpl(users);
$('.item', tmpl).click(function() {
    var item = $(this).tmplItem();
    alert(item.data.power);
});
tmpl.appendTo($('#users'));


(続きはそのうち書く)

jQuery slideUp() で IE8 だけ margin がぶっ壊れる問題が釈然としないけど治った

IE6でさえも正常に動作するのに、IE8でだけ発生する問題。
アニメーション完了の callback で、margin がぶっ壊れる要素を編集しなおすと margin が帰ってきた。なんだそれ!


さんぷるこーど。

var dt = $('#hoge dt'); // margin がぶっ壊れる要素
var dd = $('#hoge dd'); // slideする要素

dd.slideUp(500, function() { dt.html(dt.html()); });

SC-02B カスタムカーネル + z4control 導入記

カスタムカーネルは某所に上がってる initramfs に手が加わっていないほう (1.2GHz OC + 330MB RAM + BLN + その他)。
ファームウェアはオリジナル版 (JJ1) です。
最初何も考えずに Odin3 でやきやきしたら、z4mod で /data を ext2 化したことをすっかり忘れてて起動しなくなったのでちょっと焦ったり。


z4mod (apk版) からカーネルパッチを当てようと思い、パッチを当てて再起動すると、カーネルが元に戻ってまたもや焦る。
z4mod でパッチされたカーネルが z4mod 内に残ったままで、既にパッチ済みカーネルをダウンロードしたものと思い込まれており、オリジナルカーネルにパッチ当たったものが適用されていただけでした・・・
Patch Kernel と Flash Kernel は違うゾ!(あたりまえ)
ちなみにリカバリイメージからまるごと初期化した後でも、Titanium で復元したら同じことが言えるので注意してください。
z4mod をアンインストール→インストールするか、(たぶん)アプリケーション管理から設定を削除することで消えると思います。


z4control は /data, /dbdata, /cache を ext2 化してみました。
この状態で Quadrant が2000程度です。ベンチスコアでは OCLF にはかないませんね。
BLN も正常に動作していました。


カスタムカーネルで z4mod を使う場合、やきやきする前に z4mod Kernel Patcher でパッチを当てて、それをやきやきしたほうが手間が省けて良いと思います。