Intellij IDEAでタブのカラーとかを変更
IDEAを使っていると、テーマを変えた時にファイルのタブの色が真っ黒になって非常に見難くなることがある。
そういうときに画像に示すオプションを外すとファイルタブの色やファイルリストの色が消えて見やすくなる。
Intellij IDEAのscope language
ElmのコンパイルをFileWatcherプラグインを使ってやろうとしたら、ちょっとだけ躓いたのでメモ。
FileWatcherプラグインでElmのファイルを指定する場合、*.elm
とかだと指定できない。なぜならScope Languageというのを使わないといけないから。
elmだと、
file:*/(elmがあるディレクトリ)/*.elm
みたいな感じで行ける。
ElmでWebSocket接続の例
説明
WebSocketというのは、TCPで使える(主にブラウザー用の)プロトコルです。
WebSocket(ウェブソケット)は、コンピュータ・ネットワーク用の通信規格の1つである。インターネットの標準化団体であるW3CとIETFがウェブサーバーとウェブブラウザとの間の通信のために規定を予定している双方向通信用の技術規格であり、APIはW3Cが、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問題の解法を見ることができます。
続きを読む