Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Rust で作ったネイティブを Ruby から使う
Search
yo_waka
August 26, 2026
Technology
95
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Rust で作ったネイティブを Ruby から使う
2026/08/26 gotanda.rb での発表資料です
yo_waka
August 26, 2026
More Decks by yo_waka
See All by yo_waka
うちの技術負債2021_freee会計編
waka
0
1.2k
大きなプロダクトの育て方
waka
10
27k
requireの循環参照
waka
0
1.5k
Other Decks in Technology
See All in Technology
Oracle Base Database Service 技術詳細
oracle4engineer
PRO
16
120k
AIに攻撃される前に、AIに攻撃させる
tsuchikazu
0
110
AI感のないAWS構成図をAIエージェントに描かせたい!
sagochiko
2
500
AI Made Us Faster at Solving the Wrong Problems
marceloancelmo
0
140
セルフサービスのオブザーバビリティ基盤をOpenTelemetryで作る / Building a Self-Service Observability Platform with OpenTelemetry
ymotongpoo
3
520
【Findyテック文化祭ワークショップ】新卒エンジニア&採用担当と作る、 なりたい姿と今やるべき一歩
dip_tech
PRO
0
150
20260929_AmazonGuardDutyの検出通知メールにAWS DevOpsAgentの調査結果を追加する
yhana
1
410
KanaAI
shreyas1009
0
140
Swap and Memory Reclaim - Squeezing Out More RAM
ennael
PRO
1
1.5k
1人アドミンな私はAWSアカウント申請をSlackで完結したい!
ysuzuki
0
110
OpenClawでAzure DevOpsのWiki更新を自動化する - クラウドAIだけでは届かない場所へ
yutakaosada
0
140
形式手法を使って仕様をコーディングしよう
mikanichinose
0
160
Featured
See All Featured
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
1
620
Prompt Engineering for Job Search
mfonobong
0
470
Raft: Consensus for Rubyists
vanstee
142
7.7k
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
380
Git: the NoSQL Database
bkeepers
PRO
432
67k
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
260
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
500
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
320
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
440
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
69
66k
The Spectacular Lies of Maps
axbom
PRO
1
1.1k
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
290
Transcript
Rust製のネイティブビルド をRubyから使う 2026.08.26 ∕ gotanda.rb 1
はじめまして • @yo_waka • 匠のあそびという会社で Ruby / Rails をやっています •
PDF が好きです 2
HTML to PDF をやるやつを作っています • https://github.com/waka/sghtmltopdf • wkhtmltopdf という QtWebkit
を組み込んだ HTML を PDF に変換するプログラムと、 それを ActionView の DSL から使える wicked_pdf という gemを使っていた • wkhtmltopdf は QtWebkit のバージョンアップに追随できず、2023 年に残念ながらアーカイブされてし まった • ⾃分は ActionView の DSL で PDF を出⼒できるというのがとても気に⼊っていたので、より⾼速で使い勝 ⼿を⾼めたものを作ろうと思った 3
Rust製 のネイティブビルドを Ruby から使いたい • sghtmltopdf は HTML to PDF
をやるためのライブラリが優秀だったため、 Rust で書かれている ◦ HTML/CSS のパースは Servo プロジェクト(※) が提供している crate を活⽤ ▪ • html5ever, css-parser ◦ PDF の書き出しは pdf-writer crate を活⽤ ◦ パース結果を PDF の レイアウトに変換するエンジンやフォント表⽰周りが⾃作部分 wicked_pdf 同様に Ruby から使えるようにしたい = Rust のネイティブビルドを呼び出す必要がある ※ Mozilla 製の Firefox の HTML/CSS レンダリングエンジン。今は Linux Foundation に移管されている 4
Rust で Ruby のネイティブ拡張を書くためのライブラリ その1 rb-sys • Ruby C API
の⽣バインディング + ビルド基盤を提供 ◦ Ruby オブジェクトへの参照を表す型として VALUE が提供される ▪ 実体はポインタ幅の符号なし整数(詳細は次の次のページ) • bindgen で⽣成した 「rb_sys::rb_funcall」など⽣の関数‧型定義を提供 • 「rb_sys/mkmf」を提供して、extconf.rb から Cargo プロジェクトをビルド可能にする ◦ mkmf = make makefile ◦ gem インストール時に RubyGems が拡張ディレクトリの extconf.rb を実⾏する ◦ create_rust_makefile で cargo build して .so ファイルを作る ◦ .so ファイルを Ruby から読めるディレクトリに配置する Makefile を作成して Rubygems が make する 5
Rust で Ruby のネイティブ拡張を書くためのライブラリ その2 magnus • rb-sys を抽象化して、いい感じに使えるようにしてくれるライブラリ ◦
• Rust の型と Ruby の型の⾃動変換 ◦ • 「RString」「RArray」「RHash」「Symbol」など型付きの Ruby オブジェクトとして扱える fn(u64) -> String みたいな関数をそのまま Ruby 側のメソッドとして登録できる #[magnus::wrap] マクロで Rust の struct をRuby オブジェクトとして公開できたり 6
rb-sys と magnus の関係 • rb-sys が提供する VALUE とは ◦
◦ • pub type VALUE = usize; で定義される ▪ 下位 1bit が 1 => Fixnum ▪ 下位 8bit が 0x0e => Symbol ▪ 0x08 => nil 型システムの助けが⼀切なくなるので、このまま扱うのはきつい>< ▪ let a: VALUE = /* String */ ▪ let b: VALUE = /* Array */ ▪ let c = a + b; // これはコンパイル通るけど実⾏時に Segfault になる この VALUE を型付きで扱えるようにしてくれるのが magnus ◦ RString / RArray などの型で扱えるようにしてくれる ◦ rb-sys に直接渡せるように、 ⽣のVALUE を取り出す as_rb_value() も使える 7
Global VM Lock(GVL)に注意 • GVL = 1 プロセス内で Ruby のコードを実⾏できるスレッドを常に
1 つに制限するロック ◦ • Webアプリのようなマルチスレッド環境だと他のスレッドが⽌まっちゃう 普段意識することはあまりない ◦ IO#read / write, Socket 等の標準 IO は Ruby 内で GVL を⾃動で解放してくれる ◦ pg gem, mysql2 gem なんかは 内部で「rb_thread_call_without_gvl 」という GVL 解放メソッドを 呼んでGVL を解放してくれている • C 拡張や ネイティブを呼び出す、且つ IO が絡む gem を作る場合は自分で意識しないといけない 8
GVL を外さないとこうなる • 例えば、Puma をマルチスレッドで動かしていると、巨⼤な HTML が投げられると PDF 変換している間、他の スレッドが全部待ちになる
9
magnus (rb-sys)でGVLを外す場合 • magnus は GVL 解放する API を提供していない •
⾃前で「rb_thread_call_without_gvl 」を呼ぶしかない ◦ デザインパターンみたいなのがある ◦ 多分 => の実装にだいたいなるはず ◦ 気になる⼈は sghtmltopdf のリポジトリ⾒てみて ください! 10
Ruby <-> Rust の⼝はシンプルにしよう • GVL 解放している境界は分かりやすくした⽅がいい ◦ 解放前: Ruby
オブジェクトを Rust オブジェクトに変換 ◦ 解放後: Rust オブジェクトしか触らない ▪ ◦ 型で Rust オブジェクトのみ制限できる安心感 右のコード例では Ruby からは RStringを 受け取り、Rust の Vec に変換して、gvl 解放している • ↑ によって GC の影響をほぼ意識しなくてよくなります ◦ Ruby オブジェクトを持っちゃうと、 GC で棄てられるリスクがある 11
Rust で Rubygem、ツールが揃っていて 書きやすいのでおすすめです! 12