データストリームの生成
前述のように、クロスブラウザ対応やクロスドメイン対応の問題があるので、一般にはサーバプロキシを利用してTwitterのストリームを取り込む方が得策です。ストリームの処理に利用できる実装は何種類もありますが、私はXML RESTベースのデータベース(この例ではeXist-dbサーバ)用のプロキシストリームを作成することを自らへの課題としました。その理由は、開発中のアプリケーションがXML RESTベースであったためと、JSONストリームをプロキシ処理する方法を理解しようとしていたためです。
ストリームを作成するためのXQueryはとても簡単明瞭です(しかも、RubyやPHPなどの言語でのやり方に似ています)。
declare namespace httpclient = "http://exist-db.org/xquery/httpclient";
declare option exist:serialize "method=text mediatype=text/plain";
let $username := request:get-parameter("username","")
let $password := request:get-parameter("password","")
let $auth := concat("Basic ",util:string-to-binary(concat($username,":",$password)))
let $results := httpclient:get(
xs:anyURI("http://twitter.com/statuses/friends_timeline.json"),
false(),
<headers>
<header name="Authorization" value="{$auth}"/>
</headers>)
let $tweets := util:binary-to-string($results)
return $tweets
この例では、ユーザー名とパスワードをクエリ文字列パラメータから取得し、それらを基本認証文字列に連結してヘッダーとして使用しています。util:string-to-binary()ルーチンは、テキスト文字列を(Web上でバイナリコンテンツのエンコードに使われる)Base64バイナリに変換します。次に、http-client:get()がHTTP経由でGETコマンドを呼び出し(XMLHttpRequestオブジェクトを使うときとほぼ同様)、結果がバイナリ表現で返されたら、util:binary-to-string()でJSON文字列に戻します。これが呼び出しの出力に返されます。次に、
http://localhost:8080/rest/twitter/twitter.xq?username=kurt_cagle&password=mypassword
でXQueryルーチンを呼び出し、Twitterフレンドのストリームを取得します。Twitter URLを変更するだけで、これを他のユーザーストリームにも拡張できます。
バインディングのまとめ
GoogleのXBL 2の実装がはたして普及するかどうかは分かりませんが、そうなる要因はいくつもあります。コードは驚くほどクロスプラットフォームに対応しており、Konquererを除けば、最近のすべてのブラウザで動作します。もちろん、だからといってバインディング内に記述されたJavaScriptコードがそれと同じ制限を満たすとは限りませんが、フレームワークが整備されていれば、コードをブラウザ非依存にするのに大いに役立ちます。
バインディングはレイアウトとコードの簡素化に役立ち、ブラウザレベルでのコンポーネント化を促します。これにより、コードの再利用とコアライブラリの開発が促進されます。カプセル化が行われるので、一般にはスクリプティングレベルやスタイリングレベルでIDや名前空間の衝突を気にする必要はありません。つまり、指定したIDがたまたま基本スクリプティングライブラリのコアIDであったためにコードが動作しないという可能性は低くなります。また、Webページ内の依存関係のせいで紛らわしいデバッグ結果が出ることを気にせずに、コンポーネント開発を単独でテストすることもはるかに容易になります。
全体としては、XBLの時代が今まさに到来していると言って差し支えないでしょう。AJAX空間が安定化し、背後にGoogleなどの会社のリソースがあることを考えると、バインディング言語としてのXMLには大いに利用価値があり、マイナス面はほとんどありません。
