Keyball 44を組んだ

分割キーボードには以前から興味があり、特にKeyballは気になっていましたが、なかなか手を出せずにいました。 そんな折、友人がKeyball 44を組むために遊舎工房に行くと言っていたのでついていきました。

秋葉原の卍力屋。機会があればまた行きたい
この時点でもまだ組む気はあんまりなかったのですが、その友人はその日に組むためのパーツをすべて買ってしまいました。これでちょっと焦り、そろそろ組むかの気持ちになりました。 また、このときに余分に買うことになったスイッチ(というかスイッチが35個入りで、当時自分はKeyball 61を組もうとしていたので3セット買うと丁度よく、その残り)を自分が引き受けることにしたので、この日以降自宅に使う予定が(あんまりない)スイッチがなんかある みたいな状態になっていました。

まあ正直ネックだったのは値段だけで、月に趣味に使える予算をある程度決めている都合、他に何かやったり買ったりする月に買うことができなかっただけだったりしました。

そして今月は何もなかったのでついにパーツを買うことができた次第です。 ちなみにもともとはんだごては持っていませんでしたが、人生にはんだごては1つくらいあった方がいいと思ったので買いました。

あとは台とか (これについてる金属たわしかなりいい感じでした)

マットとかも。

で3連休でちょうどよかったので組みました。

はんだ付けは中学ぶりで超久しぶりなので

こんなんなったりしましたが、ダイオードをつけ終わる頃には慣れたのであとはスムーズでした。

はんだは70gも使う予定がないので、失敗して足りなくなる可能性に恐れながらも14gのものにしましたが、結局半分も使わなかった気がします。

作業中っぽい画像

13時くらいに作業を始めて、途中1時間くらい昼食を食べに行きつつ20時ごろ完成したので、だいたい6時間で完成。

で動かしてみると5箇所くらい反応しないキーがあったので翌日に持ち越してつけなおしました。 そのときにネジが1箇所死んでしまったのでなんとかする方法を募集しています。

Cherry MX互換部分のキーは80Retros X HMX Jokerを選択。 遊舎工房に行ったときに適当に触ってみたなかで一番感触が好みだったやつです。 Amazonの遊舎工房ストアにはまだ残っていますが、直販サイトだとページが消滅していました。もう生産終わってたりするんでしょうか……

ロープロファイル部分のキーはKailh Sunset Tactile Choc Swithesを選択。 その名のとおりのタクタイル感が親指キーとしてはちょうどよいです。


そんなわけでこの記事は完成したKeyball 44で練習がてら書いていますが、めっちゃしんどいです。 これ慣れたら慣れたで他のキーボード使うときに大変になるんじゃないかなあ…… もともとHHKBを使っているので、分割入門には7s Proが最適ではあったんですが、それはそれでおもしろみもないのでKeyballにした次第でした。


余談ですがLinuxでremapを使うならudev ruleが必要です。このコメントのものを書けばいいんですが、無知な自分は拡張子が.rulesじゃないといけないことを知らずに2時間溶かしました。 github.com

2025

は〜年末年始休暇だ〜年末!? の流れで思い出しました。

xecua.hatenablog.com

進捗

午前Ⅰ免除が切れるので記念受験したデスペに合格しました。

過去問3年分しか解いてませんが、解いた感じ物理設計ド下手だったので可能な限り概念設計を取る戦略で受けました。 今年は運の良いことに午後Ⅰに概念設計が2問あり、マジで物理設計を解く機会がありませんでした。

ただ今年の午後Ⅱの問2はカスまあまあな悪問でした。デスペドットコムの掲示板には単独でスレが立つ程です。 www.db-siken.com

模範解答もありえないことが書いてあるので、なんでこんなに点数があるのかよくわかりません。 ネスペのときもそうでしたが私が受けると設問に不備が出るんですかね。

ともあれ論述のいらないのは取っちゃったので、次(今割とモチベありませんが)は諦めてそっちに行くしかありませんね。SC、SA、PMあたりになると思いますが。


