こんにちは!
2022 年にWantedly に新卒入社し、DX Squad でエンジニアをしている大森です。
今回は、日本最大の Ruby に関するカンファレンスである RubyKaigi に Wantedly がスポンサードし、いくつかの講演を聴講しています。Wantedly はスポンサーブースを設けていて、アンケートに答えてくださった方には RubyKaigi 2023 のために描き下ろした技術書をお渡ししており、Twitterをフォローしてくださった方には 過去の TechBook などを配布しています。
本記事では、3日目の発表である Build Your Own SQLite3 について紹介させていただきます。
この発表では、マイコンで Ruby を動かすプロジェクトである PicoRuby と、PicoRuby の上で SQLite3 を動かす方法に加え、マイコンと SQLite3 を利用したデモが行われました。
SQLite3 について
まず、 SQLite3 について説明されました。 SQLite3 はパブリックドメインであり、商用利用が可能な点が大きな特徴です。また、シングルファイルデータベースという性質から、組込みシステムでも使いやすいそうです。
SQLite3 の組み込み例としては、OS のサポート(ファイルシステム)がある場合とない場合の両方が挙げられました。例えば、ファイルシステムがある場合の応用例としては、カーナビやモバイルアプリなどがあります。これらのデバイスでは、SQLite3はデータの格納や管理に活用されています。
一方、ファイルシステムがない環境での SQLite3 の利用例としては、ブラウザのローカル DB や one-chip マイコンなどが挙げられます。特に今回の発表では、one-chip マイコン、特に PicoRuby の上での SQLite3の運用に重点が置かれていました。これは、より制約の強い環境でもデータベースの機能を活用できるという、新たな可能性を示すものです。
PicoRuby について
次に、マイコンで動作する PicoRuby について説明されました。PicoRuby はマイコン上でシェルを提供しており、基本的な操作 ( ls, cd, rm コマンドなど) が実行できるようでした。また、リアルタイムクロックをつなげることで date コマンドも実行できる様子がデモされていました。irb も実行することができ、sqlite3 gem を使用することで、 データベースの作成・書き込み・読み込みができることを示すデモが行われました。
その後、マイコンにマウントしていた SD カードを PC にマウントし、picoruby 上で作成したデータベースを PCで読み込むデモが行われました。マイコンで作成したDBをコピーするだけで読み込めるというのは面白い体験でした。
最後に、PicoRuby で SQLite3 を動作させるために必要だった実装などについて説明されました。(実装の詳細は複雑だったため、スライド公開後に復習しようと思います。)
デモ:打鍵ログをキーボード自身が取る
最後に、キーボードの打鍵ログをキーボード自身が SQLite3 に溜め込むというデモが行われました。具体的には、https://github.com/picoruby/prk_firmware を利用し、以下の実装が行われたようです。
- すべてのアルファベットの打鍵を取得する
- 押下されたキー、時刻などを SQLite3 に記録する
これにより、キーボードが自身の打鍵ログを自動的に蓄積できるようになりました。この蓄積したデータは、後からPCにコピーして解析することが可能です。
この機能を利用して、より優れたキーマップを生成するための試みも行われました。具体的には、打鍵の傾向を解析し、それに基づいて最適なキーマップを生成できるのでは?という仮説です。
実際にログを取得し、キーマップを生成した結果、人差し指の部分には 'h', 'j', 'k', 'l' が集中していました。このようなキーマップが生成された理由は、発表者がVimユーザであるからだと説明されていました。Vim では 、'h', 'j', 'k', 'l' キー はそれぞれ左、下、上、右のカーソル移動に対応しています。このため、Vim を頻繁に使う発表者のキーボードの打鍵ログでは、これらの文字の出現率が高くなったと考えられます。
感想
最後のデモのアプローチでは文章の入力には適していないキーマップが生成されてしまいましたが、picoruby と SQLite3 の活用ができるようになると、いろいろなアイディアが生まれそうだなと思いました。ぜひ試してみたくなったので、家にある自作キーボードのファームウェアを prk_firmware に入れ替えてみようと思います。