自作キーボードをちょっとだけ便利にするツールをC#で書いた話

この記事は、C# Advent Calendar 2023 の6日目の記事です。
昨日の記事は、seekseek77さんの「C#12.0 .NET8.0における、Utf8文字列の作り方とパフォーマンス」でした。
stringを+でつなぐのではなくStringBuilderを使うべし、というのは知っていましたが、それ以外にも様々な手法があるというのが勉強になりました。

さて、この記事は「PRK_keymap」というツールをC#で作ったよ、というお話です。


目次


それは何?

「PRK_keymap」とは、PRK Firmware用のkeymap.rbのひな型を簡単に作れるツールです。

PRK Firmwareを知らない人には「???」だと思いますので、順を追って説明します。

まず、自作キーボードというものがあります。キットを組み立ててキーボードを作ったり、基板から設計してキーボードを設計したり、そういう世界です。

そして自作キーボードをキーボードとして動かすためにはファームウェアが必要になります。このファームウェア、オープンソースで多くのものが公開されており、PRK Firmwareもその中の一つです。

PRK Firmware以外にどんなファームウェアがあるかについては↓こちらの記事で簡単に説明しています。

PRK Firmwareは、キーボードの動作をRubyで記述できるのが特徴です。
この動作を記述するためのファイルが keymap.rb です。
keymap.rbは利用者がビルド等をする必要がなく、キーボードのストレージにコピペするだけでちゃんとキーボードとして動作します。
(PRK Firmware以外のファームウェアは、別の環境でビルドする必要があるものが多いです)

このkeymap.rbのひな型を簡単に作れるツールとして「PRK_keymap」を作って公開しましたよ、ということです。


なぜそれを作ったか

keymap.rb ですが、記述のしかたは割とシンプルです。
公式のWikiで解説されています。

keymap.rbの書き方はシンプルなんですが、私は忘れっぽいので「あれ、こうしたいときはどう書くんだっけ?」となることがよくあります。
そのたびに公式Wikiを見れば問題はないんですが、とはいえWikiを見なくてもサクッと書けるようにしたいなーと何となく考えていました。
Wikiの内容をちゃんと覚えるというのが正攻法だと思いますが、プログラマーにとって怠惰は美徳です。
ちゃんと覚えてなくても、プログラムの力で何とかしたいと思うのが人情です。人情なんです。

というわけで、PRK_keymapの開発がスタートしたのでした。


なぜC#で作ったか

「Ruby用のツールなのに、なんでC#で作ったの?」
はい、ごもっともです。

私は普段の仕事でC#を使うことが多いです。つまりC#が最も慣れている言語です。
慣れた言語で書きたいというのが人情です。人情なんです。

さてC#で書くことは決定事項だとして、次はどういう環境向けに書くかです。

普段の仕事では、Windows Forms向けのプログラムを書くことが多いです。はい、Windows Formsです。私の周辺ではまだまだ現役ですよ?ええ。
諸々の事情でWindows Formsを使うというのは、まあそれなりにあることだとは思います(個人の感想です)。

しかし、せっかく仕事と関係ないところでツールを作るなら、Windows Formsとは違う世界で書いてみたい。そう思うのが人情です。あ、人情はもういいですか?
自分用ツールとして作るつもりではあったものの、せっかく作るなら他の人にも利用してもらいたい。そういう意味でも、Windows Formsだとちょっとハードルが上がっちゃうかなーと考えました。

気軽に使ってもらいたい → インストール不要なWebがよさそう → C#でWebというかhtml上のUIや動作を記述したい → Blazorだ!

こんな感じで、Blazorを採用することに決めました。
Blazor自体には以前から興味があったんですが、仕事ではなかなか利用する機会がなく。
かといって今後もないとは言えないので、練習のためにも自分向けの小さいアプリをBlazorで作りたかったんです。
keymap.rbの記述にはサーバーとの通信は特に必要ないと判断したので、Blazor WASMで書くことにしました。


作ってみて何がよかった・よくなかったか

何といっても、自分が楽になりました。
画面にポチポチ入力していくだけで基本的なkeymap.rbができあがるのは楽です。
積極的な宣伝はしていないのですが、Twitter(現X)でつぶやくとそれなりの反応をいただけて嬉しかったです。
Blazorでアプリを作るという経験を一通りできたのもよかったところです。

よくなかった点?
うーん、なんですかね、あるかな?
思いつきません。


今後の展望

機能追加をしたいという思いはあります。

キー割り当ての記述までできるUI

今のPRK_keymapは、keymap.rbのひな型を作るところまでのツールです。
各キーを押したときにどんなキーコードを送るか・どんな動作をするか、というキー割り当ての部分はPRK_keymapでは設定できず、keymap.rbをローカルにダウンロードしてからエディタ等で編集する必要があります。

ローカルにダウンロードしなくても、キー割り当てがある程度は設定できるUI。そういうものを作りたいと考えています。
いつになるかはわかりませんが……。

キーボードのストレージへのコピペまでできるように

今のPRK_keymapは、keymap.rbのひな型をダウンロードして、それをキーボードのストレージにコピペしてもらうという2つの手順が必要です。
ブラウザだけで特定のローカルフォルダにファイルを書きだすことはできそうなので、この手順を1つ減らせないかな?ということです。
ただそうなると、ひな型ではなくある程度完成形までもっていったkeymap.rbでないと意味がないので、上記のキー割り当てができるUIが完成してからですね。順序としては。

.NET 8対応

PRK_keymapは.NET 6で作りました。
6はLTSとはいえ2024年にはサポート切れなので、次のLTSである8で動くように修正したいです。

6時点でのBlazorはWASMとServerに分かれていましたが、8からは両者のいいとこどりができるようになりました。
正直PRK_keymapでは恩恵はなさそうですが、ちょっと触ってみたいとは思っています。


終わりに

明日は、t0rさんの「簡易HTTP Serverを作ってみた」です。

この記事は、以下のキーボードで書きました。