rabbit-slide-kou-rubykaigi-2025 2025.4.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.rabbit +2 -0
- data/README.rd +56 -0
- data/Rakefile +17 -0
- data/config.yaml +25 -0
- data/goodbye-fat-gem-2025.rab +521 -0
- data/images/clear-code-rubykaigi-2025-silver-sponsor.png +0 -0
- data/images/nokogiri-1.18.0.png +0 -0
- data/images/ruby-3.4.0.png +0 -0
- data/images/ruby-and-nokogiri.svg +67 -0
- data/pdf/rubykaigi-2025-goodbye-fat-gem-2025.pdf +0 -0
- metadata +89 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 9efb9928123cbea592cf0d24d20762433abf2a76d9ece5818bf791ab738032d4
|
4
|
+
data.tar.gz: 535f882b08affc29e3b969cc8929097ef4ee0f70ebcd1937be12ec3774b883a6
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 545f23a1566c5db5acd5b9745b436790e9ccadae22676f156815a11ef18571c34e80eeb9545612bc8e54d630773929e24c31296504bc01df73c2507749cd2012
|
7
|
+
data.tar.gz: 1dab66fe008889d620ec26c7f0cb0281216e372a645e8b422bd1c0a5267be55b3f03ee1cc8ba74037bd531d6862dad315f565c409df8f281c106106d449b8ff0
|
data/.rabbit
ADDED
data/README.rd
ADDED
@@ -0,0 +1,56 @@
|
|
1
|
+
= Goodbye fat gem 2025
|
2
|
+
|
3
|
+
I talked about ((<"Goodbye fat gem"|URL:https://rubykaigi.org/2020/presentations/ktou.html>)) at RubyKaigi Takeout 2020. Fat gem is a gem that includes pre-built binaries. Extension libraries can assume that users have build environment with Ruby 2.4 or later. So gems don't need to bundle pre-built binaries for easy to install. Users can build binaries by themselves.
|
4
|
+
|
5
|
+
As of 2025, we're still using fat gem...
|
6
|
+
|
7
|
+
I discussed how to improve this situation with ruby-installer author, Nokogiri maintainer and RubyGems community in 2022:
|
8
|
+
|
9
|
+
* https://gist.github.com/postmodern/4c0cbccc0c7eda4585db0fc5267cdd57
|
10
|
+
* https://github.com/rubygems/rubygems/issues/1296
|
11
|
+
|
12
|
+
I propose a solution based on these discussions.
|
13
|
+
|
14
|
+
== License
|
15
|
+
|
16
|
+
=== Slide
|
17
|
+
|
18
|
+
CC BY-SA 4.0
|
19
|
+
|
20
|
+
Use the followings for notation of the author:
|
21
|
+
|
22
|
+
* Sutou Kouhei
|
23
|
+
|
24
|
+
==== ClearCode Inc. logo
|
25
|
+
|
26
|
+
CC BY-SA 4.0
|
27
|
+
|
28
|
+
Author: ClearCode Inc.
|
29
|
+
|
30
|
+
It is used in page header and some pages in the slide.
|
31
|
+
|
32
|
+
==== ADBC related images
|
33
|
+
|
34
|
+
Apache-2.0
|
35
|
+
|
36
|
+
Author: The Apache Software Foundation
|
37
|
+
|
38
|
+
== For author
|
39
|
+
|
40
|
+
=== Show
|
41
|
+
|
42
|
+
rake
|
43
|
+
|
44
|
+
=== Publish
|
45
|
+
|
46
|
+
rake publish
|
47
|
+
|
48
|
+
== For viewers
|
49
|
+
|
50
|
+
=== Install
|
51
|
+
|
52
|
+
gem install rabbit-slide-kou-rubykaigi-2025
|
53
|
+
|
54
|
+
=== Show
|
55
|
+
|
56
|
+
rabbit rabbit-slide-kou-rubykaigi-2025.gem
|
data/Rakefile
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
require "rabbit/task/slide"
|
2
|
+
|
3
|
+
# Edit ./config.yaml to customize meta data
|
4
|
+
|
5
|
+
spec = nil
|
6
|
+
Rabbit::Task::Slide.new do |task|
|
7
|
+
spec = task.spec
|
8
|
+
spec.files += Dir.glob("images/**/*.*")
|
9
|
+
# spec.files -= Dir.glob("private/**/*.*")
|
10
|
+
spec.add_runtime_dependency("rabbit-theme-clear-code")
|
11
|
+
end
|
12
|
+
|
13
|
+
desc "Tag #{spec.version}"
|
14
|
+
task :tag do
|
15
|
+
sh("git", "tag", "-a", spec.version.to_s, "-m", "Publish #{spec.version}")
|
16
|
+
sh("git", "push", "--tags")
|
17
|
+
end
|
data/config.yaml
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
---
|
2
|
+
id: rubykaigi-2025
|
3
|
+
base_name: goodbye-fat-gem-2025
|
4
|
+
tags:
|
5
|
+
- rabbit
|
6
|
+
- ruby
|
7
|
+
- rubykaigi2025
|
8
|
+
presentation_date: 2025-04-16
|
9
|
+
version: 2025.4.16.0
|
10
|
+
licenses:
|
11
|
+
- CC-BY-SA-4.0
|
12
|
+
slideshare_id:
|
13
|
+
speaker_deck_id:
|
14
|
+
vimeo_id:
|
15
|
+
youtube_id:
|
16
|
+
width: 1920
|
17
|
+
height: 1080
|
18
|
+
source_code_uri: "https://gitlab.com/ktou/rabbit-slide-kou-rubykaigi-2025"
|
19
|
+
author:
|
20
|
+
markup_language: :rd
|
21
|
+
name: Sutou Kouhei
|
22
|
+
email: kou@clear-code.com
|
23
|
+
rubygems_user: kou
|
24
|
+
slideshare_user: kou
|
25
|
+
speaker_deck_user: kou
|
@@ -0,0 +1,521 @@
|
|
1
|
+
= Goodbye fat gem 2025
|
2
|
+
|
3
|
+
: author
|
4
|
+
Sutou Kouhei
|
5
|
+
: institution
|
6
|
+
ClearCode Inc.
|
7
|
+
: content-source
|
8
|
+
RubyKaigi 2025
|
9
|
+
: date
|
10
|
+
2025-04-16
|
11
|
+
: start-time
|
12
|
+
2025-04-16T14:00:00+09:00
|
13
|
+
: end-time
|
14
|
+
2025-04-16T14:30:00+09:00
|
15
|
+
: theme
|
16
|
+
clear-code
|
17
|
+
|
18
|
+
= Sutou Kouhei\nA president Ruby committer
|
19
|
+
|
20
|
+
The president of ClearCode Inc.\n
|
21
|
+
(('note:クリアコードの社長'))
|
22
|
+
|
23
|
+
# img
|
24
|
+
# src = images/clear-code-rubykaigi-2025-silver-sponsor.png
|
25
|
+
# relative_width = 70
|
26
|
+
# reflect_ratio = 0.1
|
27
|
+
|
28
|
+
= The update of "Goodbye fat gem"
|
29
|
+
|
30
|
+
# img
|
31
|
+
# src = https://slide.rabbit-shocker.org/authors/kou/rubykaigi-takeout-2020/goodbye-fat-gem.pdf
|
32
|
+
# relative_width = 80
|
33
|
+
|
34
|
+
== スライドプロパティー
|
35
|
+
|
36
|
+
: enable-title-on-image
|
37
|
+
false
|
38
|
+
|
39
|
+
= Fat gem a.k.a. {binary,native} gem
|
40
|
+
|
41
|
+
Gem that includes pre-built binaries\n
|
42
|
+
(('note:ビルド済みバイナリー入りのgem'))
|
43
|
+
|
44
|
+
= Why is fat gem needed?\n(('note:どうしてfat gemが必要なのか'))
|
45
|
+
|
46
|
+
* Difficult to build extension library\n
|
47
|
+
(('note:拡張ライブラリーのビルドが難しい'))
|
48
|
+
* Extension library:\n
|
49
|
+
A Ruby library implemented with C API\n
|
50
|
+
(('note:拡張ライブラリー:C APIを使って実装されたRubyライブラリー'))
|
51
|
+
* Fat gem just copies pre-built binaries\n
|
52
|
+
(('note:fat gemは単にビルド済みバイナリーをコピーするだけ(ビルドしない)'))
|
53
|
+
|
54
|
+
= Why is building it difficult?\n(('note:どうして拡張ライブラリーのビルドは難しいのか'))
|
55
|
+
|
56
|
+
* Users need build environment\n
|
57
|
+
(('note:ユーザーはビルド環境を用意しないといけない'))
|
58
|
+
* e.g.: C/Rust/Go compiler and so on\n
|
59
|
+
(('note:例:C/Rust/Goコンパイラーなど'))
|
60
|
+
* Users need build dependencies\n
|
61
|
+
(('note:ユーザーが依存するライブラリーを用意しないといけない'))
|
62
|
+
* e.g.: GTK 4 for gtk4 gem\n
|
63
|
+
(('note:例:gtk4 gemはGTK 4が必要'))
|
64
|
+
|
65
|
+
= With fat gem\n(('note:fat gemを使うと'))
|
66
|
+
|
67
|
+
* Users don't need build environment!\n
|
68
|
+
(('note:ユーザーはビルド環境を用意しなくてもよい'))
|
69
|
+
* No compiler\n
|
70
|
+
(('note:ユーザーはビルド環境がなくてもよい'))
|
71
|
+
* Users don't fail installation!\n
|
72
|
+
(('note:ユーザーはインストールに失敗しない'))
|
73
|
+
* Fat gem just copies pre-built binaries\n
|
74
|
+
(('note:fat gemは単にビルド済みバイナリーをコピーするだけ'))
|
75
|
+
|
76
|
+
= With fat gem\n(('note:fat gemを使うと'))
|
77
|
+
|
78
|
+
(('tag:center'))
|
79
|
+
Happy!\n
|
80
|
+
🙌\n
|
81
|
+
All extension libraries\n
|
82
|
+
must be released as fat gems!!!\n
|
83
|
+
(('note:すべての拡張ライブラリーはfat gemとしてリリースされるべきじゃん!!!'))
|
84
|
+
|
85
|
+
(('tag:right'))
|
86
|
+
(('wait'))...Really?\n
|
87
|
+
(('note:…ほんとに?'))
|
88
|
+
|
89
|
+
= A fat gem maintainer says...\n(('note:あるfat gemメンテナー曰く…'))
|
90
|
+
|
91
|
+
Thanks fat gem!\n
|
92
|
+
Goodbye fat gem!\n
|
93
|
+
(('note:ありがとうfat gem!'))\n
|
94
|
+
(('note:さよならfat gem!'))
|
95
|
+
|
96
|
+
= Fat gem problem 1\n(('note:fat gemの問題1'))
|
97
|
+
|
98
|
+
Can't use\n
|
99
|
+
the latest Ruby\n
|
100
|
+
immediately\n
|
101
|
+
(('note:いち早く最新のRubyを使えない'))
|
102
|
+
|
103
|
+
= Details\n(('note:詳細'))
|
104
|
+
|
105
|
+
* Ruby is released every Christmas\n
|
106
|
+
(('note:Rubyは毎年クリスマスにリリースされる'))
|
107
|
+
* To use fat gems with the latest Ruby:\n
|
108
|
+
(('note:最新のRubyでfat gemを使うには'))
|
109
|
+
* Need to release fat gems for it\n
|
110
|
+
(('note:最新のRuby用のfat gemがリリースされていないといけない'))
|
111
|
+
* Users can't use the latest Ruby while:\n
|
112
|
+
(('note:ユーザーは↓の間は最新のRubyを使えないまま'))
|
113
|
+
* Any of fat gems doesn't support it\n
|
114
|
+
(('note:使っているfat gemのどれか1つでも最新のRubyをサポートしていない'))
|
115
|
+
|
116
|
+
= The Ruby 3.4 and Nokogiri case
|
117
|
+
|
118
|
+
# img
|
119
|
+
# src = images/ruby-and-nokogiri.svg
|
120
|
+
# relative_height = 70
|
121
|
+
|
122
|
+
(('tag:center'))
|
123
|
+
(('wait'))We can use immediately!!!\n
|
124
|
+
(('note:すぐに使えるじゃん!!!'))
|
125
|
+
|
126
|
+
= From extension gem maintainer view\n(('note:拡張gemメンテナー視点'))
|
127
|
+
|
128
|
+
Not all extension gem maintainers\n
|
129
|
+
can do it\n
|
130
|
+
((*immediately*))\n
|
131
|
+
(('note:すべての拡張gemメンテナーが((*すぐに*))対応できるわけじゃない'))
|
132
|
+
|
133
|
+
= As a user\n(('note:ユーザーとして'))
|
134
|
+
|
135
|
+
* Do you think only people\n
|
136
|
+
who can release immediately\n
|
137
|
+
must maintain extension gems?\n
|
138
|
+
(('note:すぐにリリースできる人たちだけが拡張gemをメンテナンスするべき?'))
|
139
|
+
* Is it desired Ruby ecosystem?\n
|
140
|
+
(('note:そんなRubyエコシステムがよさそう?'))
|
141
|
+
|
142
|
+
= Wait!\n(('note:ちょっと待って!'))
|
143
|
+
|
144
|
+
* Can we fallback to a normal gem until the latest Ruby's fat gem is released?\n
|
145
|
+
(('note:最新のRuby用fat gemリリースまでは通常のgemにフォールバックできない?'))
|
146
|
+
* Python's wheel can do it\n
|
147
|
+
(('note:Pythonのwheelならできる'))
|
148
|
+
* RubyGems can implement similar approach\n
|
149
|
+
(('note:RubyGemsでも同じような仕組みを実装することはできる'))
|
150
|
+
* But... do you use it...?\n
|
151
|
+
(('note:でも、その仕組み、使う…?'))
|
152
|
+
|
153
|
+
= A common scenario\n(('note:よくあるシナリオ'))
|
154
|
+
|
155
|
+
(1) Ruby 3.5 is released!\n
|
156
|
+
(('note:Ruby 3.5リリース!'))
|
157
|
+
(2) Fat gem A isn't 3.5 ready yet...\n
|
158
|
+
(('note:fat gemのAはまだRuby 3.5に対応していない…'))
|
159
|
+
(3) (({bundle install})) failed with Ruby 3.5\n
|
160
|
+
(('note:Ruby 3.5では(({bundle install}))失敗'))
|
161
|
+
* Because you don't have build environment...\n
|
162
|
+
(('note:ビルド環境を整備していないからなぁ…'))
|
163
|
+
(4) Pin Ruby to 3.4!\n
|
164
|
+
(('note:しばらくRuby 3.4を使っていよう!'))
|
165
|
+
|
166
|
+
= Another scenario\n(('note:別のシナリオ'))
|
167
|
+
|
168
|
+
(1) We always use the latest Ruby!\n
|
169
|
+
(('note:常に最新のRubyを使うぞ!'))
|
170
|
+
(2) No fat gem must not block it!\n
|
171
|
+
(('note:fat gemの有無で阻害されたくない!'))
|
172
|
+
(3) Stop using fat gem!\n
|
173
|
+
(('note:fat gemを使うのをやめよう!'))
|
174
|
+
* Prepare build environment\n
|
175
|
+
(('note:ビルド環境を整備する'))
|
176
|
+
* (({bundle config force_ruby_platform true}))
|
177
|
+
|
178
|
+
= FYI: How to implement the fallback\n(('note:参考情報:フォールバックの実装方法'))
|
179
|
+
|
180
|
+
* Normal flow:\n
|
181
|
+
(('note:通常のフロー'))
|
182
|
+
(1) Find (({nokogiri-X.Y.Z-x86_64-linux.gem})) (('note:(fat gem)'))\n
|
183
|
+
(('note:(({nokogiri-X.Y.Z-x86_64-linux.gem}))を探す'))
|
184
|
+
(2) Exist: Use it\n
|
185
|
+
(('note:あったらそれを使う'))
|
186
|
+
(3) Not exist: Use (({nokogiri-X.Y.Z.gem})) (('note:(normal gem)'))\n
|
187
|
+
(('note:なかったら(({nokogiri-X.Y.Z.gem}))を使う'))
|
188
|
+
|
189
|
+
* Point: The (({x86_64-linux})) part\n
|
190
|
+
(('note:ポイント:(({x86_64-linux}))のところ'))
|
191
|
+
|
192
|
+
= FYI: How to implement the fallback\n(('note:参考情報:フォールバックの実装方法'))
|
193
|
+
|
194
|
+
* (({x86_64-linux}))
|
195
|
+
* Includes architecture and OS\n
|
196
|
+
(('note:アーキテクチャーとOSは含んでいる'))
|
197
|
+
* But doesn't include Ruby version\n
|
198
|
+
(('note:でもRubyのバージョンは含んでいない'))
|
199
|
+
* A fat gem includes binaries\n
|
200
|
+
for all supported Rubies\n
|
201
|
+
on the architecture and OS\n
|
202
|
+
(('note:fat gemには対象アーキテクチャーのOS用のすべてのサポートしているRuby用のバイナリーが含まれている'))
|
203
|
+
|
204
|
+
= FYI: How to implement the fallback\n(('note:参考情報:フォールバックの実装方法'))
|
205
|
+
|
206
|
+
* RubyGems can't know whether\n
|
207
|
+
(({x86_64-linux})) gem includes binaries\n
|
208
|
+
for Ruby 3.5 or not\n
|
209
|
+
(('note:RubyGemsは(({x86_64-linux})) gemがRuby 3.5用のバイナリーを含むかわからない'))
|
210
|
+
* How to solve it?\n
|
211
|
+
(('note:解決方法は?'))
|
212
|
+
* Add Ruby version: (({x86_64-linux-ruby3.4})), (({x86_64-linux-ruby3.5})), ...\n
|
213
|
+
(('note:This is what Python's wheel does'))\n
|
214
|
+
(('note:Rubyのバージョンも入れちゃえばいい(Pythonのwheelはこうしている)'))
|
215
|
+
|
216
|
+
= Fat gem problem 2\n(('note:fat gemの問題2'))
|
217
|
+
|
218
|
+
Vulnerability response\n
|
219
|
+
may get delayed\n
|
220
|
+
(('note:脆弱性対応が遅れがち'))
|
221
|
+
|
222
|
+
= Details\n(('note:詳細'))
|
223
|
+
|
224
|
+
* Only bindings fat gem case\n
|
225
|
+
(('note:バインディングのfat gemだけのケース'))
|
226
|
+
* (('note:Bindings: A extension library to use an external library'))\n
|
227
|
+
(('note:バインディング:外部のライブラリーを使う拡張ライブラリー'))
|
228
|
+
* Includes an external library binary\n
|
229
|
+
(('note:fat gem内に外部ライブラリーのバイナリーも含む'))
|
230
|
+
* When a vulnerability of an external library is found:\n
|
231
|
+
(('note:外部ライブラリーに脆弱性が見つかった場合:'))
|
232
|
+
* Should be released immediately with fix\n
|
233
|
+
(('note:すぐに修正を含んだバージョンをリリースするべき'))
|
234
|
+
|
235
|
+
= libxslt 1.1.43 + Nokogiri
|
236
|
+
|
237
|
+
* libxslt: 1.1.43: 2025-03-12
|
238
|
+
* CVE-2025-24855, CVE-2024-55549
|
239
|
+
* Nokogiri: 1.18.4: ((*2025-03-14*))
|
240
|
+
* Updates bundled libxslt to 1.1.43
|
241
|
+
* (('wait'))Debian: bookworm: ((*2025-03-15*))
|
242
|
+
* Fixes CVE-2025-24855, CVE-2024-55549
|
243
|
+
* (('wait'))Nokogiri is faster than Debian!!!\n
|
244
|
+
(('note:Nokogiriの方がDebianより対応が速いじゃん!!!'))
|
245
|
+
|
246
|
+
= From fat gem maintainer view\n(('note:fat gemメンテナー視点'))
|
247
|
+
|
248
|
+
Not all fat gem maintainers\n
|
249
|
+
can do it\n
|
250
|
+
((*immediately*))\n
|
251
|
+
(('note:すべてのfat gemメンテナーが((*すぐに*))対応できるわけじゃない'))
|
252
|
+
|
253
|
+
= As a user\n(('note:ユーザーとして'))
|
254
|
+
|
255
|
+
* Do you think only people\n
|
256
|
+
who can release immediately\n
|
257
|
+
must maintain extension gems?\n
|
258
|
+
(('note:すぐにリリースできる人たちだけが拡張gemをメンテナンスするべき?'))
|
259
|
+
* Is it desired Ruby ecosystem?\n
|
260
|
+
(('note:そんなRubyエコシステムがよさそう?'))
|
261
|
+
|
262
|
+
= Fat gem problem 3\n(('note:fat gemの問題3'))
|
263
|
+
|
264
|
+
High\n
|
265
|
+
maintenance\n
|
266
|
+
cost\n
|
267
|
+
(('note:メンテナンスが大変'))
|
268
|
+
|
269
|
+
= Details\n(('note:詳細'))
|
270
|
+
|
271
|
+
* Especially binding fat gem case\n
|
272
|
+
(('note:特にバインディングのfat gemのケース'))
|
273
|
+
* Normally, cross-compiling is used\n
|
274
|
+
(('note:通常、クロスコンパイルしてfat gemを作る'))
|
275
|
+
* Most external libraries don't do it\n
|
276
|
+
(('note:多くの外部ライブラリーはクロスコンパイルなんてしない'))
|
277
|
+
* There are some problems on upgrading\n
|
278
|
+
(('note:外部ライブラリーのバージョンをあげるたびになにかしら問題が見つかる'))
|
279
|
+
* Ruby-GNOME has 10+ related external libraries\n
|
280
|
+
(('note:Ruby-GNOMEは10以上の関連外部ライブラリーがあって大変だった'))
|
281
|
+
|
282
|
+
= Wait!\n(('note:ちょっと待って!'))
|
283
|
+
|
284
|
+
* Does rake-compiler-dock help us?\n
|
285
|
+
(('note:rake-compiler-dockで解決しないの?'))
|
286
|
+
* We can prepare stable cross-compiling env\n
|
287
|
+
(('note:これで安定してクロスコンパイル環境を用意できる'))
|
288
|
+
* (('wait'))Cross-compiling itself is difficult!!!\n
|
289
|
+
(('note:クロスコンパイル自体がキビシイんだよー!!!'))
|
290
|
+
* (('wait'))BTW, do you know all target platforms?\n
|
291
|
+
(('note:ところで、すべてのクロスコンパイル対象のプラットフォームを知ってる?'))
|
292
|
+
= Target platforms\n(('note:対象プラットフォーム'))
|
293
|
+
|
294
|
+
11 platforms:
|
295
|
+
|
296
|
+
* {x86{,_64},arm,aarch64}-linux-{gnu,musl}
|
297
|
+
* 8: 32/64bit, Intel/ARM, Linux, glibc/musl libc
|
298
|
+
* {x86_64,arm64}-darwin
|
299
|
+
* 2: 64bit, Intel/ARM, macOS
|
300
|
+
* x64-mingw-ucrt: Windows
|
301
|
+
|
302
|
+
= Target platforms × Ruby version\n(('note:対象プラットフォーム × Rubyのバージョン'))
|
303
|
+
|
304
|
+
11 platforms × 4 versions = 44 patterns!
|
305
|
+
|
306
|
+
* {x86{,_64},arm,aarch64}-linux-{gnu,musl}
|
307
|
+
* 8: 32/64bit, Intel/ARM, Linux, glibc/musl libc
|
308
|
+
* {x86_64,arm64}-darwin
|
309
|
+
* 2: 64bit, Intel/ARM, macOS
|
310
|
+
* x64-mingw-ucrt: Windows
|
311
|
+
|
312
|
+
= Static linking is difficult too\n(('note:スタティックリンクも難しいんだよー'))
|
313
|
+
|
314
|
+
* Binding fat gem uses static linking\n
|
315
|
+
(('note:バインディングfat gemはスタティックリンクを使う'))
|
316
|
+
* May mix multiple different zlib, curl, OpenSSL, ...\n
|
317
|
+
(('note:((複数の違うバージョンのzlib, curl, OpenSSLなどが混在するかも'))
|
318
|
+
* Symbol conflicts with (({dlopen(RTLD_GLOBAL)}))\n
|
319
|
+
(('note:(({dlopen(RTLD_GLOBAL)}))だとシンボルが衝突するかも'))
|
320
|
+
* Namespace may fix this?\n
|
321
|
+
(('note:Namespaceは(({dlopen(RTLD_LOCAL)}))なので解決するかも?'))
|
322
|
+
|
323
|
+
= How to solve these problems?\n(('note:これらの問題を解決するには?'))
|
324
|
+
|
325
|
+
(('wait'))
|
326
|
+
Prepare build env\n((*automatically*))!?\n
|
327
|
+
(('note:ビルド環境を((*自動で*))準備すればよいのでは!?'))
|
328
|
+
|
329
|
+
= Predecessor: RubyInstaller2\n(('note:先駆者:RubyInstaller2'))
|
330
|
+
|
331
|
+
* Ruby distribution for Windows\n
|
332
|
+
(('note:Windows用のRubyディストリビューション'))
|
333
|
+
* Based on MSYS2\n
|
334
|
+
(('note:MSYS2ベース'))
|
335
|
+
* Build environment (Devkit) is included\n
|
336
|
+
(('note:Devkitという名前のビルド環境がセット'))
|
337
|
+
* Package manager is included\n
|
338
|
+
(('note:パッケージマネージャもセット'))
|
339
|
+
|
340
|
+
= msys2_mingw_dependencies
|
341
|
+
|
342
|
+
# rouge ruby
|
343
|
+
|
344
|
+
gemspec.metadata["msys2_mingw_dependencies"] = "gtk4"
|
345
|
+
|
346
|
+
* gem's metadata for RubyInstaller2\n
|
347
|
+
(('note:gemの独自メタデータ'))
|
348
|
+
* Install dependencies automatically!!!\n
|
349
|
+
(('note:依存パッケージを自動インストール!!!'))
|
350
|
+
* No install failure by missing dependencies!\n
|
351
|
+
(('note:依存パッケージがなくてインストール失敗ということはない!'))
|
352
|
+
|
353
|
+
= Discussed\n(('note:相談した'))
|
354
|
+
|
355
|
+
* "[RFC] Allow specifying and installing external dependencies" in 2022\n
|
356
|
+
(('note:((<URL:https://gist.github.com/postmodern/4c0cbccc0c7eda4585db0fc5267cdd57>))'))\n
|
357
|
+
(('note:[RFC] 外部依存情報を指定してインストールできるようにしない?'))
|
358
|
+
|
359
|
+
= The RFC draft content\n(('note:このRFCドラフトの内容'))
|
360
|
+
|
361
|
+
* Problem: Difficult to install gems that have external dependencies\n
|
362
|
+
(('note:問題:外部依存があるgemのインストールはむずかしい'))
|
363
|
+
* Proposal:
|
364
|
+
* Allow specifying external deps in gemspec\n
|
365
|
+
(('note:gemspecで外部依存を指定できるようにしよう'))
|
366
|
+
* Install them automatically on install\n
|
367
|
+
(('note:インストール時に自動で外部依存もインストールしよう'))
|
368
|
+
|
369
|
+
= Who did discuss it?\n(('note:だれが相談していたの?'))
|
370
|
+
|
371
|
+
* ((<@postmodern|URL:https://github.com/postmodern>)): ruby-install author
|
372
|
+
* ((<@flavorjones|URL:https://github.com/flavorjones>)):
|
373
|
+
* Nokogiri maintainer
|
374
|
+
* rake-compiler-dock maintainer
|
375
|
+
* ((<@kou|URL:https://github.com/kou>)):
|
376
|
+
* native-package-installer author
|
377
|
+
* rake-compiler maintainer
|
378
|
+
|
379
|
+
= And then?\n(('note:最終的にどうなったの?'))
|
380
|
+
|
381
|
+
* No consensus and no action...\n
|
382
|
+
(('note:話がまとまらなく具体的なアクションはなかった…'))
|
383
|
+
* But!
|
384
|
+
* Use-cases and requirements were organized\n
|
385
|
+
(('note:ユースケースや必要なことは整理された'))
|
386
|
+
* I got a little motivated💪\n
|
387
|
+
(('note:私がちょっとやる気になった'))
|
388
|
+
|
389
|
+
= 💪rubygems-requirements-system
|
390
|
+
|
391
|
+
A new RubyGems plugin for it:
|
392
|
+
|
393
|
+
# rouge console
|
394
|
+
|
395
|
+
$ gem install rubygems-requirements-system
|
396
|
+
$ gem install gtk4
|
397
|
+
|
398
|
+
A new Bundler plugin for it:
|
399
|
+
|
400
|
+
# rouge ruby
|
401
|
+
# keep-in-size = false
|
402
|
+
|
403
|
+
# Gemfile
|
404
|
+
plugin "rubygems-requirements-system"
|
405
|
+
gem "gtk4"
|
406
|
+
|
407
|
+
= How to use by developers\n(('note:開発者の使い方'))
|
408
|
+
|
409
|
+
# rouge ruby
|
410
|
+
|
411
|
+
Gem::Specification.new do |spec|
|
412
|
+
# "system" <- Keyword
|
413
|
+
# "gtk4" <- Package ID
|
414
|
+
# "debian", "homebrew" <- Platform ID
|
415
|
+
# "libgtk-4-dev", "gtk4" <- Package name in the platform
|
416
|
+
spec.requirements << "system: gtk4: debian: libgtk-4-dev"
|
417
|
+
spec.requirements << "system: gtk4: homebrew: gtk4"
|
418
|
+
# ...
|
419
|
+
# That's all!
|
420
|
+
end
|
421
|
+
|
422
|
+
= Supported platforms\n(('note:対応プラットフォーム'))
|
423
|
+
|
424
|
+
Alpine Linux, ALT Linux, Amazon Linux, Arch Linux, Conda, Debian, Fedora, FreeBSD, Gentoo Linux, Homebrew, MacPorts, PLD Linux, RHEL, SUSE and Ubuntu
|
425
|
+
|
426
|
+
= What problems are solved by this?\n(('note:これで何が解決するの?'))
|
427
|
+
|
428
|
+
* Can't use the latest Ruby immediately\n
|
429
|
+
(('note:すぐに最新のRubyを使えない'))
|
430
|
+
* Can't update vulnerable products immediately\n
|
431
|
+
(('note:すぐに脆弱性のあるプロダクトを更新できない'))
|
432
|
+
* High maintenance cost\n
|
433
|
+
(('note:高いメンテナンスコスト'))
|
434
|
+
|
435
|
+
By goodbye fat gem\n
|
436
|
+
(('note:fat gemをやめることで'))
|
437
|
+
|
438
|
+
= What problems are remained?\n(('note:残る問題はなに?'))
|
439
|
+
|
440
|
+
* Longer install time\n
|
441
|
+
(('note:インストール時間が長くなる'))
|
442
|
+
* Build time > Copy pre-built binaries time\n
|
443
|
+
(('note:ビルド時間 > ビルド済みをコピーする時間'))
|
444
|
+
* Some people don't like system change\n
|
445
|
+
(('note:システムが変更されることがイヤな人がいる'))
|
446
|
+
* e.g.: They don't like (({apt install XXX}))\n
|
447
|
+
(('note:たとえば(({apt install XXX}))がイヤ'))
|
448
|
+
|
449
|
+
= How to resolve "longer install"?\n(('note:「インストール時間が長くなる」のは解決できる?'))
|
450
|
+
|
451
|
+
(('tag:center'))
|
452
|
+
(('tag:large'))
|
453
|
+
(({MAKEFLAGS="-j$(nproc)"}))...?\n
|
454
|
+
(('note:パラレルビルドでがんばれる…?'))
|
455
|
+
|
456
|
+
((' '))
|
457
|
+
|
458
|
+
= How to resolve "system change"?\n(('note:「システムが変更される」のは解決できる?'))
|
459
|
+
|
460
|
+
* Container per app?\n
|
461
|
+
(('note:アプリごとにコンテナーを作ればいいのでは?'))
|
462
|
+
* Package manager per app?\n
|
463
|
+
(('note:アプリごとにパッケージマネージャーを用意すればいいのでは?'))
|
464
|
+
* e.g.: Conda, Conan, vcpkg, ...
|
465
|
+
* (('wait'))Homebrew!? (It uses Ruby!)\n
|
466
|
+
(('note:Homebrewとか!?Ruby使っているし!'))
|
467
|
+
|
468
|
+
= Proposal\n(('note:提案'))
|
469
|
+
|
470
|
+
* Reduce maintenance cost for sustainable Ruby ecosystem\n
|
471
|
+
(('note:持続可能なRubyエコシステムのためにメンテコストを減らさない?'))
|
472
|
+
* Well maintained fat gems are useful for users\n
|
473
|
+
but they have high maintain cost...\n
|
474
|
+
(('note:メンテされているfat gemが便利なのはわかるけど大変なんよ。。。'))
|
475
|
+
* Maintainers can use their time for others\n
|
476
|
+
(('note:メンテナーは他のことに時間を使えるようになるよ'))
|
477
|
+
* Goodbye fat gem with\n
|
478
|
+
auto preparation mechanism\n
|
479
|
+
(('note:自動で準備してくれる仕組みでfat gemにさよならできない?'))
|
480
|
+
|
481
|
+
= Without fat gem\n(('note:fat gemをやめると'))
|
482
|
+
|
483
|
+
(('tag:center'))
|
484
|
+
(('tag:xx-large'))
|
485
|
+
Happy!\n
|
486
|
+
🙌
|
487
|
+
|
488
|
+
(('tag:right'))
|
489
|
+
(('wait'))...Really?\n
|
490
|
+
(('note:…ほんとに?'))
|
491
|
+
|
492
|
+
= What do the RubyGems devs think?\n(('note:RubyGems開発者はどう考えているの?'))
|
493
|
+
|
494
|
+
"Developing wheels for RubyGems"\n
|
495
|
+
(('note:RubyGems用のwheelsを開発しているよ'))
|
496
|
+
|
497
|
+
(('note:((<URL:https://blog.rubygems.org/2025/03/19/february-rubygems-updates.html>))'))
|
498
|
+
|
499
|
+
(('tag:right'))
|
500
|
+
(('wait'))...Really?\n
|
501
|
+
(('note:…マジ?'))\n
|
502
|
+
(('note:私はPyArrowのwheelをちょっとメンテしているけどマジ大変よ。。。'))
|
503
|
+
|
504
|
+
= Wrap up\n(('note:まとめ'))
|
505
|
+
|
506
|
+
Thanks fat gem!\n
|
507
|
+
Goodbye fat gem...?\n
|
508
|
+
(('note:ありがとうfat gem!'))\n
|
509
|
+
(('note:さよならfat gem…?'))
|
510
|
+
|
511
|
+
= Let's discuss this!\n(('note:相談しようぜ!'))
|
512
|
+
|
513
|
+
I'll be the followings:
|
514
|
+
|
515
|
+
* Around the venue(('note:(そこらへんをぶらぶら)'))
|
516
|
+
* @.bookstore in long breaks\n
|
517
|
+
(('note:長い休憩のときはささださんの本屋さんで店員のお手伝いしているかも'))\n
|
518
|
+
(('note:リーダブルコードのサイン会にもいるよ'))
|
519
|
+
* Day 1: Official party
|
520
|
+
* Day 2: Ruby Development Inc. Drinkup
|
521
|
+
* Day 3: Code Party(('note:(コード懇親会)'))
|
Binary file
|
Binary file
|
Binary file
|
@@ -0,0 +1,67 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
2
|
+
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
3
|
+
|
4
|
+
<svg
|
5
|
+
width="157.42708mm"
|
6
|
+
height="138.77699mm"
|
7
|
+
viewBox="0 0 157.42708 138.777"
|
8
|
+
version="1.1"
|
9
|
+
id="svg5"
|
10
|
+
xml:space="preserve"
|
11
|
+
inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
|
12
|
+
sodipodi:docname="ruby-and-nokogiri.svg"
|
13
|
+
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
14
|
+
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
15
|
+
xmlns:xlink="http://www.w3.org/1999/xlink"
|
16
|
+
xmlns="http://www.w3.org/2000/svg"
|
17
|
+
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
|
18
|
+
id="namedview7"
|
19
|
+
pagecolor="#ffffff"
|
20
|
+
bordercolor="#000000"
|
21
|
+
borderopacity="0.25"
|
22
|
+
inkscape:showpageshadow="2"
|
23
|
+
inkscape:pageopacity="0.0"
|
24
|
+
inkscape:pagecheckerboard="0"
|
25
|
+
inkscape:deskcolor="#d1d1d1"
|
26
|
+
inkscape:document-units="mm"
|
27
|
+
showgrid="false"
|
28
|
+
inkscape:zoom="0.914906"
|
29
|
+
inkscape:cx="345.39067"
|
30
|
+
inkscape:cy="503.8769"
|
31
|
+
inkscape:window-width="3440"
|
32
|
+
inkscape:window-height="1371"
|
33
|
+
inkscape:window-x="0"
|
34
|
+
inkscape:window-y="32"
|
35
|
+
inkscape:window-maximized="1"
|
36
|
+
inkscape:current-layer="layer1" /><defs
|
37
|
+
id="defs2" /><g
|
38
|
+
inkscape:label="Layer 1"
|
39
|
+
inkscape:groupmode="layer"
|
40
|
+
id="layer1"
|
41
|
+
transform="translate(-11.944796,-10.205935)"><image
|
42
|
+
width="107.68542"
|
43
|
+
height="33.866665"
|
44
|
+
preserveAspectRatio="none"
|
45
|
+
xlink:href="ruby-3.4.0.png"
|
46
|
+
id="image63"
|
47
|
+
x="30.225233"
|
48
|
+
y="10.205935" /><image
|
49
|
+
width="157.42708"
|
50
|
+
height="94.456253"
|
51
|
+
preserveAspectRatio="none"
|
52
|
+
xlink:href="nokogiri-1.18.0.png"
|
53
|
+
id="image119"
|
54
|
+
x="11.944796"
|
55
|
+
y="46.876827" /><rect
|
56
|
+
style="fill:none;stroke:#458cff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
|
57
|
+
id="rect333"
|
58
|
+
width="34.236771"
|
59
|
+
height="8.1849632"
|
60
|
+
x="85.717178"
|
61
|
+
y="30.203192" /><rect
|
62
|
+
style="fill:none;stroke:#458cff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
|
63
|
+
id="rect333-3"
|
64
|
+
width="55.335312"
|
65
|
+
height="94.569733"
|
66
|
+
x="33.951771"
|
67
|
+
y="46.913441" /></g></svg>
|
Binary file
|
metadata
ADDED
@@ -0,0 +1,89 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rabbit-slide-kou-rubykaigi-2025
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 2025.4.16.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Sutou Kouhei
|
8
|
+
bindir: bin
|
9
|
+
cert_chain: []
|
10
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
11
|
+
dependencies:
|
12
|
+
- !ruby/object:Gem::Dependency
|
13
|
+
name: rabbit
|
14
|
+
requirement: !ruby/object:Gem::Requirement
|
15
|
+
requirements:
|
16
|
+
- - ">="
|
17
|
+
- !ruby/object:Gem::Version
|
18
|
+
version: 2.0.2
|
19
|
+
type: :runtime
|
20
|
+
prerelease: false
|
21
|
+
version_requirements: !ruby/object:Gem::Requirement
|
22
|
+
requirements:
|
23
|
+
- - ">="
|
24
|
+
- !ruby/object:Gem::Version
|
25
|
+
version: 2.0.2
|
26
|
+
- !ruby/object:Gem::Dependency
|
27
|
+
name: rabbit-theme-clear-code
|
28
|
+
requirement: !ruby/object:Gem::Requirement
|
29
|
+
requirements:
|
30
|
+
- - ">="
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
33
|
+
type: :runtime
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - ">="
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '0'
|
40
|
+
description: |-
|
41
|
+
I talked about ((<"Goodbye fat gem"|URL:https://rubykaigi.org/2020/presentations/ktou.html>)) at RubyKaigi Takeout 2020. Fat gem is a gem that includes pre-built binaries. Extension libraries can assume that users have build environment with Ruby 2.4 or later. So gems don't need to bundle pre-built binaries for easy to install. Users can build binaries by themselves.
|
42
|
+
|
43
|
+
As of 2025, we're still using fat gem...
|
44
|
+
|
45
|
+
I discussed how to improve this situation with ruby-installer author, Nokogiri maintainer and RubyGems community in 2022:
|
46
|
+
|
47
|
+
* https://gist.github.com/postmodern/4c0cbccc0c7eda4585db0fc5267cdd57
|
48
|
+
* https://github.com/rubygems/rubygems/issues/1296
|
49
|
+
|
50
|
+
I propose a solution based on these discussions.
|
51
|
+
email:
|
52
|
+
- kou@clear-code.com
|
53
|
+
executables: []
|
54
|
+
extensions: []
|
55
|
+
extra_rdoc_files: []
|
56
|
+
files:
|
57
|
+
- ".rabbit"
|
58
|
+
- README.rd
|
59
|
+
- Rakefile
|
60
|
+
- config.yaml
|
61
|
+
- goodbye-fat-gem-2025.rab
|
62
|
+
- images/clear-code-rubykaigi-2025-silver-sponsor.png
|
63
|
+
- images/nokogiri-1.18.0.png
|
64
|
+
- images/ruby-3.4.0.png
|
65
|
+
- images/ruby-and-nokogiri.svg
|
66
|
+
- pdf/rubykaigi-2025-goodbye-fat-gem-2025.pdf
|
67
|
+
homepage: https://slide.rabbit-shocker.org/authors/kou/rubykaigi-2025/
|
68
|
+
licenses:
|
69
|
+
- CC-BY-SA-4.0
|
70
|
+
metadata:
|
71
|
+
source_code_uri: https://gitlab.com/ktou/rabbit-slide-kou-rubykaigi-2025
|
72
|
+
rdoc_options: []
|
73
|
+
require_paths:
|
74
|
+
- lib
|
75
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
76
|
+
requirements:
|
77
|
+
- - ">="
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
version: '0'
|
80
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
81
|
+
requirements:
|
82
|
+
- - ">="
|
83
|
+
- !ruby/object:Gem::Version
|
84
|
+
version: '0'
|
85
|
+
requirements: []
|
86
|
+
rubygems_version: 3.7.0.dev
|
87
|
+
specification_version: 4
|
88
|
+
summary: Goodbye fat gem 2025
|
89
|
+
test_files: []
|