今(30代前半くらいまでの間に)やっとかないと今後一生やらなさそうなのでやっとけシリーズが個人的にある(例: 修士号の取得)んですが、そのうちの1つ、普通自動二輪免許の取得に踏み出しました。 10月に入校して、11月から教習を開始、現時点で第一段階まで終了しました。

当然MTですが、1回だけあるAT教習では普通に事故りかけたので、ビッグスクーターだけは一生乗らないと思います。 やっぱりMTなんですよね〜 (四輪車も久しぶりにMT運転したい……)

来年の3月までには取得したいところです(大学生が春休みに入る前に終われるといいけど…… まあ二輪だしあんまり関係ないかも)。

目標

今年も目標をいくつか立てていました。

ソロキャンをする

道具は揃いました(改良の余地はあります)。焚き火台はTokyo Craftsのマクライト2。 (SOTOのバーナーを使っているので、火まわりをSOTOで揃えるためにエアスタが欲しい、とは思っていますが、お値段の都合と、料理に弱そうなあたりでいったん見送り) 焚火台マクライト2tokyocrafts.jp

かなり軽くてコンパクトに収納できる割にちゃんと大きいのでいい買い物をしたな〜って思ってます。 スノピの焚き火台(格上)持ちがいなければグルキャンでも使えると思う代物です。

あと去年12月にキャンプ行ったらクッッッソ寒かったのでダウンシュラフ買いました。 試運転した感じは悪くないです。というか11月末に行ったし本運転かも。 takemo.base.shop

ただソロキャンプには行けていません。バイクの免許取るしツーリングキャンプとかできるといいなあ。

運動をする

目安としてGoogle Fitのハートポイント30を毎日……としましたが、流石にこれは無理。 毎週ランニングか何かの運動をする、くらいはやろうと思い、実際キャンプなどで運動できない場合を除いてほぼ達成しました。 ランニングと言っても1.5kmでバテバテになるので、その程度ではありますが……。

来年は週2とかに増やしたいと思っています(ジム使えるといいんですけど高い……)。

Gentoo Linuxになんかしらのcontributeをする

上流に還元するってやつですね。やりたい項目はいくつか見つかってはいるんですが、知らん人と話をするのが怖い……

あと上旬はNixに現を抜かしていたので機会が単純に減っていました。 Nixは思想は嫌いじゃありませんが、実装に無理がありすぎるのとドキュメントが終わっているのでやめました。

WSLもNixOSかなって思っていましたが普通にArchに戻しました(GentooはWSLには重いのでArchくらいが丁度いいと思ってます)。

引っ越す

なんか最近毎年言ってる気がする。 契約更新だったので引っ越そうかと思ったんですが普通に時期が悪い。 いい感じの物件は見つかったんですが会社の家賃補助を考慮に入れてもらえず審査に落ちました。

そもそも現在の住居の契約を読み違えていて、1年経っていれば違約金は発生しなくなるようなので、来年の夏頃に改めて探そうと思います。

その他

去年の記事になんか書いてましたがMagic: the Gatheringに関しては何度かFNMなど店舗イベントに参加しました。 というか書いてなかった気がするけどスタンも組みました。RWのバーン。 変なデッキが好きになってしまうようで、それとは別にLOにも興味が湧いています(ヘイト高いので躊躇……)。

でFNMなんですけどアレ(少なくとも晴れは)どっちかというと競技指向のイベントですね。 カジュアル勢には厳しい感じがしたので(特に恵まれないパイオニアは)厳しい……。

EDHならブラ3くらいはカジュアル勢多いと思うので、知らん人とやりたいだけならそっちの方がいいのかなあとなってます。


今年も5月にどこかにビューーンをしましたが、 xecua.hatenablog.com

このあと日本酒への興味は続いており、居酒屋に行っても日本酒が気になってしまったり、旅行先で日本酒を飲んでみたり、日本酒の同人誌や本を買ったりしました。

www.kodansha.co.jp

何かしらの酒の愛好家になりたいとは思っていたので、このまま日本酒党になってもいいかな、と思っています。 ビールも好きですけどね。

写真

ちなみに構成考えるの面倒なので去年の記事見ながら同じことやってます。

1月にハワイアンズ行きました。日本一長いらしいボディスライダーがすごいよかったです。

