プログラミング」カテゴリーアーカイブ

ElmでWebSocket接続の例

説明

WebSocketというのは、TCPで使える(主にブラウザー用の)プロトコルです。

WebSocket(ウェブソケット)は、コンピュータ・ネットワーク用の通信規格の1つである。インターネットの標準化団体であるW3CIETFがウェブサーバーとウェブブラウザとの間の通信のために規定を予定している双方向通信用の技術規格であり、APIW3Cが、WebSocket プロトコルIETFが策定に関与している。プロトコルの仕様は RFC 6455。TCP上で動く。

引用元 Wikipedia

Javascriptから簡単に利用することができ、Httpに比べ低いレイテンシーでリアルタイムな通信に向いていると言われています。

WebSocketプロトコルについては次の2つのウェブサイトが参考になりました。

RFC6455 — The WebSocket Protocol 日本語訳

  • RFC6455の日本語訳を公開してくださってる方がいらっしゃいました。有り難いですね!しかもちゃんと最新版にアップデートされてます。

Block Rockin’ Codes – WebSocket サーバの実装とプロトコル解説

  • サーバー側でWebSocketの通信を行う部分を書いて見たのですが、その時一番参考にしたウェブサイトです。

WebSocket関連の記事・ソースコードは、以前の版(ドラフト版)をベースに書かれたものが多くあります。最新版とドラフト版ではかなり仕様が変わっているので、注意したほうが良いです。

ElmにもWebSocketを使うためのライブラリが備わっていて~ / Catalog / Elm / WebSocket、非常にシンプルなconnectという関数のみが用意されています。

connect : String -> Signal String -> Signal String

という型からわかるように、WebSocketへの送信も受信もどちらもシグナルになります。Httpと同じですね。正直エラーとかクローズとかどうやってハンドリングするのかわかりませんが、まずは使えることを喜びましょう。

今回ws://echo.websocket.orgにテキストを投げてそれを表示するだけのスクリプトを書きました。ご参考まで。

WebSocketはブラウザでTCPのようなコネクション持続型の通信を行える、非常に興味深い技術だと感じました。仕様もほぼ固まっている?ようなので、色々と使えたら面白いですね。現状WebSocketの中身をブラウザのデバッグツールでみれるのは、Chromeだけのようです。

続きを読む

ElmでN-Queenしてみた

説明

動作するもの

題名の通り、ElmでN-Queen問題をやってみました。リアルタイムにクイーンを配置していくので、アニメーションとして楽しめます。

N-Queen問題ではバックトラック法を使うわけですが、木構造深さ優先探索していないので、厳密な意味でのバックトラック法ではないかなと思います。

N-Queenの場合、縛りのせいで最大2手戻ればすべて網羅できるので、そのせいで解けています。

2014-08-16追記: 良く考えるとツリーをすべて網羅しているということはバックトラック出来ているということですよね。

書いてて思ったのはやはりリストをがっつり扱えるElmという言語のパワーです。特にクイーンの配置をチェックする部分が物凄くきれいに書けます。

斜めチェック用のリストを生成している部分です。

-- left down to right top
ldrtCoords w h =
let xys = xyCoords w h
in map (\(x, y) -> y - x) xys
-- right down to left top
rdltCoords w h =
let xys = xyCoords w h
in map (\(x, y) -> y + x) xys

それを使ってチェックします。

      -- チェッカー関数 nはそれぞれチェックするグループIDを示す
rowCheck n = filter (\(x, cellState) -> x == n) <| zip (yCoords bw bh) xyq
colCheck n = filter (\(y, cellState) -> y == n) <| zip (xCoords bw bh) xyq
ldrtCheck n = filter (\(ldrt, cellState) -> ldrt == n) <| zip (ldrtCoords bw bh) xyq
rdltCheck n = filter (\(rdlt, cellState) -> rdlt == n) <| zip (rdltCoords bw bh) xyq
checkFn = (>=) 1
-- チェックフラグ
rowCheck' = all checkFn <| log "row" <| map (countQueens . rowCheck) [1 .. bw]
colCheck' = all checkFn <| log "col" <| map (countQueens . colCheck) [1 .. bh]
ldrtCheck' = all checkFn <| log "ldrt" <| map (countQueens . ldrtCheck) [(1 - bw) .. (bw - 1)]
rdltCheck' = all checkFn <| log "rdlt" <| map (countQueens . rdltCheck) [2 .. (bw + bh)]

Cなどの手続き型で書かれたN-Queen問題のソースコードは結構ぐちゃっとしてる場合が多いと思うのですが、やはりここは関数型の簡潔さ・スマートさを感じますね。

ちなみにRosetta Codeというサイトでいろんな言語のN-Queen問題の解法を見ることができます。

続きを読む