inSmartBank

ワンバンクを運営する株式会社スマートバンクのメンバーによるブログです

RubyKaigi 2025 セッションレポート(後編) #rubykaigi

スマートバンクRubyKaigi 2025 参加メンバーによるセッションレポート後編です! 前編はこちら

  mitani

mitaniからはPENさんによる「Analyzing Ruby Code in IRB」についてレポートします!

このトークでは、IRBのシンタックスハイライトやコード補完などの裏側で行われているコード解析や、それをRipperからPrismに置き換えたことによる効果についての発表がありました。 IRB内部のコード解析では、これまでRipper::Lexerを中心にRipper.sexpやRubyVM::InstructionSequence.compile、JRuby.compile_ir、evalなどを使って行ってきたとのこと。IRBはユーザーがコードを入力しながら使うものなので、不完全なコードに対して解析を行う必要があり、Ripper::Lexer以外にこれを扱えるパーサーがなかったことが理由だそうです。Ruby 3.2からはerror_tolerantのオプションが入ったり、Ruby 3.3からはPrismがデフォルトのgemになったことでRipper::Lexer以外の方法が増え、現在ではPrismへの載せ替えが行われています。

発表の中では、シンタックスハイライト / コードのインデント / コードの終了検知 / エコー除去 / コード補完について、既存のRipperでの実装と課題点、Prismに置き換えた際のメリットの説明がありました。コードのインデントを綺麗にする際には、コード一つ一つを見るのではなくサブセットっぽくコードの塊を捉えて扱ったり、コードの終了判定を行う箇所ではインジェクション対策が行われていたりと、IRBならではの視点や技術について盛りだくさんな発表となっていました。個人的に面白かったのが、自由に色々なコードを入力できるIRBにおいて、どこまで綺麗に表示できるようサポートするかの部分で、PENさんが色々な入力パターンを思い浮かべて網羅していたり、かなりのエッジケースの対応の話をされていて面白かったです。

IRB、普段何気なく使っててもコード補完が綺麗に出たり、自動インデントがバチっと決まったりとめちゃめちゃ使い心地が良いですが、裏側ではこんなことをしているのか!!!と勉強になりました!

 koshiba

koshibaからはasonasさんの「How to make the Groovebox」についてレポートします。プレイベントでデモや概要を聞いていて楽しみにしていました!

グルーブボックスは、それ一台で音楽制作ができる電子楽器の一つです。シンセサイザー、シーケンサー、エフェクター、サンプラーなどの機能を備えているもので、シンプルな構成のものから、多数のボタンやツマミを備えた複雑なものまであります。こうした機材を使って音楽を作るには、音楽理論を学ぶだけでなく複雑なマニュアルを読み込んだり多くの知識が求められるとのこと。

しかし、ソフトウェアエンジニアであれば、自分でコードを書いたり、ドキュメントを読み、サンプルコードを動かして理解するという方法に慣れています。同じようなアプローチで、電子楽器も理解できるのではないか?と考えRubyでグルーブボックスを作ってみようとgroovebox-rubyを作られたそうです。今回はクロスプラットフォームな音声入出力ライブラリ PortAudio を使って実装されました(このあとあったmakicamelさんのLTでも使われていましたね)。

シンセサイザーはOscillator(VCO)、Filter(VCF)、Envelope Generator(ADSR)、Amplifier(VCA)の4つから構成されていることが紹介されました。例えばOscillatorは波形を生成でき、いろんな波形を重ねることで複雑な音になります(このあたりは前日のTRICKで丁度紹介されていたところで偶然にも予習になってました)。サイン波などの波形はRubyのMathを使って作れます。これらをどう実行するかはコードだけでなく実際に音を鳴らし波形を見せながらの説明がありました。アクティブノーツの数だけループでまわして波形を足していくと和音が表現できます。しかし最後は音割れしてしまうので、リミッターの実装もし、鳴っている音の逆数をかけることで、均一になるように工夫されていました。

シーケンサーによって、各音をどのタイミングで鳴らし、いつ止めるかを制御します。複数のトラックを扱えるマルチトラックなシーケンスに対応していて、MIDIファイル(.mid)のインポートやエクスポートも可能になっていました。これらの処理は、dRubyを用いて各プロセス間で連携する形で実装されていました。このシーケンサーの実装は難しかったそうです。各トラックのノートを同じタイミングで鳴らすことで和音になるものの、sleep は 正確なタイミング保証がないので単純にsleepを使った場合BPMが早くなると時間が短くなってブレが出てしまいます。これを解決するには専用のシーケンサーを買うかOSのAPIを使うなども考えられますが、なんとか実装したいと調整を重ねられたそうです。

その苦労の結果のデモがありました。ゼロから打ち込みもできるし、あらかじめ用意したmidファイルも読み込める。シーケンスを並べたり、和音を並べながら音の数を増やしたり、減らしたり。ずれも感じず操作のたびに音の重なり方が変わり深みが増しライブ会場のようになってきました。めでたしめでたしの拍手からのまとめはこのデモを鳴らしたまま続行。BGM付きの発表に気分が高まりました。

音が音楽になっていく瞬間に立ち会える本当にわくわくする発表だったので動画の公開が待ち遠しいです!

 kaoru

最近スマートバンクに転職した私から、株式会社 Fusic の岡嵜さんによる "Porting PicoRuby to Another Microcontroller: ESP32" のレポートをお届けします。

前職で Fusic さまには大変お世話になっており、また個人的にも IoT/マイコン分野に興味があるため、このセッションを楽しみにしていました。

このセッションでは、マイコン向けの軽量 Ruby 実装である PicoRuby を、Espressif 社の ESP32 ベースの 2 種類のマイコン(RISC-V アーキテクチャの M5Stamp C3 Mate と Xtensa アーキテクチャの ESP32-DevKitC)へ移植する手順が紹介されました。内容はプログラムのクロスコンパイル、リンク、アーカイブといった基礎からスタートし、PicoRuby プロジェクトのディレクトリ構成の概要、そして実際にシェル上で echo コマンドを動作させるまでのポーティング作業をステップバイステップで解説いただきました。セッションの締めくくりには、ESP32-DevKitC と自作基板を使ったブロック崩しのデモが披露され、会場を沸かせました。

ブロック崩しデモについて特筆すべきは、ADC(アナログデジタル変換)を用いたコントローラ入力処理、SPI(シリアルペリフェラルインターフェース)によるマトリクス LED 制御、PWM(パルス幅変調)を使ったサウンド生成をゼロから実装するのではなく、mrbgems(mruby 向けの gem)を活用されていた点です。mruby エコシステムが充実していることが窺えました。

「PicoRuby を新しいマイコンに移植する」と聞くと一見ハードルが高そうに思えますが、発表を通じて必要なステップが明確に整理されており「自分でも新しいマイコンへの移植に挑戦できるかもしれない」と感じさせてくれる素晴らしい内容でした。Nordic セミコンダクター社の nRF52 への移植も募集中とのことで、家に使っていないボードが転がっているので時間を見つけて挑戦してみたいと思います。

RubyKaigi は今回が初参加でしたが、これまで参加機会の多かった toB 向け展示会とは異なる、コミュニティ主導の雰囲気に新鮮さを感じ、大変楽しむことができました。運営スタッフの皆様、ありがとうございました。


いかがでしたでしょうか。来年は函館で開催とのことで今から楽しみですね!

スマートバンクでは、一緒にRubyコミュニティを盛り上げていきたい仲間を募集しています! smartbank.co.jp

We create the new normal of easy budgeting, easy banking, and easy living.
In this blog, engineers, product managers, designers, business development, legal, CS, and other members will share their insights.