関東大震災後に火事延焼防止目的で小学校と公園が併設された、いわゆる復興小公園の1つ……なんですが、小学校が消滅してデカい公園になった場所。 何かっていうとエクハのイベントの物販後に暇だったので散歩してたら見つけたやつなんですが、イベントの方のいい感じの写真がありませんでした。 お世辞にもヒットしたとは言えない(原文ママ)コンテンツですが、来年もなんかあるといいなあ……

そういえば同じくキングレコードが一枚噛んでる歌メインのアニメ、プリオケの行く末も気になります(メインターゲットにウケているのかよくわからない…… イベントのファミリー席は流石に埋まりますが)。

4月。箱根に温泉旅行に行きました。旅館でのんびり〜をやりたかったんですが、1泊2日だったので割と忙しかったのがちょっと残念。 ロマンスカーで箱根湯本に行く、はやりたかったので達成できてよかったですが、もっと言うとGSEの展望席がよかった(予約失敗)。

9月。万博に行きました。前日に別の用事があってから、その足で車で大阪まで行き、2日間滞在したのでかなり慌しい3日間でした。 頻度的に四半世紀後くらいにはまた日本でやりそうですが、やってるもんには行っときたいですからね。行ってよかったです。

12月。今年2回目のどこかにビューーンをしました。日帰りだったので日記にすらしていなくて、Twitterで何件か投稿したくらいでした。 今回は12月に解禁されたばかりのグリーーンを利用。目的地は新庄(山形新幹線の終着駅)になりました。 dokokani-eki-net.com

東京⇔新庄で3時間半(はやぶさの東京新青森間より長いみたい。グリーン車じゃなければ耐えられなかったかもしれない)。 温泉に行きたい気分だったので、さらにそこからバスで片道1時間のところにある肘折温泉に行きました。 自宅と東京駅間の移動も含めると、総移動時間11時間とかいうよくわからない日帰り旅行になりました。

豪雪地帯らしく、前日はドカ雪が降ったみたいですが当日はちょい雪程度だったので助かりました。 (最初車を検討していましたが普通に雪ヤバいよな……となり公共交通機関に絞ったのは正解でした)

$XDG_CONFIG_HOMEを設定しているとFlutterがすごいところに設定を書き込む

XDG Base Directory使ってますか? 対応してるコマンドの設定とかなんやらかんやら全部押し込められるし分散しなくて楽なのでおすすめです。

specifications.freedesktop.org

ところでこれのうち$XDG_CONFIG_HOMEを設定していると、Flutterがすごい挙動をします。

$ echo $XDG_CONFIG_HOME
/home/xecua/.config

$ flutter config --jdk-dir /opt/openjdk-bin-25
Setting "jdk-dir" value to "/opt/openjdk-bin-25".

You may need to restart any open editors for them to read new settings.

$ cat $XDG_CONFIG_HOME/settings
{
  "jdk-dir": "/opt/openjdk-bin-25"
}

おわかりでしょうか。

$XDG_CONFIG_HOME/settingsに設定を書き込んでいます。

前述のXDG Base Directory Specificationでは

Specifications may reference this specification by specifying the location of a configuration file as $XDG_CONFIG_DIRS/subdir/filename. This implies that:

Default configuration files should be installed to $sysconfdir/xdg/subdir/filename with $sysconfdir defaulting to /etc.

A user-specific version of the configuration file may be created in $XDG_CONFIG_HOME/subdir/filename, taking into account the default value for $XDG_CONFIG_HOME if $XDG_CONFIG_HOME is not set.

Lookups of the configuration file should search for ./subdir/filename relative to all base directories indicated by $XDG_CONFIG_HOME and $XDG_CONFIG_DIRS . If an environment variable is either not set or empty, its default value as defined by this specification should be used instead.

と記載があります。

たいていのアプリケーションではsubdirの部分に自分の名前をつけることによって、他のアプリケーションとの衝突を避けていますが、Flutterは$XDG_CONFIG_HOMEは俺の庭だと言わんばかりに直下に作っている訳です。
解釈の余地がある(諸説)のでFlutterが即悪とは言えない(諸説)ような気もしますが、他のアプリケーションに倣って$XDG_CONFIG_HOME/flutterにでも書き込んでほしいものです。

