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を最近買ってつけてる。あてずっぽうにシャッター押してるようなものなので大したものは撮れないのだけど、ライフログとしては面白い。たとえばチャリで移動中だとこんな感じ。
ゲームあれこれ
PS4のDark Souls 2は罪人以外の3匹まで倒してSL110超え。なんでこんなに上がってしまったのかよくわからない。奇跡に振ってるくせに牢を最後に回したので、未だに属性強化できないのが辛い。