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
RubyKaigi 2024 followup
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
ahogappa
September 03, 2024
110
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
RubyKaigi 2024 followup
ahogappa
September 03, 2024
More Decks by ahogappa
See All by ahogappa
Rubyで楽して タスクを書きたい!
ahogappa
0
290
The Ruby One-Binary Tool, Enhanced with Kompo
ahogappa
1
3.4k
It’s about time to pack Ruby and Ruby scripts in one binary
ahogappa
1
7.4k
Featured
See All Featured
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
10k
Believing is Seeing
oripsolob
1
220
Navigating Algorithm Shifts & AI Overviews - #SMXNext
aleyda
1
1.6k
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.8k
What the history of the web can teach us about the future of AI
inesmontani
PRO
1
700
The SEO identity crisis: Don't let AI make you average
varn
0
560
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
3
250
Exploring anti-patterns in Rails
aemeredith
4
510
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
670
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.8k
RailsConf 2023
tenderlove
30
1.6k
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
300
Transcript
ahogappa kompoのその後 RubyKaigi 2024 followup 1
© 2020 Coiney, Inc. • ahogappa • STORES, Inc 自己紹介
2 2
© 2020 Coiney, Inc. • RubyとRubyスクリプトをワンバイナリにする gem(kompo)を作った話 ◦ モチベーション ◦
デモ ◦ 実装方法 ◦ Future Works RubyKaigiで何を話したの 3 3
© 2020 Coiney, Inc. • RubyKaigiでFuture Worksとしていた部分 ◦ 内部ファイルシステムへの自由なアクセス ◦
クロスコンパイル ◦ ファイルの圧縮 • STORES Tech Blogに書いた記事を元に発表資料にしてい ます ◦ https://product.st.inc/entry/2024/06/25/100008 ◦ この記事以降に更新があった内容も含まれています 今日話すこと 4 4
© 2020 Coiney, Inc. • お手軽であること ◦ 簡単にワンバイナリ化できて欲しい ◦ 複雑なオプションはなるべくいらないようにしたい
• それなりに速度が出ること ◦ 簡単にできても遅くなってしまうと、元のコードを チューニングする必要があったり、諦めてしまう ◦ クロスコンパイルできること kompoのコンセプト 5 5
© 2020 Coiney, Inc. • requireをパッチすることで、 内部ファイルシステムにアクセスしている 内部ファイルシステムへの自由なアクセス 6 6
© 2020 Coiney, Inc. • requireの代わりに `eval File.read(“hoge.rb”)` を実行す るようなコードが対応できない
◦ 例えばRubyGems gem ◦ デモの時は誤魔化していた • 内部ファイルにアクセスできる手段をrequire以外にも開 放する ◦ 内部ファイルを取得したい!を明示的にできるような 何かを作る必要がある 内部ファイルシステムへの自由なアクセス 7 7
© 2020 Coiney, Inc. • 実現するためにやらないといけないこと • “ちゃんとした”ファイルシステムの構築 • open,
readなどの関数をパッチする => パッチした関数が呼ばれたら内部ファイルシステムに繋げる • “ちゃんとした”ファイルシステムの構築 ◦ 今はファイルの中身を巨大なバイト列として保持している ◦ ディレクトリの情報や更新情報などのfile statに必要な情報を 持っていない • open, readなどの関数をパッチする ◦ ruby-packer gemはこの方法でrailsまで動かしている 内部ファイルシステムへの自由なアクセス 8 8
© 2020 Coiney, Inc. • ファイルシステムとして必要な機能は基本的に読み込みだけ ◦ 書き込みが要求されたら、本物のファイルシステムを使ってあげる ◦ ファイルパスを与えられたらfd(のような何か)を返して、fdでアク
セスされたらデータを返すような実装をすればいいはず • FUSEも試してみた ◦ macはmacfuse、windowsはそもそもない?ということで、環境差 異がありそう ◦ バイナリを実行する環境にfusermountコマンドのインストールが 必要 “ちゃんとした”ファイルシステムの構築 9 9
© 2020 Coiney, Inc. • 関数をパッチする方法 ◦ #defineを使ってコンパイル時に関数を置き換える ◦ LD_PRELOADを使ってリンクする関数を変える
◦ -Wl,--wrapを使ってリンク時に関数を読み替える • ruby-packer では#defineを使ってパッチしている ◦ ruby本体に変更を加える必要がある ◦ rubyの変更に追従する必要がある • LD_PRELOADは共有ライブラリにする必要がある ◦ 動的リンク時に解決 ◦ パッチファイルを共有ライブラリにして配布する必要がある • -Wl,--wrapが使えそう...? ◦ rubyに変更を加える必要がない&静的リンクで解決 ◦ GNU Linker限定のオプション • 別解でIFUNCとかもありそう open, readなどの関数をパッチする 10 10
© 2020 Coiney, Inc. • -Wl,--wrapってどんなことをやっているのかlldとmoldの コードを読む • 意外とやっていることは少ない open,
readなどの関数をパッチする 11 11 ref: https://github.com/rui314/mold/blob/ed4cae93542350c863eff7e10131272b4c01fe0e/src/input-files.cc#L641-L652
© 2020 Coiney, Inc. • リンカの種類に依存せずにこれを実現できないか • とはいえリンカを作るのは大変すぎる • シンボルを読み替えればいいだけなので、コンパイル後バ
イナリを編集したらできそう? ◦ libstatic-ruby.aに対してバイナリ編集する ◦ rubyだけで実現できれば、rustを使う必要がなくなる ◦ LIEFのruby版みたいなのを作る必要がある open, readなどの関数をパッチする 12 12
© 2020 Coiney, Inc. • やりたいが、全然何も考えられていない ◦ 特にWindows • 先程のバイナリ編集はELFを想定しているので、Mach-O,
PEのことを考える必要があるはず クロスコンパイル 13 13
© 2020 Coiney, Inc. • こちらも何も考えられていない ◦ 発表した当初から変わらずzlibで固めるかな... • そもそもどんなデータをワンバイナリに含めるか
◦ minifyしたもの ◦ ASTを小さく表現するほうが小さくなる? ◦ boot snapのように事前コンパイルしたもののほうが速 度は出そう • ただのminifyだったらminifyrbでいいじゃないかな ファイルの圧縮 14 14
© 2020 Coiney, Inc. • 関数をパッチする方法を考えている&実装している • ELF(などの実行形式ファイル)について調べている • やることたくさん
まとめ 15 15
ありがとうございました! 16
© 2020 Coiney, Inc. • namespace ◦ 拡張ライブラリは静的リンクしたいのでリンク時に シンボルが重なってこけそう ◦
マングリングする??? ◦ ワンバイナリに含めておいて、それをいい感じに参照 する??? おまけ 17 17