ちなみにPRを送ってマージに至るのは非常に難しいようです(詳細は知りませんが)。

I believe the main issue is that contributing to flutter repositories is incredibly difficult, and there are not enough resources on the flutter team to support open source developers.

github.com


ちなみに該当の処理を行っている箇所はこちら。 https://github.com/flutter/flutter/blob/master/packages/flutter_tools/lib/src/base/config.dart#L195-L211

$HOME/.flutter_$nameがあればそのファイルを、なければ$XDG_CONFIG_HOME/$name($HOME/.config/$nameにフォールバック)を使う、という挙動のようです。 nameには(把握している限り)tool_statesettingsが入る可能性があります。

ということで、現時点で可能なWorkaroundは次のどちらかになりそうです。

  1. $HOME/.flutter_tool_state$HOME/.flutter_settingsをあらかじめ作成しておく

     $ echo '{}' > $HOME/.flutter_tool_state
     $ echo '{}' > $HOME/.flutter_settings
    
  2. 次のようなaliasを設定する (例: fish)

     alias flutter='XDG_CONFIG_HOME=$XDG_CONFIG_HOME/flutter command flutter'
     alias fvm='XDG_CONFIG_HOME=$XDG_CONFIG_HOME/flutter command fvm'
    

自分は2の方をやることにしました。

Xiaomi Pad 7を購入しました

学生時代にiPad Pro (第1世代11インチ)を購入してから、ずっと使い続けてきました。

学生時代の主な用途はノートで、GoodNotesを利用していました。 また、そこそこスペックもいいのでゲームもいくつか遊んでいました。 特に遅延が少なく音ゲーに向いているのはそれなりに知られていることかと思います。あとははらがみなどをやっていました。

最近はもっぱらゲームで、特に実家に帰っていてPCが使えないときのホヨバゲーのプレイ環境としては(貧弱なPixelよりは)頼りになる存在でした。 ただ、いかんせんストレージが貧弱でした。学生時代に買ったやつなので容量が64GBしかなく、近年の大容量化の波には勝てなくなってしまいました。

そんな感じで、ここ数年は買い替えたいという気持ちもありつつ、iPadを買った当時よりもApple嫌いは加速していたので、Androidタブを検討していました。 ただAndroidタブは選択肢が多く、また特に強いのが中国・韓国であることからなんとな~く抵抗があり(Pixel Tabletには期待していたのですがあのザマ)、二の足を踏んでいたところでした。

4月頃に一念発起し、軽く調べてみるとXiaomi Pad 6s Proというタブレットが非常によさそうなことがわかりました。 一方で、このタブレットがちょっと昔のもので、もう中古のものしか出回っていないようです。 このシリーズだと今はXiaomi Pad 7と7 Proがあり、7 Proは値段の割に7よりも嬉しいポイントがあまりなかったので、6s Proか7か、という二択となりました。 決め手はコレ、というものはありませんでしたが、中古のものに手を出すのにやや抵抗を感じる性格だったのと、強いて言えば6s Proが12インチとでかいのがちょっと邪魔になりそうかな~という感じで新品の7を購入するに至りました。

ちなみにヨドバシカメラで23時に購入したら翌日の9時前に届きました。こわい。

以下は軽く知見的なものを置いておきます。

音ゲ

主にプレイしているのはArcaea。軽く遊んでみたところなんかやたら無反応が発生するので適当にggってたらいくつか知見がヒット。 ↓の設定をしてみたらとりあえず反応はよくなりました。 note.com

iPadのときは60fpsでしたが、今回のタブレットでは120fpsになりました。なんとなく速く感じます。慣れるまでちょっと時間がかかりそうです。(ボルテの新筐体のときそんな差感じたっけな……) (これもしかしてソフト側で対応してなくて意味なかったりします?)

ゼンゼロ

はらがみは半分引退しているのですが、たぶんゼンゼロが楽しすぎるからです。 60fpsにしてみましたがカクついたりはしなそうです。オブジェクトが増えるとちょっと重いかも。

ノート

今でも一応IPAの試験を受けるときなどはノートを使うことがあるので、調べたり軽く触ってみました。

