bigsleepの日記

 | 

2015-05-11

リバーシのオンラインゲームを作った (4)

00:03

並行処理続き

Haskellによる並列・並行プログラミングという本がでていて、並行処理は後半の方に書いてありました。

そういえば買ったもののまだちゃんと読んでなかったので使い方色々間違ってるかもしれません。

http://chimera.labs.oreilly.com/books/1230000000929

https://www.oreilly.co.jp/books/9784873116891/



eff

かなり前に話題になっていた extensible effects というのが

Webアプリとかにも向いてるんではという気がして使ってみてます。

https://hackage.haskell.org/package/extensible-effects


向いてると思ったのは実行用の関数を変えることで機能を差し替えたりできるので

便利かもという感じのことを考えてました。


例えばロガーを差し替えられるようにしておいて

標準出力に出したり、ファイルに出力したり、その他fluentdに流したりなどできると思います。


後は例えばoauthなどで外部のAPIを呼ぶような場合に

httpクライアントをモックに差し替えてテストしやすいようにするなど。


ただ結局テストあまり書いてなかったり、モック使ったテストも書き間違ったりするので

あまり活かせてない気もします。


extensible effects それなりに使えそうだなという感じで結構いいとは思います。

微妙な点も色々あって

型推論があまり上手くいかなくて型注釈をたくさん書く必要がある場合があったり、

他のライブラリであまり使われているわけではないので再利用できなそうだったり、

パフォーマンスがあまり良くないらしいとか。



他にもいくつか eff 実装したライブラリがあるようでどれ使ったらいいのかよく分からんという感じもあります。

effectをどの実装でも使いまわせるような仕組みがあるといいのかなと思うんですが書くの難しそうです。

https://hackage.haskell.org/package/effin

https://hackage.haskell.org/package/effect-handlers



wai, warp

httpやwebsocket通信部分に wai, warp, websockets, wai-websockets あたりの

パッケージを使いました。


wai, warp は有名でよく使われていると思います。

確かバージョン3からconduitを使わないように変更されて

色々変わっているので検索して見つかる情報はちょっと古いことも多いかもしれません。


http://hackage.haskell.org/package/wai-3.0.2.3/docs/Network-Wai.html

type Application = Request -> (Response -> IO ResponseReceived) -> IO ResponseReceived

アプリケーションが上のように定義されていて

アプリケーションとあと設定などをwarpに渡すとサーバーとして動くという感じで

使うのは難しくないと思います。

基本的にはリクエストを受け取って、何かしてレスポンスを返すというだけです。


ただこのままだと使いにくかったので

waiのリクエストから変換できるタイプを扱う型クラス (FromWaiRequest) と

waiのレスポンスに変換できるタイプを扱う型クラス (ToWaiResponse) を

使ってます。


コードは下の感じです。

https://github.com/bigsleep/Wf/blob/master/src/Wf/Network/Wai.hs



ルーティング

一部websocketを使うのでルーティングとかどうやるんだろうかと思ったんですが

websocketもハンドシェイクの段階ではhttpで通信するようで

ルーティングでは特に何も気にしないでもいいようでした。


httpメソッドとパスとルーティング定義から、マッチするアプリケーションを呼び出すという感じで書きました。

ちょうどMonadPlusのmsumが使えそうという気がしてこれを使いました。

https://github.com/bigsleep/Wf/blob/master/src/Wf/Web/Routing.hs

http://hackage.haskell.org/package/base/docs/Control-Monad.html#v:msum


このへんも色々ライブラリがhackageにあると思います。

http://hackage.haskell.org/packages/search?terms=routing+route

トラックバック - http://d.hatena.ne.jp/bigsleep/20150511/1431356607
リンク元
 |