update.2013年のClojure界隈はcore.asyncが話題ですが、今回は非同期処理にcore.asyncは使いません。今回はcore.asyncの代わりにalephというライブラリを使って、WebSocketを使った簡単なデモアプリケーションを作ってみようと思います。サーバーとクライアントの両方をClojureで実装します。alephalephは、同じ作者のlaminaという非同期プログラミングライブラリをベースに、nettyを使ってHTTP/WebSocket/TCP/UDPのI/Oをサポートしたライブラリです。core.asyncと同様に、laminaではchannelと呼ばれるキューにメッセージを出し入れすることで非同期処理をサポートしています。laminaにはchannel以外にも様々な機能がありますが、今回はchannel以外の機能は使わないので解説しません。(というか解説できるほど私が理解していません。laminaの詳細については公式のwikiに分かりやすく説明が載っているので、そちらを参照してください。2013/12/6時点でalephの最新のバージョンは0.3.0です。この記事内のコードも0.3.0で動作チェックしています。core.asyncはClojureScriptでも動きますが、alephはその実装上JVM以外でのClojureをサポートしないので注意してください。alephing今回作成するデモは、サーバーが受け取ったメッセージをクライアントにブロードキャストするという、WebSocketのチュートリアルのようなシンプルなアプリケーションです。テキストだけのCUIでも十分なのですが、それだとデモとして味気ないので、今回はquilというライブラリ(ProcessingのClojureラッパー)を使って簡単なGUIを追加しました。アプリケーションのフローとしては、ウィンドウ内をマウスクリックすると、そのマウス座標をサーバーに送信サーバー受け取ったマウス座標を現在接続している全クライアントにブロードキャストで送信クライアントはマウス座標を受け取ると、その座標にオブジェクトをレンダリングのようになります。簡単に図にまとめると、下のようになります。今回作成したデモのソースコード類はgithubの下記のレポジトリに置きました。