Goodnotes

iPadではお世話になっていましたが、Androidはあんまりよくないという評判を聞きます。 というか5あたりからサブスクになったので微妙ですね。ということで選択肢からは外しました。

一応今でもiOS限定で買い切り版はありそう? www.goodnotes.com

Jnotes

UIはシンプル目ですが機能はiOS版GoodNotesと同じくらいの雰囲気。 1,920円の買い切りモデルと月320円あるいは年1,036円のサブスクモデルがあります。後者を(1月のお試し以外の目的で)選ぶメリットは不明。 note.com

StarNote

こちらもiOS版GoodNotesくらい機能がありそうです。 さらにXiaomiのスタイラスペンのボタンに機能を割り当てることができます。 アカウントを作らないと有料版の値段がわからないし、いくら調べても出て来ませんが、買い切りで 950円 のようです。破格。 starnote.ai

ということでいったんStarNoteを使ってみることにします。 ノートアプリも中国製が強いっぽくて、ちょっと不安にはなります (中国人のことは割と信頼していますが、中国という国はあんまり信頼できない……)。

(追記) 2週間くらいの感想

ArcaeaちょいちょいやったりStarNoteでデスペの問題解いたりしていました。

  • Arcaea
    • 速く感じたのでハイスピをちょっと落としました(5.2→4.9)。見えるようにはなりましたが120fps感はあんまり感じなくなりました。
  • StarNote
    • 最初はiPadでのGoodNotesや、Xiaomi純正アプリであるMi キャンパスと比べると若干のラグを感じました。ただ、慣れてくるとあんまり気にならなくなります。
    • GoodNotesだとバックアップの一環でPDFを出力してくれましたが、このアプリはエクスポートで明示しないと出してくれないようです。このへんは今後に期待というところでしょうか。
      • もっと欲を言うと、.goodnotes形式の取り込みに対応してくれると非常に嬉しい。

(追記2)

使っていたiPadを売りました。「ちょっと曲がってるのであんまり高くは買い取れませんね(15000円)」←悲しい。

ビューーン

去年ゴールデンウィークに行ったので今年もゴールデンウィークに行くか~と思ったら、連休が短すぎて取れなかったので翌週に行きました。 今年はJRE BANKの特典で4000ポイントです。 xecua.hatenablog.com

候補はこんな感じ。 行き先候補。水沢江刺駅、山形駅、二戸駅、長岡駅の4択。

長岡駅に決まったので新潟出身の友人にお勧めを聞いたりしました。


初日は車を借りてちょっと遠出。 Google Mapで見つけた八方台、友人にお勧めされた栃尾(の油揚げ)、JR東にお勧めされた山古志へ。

八方台はマジ絶景だったのでおすすめです。特に5月くらいだと雪が残っててこれがまた良い。 徒歩は現実的ではないしタクシーを使うと多分渋い顔をされるので、自動車の免許があった方がいいと思います。

八方台からの風景。下の方に池や森林が、中央に雪を被った岩山が見える。
森林のコントラストがまたいい

栃尾では油揚げを食べました。個人的にはかんずりが好み。 道の駅とちおの油揚げ焼き定食

山古志は棚田がいい感じ。 山古志の棚田 復興交流館とやらがあって何の復興かと思ったら中越地震(2004)とのこと。まだ物心ついてない頃だし阪神等と違って学校でも取り上げられないので知りませんでした。 道中やたら新しい擁壁があったので何かと思ったんですけど多分これ由来ですかね。

このあと温泉入る予定だったんですが時間が早すぎて微妙だとなり一旦車を返してしまって宿にチェックイン。 宿は「ビジホってなんかいいよな~」で駅前のビジホ。

でかい風呂に入りたかったんですが近場にはなく、車は返してしまっていて、バスや電車も全然ない地域なので普通に困ってしまいました。 宿で1時間くらい悩んだ挙句、たまたま行きのバスがいい感じの時間にあったゆらいやへ。 yuraiya.com 帰りは40分歩くことになって、まあそれはいいんですが丁度雨が降って大変でした。

