Pop_OSインストールしたら夕暮れを壁を挟んで三回背にしてた

PopOSをインストールして環境設定してたらくそめんどくさかったんだけど、何一つメモ残してないから何がめんどくさかったのかわからないまま、ブログアップロードテストを迎えてしまったらいなう。

  • GドライブのSSDのフォーマットがMBRだったのでハマる
    • 音楽とゲームのデータ置き場だったんだけど、なぜかMBRだった。データ移して、GPTにフォーマットし直して、データ戻して、パーテーション切って解決
  • nvideaのドライバー付きのISOだったはずなんだけど、インストールしてリブートしたら画面真っ黒でハマる
    • リブート前にドライバー再インストールしたら直太朗
  • 日本語入力できずハマる
    • Preonic/qmkの設定が悪いのだろうと思い込んでて、GUIからちゃんと設定できるやつ見逃してた
    • mozcにIMEの有効化無効化を変換無変換に割り当てるも、そもそも入力ソースにmozcを使う設定になってなかった
  • dfu-utilがキーボードを認識せずハマる
    • qmkの設定変えようとするもdfu-utilがCannot Open Device
    • util/udev/50-qmk.rulesを/etc/udev/rules.d/に入れる
    • sudo udevadm control --reload-rules
    • sudo udevadm trigger
    • でなんとかなった気がする。色々やってて気がついたら治ってたパターン
  • githubに接続できずハマる
    • sshキー設定してつなぐも違うfingerprintが帰ってきて戸惑う
    • 無視してEnter。つながった。これは大丈夫なのだろうか...
  • nvim-qtがバッククォート表示しない
    • なんでや
  • みんな大好きVimIME。今更再びハマる。
    • fcitx5-mozc
    • autocmd InsertLeave * call system('fcitx5-remote -c')
    • autocmd InsertEnter * call system('fcitx5-remote -o')

設定するだけしてやることない問題

QMKにNICOLA配列でも設定するか

keymap

PreonicのQMKに定義してみた。一年ほど前に。キーマップ書いて一切練習してなかったのを思い出してちょっとやってみるかっと思ってファームウェア書き込んだら、修飾キーあたりが動かんくてなるほど、それで練習しなかったのかとなっとく。調べてみたもののこれでいいはずなんだけどなーってやつが思い通り動いてくれないので、NICOLAモード中にAltやCtrlを使えないという雑な作りでもういいや状態になってしまった。


とかなんとか書いていて、ふと思いついた修正をいれてみたら直ったぞ。まぁよかった。

Unicode Support

話を戻して、rules.mkUNICODEMAP_ENABLE = yesとしてUnicodeMapをわーと日本語の定義を書いて、ってこれぜったいどっかにあるだろ。自分で書くなよ。と思いつつも書いて。NICOLA配列もわーとならべて。いくぜーとフラッシュしても全然文字化けしてて。えーと思いつつぐぐると設定がもうひとつたりてなくて。UnicodeのInputModeを指定する必要があるらしく、しかしWindowsのビルドインメソッドはおすすめしないよと書いてあって、代わりに書いてあったのが、WinComposeというアプリを使えと。それインスコして、matrix_init_userset_unicode_input_mode(UC_WINC)を追加しておつかれさまでした。

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
   |        ^^^^^^^^

みたいな感じになっていい感じ。