こんにちは、エムスリーデジカル開発チームの鳥山(@to_lz1)です。
エムスリーは、2022年11月10日から2日間島根県松江市で開催された「RubyWorld Conference 2022」にRubyスポンサーとして参加させて頂きました! 大変久しぶりとなるオフラインイベントへのブース出展でもありました。イベントの様子も交えてレポートさせて頂ければと思います。
ブースの様子
弊社ブースではエムスリーエンジニアリングフェローである河合さん(@vaaaaanquish)のインタビュー動画や、弊社内で隔週開催しているTechTalkの動画を上映しました。
エムスリー公式テックチャンネルは鋭意新たなコンテンツを公開中です。ぜひチャンネル登録もよろしくお願いします!
また、弊社メンバー作成の難読 Ruby クイズを日替わりで出題しました。
例えば以下のような問題です。
parseには様々な知識が要求されますが、読者の皆さまはいかがでしょうか。
過去 RubyKaigi でも実施したことがありますが、こちら今回も大盛況でRubyコミッタの方々やMatzさんにも回答して頂きました!
Rubyクイズに関しては、当日の問題とその解説を別記事として近日中に公開します。お楽しみに!
ノベルティ
クイズ正解者の景品として、技術書展で頒布した エムスリーテックブック#1 を配布しました。
#RubyWorld で M3 テックブックもらいました。やったー。 pic.twitter.com/91mM7jrHXM
— Hiroshi SHIBATA (@hsbt) 2022年11月11日
また、来場者へのノベルティとしてマスクも配布しました。まだまだ感染症リスクの残る昨今、エンジニアの皆さんの日常生活にもお役立て頂ければ幸いです。
セッション紹介
個人的に印象深かったセッションを2つほど紹介します。
Rubyをセキュアな言語にする ~Rubyの脆弱性対応の最新動向紹介~
遠藤 侑介(@mametter)さんによるRubyのセキュリティリリースの裏側、ReDoSとそれに対するRubyの対策についての発表でした。
Rubyのリリースノートにしばしば含まれる「脆弱性修正」ですが、その裏には以下のプロセスが含まれます。
- 脆弱性報告を受け取る
- 脆弱性かどうかを判断する
- 修正を作成する
- CVE番号を取得する
- アナウンス文を準備する
- リリースする
特に「脆弱性かどうかを判断する」に当たっては、「現実的にセキュリティ被害が生じうる」「Rubyで直すべき問題である」ならばRubyの脆弱性である、という基準が用いられます。
「Rubyで直すべき問題」なのかどうか、実際の判断はとても難しいです。例えばある機能に特定の入力をすると現象が起きる場合、
- そのような使い方をするアプリケーションは実在するのか?
- 実在したとして、それはアプリケーションの責任ではないか?
といった問いに答えなければ、「Rubyで直すべき問題かどうか」には決着が付きません。現実的には現象の影響度や他言語の判断なども情報収集して総合的に判断する、とのことでした。
Matzさんの基調講演でも「こういう機能があればRuby使うのに」という声にそのまま応えても彼らは結局Rubyを使わない、といった話がありました。脆弱性対応しかり、こうした場ではRubyというプロダクトが要望や課題にどこまで応えるべきなのか、という判断が求められているのだと感じます。この点、Rubyのコミッタもまた言語というプロダクトのPdMなのかもしれない、とも思った次第です。
後半では多言語で流行中の脆弱性である ReDoS (Regular Expression Denial of Service)へのRubyの対応状況を聞くことが出来ました。
ユーザサイドでは ReDoS を起こしてしまうような正規表現の使用を避ける、という対策が有りえますが、修正によっては可読性が下がる可能性もあり、ユーザにこうした努力を強いることなく根本的に解決したいというモチベーションがあります。このため、以下の対策が検討されています。
- 効率的なアルゴリズム(RE2)の併用
- 組み込みタイムアウト(Regexp.timeout)の導入
- 既存アルゴリズム(onigmo)の改良
この内、2 と 3 がメインラインにマージされており、Ruby 3.2 に入りそうとのことです。今後に期待ですね。
ShopifyでのRuby開発について
Aaron Patterson(@tenderlove) さんによる2日目の基調講演(なんと全編日本語!)でした。
Shopifyでの開発やそこで使われる Sorbet, Ruby LSPといったツール群の話も面白かったのですが、AaronさんがRubyで書いたJITコンパイラの話は特に興味深かったです。
RubyのJITコンパイラとしてはShopifyが YJIT
を開発しており、このRust実装が2022年4月にRubyリポジトリにマージされたことはちょっとした話題にもなりました。
一方、Aaronさんには、Rustじゃなく、あくまでRubyを書きたいというモチベーションが(どこまで本気かはともかくw)あるようで、Ruby製JITコンパイラ、およびその構成要素となるGemをいくつか開発しています。
- GitHub - tenderlove/tenderjit: JIT for Ruby that is written in Ruby
- GitHub - tenderlove/aarch64: Pure Ruby ARM64 Assembler
- GitHub - tenderlove/jit_buffer: General purpose buffer for use with building JITs
JITコンパイラは
- 機械語を生成するAssembler
- 実行可能なメモリ(Executable Memory)
から成り、機械語を実行可能なメモリに書き込んでCPUに機械語を実行させます。
Aaronさんが作った jit_buffer
はこの内 Executable Memory を提供するライブラリです。あくまで汎用的なメモリ空間を提供することが責務なので、書き込まれる機械語の仕様は x86_64
でも arm64
でも構いません。 cross platformであることをテストしたかった彼がどのようなテストコードを書いたかというと...詳細は以下の動画でご覧いただけます。
なお講演に出てくるコード、GitHub上ではここでした。改めて見てもすごい。
We are Hiring!!
エムスリーとして久しぶりのオフラインイベントへのブース出展、また筆者個人としてもこうした取り組みが初めてで慣れない部分も有りましたが、ノベルティの制作協力、ブースの準備等々、様々な方に大変お世話になりました。この場でもお礼を伝えたいと思います。
また、スポンサー枠という形ではありますが、筆者もデジカルの紹介をすべく登壇をさせて頂きました。
デジカルも2015年のサービスローンチ以来、Ruby on Railsを中心に様々な技術を用いて成長して来たプロダクトです。今もビジネス規模を拡大し続けており、これに合わせてチームもスケールさせていきたいです!
- サービス間連携を含めた新しい診療体験の実現
- ビジネスの成長に合わせてスケールするインフラ・アプリケーションの設計と実装
など、医療業界を前進させるためのチャレンジングな課題がたくさんあります。少しでも興味をお持ちの方は、ぜひカジュアル面談でお話しましょう! あなたのエントリーをお待ちしています。