夜は去年食べたへぎそばが忘れられなかったのでへぎそばを食べました。 タレカツ丼もセットになったやんちゃなやつがあったのでそれをセレクト。

へぎそばとタレカツ丼のセット
やんちゃ


2日目の予定は1日目の夜に組みましたが、所要時間が読めないところもあったので割と行き当たりばったりでした。

まずは朝一で県立近代美術館へ。 美術館とか全然行かないタイプだったんですが、去年青森県立美術館に行ってから、旅行で美術館に行くのが定番になった感じがします。 時間の都合でコレクション展だけ鑑賞。近辺に在住歴のある人の作品が展示されていました。 新潟県立近代美術館の外観

その後科学博物館へ。いろいろ入ってる建物の1コーナーって感じでしたが普通に1時間以上溶けました。 長岡市立科学博物館の外観

そこから歩いて宮内駅に向かい、青島食堂で生姜醤油ラーメンを食べました。 以前三条に行ったときに杭州飯店で背脂ラーメンは食べてたので、5大ラーメンのうち2つを(ほぼ?)発祥の店で食べたことになります。 青島食堂宮内駅前店のラーメン

実は青島食堂は秋葉原にもあって、そちらに1週間前に予習も兼ねて行っていました。 青島食堂秋葉原店のラーメン (大)

秋葉原だと1時間待ちましたが本店は10分くらいで食べられました。 本店はこちらと比べて味があっさり目で食べやすいしスープも飲みやすい……と思ったんですが、割と目分量なので偶然だったかもしれません。

あとは駅に戻って新幹線の時間まで待っていたんですが、暇だったのでぽんしゅ館で唎き酒をしました。以下メモ。

  • N-888: フルーティ。バナナ(って書いてあったけどそうかなあ)……?
  • よしかわ杜氏 大辛口: ザ って感じだったかも
  • 北雪 越淡麗: 口に入れた瞬間香りが広がる。今回飲んだ中だと一番好きかも。
  • 清泉: めっちゃさっぱり

日本酒自体ちゃんと飲んだのは始めてだったんですが、同じ米でもここまで個性が出るんだなあ、とちょっと興味が湧きました。

貰った本の感想

友人と誕生日に本を贈り合う習慣が生えた。 私の前回の誕生日には5人から貰っていて、まだ感想とか書いてなかったので書いておく。

その前に昨年の誕生日の時点で貰ったものも感想を書いていなかったのでそちらから。

会話の科学 あなたはなぜ「え?」と言ってしまうのか

books.bunshun.jp

読んだの一年前だから内容割と忘れちゃったかも。 会話は言語学とは別物として文化的な分析とかをされがちだけど、科学的にも分析できるんじゃないか……ということで分析した結果の報告。 結構根気強く会話の様子を録音・文字起こし等々している。 人文系・社会学系だと科学論文じゃなくて本という形で出すみたいなこともあるらしいのでそういう感じかも。

どの言語でもだいたい1秒以内に返事がなかったら相手が理解できなかったと思ってしまう、とか、そのことと人間の運動の仕組みからして、人間は会話の終端を予測しながら返事をする、とか、そういった分析が見られておもしろかった。

ちなみに帯に書いてある「日本人の返事は世界一食い気味」に関しては表から読み取れるが、別に本文中で深堀りされている訳ではない。


ここから今年。

いなくなれ、群青

www.shinchosha.co.jp

アニメ化もした「サクラダリセット」の原作者である河野裕の作品の中でも、恐らく割と有名な方のやつ。 発売当時は「刺さらなさそうだな……」と思ってスルーした一冊だったりする。

河野裕に関してはサクラダリセットでもなくて、以前通勤時間に読む本を募集したときに(この本を贈ってくれた)友人が薦めてくれた「昨日星を探した言い訳」(長いので以下『言い訳』と書く)が最初の作品だった。 今年贈ってもらう本を整理していたときに、『言い訳』の雰囲気がよかったので河野裕作品も入れておこうかな、と入れたらそのまま薦めた本人から来た。

『言い訳』でもそうだったけど、少年少女が未熟なりに互いの思いの丈を全力でぶつけ合う(勝手に青春レスバトルって言ってる)雰囲気が非常に心地良い作品だった*1。 こちらはシリーズものになっているものの、普通に1冊で完結してはいるので、続きはいつか。というかどう続くんですかこれ。

