Slide 1

Slide 1 text

近藤宇智朗 / 2022-05-11 
 Narrative of Ruby x Rust
 Fukuoka.rb #256 Special LT


Slide 2

Slide 2 text

#256 Mirrativ, Inc. Infra Engineer
 • 主にGoを書く、RubyとRustが好き
 • シニアシレンジャー
 • 好きなtrait: PartialEq
 • バイナリアンワナビ
 近藤うちお (@udzura)
 ※ ミラティブはGo/フロントエンド/Unity/ネイティブアプリエンジニアを強烈に募集しています。


Slide 3

Slide 3 text

福岡市エンジニアカフェ
 ハッカーサポーターというタイトルで色々お手伝いしてます


Slide 4

Slide 4 text

Today’s LT


Slide 5

Slide 5 text

Rust、熱量ありますね
 Rubyist的には、YJITとか、RubyGemsのRustビルダー対応とか


Slide 6

Slide 6 text

#256 今日のテーマ
 RustでRuby(MRI)の拡張gemを書く話
 • LTなので時間厳守です、要点だけです
 • めちゃくちゃ早口です
 • 時間が余ったら僕とRustに関するナラティブを垂れ流します


Slide 7

Slide 7 text

#256 なぜRustで拡張gemを書くのか?


Slide 8

Slide 8 text

#256 Rubyで拡張を書きたい時
 YJITはまあ置いときましょう
 • A.
 • スピードがとにかく欲しい。文字列操作でいちいちStringインスタンス作りたくない ような状況など
 • B.
 • 特定のシステムコールやCライブラリ関数を呼びたいが既存のものがない
 • C. 他にあれば教えてください


Slide 9

Slide 9 text

#256 第一の選択肢: C言語?
 • ところでC言語といえば…
 脆弱性ですよね(諸説あり)
 • 僕が色々いうよりIPAの
 資料を読んだ方がいい
 (古いのが難点)
 
 • 他の選択肢… 
 • C++: Cより安全にする仕組みはあるがそれでも自由すぎ 
 • FFIとか: 便利だが逆に自由度低い、ややバッドノウハウ 
 https://www.ipa.go.jp/security/awareness/vendor/programmingv2/clanguage.html

Slide 10

Slide 10 text

#256 C言語と脆弱性
 • 2021 CWE Top 25 の上位には相変わらずCのメモリに関する脆弱性
 2021年に起こった脆弱性を振り返る 
 https://cwe.mitre.org/top25/archive/2021/2021_cwe_top25.html 

Slide 11

Slide 11 text

#256 メモリの脆弱性を回避したコードを書くのは簡単ではない
 • 回避策やツールはある
 • が使われるとも限らない
 • udzura mruby本 第9章
 • (第9章だけバラで売りたいw)
 • 他「初めて学ぶバイナリ解析」とか


Slide 12

Slide 12 text

そこでRustなんすよ…


Slide 13

Slide 13 text

#256 Rust の特徴的機能
 だいたい全てはメモリ安全性のために
 • 所有権
 • 借用規則
 • ライフタイム
 • Option
 • unsafe …


Slide 14

Slide 14 text

#256 ただ安全なだけじゃない
 • 上記に加え、型の表現力がとても高く、意図を表現しやすい。
 • 安全かつ快適にコードが書ける(しかも多くの場合速い)
 • これってすごくない?
 • Rubyと同じ雰囲気がある、Rubyistはしっくりくると思う


Slide 15

Slide 15 text

論より動くもの


Slide 16

Slide 16 text

How to Implement Rusty Gem


Slide 17

Slide 17 text

#256 詳細はブログをじっくり読んでください
 LTじゃ無理っすわ、jimlockさん...
 • https://udzura.hatenablog.jp/entry/2022/05/11/193100

Slide 18

Slide 18 text

#256 実装の全体だけでも


Slide 19

Slide 19 text

#256 It works! よかったね。
 オレはようやくのぼりはじめたばかりだからな


Slide 20

Slide 20 text

時間があれば話す


Slide 21

Slide 21 text

#256 One More Thing
 5分では絶対話せない
 • もうちょっと真面目に
 中身を書いてみた
 • 実装例 👉


Slide 22

Slide 22 text

#256 渋ポイント1
 • bindgenはCマクロを
 エクスポートしない
 • 大事な機能に限って
 マクロだったりする
 • Cで小さなラッパ関数を
 書いてリンクするとか
 おもてなしが必要…。
 本当は RSTRING_LEN() が
 使いたいんです…。


Slide 23

Slide 23 text

#256 渋ポイント2
 • Rubyメソッドに対応する
 関数は、可変長引数(?)
 • transmuteして
 fn() -> VALUE 型扱い
 他にもQnil→VALUEとか
 transmute多くて治安が
 • 一方mrubyは
 mrb_get_args()を使った…
 治安が悪い!!


Slide 24

Slide 24 text

#256 Rust gemを便利に作れるラッパcrate欲しい
  
 • 暇があればぼくが作…ウッ
 • !?:
 https://crates.io/crates/coffret 
 • 名前重要なので押さえました
 • 頑張って中身を作りましょう
 nixみたいな。コントリチャンスだ! 
 少しだけ良くなります 


Slide 25

Slide 25 text

終わりに


Slide 26

Slide 26 text

#256 僕とRustのナラティブ
  
 • 口頭のみです!!(??)
 僕が一番Rustをうまく使えるんだ(使えるとは言っていない)