💎

ハードウェアについて詳しくない Rubyist が prk_firmware の開発に参加すべき 3 つの理由

2021/12/16に公開

これは2021年PRK Firmwareアドベントカレンダーの 16 日目の記事です。前後の記事は、カレンダーから辿ってください。

prk_firmware が公開され、いくつかのキーボードを prk_firmware で動くようにしたり、prk_firmware 本体にパッチを書いたりしてきました。そんな中で感じた、Rubyist が prk_firmware の開発に参加することによるメリットを少し書いていきたいと思います。

なお私は以前、 趣味で Ardino で簡単なセンサープログラミングをしてみたり、ここ数年は自作キーボードを少々嗜んでいたので、このタイトルについては審議が必要かもしれません。

RubyKaigi で見た技術について知り、試すことができる

私は普段 Web プログラミングを生業としています。そのため、mruby や mruby/c の発表については、あまり理解できておりませんでした。また、自分でスタートするにも、マイコン等の知識が無いため、どこから始めていいのかわからないというじょうたいでした。しかし、prk_firmware のおかげで、気付いたら mruby についても知ることができるという状況になりました。

また、prk_firmware では、テストととして steep が導入されているため、それも触れることができます。

キーボードを触っているだけなのに、気付いたら RubyKaigi で見聞きした技術を触れれるというのは、いい体験だと思います。

キーボードについての理解が深まる

自作キーボードに使われるファームウェアのデファクトスタンダードともいえる QMK firmware は C 言語で記述されているうえに、様々なマイコンやキーボードに対応しようとしているからか、巨大です。そのソースコードに飛び込むには覚悟が必要です。

一方、prk_firmware は、キーボードのしくみが Ruby (正確には picoruby)で記述されています。我々 Rubyist は Ruby を読めます。つまり、我々はキーボードの仕組みについて読むことができるのです。

実際、prk_firmware の何か直したい挙動があったときは、しばらくソースコードと睨めっこすれば、なんとなくの修正すべき箇所が特定できたと思います。

とはいえ、基本的な仕組みを知らずにコードだけで理解するのは難しいので、以下にあげるような書籍を読んでおくと効果的だと思います。

Arudino とか、まったく触ったことがない人であれば、「ねこでも作れる!オリジナルキーボード(通称:ねこつく)」や「はじめての自作キーボード」から始めるとよさそうです。

最近だしたパッチでは、実際これらの本で読んだ知識の再確認のようなことをしながら書くことになり、より理解が深まったと感じました。

Ruby のパワフルさを再確認できる

prk_firmware は mruby の実装の一つである picoruby で記述されています。そのため、Ruby で記述はできるのですが、CRuby で使えるメソッドが実装されておらず、自分でその処理を書かないといけないことが発生します。以前、Zinc といいうキーボードを prk_firmware で動作するようにしたときは、Array#reverseArray#flatten が必要になったのですが、それは mruby/c には実装されていないため使えませんでした。Ruby は標準で便利なメソッドが用意されているんだというのを改めて感じるポイントでした。

また、実装されていない処理は、自分で記述し関数として定義すればいいのです。さらに、Ruby はクラスをオープンすることが可能です。徐に以下のようにすれば、普段の Ruby と違わない書き心地でかけるというのは、あらためて Ruby すごいという気持ちになりました。

class Array
  def reverse
  end
end

最後に

ハードウェア的なことがわからないからできないという気持ちがあるかもしれませんが、だいたい Ruby で書かれているので、ハードと密接に関わるところ以外はなんとなくやれるんじゃないかなと思います。例えば、今は keymap.rb をこう書かないといけないけど、こういうインターフェースのほうが便利とか、そういう提案もよろこばれるんじゃないかなぁとおもいます。

この記事を読んで、prk_firmware に対してコードを読んだり書いたりしたりする人が増えることを願います。

この記事は、昨日届いた KBD67Lite R3を開封せずに、Cornelius + Cobalt POM Linears + GMK FeatureFunk で書かれました。

Discussion