しさくろく

試作録、思索録、詩作録、…etc

ポメラハック: DM200で新下駄配列+DvorakPを打てるようにした

f:id:funatsufumiya:20210810221217j:plain

タイトルの通りなのだけど、今回は実際使っている動画を撮ってみた。自分のタイピングの拙さとかもそのまんま収録されてるけど、百聞は一見に如かずだと思う。

youtu.be

何をやったのかというと、まず前回ポメラハックを開始して、とりあえず普通に使えるLinux (Debian) として使えるようにして満足した。ここまでは、ネット上の記事とかにいろいろ情報が書かれているので割愛。(このQiita記事とかはとても参考になった。)

自分が今回やったことは、自作のキーエミュレーターLinux (Debian)上で動かして、新下駄配列+DvorakPが打てるようにした。

github.com

やっていることはoyainputokeyfumと同じで、/dev/input/event0 などのキー入力を読み取り、かつバイパス(grab)して、 /dev/uinput を使ってキーを変更。実際使うときはoyainput同様に、nohupなど別プロセスとして起動して使う。

自分の作ったエミュレーターで特筆すべき点は、

  • Rubyで書かれている(コードは1ファイルのみ)
  • やまぶきR用のキー設定ファイルが、ある程度そのまま使える
  • Grabの定数をコード中で指定

だと思う。上の2つは開発の簡単さと修正のしやすさのため。ただ、やまぶきRの親指シフト入力と挙動は違っていて、自分自身が親指シフト系を使っていないのでシフトキーの挙動は現時点では適当。一方で、新下駄配列を快適に入力するために、文字キー同士の同時打鍵タイミングには凝った。まだ妙な挙動はあるものの、プロトタイプとしては満足。タイミングはソース中で指定できるけど、後々パラメータとして外部に出せたらと思ったりする。(やまぶきR用設定ファイルのパーサーも適当に取り急ぎ作ったものなので、後々ちゃんと書き直したい。書き直すときはそもそもRubyじゃなくてRustとかにしたいけど、まずその前に日本語切り替えをMozc連動に改良したい。)

最後の一つ、Grabの定数指定については、ポメラDM200での使用に特化した内容。前述のoyainputは素直に動いたのにokeyfumが動かなかった点に事の発端がある。ポメラDM200は32ビットのARMマシンであるせいか、OCamlRuby中のGrabの定数がint32の範囲を超えてエラーしてしまい正しく動かなかった。直接C言語から呼ぶと全く問題ないので、イマイチ腑に落ちなかったものの、Rubyの場合は直接指定すると動いたので、そうした。

ちなみに、Debian人柱版 その2 を使ったのだけれど、作者の追記にあるように、今回のようなキーエミュレーターを使えるようにするためには、/dev/uinput を有効にするカーネル更新をする必要がある点に注意。カーネル更新といってもとても簡単で、方法は前述のQiita記事中にある。

さらにDM200に限った注意としては、/dev/input/event にいくつか制約があるので、デバイス名の列挙など使えない機能がある点に注意。自分のキーエミュレータで使っているrevdevライブラリでも、その理由で一箇所コメントアウトしないと動かなかったので、DM200で使える版としてフォークしてある。( gem install revdev の代わりにこのgitを使えばOK。あとでREADMEにも書こうかな。 )

github.com

―― さて、今回は思いつき優先で、とりあえず勢いでキーエミュレータまで書いてしまったのだけど、キーエミュレータを作るのってとても楽しいなと実感した。今まで既存のキーエミュレータを使っていて、微妙に痒いところに手が届かない感があったりしたけど、自分で作るとフルに自由にできて楽しい。特にLinuxの場合はMacWindowsに比べてそんなに自作は難しくないし、今回のようにRubyとかから気軽に呼べるライブラリがMacWindowsでもあると、もっと自由にキーエミュレータとかキー割り当て変更が高度にできて楽しいだろうなと思った。

あと何より、DM200が素晴らしい。単純にLinuxマシンとして見ても優秀だし、元のソフトやハード構成が素敵なので、シンプルに、書くことへの愛を感じる。ハックしなくても親指シフトが使えるワープロとして貴重だし、ぜひ今後も販売し続けて欲しい。しいていえば、今回ハックした版にはMozc(オープンソースGoogle日本語入力)が入っているので推測変換が効くけど、元々のATOKは推測変換が効かなくて辛いので、ぜひ次期版は推測変換できるようになったらいいなぁ。