5/2の日記
Haskellあれこれ
昔Perlで書いたTCP/IPで通信するアプリをHaskellで書き換えようと思い立つ。
ハマらないようにおとなしくstackageを利用。プロジェクトのルートにcabal.config を置くだけ。ユーザに強制すべきものではないのでsandbox系のファイルと一緒に.gitignoreに突っ込む。今回は5/1のnightlyを利用。
streaming周りconduitっていいかなーと思ったけど、試しに pipes を触ってみた。pipes-network見たけどconduitでいう runTCPClientが見つからない悲しみ。conduitの方で実装見たらだいたい fromSocket と toSocket の間に Pipe を挟むだけでよさそうだったのでそれで済ました。
後、socketからの入力をパースしたくて pipes-parseを見たのだけどこっちは使い方がよくわからず。pipes-attoparsecでParser作れるのはわかったのだけど、それをどうやって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
ゲームあれこれ
PS4のDark Souls 2は罪人以外の3匹まで倒してSL110超え。なんでこんなに上がってしまったのかよくわからない。奇跡に振ってるくせに牢を最後に回したので、未だに属性強化できないのが辛い。