アクロトリップ 特装版 #1~#5

www.s-manga.net

アニメがなんかめっちゃよかった(特に伊藤美来が出す伊達地図子の声)ので入れてたら贈ってくれた。 この作品アニメ化の時点で完結してたんですね。 内容的にはアニオリ挟みつつ頑張ればもう1クールいけなくもないかも、くらいの感じでした。出て来てないキャラクターいるし。 結局社長はなんだったんだよ、という人は是非原作を読んでください。ちゃんと回収されています。

アニメの方の感想で書いたかもしれない(書いてないかもしれない)けど、「(大局的に見ると)ほとんど何も起きていないが、登場人物の心の中で小さな変化が起きている作品」(要するに日常系なんですけど)。 個人的に、田舎に引っ越してきて心を塞いでしまった中学生の女の子が周りの大人に巻き込まれてなんやかんやでちょっとだけ心を開く、みたいな作品が好きなんだと思います。 「ササエルの中には誰もいない」もそんな作品で好きです。ダンテとササエルっていう立ち位置も似てるね。もうこれ姉妹作品なんじゃないか。 似たような作品あったら誰か教えてください。

それでも町は廻っている #1, #16, 廻覽板

www.shonengahosha.co.jp

とりあえず全巻入れてたら1巻と最終巻が贈られてきた。どうなっとんねん。 間を手に入れるまでは読めないのでとりあえずそのまま寝かせています。

リンカ・ローダ実践開発テクニック

shop.cqpub.co.jp

「喉から第二関節が出るくらい欲しい本」と言われて贈られてきた。実際喉から第二関節が出るくらい欲しかったかもしれない。 コンパイラ沼にのめり込まない限りリンカとかローダに焦点当てることってそんなにないと思うのでいい機会だったと思います。

今は通勤中にちょいちょい読んでいますが、ちょっとデカくて場合によっては読めないのでペースは遅め。 スマホは開けるくらいの幅が確保できたときは電子で買ったBinary Hacks Rebootedを読むこともありますが、内容が一部重複するので「あれ、この話さっきしなかったっけ?」みたいな状態になったり。 シナジーはあっていいと思います。

ゼロからのOS自作入門

book.mynavi.jp

通称みかん本。 著者が1回だけ(当時の)東工大で講義をしたときの教科書にもなっている……らしい。 ちなみに私は外せない用事と重複したかなんかでその講義を取れなかったのでめっちゃ悔しい。 でその講義動画が上がっているらしく、それを見ていた友人に「ええやん」って言ったら「お前もやれ!」と贈られてきた。

低レイヤのできない人間にプログラマを名乗る資格はないのでは?という過激派なのでやりたいとは思いつつも、以前30日でできる方で挫折しているので躊躇しており、じっくり腰を据えてできるときが来るのを待っています。

*1:サクラダリセットは別にそうでもない……よね

Vimの起動中だけIMEを切る

Vimといいながら私が使っているものがNeovimであることは置いておきます(たぶんこの記事の内容においてはVimでもいけるはず)。


InsertモードのときだけIMEを有効にする、みたいなのはよく見かけますが、SKK使いの自分にはskkeletonがついています。 github.com

むしろVimを起動しているときはIMEを無効化しておきたいです。
これまではGUIエディタのときは勝手に無効になる(Neovideだとなんか入力できなかったりする)、ターミナルから起動するときはLinux(fcitx5)なら都度IMEを有効化/無効化していましたが普通にめんどくさいですし、macOS(macSKK)だと「(ターミナル)では直接入力」を選択することになるので、他のアプリケーションで日本語が入力できなくなる致命的な問題がありました。

で気付いたんですがVimの起動状態にあわせてIMEの状態を切り替えればいいんですよね。ということでやりました。

一応探したんですけどそれっぽいのはありませんでした。
こちらは探してるときに最初に出てきたプラグインIMEの状態を変更するやつってim-selectくらいしかないと思っていたんですけどいろいろあるんですね。参考になりました。 コードは別に読んでません。 github.com

