BlobBuilderインターフェースが非推奨となっていた

最近になって気がついたがBlobBuilderインターフェースが非推奨となっていた。Chronium 21.0.1180.75にてnew WebKitBlobBuilder()といった記述のあるスクリプトを実行すると「BlobBuilder is deprecated. Use “Blob” constructor instead.」といった表示がコンソールに出力されるようになっている。まだ現時点では使えはするようだがいつ使えないようになってしまうのかわからない。なのでつかうようにと表示されているようBlobはどういった仕様でどのようにつかえるものなのかを簡単に調べてみた。

File APIの仕様中にあるBlobインターフェースの項を見てみたところ

var blob = (function(blobBuilder) {
blobBuilder.append('<!doctype html>\n');
blobBuilder.append('<title>HTML DOCUMENT</title>\n');
blobBuilder.append('<p>HTML HTML HTML!</p>\n');
return blobBuilder.getBlob('text/html');
})(new WebKitBlobBuilder());

といったコードは

var blob = new Blob([
'<!doctype html>\n',
'<title>HTML DOCUMENT</title>\n',
'<p>HTML HTML HTML!</p>\n'
], { type: 'text/html' });

とおきかえられるようになっている。これまでの仕様と比べて簡素で簡潔とした直感的な記述ができるようになったのではないかとわたしの目には見える。

ただ変更された仕様もまだワーキングドラフトであるので今後どうなって行くのか判らない。BlobBuilderインターフェースの仕様は四月に、Blobインターフェースの仕様は七月にと変更になってからしばらく経てから気付いたのはあまりにも遅きに失してしまったように感じてしまう。少し前までは仕様の変更は密に追っていたというのに今はこのような体たらくではずかしい。万全の態勢で情報を得られるような仕組み作りを用意していきたい。

node-xmlhttprequestをnpmに登録しました

node-xmlhttprequestnpmに登録しました。

$ npm install -g w3c-xmlhttprequest

のようなコマンドをターミナル等から入力する事によってインストールが可能です。

(function() {
'use strict';
var XMLHttpRequest = require('w3c-xmlhttprequest').XMLHttpRequest;
var req = function req(uri) {
var client = new XMLHttpRequest();
client.open('GET', uri);
client.responseType = 'json'
client.addEventListener('load', function(event) {
console.log(client.response);
}, false);
client.send(null);
};
req('http://example.com/sample.json');
})();

のようにNodeでもウェッブブラウザ上のXMLHttpRequestとそう変らない動作をさせられます。

nginxで既存のHTTPヘッダーを上書きして送出する方法

nginxで任意のHTTPヘッダーを追加したい場合にはadd_headerディレクティブを用いますが、add_headerディレクティブは追加しようとしたフィールド名が重複するHTTPヘッダーが既に用意されていた場合には既にある物に「,」区切りで連結してしまいます。たとえば強制的に出力するContent-Typeを変更するためにadd_header Content-Type text/css;のようにしてもContent-Type: text/html, text/cssといった形の不正なHTTPヘッダーが出力されてしまいます。

解決方法は簡単でHTTP Headers More Moduleのmore_set_headersディレクティブをつかえばすぐです。使い方も簡単でadd_headerディレクティブをつかっている箇所をそのままmore_set_headers "Content-Type: text/css";と置きかえれば良いだけです。add_headerディレクティブとはちがい単一の引数にコロン区切りフィールド名とその中身のどちらも入れることになるので、その点は注意が必要です。

HTTP Headers More Moduleは通常のインストールでは多くの場合いっしょに入れられないので、nginxの公式Wikiにある記載を参考にしてコンパイル時のオプションを適切に変更すれば良いでしょう。またDebian GNU/Linuxであればもっと簡単にaptitudeでのインストール時にnginx-fullではなくnginx-extrasを指定することによりHTTP Headers More Moduleがつかえるようにコンパイルされたnginxをインストールすることが可能です。