shindig の makeRequest で文字化け回避法

shindig の makeRequest で得たテキストデータが文字化けするようなのでソースを追ってみた。
makeRequest された shindig(サーバー側)は取ってきたコンテンツを直接返すのではなく、JSONの形に直して送るようだ。
この時 shindig 側ではバイト配列を String にする処理が行われるのだが、Java の内部文字列は UTF-8 固定なので、[何か]→UTF-8 の変換を試みる。
shindig はこの[何か]をコンテンツについていたレスポンスヘッダから判断するようで、コンテンツ提供側のサーバーが送ったレスポンスヘッダが間違っていると文字化けしてしまう。

追記(10/18)と思ったのだが「utf-8」とヘッダを送信しても文字化けするみたい。逆にドキュメントタイプを「text/html」以外にすると文字化けしない???

解決策はいくつかある。

  1. コンテンツ提供側のサーバーのヘッダをどうにかする。設定を弄るのが根本的な解決法だけど、静的ファイルなら拡張子によってヘッダを生成していることがほとんどなので、拡張子を変えると解決することもある。動的データの場合はそれを生成しているプログラムを弄らなきゃだめかな。
  2. makeRequest するときコンテンツ形式に JSON を指定する。自分は試したわけではないがこうすると上手く行くらしい。たぶんサーバー側で得たデータをそのまま返すようになるんだと思う。

ちなみに自分は静的データを取ってきたときに文字化けしてたのですが拡張子を「.html」から「.part」に変えるだけで解決しました。

Shindig のエラー対処法

Shindig を使って以下のようなエラーが出る場合は

java.lang.IllegalArgumentException: type DIRECT is not compatible with address null.

ソースを修正してコンパイルし直すとなおります。

org.apache.shindig.gadgets.http.BasicHttpFetcher のソース90行目付近

HttpURLConnection fetcher = (HttpURLConnection) ( proxyProvider == null ?
    url.openConnection() : url.openConnection(proxyProvider.get()));

Proxy proxy = proxyProvider == null ? null : proxyProvider.get();
if(proxy.type() == Proxy.Type.DIRECT) proxy = null;
HttpURLConnection fetcher = (HttpURLConnection) ( proxy == null ?
    url.openConnection() : url.openConnection(proxy));

このように修正。
ようするに openConnection メソッドの引数に type が DIRECT の Proxy が渡るのはよろしくないようです。

JFilter を使って Sonar で和音の発音タイミングをずらす

拙作 JFilter を使って Sonar で和音の発音タイミングをずらすサンプルです。
こういうサンプル集みたいのを作ったほうがいろんな人に使ってもらえるのかなぁ…

// ノート毎にいくらずらすか
var d=10;
// 全体にかけるオフセット
var offset=0;
// 逆
var reverse=false;

// events を同じ time 値を持つもの毎に配列にまとめる
function parTime(events) {
	if(events.length==0) return [[]];
	result = [[events[0]]];
    for(var i=1; i<events.length; i++) {
    	if(result[result.length-1][0].time != events[i].time) {
        	result.push([events[i]]);
        } else {
        	result[result.length-1].push(events[i]);
        }
    }
    return result;
}

function onEvents(from, to, events) {
	// events をタイム毎に割る
    par = parTime(events);
    // tone で sort
    for(var i=0; i<par.length; i++) {
    	par[i].sort(function(a,b) {
        	if(!reverse)
            	return a.key - b.key;
            else 
            	return b.key - a.key;
        });
       	for(var j=0; j<par[i].length; j++) {
        	par[i][j].time += j*d+offset;
        }
    }
    // 配列を結合する
    result = [];
    for(var i=0; i<par.length; i++) {
    	result = result.concat(par[i]);
    }
	return result;
}

windows で使える2つの make に関する微妙な違い

cygwin の make は .bat を補完してくれない。.exe は補完してくれる。

target: files
command args

この時 command.exe は実行可能。command.bat は実行不可能。

MinGW版のmakeなら.batも補完できる。

xyzzy で fcsh を利用する xyzzy fcsh を更新した

いろいろ気になっていたところを直しました。
結構大きめの変更。関数の仕様とかも変わっているので旧版を利用していた人は注意!*1

http://www.libspark.org/wiki/hidachinoiro/xyzzyfcsh

  • 複数の fcsh バッファを作成できるようになった(バージョン毎に fcsh を起動したりできる)
  • コンパイルだけでなく任意のコマンドを fcsh に送れるようになった
  • キー毎に違う引数で↑の関数を呼ぶようにすればひとつの fcsh でメインアプリとテストのコンパイルを使い分けるとかも可能!
  • エラーを検索してジャンプできるようになった
  • 関数リファレンスをちゃんと(笑)書いた

*1:旧版はちゃんと残してあります