Vimの起動中だけIMEを無効化したい訳ですが、起動中でも他のアプリにフォーカスが行っているときは有効化していたいです。
つまりフォーカスに関するイベントがあればいい訳ですが、流石にあります。FocusGainedFocusLostvim-jp.org あとは起動時と終了時にもIMEの状態を切り替えたいのでVimEnterVimLeaveにもフックするといいと思います。

これを使うにはフォーカスに関するイベントの検知に対応しているターミナルエミュレータGUIアプリじゃないといけませんが、まあ大体対応していると思います。
1つだけ注意する必要があるのはtmuxのようなマルチプレクサを使っている環境でしょうか。そのままだとフォーカスに関するイベントが貫通しません。
tmuxの場合はggるといくらでも出てきますが、set -g focus-events onをすればokです。

という訳でできたものがこちら。ちゃんとプラグインとして整備しようとするとちょっと大変そうなのでdotfilesに置いているだけです。 そのうちやってもいいかもとは思っています。

github.com

いちおうコードそのまま置いときますね。

vim.api.nvim_create_autocmd({ "FocusGained", "VimEnter" }, {
    group = init_augroup_id,
    pattern = "*",
    callback = function()
        -- disable IME
        local os_string = require("xecua.utils").get_os_string()
        local command = nil
        if os_string == "Linux" then
            local c = nil
            if vim.fn.executable("fcitx5-remote") then
                c = "fcitx5-remote"
            elseif vim.fn.executable("fcitx-remote") then
                c = "fcitx-remote"
            end
            if c then
                -- test fcitx is running (e.g. in GUI session)
                local result = vim.system({ c }, { text = true }):wait()
                if result.code ~= 0 then
                    error(result.stderr)
                end
                if result.stdout ~= "0\n" then
                    command = { c, "-c" }
                end
            end
        elseif os_string == "Darwin" then
            if vim.fn.executable("macism") then
                command = { "macism", "com.apple.keylayout.ABC" }
            end
        end
        if command then
            local result = vim.system(command, { text = true }):wait()
            if result.code ~= 0 then
                error(result.stderr)
            end
        end
    end,
})
vim.api.nvim_create_autocmd({ "FocusLost", "VimLeave" }, {
    group = init_augroup_id,
    pattern = "*",
    callback = function()
        -- enable IME
        local os_string = require("xecua.utils").get_os_string()
        local command = nil
        if os_string == "Linux" then
            local c = nil
            if vim.fn.executable("fcitx5-remote") then
                c = "fcitx5-remote"
            elseif vim.fn.executable("fcitx-remote") then
                c = "fcitx-remote"
            end
            if c then
                -- test fcitx is running (e.g. in GUI session)
                local result = vim.system({ c }, { text = true }):wait()
                if result.code ~= 0 then
                    error(result.stderr)
                end
                if result.stdout ~= "0\n" then
                    command = { c, "-o" }
                end
            end
        elseif os_string == "Darwin" then
            if vim.fn.executable("macism") then
                command = { "macism", "net.mtgto.inputmethod.macSKK.ascii" }
            end
        end
        if command then
            local result = vim.system(command, { text = true }):wait()
            if result.code ~= 0 then
                error(result.stderr)
            end
        end
    end,
})

ちなみにget_os_string()は基本的にunameの結果を返すだけの関数です。

Linux環境ではfcitx5+fcitx-skkを、macOS環境ではmacSKKを使っているので、それにあわせて書いてあります。
Linuxでは仮想コンソールで使うこともあり、必ずしもfcitxが動いてはいないということをケアするためにめんどくさい分岐が入っています(試していないので動くか不明ですが)。
macOSではmacismを入れ、OS付属の「ABC」を有効化した状態で、そちらへの切り替えをmacSKKの無効化として扱っています。

ちなみにWindowsは開発機ではないので対応していません。というかCorvusSKKってコマンドで切り替えられるかわからないしホットキーがそんなに面倒じゃないのでまあ許せそう。

あと2つ以上起動している状態で相互に切り替えるとたまにうまくいかないので、ロックかなんかする必要があるのかなあとは思います。そのあたりもおいおい。