接続がよく切れるなーと思ってたらその日のうちに接続不可になって壊れたので買い替えた。M575でもいいかなとか思ったけどあちらは表面が樹脂のままなのですべるらしいし、傾きもたりない感じなので、そのままMXErgoを新しくしたらちゃんと接続できて、なんぞかんぞドライバーいじくちゃったせいかもなーとか思ってたけど大事には至らずにすんだ。2017年10月に買ったやつだったので、五年弱も使えたってことですばらしい。クリック音の静音化したやつも売ってくれないかなー。
接続がよく切れるなーと思ってたらその日のうちに接続不可になって壊れたので買い替えた。M575でもいいかなとか思ったけどあちらは表面が樹脂のままなのですべるらしいし、傾きもたりない感じなので、そのままMXErgoを新しくしたらちゃんと接続できて、なんぞかんぞドライバーいじくちゃったせいかもなーとか思ってたけど大事には至らずにすんだ。2017年10月に買ったやつだったので、五年弱も使えたってことですばらしい。クリック音の静音化したやつも売ってくれないかなー。
{-# LANGUAGE GeneralizedNewtypeDeriving #-} data InnerState = InnerState { _y :: Int } newtype Inner m a = Inner { runInner :: StateT InnerState m a } deriving (Functor,Applicative,Monad,MonadState InnerState,MonadTrans,MonadIO) data AppState = AppState { _x :: Int } newtype App m a = App { runApp :: StateT AppState m a } deriving (Functor,Applicative,Monad,MonadState AppState,MonadTrans,MonadIO)
GeneralizedNewtypeDerivingに任せれば良い。以下経緯。
data InnerState = InnerState { _y :: Int } type Inner m a = StateT InnerState m a data AppState = AppState { _x :: Int } type App m a = StateT AppState (StateT InnerState m a) a makeLenses ''InnerState makeLenses ''AppState app :: App IO () app = do x += 1 x' <- use x y' <- lift $ do y += 1 use y liftIO $ print (x',y')
みたいなことをやりたいとして、とりあえず動くわけだがMonadスタックが深くなってくるとtypeの書き方が気になってくる。
type App m a = StateT AppState (StateT InnerState (StateT InnerState2 (StateT InnerState3 (StateT InnerState4)))) a
このデータ構造の設計がそもそも悪いのではないかと言われればそうなんだが、まぁごりごりやっていくとこう成り果ててしまうこともある。それはそれとして。こういう場合にtypeの書き方を以下のように短くしたい。
type Inner m a = StateT InnerState m a type Inner2 m a = StateT InnerState2 m a type Inner3 m a = StateT InnerState3 m a type Inner4 m a = StateT InnerState4 m a type App m a = StateT AppState (Inner (Inner2 (Inner3 (Inner4 m)))) a
しかし、
-- • The type synonym ‘Inner’ should have 2 arguments, but has been given 1 -- • In the type synonym declaration for ‘App’ -- -- | type App m2 a = -- | StateT AppState (Inner (Inner2 (Inner3 (Inner4 m)))) a
と怒られる。typeではうまくいかないようだ。そこでtypeをnewtypeにすると、
newtype Inner m a = Inner { runInner :: StateT InnerState m a } newtype Inner2 m a = Inner2 { runInner2 :: StateT InnerState2 m a } newtype Inner3 m a = Inner3 { runInner3 :: StateT InnerState3 m a } newtype Inner4 m a = Inner4 { runInner4 :: StateT InnerState4 m a } newtype App m a = App { runApp :: StateT AppState (Inner (Inner2 (Inner3 (Inner4 m)))) a }
部分的には解決しそうだが、
-- • No instance for (Monad (App IO)) arising from a do statement -- • No instance for (MonadState AppState (App IO)) -- • No instance for (MonadTrans App) arising from a use of ‘lift’ -- • No instance for (MonadState InnerState IO) -- • No instance for (MonadIO (App IO)) arising from a use of ‘liftIO’
と怒られる。こんどはMonad系のinstanceがないぞと。こちらとしてはただのStateT HogeState m a
のエイリアスみたいなノリで使いたいだけなのに自分で定義する必要があるらしい。
{-# LANGUAGE GeneralizedNewtypeDeriving #-} -- Inner[2,3,4]は省略 newtype Inner m a = Inner { runInner :: StateT InnerState m a } deriving (Functor,Applicative,Monad,MonadState InnerState,MonadIO,MonadTrans) newtype App m a = App { runApp :: StateT AppState m a } deriving (Functor,Applicative,Monad,MonadState AppState,MonadIO,MonadTrans) type AppIO a = App (Inner IO) a
GNDのderivingが全部やってくれる。最初は以下のように手で書いていたがそんな必要はなくて俺はなにやってたんだ状態になったのでした。最初にGNDを試して駄目だった気がしたのは気のせいだったのだろう。
newtype Inner m a = Inner { runInner :: StateT InnerState m a } deriving (Functor,Applicative,Monad) newtype App m a = App { runApp :: StateT AppState m a } deriving (Functor,Applicative,Monad) instance Monad m => MonadState InnerState (Inner m) where get = Inner get put = Inner . put instance Monad m => MonadState AppState (App m) where get = App get put = App . put instance MonadTrans App where lift m = App $ StateT $ \s -> do a <- m pure (a,s) instance MonadTrans Inner where lift m = Inner $ StateT $ \s -> do a <- m pure (a,s) instance MonadIO m => MonadIO (App m) where liftIO = lift . liftIO instance MonadIO m => MonadIO (Inner m) where liftIO = lift . liftIO
エラゴン、エルデスト、ブリジンガー、インヘリタンスと続いたドラゴンライダーシリーズを読み終えた。子供の頃エラゴンとエルデストを読み、友達と映画まで見に行った覚えがある。痛烈に覚えている景色があった。エルフの森の建物が木そのものと一体となっている景色だ。木造の家ではない。木の成長、形を魔法でコントロールして生きたままの植物が家になっている景色だ。さらにグレイダーが崖の下から羽ばたき現れた景色、マーダックに敗北する前に戦場上空をサフィラと共に疲れ切った様子で飛び回っている景色など、エルデストのワンシーンが大人になってからも時折頭に浮かんだりした。そのたびに残り二巻も読みたいと思ってはいたが、本の分厚さを思い出すとなかなか読み出せなかった。今年の目標としてドラゴンライダーシリーズを読むというのを立てていたせいか、なんとなく読書ベクトル的な慣性がついていたので、ためしにKindleで一巻を買って読んでみた。すると驚くほど簡単に読み進められたので勢いよく物語は進んでいった。Kindle版というのが良かったと思う。あの分厚い本を寝っ転がりながら片手て読めるわけがないがKindleなら難なくできる。Kindleで得られる物理的な読書体験の良さがこんなにもありがたいなんて知らなかった。そんなわけで二ヶ月かかってはいるがシリーズを読破した。「アラケイジアの物語」という外伝もあるのでそちらも近々読む。
物語のラストは最初から決まっていた。指輪物語のラストのようだった。
<stderr>: commitAndReleaseBuffer: invalid argument (invalid character)
で動かないぞという話。
app\Main.hs:36:27: error: <stderr>: commitAndReleaseBuffer: invalid argument (invalid character)
とかなんとか言われて動かない場合にターミナルの文字コードをUTF-8に変えようと、
chcp 65001
とするも、
app\Main.hs:27:8: error: 窶「 No instance for (Control.Monad.Reader.Class.MonadReader GB IO) arising from a use of 窶・iew窶・[0m 窶「 In a stmt of a 'do' block: m <- view mem In the expression: do m <- view mem pure 10 In an equation for 窶腕eadMem窶・ readMem = do m <- view mem pure 10 | 27 | m <- view mem | ^^^^^^^^
みたいな感じで文字化けする場合、
[System.Console]::OutputEncoding = [System.Text.Encoding]::GetEncoding("utf-8") [System.Console]::InputEncoding = [System.Text.Encoding]::GetEncoding("utf-8") $env:LESSCHARSET = "utf-8"
とやると、
app\Main.hs:27:8: error: • No instance for (Control.Monad.Reader.Class.MonadReader GB IO) arising from a use of ‘view’ • In a stmt of a 'do' block: m <- view mem In the expression: do m <- view mem pure 10 In an equation for ‘readMem’: readMem = do m <- view mem pure 10 | 27 | m <- view mem | ^^^^^^^^
みたいな感じになっていい感じ。
うるせぇ静かにして暖かくして寝てろ。
第93期棋聖戦一局目で永瀬がイッヤッフー!!してるのでなかなか集中して書けない。
今を生きるだけで精一杯なのにどうしろと言うんだ。しかし10年20年先の自分はもっと体力的に余裕が無いはずである。それに備え今からやれるだけのことをしないとジリ貧なのは自明。とは言え、タイトルはむしろ方便なのではないか。未来の僕を理由にして今現状を否定したい欲望の表現型なのではないか。仕事辞めたい。ただそれだけ。ではないが。現状を変えたくてしょうがない。仕事がいやでしょうがない。今から僕はなにをするんだろうか。何もしない。
靴ほしいなと思って色々物色してく中でサイズ感質感を確かめるためにprime try before you buyが便利だった。24.5cmがいつものサイズ。
デザイン良くても幅甲窮屈で踵浮くのはラストと根本的に相性悪いのでつらい。
結局これ買った。甲の圧迫感だけなければ最高なんだけどな。うーん。そもそもきれいめのスニーカー探してたのでこれはちがうのではとか思いつつ履き心地楽しいという理由で別枠購入。
きれいめのスニーカーと梅雨用ゴアテックスを引き続き物色してくぞ。