MX Ergo買い替えた

接続がよく切れるなーと思ってたらその日のうちに接続不可になって壊れたので買い替えた。M575でもいいかなとか思ったけどあちらは表面が樹脂のままなのですべるらしいし、傾きもたりない感じなので、そのままMXErgoを新しくしたらちゃんと接続できて、なんぞかんぞドライバーいじくちゃったせいかもなーとか思ってたけど大事には至らずにすんだ。2017年10月に買ったやつだったので、五年弱も使えたってことですばらしい。クリック音の静音化したやつも売ってくれないかなー。

ただのショートカットとしてのnewtypeにMonadState/MonadTrans/MonadIOのinstanceを定義する

{-# 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で得られる物理的な読書体験の良さがこんなにもありがたいなんて知らなかった。そんなわけで二ヶ月かかってはいるがシリーズを読破した。「アラケイジアの物語」という外伝もあるのでそちらも近々読む。

物語のラストは最初から決まっていた。指輪物語のラストのようだった。

WindowsTerminal/powershellでのstack/GHCの文字化け

  • <stderr>: commitAndReleaseBuffer: invalid argument (invalid character)で動かないぞ
  • 文字コードが悪いらしいぞ
  • chcp 65001でutf8にするぞ
  • 動くようになったけど文字化けするぞ
  • powershellエンコーディングの設定するぞ
  • 直ったぞ

という話。


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がいつものサイズ。

  • オニツカタイガー TIGER ALLY
    • アッパーが全部スエードのきれいめのスニーカー。フィット感も悪くなく本命だったが仕事で履いてるアシックスの作業靴とデザインほぼ一緒だったので敬遠。残念
    • 24.5cm まともに履けない
    • 25cm 甲、幅ちょっと窮屈。踵緩めで少し浮く
  • オニツカタイガー GSM
    • 25cm 甲、幅ちょっと窮屈。踵緩めで少し浮く
  • オニツカタイガー REBILAC RUNNER
    • これもデザインかなり好みだったんだがチャッカブーツでありがちなラストに嫌われてる感じで残念。
    • 25cm 甲、幅ちょっと窮屈。踵緩めで結構浮く
  • オニツカタイガー HMR PEAK G-TX
    • これもデザインかなり好みだったんだがパーツが足に食い込むってデザインの敗北なのでは。相性。
    • 25cm 甲、幅ちょうどくらい。踵緩め。足先を曲げたとき、歩いたときに紐穴が足に食い込む
  • アシックス LYTECOURT
    • 安くこれで済ますか。みたいな感じで試したけどやはり質感それなりで買う気にはならんかった。
    • 25cm つま先ぎゅうぎゅう。小さい
  • ナイキ エアフォース1 07
    • こういう王道系って全然興味なかったんだけど一回くらい試すかと思って。まあこんなもんか感ありつつももっと物色したい。
    • 25.5cm 踵浮く。25cmを試したい。
  • アディダス ウルトラブースト 4.0/5.0 DNA
    • ソールのデザインが発泡スチロール状態なのでイマイチなんだが、クッション性が独特すぎて楽しい。靴を感じさせないかのような一体感の24.5が良かったんだけど、甲の締め付けが我慢ならんかったので諦め、若干踵浮くけど楽に履ける25を結局買った。それでも甲の圧迫感はあるのでそもそも靴と相性悪いのかもしれんが、通気性とソールが最高すぎて買ってもうた。
    • 24.5cm 最高のフィット感。しかし甲がかなりキツイ
    • 25cm 踵少しだけ浮く。甲が少しましになるもすこし圧迫感あり
  • アディダス スタンスミス
    • 王道系。世界一売れたスニーカーらしい。合成革になってしまったようで質感がだいぶ変わっていてうーん。
    • 25cm 幅甲ちょうど、踵浮く。24.5はきつそう
  • アディダス スタンスミス ゴアテックス
    • 梅雨用のゴアテックスもさがしてる。
    • ゴアテックス分狭くなるらしいので25.5にしたが普通にでかい。スタンスミスの25でだめならこっちもサイズ落として試してもむりそうかな。シンプルで良さげなのに。残念。
    • 25.5cm でかい
  • アサヒトップドライ レインブーツ ゴアテックス
    • 結構デザイン良くていい感じ。ソール、クッション性が微妙で足が前に傾いてるような感じで違和感。
    • 24.5cm でかい。幅甲は余裕あるので24cmでよさそう。

デザイン良くても幅甲窮屈で踵浮くのはラストと根本的に相性悪いのでつらい。

結局これ買った。甲の圧迫感だけなければ最高なんだけどな。うーん。そもそもきれいめのスニーカー探してたのでこれはちがうのではとか思いつつ履き心地楽しいという理由で別枠購入。

きれいめのスニーカーと梅雨用ゴアテックスを引き続き物色してくぞ。

THE BATMAN

前作のスタイリッシュさが消え失せており、渋く地味で泥臭いバットマンシリーズになるようだ。バイクは初代仮面ライダー号みたいで、バットマンカーはアメリカンマッスルカーになってて、ちゃんとダサい。ブラーがFPSゲームのそれみたいで、なんだったらUnrealEngine使ってるんじゃね感もある。しらんけど。ロバート・パティンソンはTENNETとはまた違う一面を見せてくれて良い。虚ろな。