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 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
@@ -0,0 +1,2 @@
1
+ --size 1920,1080
2
+ goodbye-fat-gem-2025.rab
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
@@ -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>
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: []