Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
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をうまく使えるんだ(使えるとは言っていない)