5/2の日記

Haskellあれこれ

昔Perlで書いたTCP/IPで通信するアプリをHaskellで書き換えようと思い立つ。

ハマらないようにおとなしくstackageを利用。プロジェクトのルートにcabal.config を置くだけ。ユーザに強制すべきものではないのでsandbox系のファイルと一緒に.gitignoreに突っ込む。今回は5/1のnightlyを利用。

streaming周りconduitっていいかなーと思ったけど、試しに pipes を触ってみた。pipes-network見たけどconduitでいう runTCPClientが見つからない悲しみ。conduitの方で実装見たらだいたい fromSockettoSocket の間に Pipe を挟むだけでよさそうだったのでそれで済ました。

後、socketからの入力をパースしたくて pipes-parseを見たのだけどこっちは使い方がよくわからず。pipes-attoparsecParser作れるのはわかったのだけど、それをどうやってpipesのエコシステムに組み込むべきなのか判断に迷う。conduitだとconduitParserがきちんとあるので簡単にエコシステムに組み込めるのだけど、ParserからPipesを作る道具がない。この辺はconduitにはleftoverの型があるけどpipesにはそれがないせいな気がする。

仕方ないので Producer をラップして目的の Producer を作るようにした。これがエコシステムにあう実装かはちょっと判断できず。

wrapWithParser parser producer = do
  (r, producer') <- Pipes.Parse.runStateT parser producer
  case r of
   (Just (Right bs)) -> do
     Pipes.yield bs
     wrapWithParser parser producer'
   {- snip -}

Narrative clip

narrative clipを最近買ってつけてる。あてずっぽうにシャッター押してるようなものなので大したものは撮れないのだけど、ライフログとしては面白い。たとえばチャリで移動中だとこんな感じ。

By narrative clip

By narrative clip

ゲームあれこれ

PS4のDark Souls 2は罪人以外の3匹まで倒してSL110超え。なんでこんなに上がってしまったのかよくわからない。奇跡に振ってるくせに牢を最後に回したので、未だに属性強化できないのが辛い。