rabbit-slide-unasuke-hokurikurk01 1.0.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: 42340dd22148c561ed96e1294e782ef65a81cef82be160ecff109f6e22d4066b
4
+ data.tar.gz: 5b99d066dc897e8f8f6e43199eca68accc5b116e4a9da5ccb855a20f8614cd0d
5
+ SHA512:
6
+ metadata.gz: 908aec689795c5cbf46614d23af91486426abe326660d89a4337912b1356143b3a5ddfc78d930ddc1fa4b1a12535c75e1c74b0f1172562f52c21161f84064207
7
+ data.tar.gz: a7de61dd14a177c136433071cbef9b20c7b4c97aa1908dce37139fb927b33e5500a6df6b04709f434cf2541dc94ba625068b33186d7665259a871ff28011983b
data/.rabbit ADDED
@@ -0,0 +1,2 @@
1
+ --size 1920,1080
2
+ slide.rab
data/README.md ADDED
@@ -0,0 +1,24 @@
1
+ # 北陸Ruby会議01
2
+
3
+ https://regional.rubykaigi.org/hokuriku01/
4
+
5
+ ## 作者向け
6
+
7
+ ### 表示
8
+
9
+ rake
10
+
11
+ ### 公開
12
+
13
+ rake publish
14
+
15
+ ## 閲覧者向け
16
+
17
+ ### インストール
18
+
19
+ gem install rabbit-slide-unasuke-hokurikurk01
20
+
21
+ ### 表示
22
+
23
+ rabbit rabbit-slide-unasuke-hokurikurk01.gem
24
+
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("doc/**/*.*")
9
+ # spec.files -= Dir.glob("private/**/*.*")
10
+ # spec.add_runtime_dependency("rabbit-theme-YOUR-THEME")
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/_slide.md ADDED
@@ -0,0 +1,78 @@
1
+ # QUIC(TLS 1.3)実装進捗
2
+
3
+ author
4
+ : unasuke
5
+
6
+ content-source
7
+ : RubyKaigi 2025 follow up
8
+
9
+ date
10
+ : 2025-08-30
11
+
12
+ theme
13
+ : theme
14
+
15
+ # 自己紹介
16
+
17
+ * Name: うなすけ
18
+ * Work: フリーランス
19
+ * Kaigi on Rails 2025オーガナイザー (09/26-27 開催)
20
+ * {::tag name='x-small'}GitHub <https://github.com/unasuke>{:/tag}
21
+ * {::tag name='x-small'}Fediverse <https://mstdn.unasuke.com/@unasuke>{:/tag}
22
+ * {::tag name='x-small'}X <https://twitter.com/yu_suke1994>{:/tag}
23
+ * {::tag name='x-small'}<https://unasuke.com>{:/tag}
24
+
25
+ ![](img/icon.jpg){:relative_width='24' align='right' relative_margin_right='-8' relative_margin_top='20'}
26
+
27
+ # 元ネタない勢(1人)
28
+
29
+ ![](img/timetable.png){:relative_width='100'}
30
+
31
+ # 経緯
32
+ 1. QUICプロトコルをRubyで実装したい
33
+ 2. 一旦Python実装のRuby移植は不完全ながらできた(これがGrantでの成果)
34
+ 3. より"Rubyらしい"コードになるように実装し直している
35
+ 4. *QUICを実装するためにはTLS 1.3を実装しないといけない* ← イマココ
36
+
37
+ \\nずっとTLS 1.3の実装してる
38
+
39
+
40
+ # 進捗
41
+ 実際にご覧いただこう
42
+
43
+ # 今のは何?
44
+ * `www.example.com` に対して (https) HTTP/1.1 でGET requestを飛ばしている
45
+ * TLS handshakeをする
46
+ * 返ってきた暗号化されたデータを解く
47
+ * 標準出力に表示しておしまい
48
+
49
+ # 取り組んでいたこと
50
+ * Client側Handshake flowのリファクタ
51
+ * そもそもHTTPSでreq/resをするサンプルクライアントの実装
52
+ * 色々不足していたものたちの実装&リファクタ
53
+
54
+ # 取り組んでいたことlist
55
+ * [QUIC実装月報 2025年3月 \| うなすけとあれこれ](https://blog.unasuke.com/2025/quic-impl-monthly-report-202503/)
56
+ * 進捗らしい進捗があるのはここだけかも
57
+ * [QUIC実装月報 2025年4月 \| うなすけとあれこれ](https://blog.unasuke.com/2025/quic-impl-monthly-report-202504/)
58
+ * [QUIC実装月報 2025年5月 \| うなすけとあれこれ](https://blog.unasuke.com/2025/quic-impl-monthly-report-202505/)
59
+ * [QUIC実装月報 2025年6月 \| うなすけとあれこれ](https://blog.unasuke.com/2025/quic-impl-monthly-report-202506/)
60
+ * [QUIC実装月報 2025年7月 \| うなすけとあれこれ](https://blog.unasuke.com/2025/quic-impl-monthly-report-202507/)
61
+
62
+ # やってたよ
63
+ ruby-jp discordの `#weekly-shinchoku` で垂れ流しています
64
+
65
+ ![](img/discord-log.png){:relative_width='60'}
66
+
67
+ # 実際にご覧いただこう2
68
+ 実際にご覧いただこう
69
+
70
+ # HELP ME
71
+ 会場にお越しのTLS有識者の方
72
+
73
+
74
+ # 今後の展望
75
+ * 明日からまた開発中断します
76
+ * Kaigi on Rails 2025のため……
77
+ * 10月から復活!
78
+ * したい……
data/_slide.rab ADDED
@@ -0,0 +1,440 @@
1
+ = Ruby Implementation of QUIC: Progress and Challenges
2
+
3
+ : author
4
+ unasuke (Yusuke Nakamura)
5
+ : content-source
6
+ RubyKaigi 2023
7
+ : date
8
+ 2023-05-12
9
+ : theme
10
+ theme
11
+
12
+ = Self introduction
13
+
14
+ * Name: unasuke (Yusuke Nakamura)
15
+ * Work: freelance Web app developer @ Japan
16
+ * Itamae gem maintainer, Kaigi on Rails Organizer
17
+ * (('tag:x-small')) GitHub ((<URL:https://github.com/unasuke>))
18
+ * (('tag:x-small')) Mastodon ((<URL:https://mstdn.unasuke.com/@unasuke>))
19
+ * (('tag:x-small')) Twitter ((<URL:https://twitter.com/yu_suke1994>))
20
+
21
+
22
+ # image
23
+ # src = img/icon_face.jpeg
24
+ # relative_width = 24
25
+ # align = right
26
+ # relative_margin_right = -8
27
+ # relative_margin_top = 33
28
+
29
+ = [AD 1] Rubyist Book Authors Stamp Rally
30
+ # image
31
+ # src = img/authorsrb.jpg
32
+ # relative_width = 85
33
+
34
+ = [AD 2] RubyMusicMixin2023 by pixiv at Day 3
35
+ # image
36
+ # src = img/rubymusicmixin2023.jpg
37
+ # relative_width = 80
38
+
39
+ = Ruby Association Grant
40
+ # image
41
+ # src = img/ruby-association-grant-2022-unasuke.png
42
+ # relative_width = 90
43
+
44
+ (('tag:small'))(('tag:center'))((<URL:https://www.ruby.or.jp/en/news/20221027>))
45
+
46
+ = What is QUIC?
47
+ * UDP-based communication protocol
48
+ * HTTP/3 uses QUIC
49
+ * Faster than HTTP/2 (TCP)
50
+
51
+ \n
52
+ # image
53
+ # src = img/QUIC-Badge-Dark-RGB-Horiz.png
54
+ # relative_width = 50
55
+ # align = center
56
+ (('tag:x-small'))(('tag:center')) image from ((<URL:https://github.com/quicwg/wg-materials>))
57
+
58
+
59
+ = What is QUIC? - Diagram by Robin Marx
60
+ # image
61
+ # src = img/protocol-stack-h2-h3-improved-readability.png
62
+ # relative_width = 45
63
+ # align = center
64
+
65
+ (('tag:x-small'))(('tag:center')) image from ((<URL:https://github.com/rmarx/h3-protocol-stack>))
66
+
67
+ = My talks
68
+ * RubyKaigi Takeout 2021
69
+ * "Ruby, Ractor, QUIC"
70
+ * RubyKaigi 2022 (Tsu)
71
+ * "Ruby, Ractor, QUIC"
72
+ * Now (2023, Matsumoto)
73
+
74
+ \n
75
+ # image
76
+ # src = img/past-kaigi-slides.png
77
+ # relative_width = 40
78
+ # align = right
79
+
80
+
81
+ = Implement QUIC from scratch
82
+ (('tag:center'))Have you ever created a Rails application?
83
+
84
+ # image
85
+ # src = img/person-raising-hand.svg
86
+ # relative_width = 30
87
+ # align = center
88
+
89
+ = Implement QUIC from scratch
90
+ (('tag:center'))Have you ever implemented the QUIC protocol?
91
+
92
+ # image
93
+ # src = img/person-raising-hand.svg
94
+ # relative_width = 30
95
+ # align = center
96
+
97
+
98
+ = Implement QUIC from scratch
99
+ It's too difficult! \n
100
+
101
+ * When create a Rails application
102
+ * learn from "Rails Guides" and "Rails Tutorial"
103
+ * When create a QUIC implementation...?
104
+ * RFCs are not a "implementation guide"
105
+
106
+ = Try to implement QUIC once
107
+
108
+ * To learn how to implement QUIC
109
+ * Implement it once (how?)
110
+ * Porting existing implementation!
111
+
112
+
113
+ = Topics
114
+
115
+ (1) (('tag:large'))Porting from Python to Ruby
116
+ (2) (('tag:large'))Rubyish QUIC implementation
117
+ (3) (('tag:large'))Future of my implementation
118
+
119
+
120
+ = Porting from Python to Ruby
121
+ # image
122
+ # src = img/to-ruby-from-python.png
123
+ # relative_width = 78
124
+ # align = center
125
+ (('tag:xx-small'))(('tag:center'))((<URL:https://www.ruby-lang.org/en/documentation/ruby-from-other-languages/to-ruby-from-python/>))
126
+
127
+ = Porting from Python to Ruby
128
+ # image
129
+ # src = img/python_easy_code.png
130
+ # relative_width = 80
131
+ # align = center
132
+
133
+ (('tag:center'))Can you port this Python code to Ruby?
134
+
135
+ = Porting from Python to Ruby - Code amount
136
+ # image
137
+ # src = img/aioquic-loc.png
138
+ # relative_width = 100
139
+ # align = center
140
+
141
+ = Porting from Python to Ruby - How I ported it
142
+ * Keep the same structure as Python
143
+ * Carelessly changed may cause getting stuck
144
+ * Avoid porting asynchronous processing parts
145
+ * Difference of functionality
146
+ * My lack of knowledge
147
+
148
+ = Porting from Python to Ruby - Built-in types, bytes
149
+ # image
150
+ # src = img/aioquic_buffer.png
151
+ # relative_width = 100
152
+ # align = center
153
+
154
+ (('tag:x-small'))(('tag:center'))((<URL:https://github.com/aiortc/aioquic/blob/main/src/aioquic/_buffer.pyi>))
155
+
156
+ = Porting from Python to Ruby - Built-in types, bytes
157
+
158
+ * bytes in Python
159
+ * immutable (bytearray is not)
160
+ * String in Ruby
161
+ * mutable
162
+ * has Encoding (not only ASCII)
163
+
164
+ = Porting from Python to Ruby - Built-in types, bytes
165
+ Python returns 3
166
+ # image
167
+ # src = img/bytes_python.png
168
+ # relative_width = 60
169
+ # align = center
170
+
171
+ Ruby returns 1 (return 3 if use String#bytesize)
172
+ # image
173
+ # src = img/bytes_ruby.png
174
+ # relative_width = 60
175
+ # align = center
176
+
177
+ = Porting from Python to Ruby - Built-in types, enum
178
+ # image
179
+ # src = img/enum_python.png
180
+ # relative_width = 80
181
+ # align = center
182
+
183
+ (('tag:center')) Python
184
+
185
+
186
+ = Porting from Python to Ruby - Built-in types, enum
187
+ # image
188
+ # src = img/enum_ruby.png
189
+ # relative_width = 80
190
+ # align = center
191
+
192
+ (('tag:center')) Ruby
193
+
194
+ = Porting from Python to Ruby - Built-in types, enum
195
+ # image
196
+ # src = img/enum_python_debug.png
197
+ # relative_width = 80
198
+ # align = center
199
+
200
+ "Oh! 1025 is the SignatureAlgorithm.RSA_PKCS1_SHA256 in TLS 1.3!"
201
+
202
+ = Porting from Python to Ruby - Built-in types, tuple
203
+ # image
204
+ # src = img/aioquic_conn.png
205
+ # relative_width = 90
206
+ # align = center
207
+
208
+ (('tag:center')) Python
209
+
210
+ = Porting from Python to Ruby - Built-in types, tuple
211
+ # image
212
+ # src = img/raioquic_conn.png
213
+ # relative_width = 90
214
+ # align = center
215
+
216
+ (('tag:center')) Ruby
217
+
218
+ = Porting from Python to Ruby - Code style
219
+ # image
220
+ # src = img/aioquic_callback.png
221
+ # relative_width = 70
222
+ # align = center
223
+
224
+ (('tag:center')) Python
225
+
226
+ = Porting from Python to Ruby - Code style
227
+ # image
228
+ # src = img/raioquic_callback.png
229
+ # relative_width = 75
230
+ # align = center
231
+
232
+ (('tag:center')) Ruby
233
+
234
+ = Porting from Python to Ruby - Code style
235
+ # image
236
+ # src = img/aioquic_callback_register.png
237
+ # relative_width = 80
238
+ # align = center
239
+
240
+ (('tag:center')) callback register in Python
241
+
242
+
243
+ = Porting from Python to Ruby - Library API
244
+ Not only language themselves but also API differences.
245
+
246
+ Using OpenSSL functionality from...
247
+
248
+ * Python (aioquic)
249
+ * pyca/cryptography
250
+ * ((<URL:https://github.com/pyca/cryptography>))
251
+ * Ruby
252
+ * openssl gem
253
+ * ((<URL:https://github.com/ruby/openssl>))
254
+
255
+ (to implement TLS 1.3)
256
+
257
+ = Porting from Python to Ruby - Library API
258
+ (1) looked for API calls to pyca/cryptography's
259
+ (2) find which C API of OpenSSL it corresponds to
260
+ (3) find how it is wrapped in the openssl gem
261
+ (4) port it to a Ruby API call in the openssl gem
262
+
263
+ = Porting from Python to Ruby - Library API example
264
+ # image
265
+ # src = img/key_exchange_python.png
266
+ # relative_width = 100
267
+ # align = center
268
+
269
+ = Porting from Python to Ruby - Library API example
270
+ # image
271
+ # src = img/key_exchange_ruby.png
272
+ # relative_width = 90
273
+ # align = center
274
+
275
+ = Porting from Python to Ruby - Result
276
+ # image
277
+ # src = img/raioquic-loc.png
278
+ # relative_width = 90
279
+ # align = center
280
+
281
+ = Porting from Python to Ruby - Demo
282
+ # image
283
+ # src = img/raioquic-demo.gif
284
+ # relative_width = 85
285
+ # align = center
286
+
287
+ = Porting from Python to Ruby - Insights
288
+
289
+ (1) QUIC IS VERY DIFFICULT
290
+ (2) TLS 1.3 IS ALSO VERY DIFFICULT
291
+ (3) "writing once" empowers me
292
+
293
+ = Porting from Python to Ruby - "Raioquic"
294
+ # image
295
+ # src = img/raioquic-og.png
296
+ # relative_width = 80
297
+ # align = center
298
+
299
+ (('tag:center'))((<URL:https://github.com/unasuke/raioquic>))
300
+
301
+
302
+ = Rubyish QUIC implementation
303
+ # image
304
+ # src = img/raioquic_demo_client.png
305
+ # relative_width = 44
306
+ # align = center
307
+
308
+ = Future of my implementation - How to make it Rubyish?
309
+ To make implementation Rubyish...
310
+
311
+ (1) Use suitable features to Ruby (internal)
312
+ * tuple → class or dedicated struct or data
313
+ * bytes → IO::Buffer, not String
314
+ (2) Adapt to existing API styles (public API)
315
+
316
+ = Future of my implementation - TLS in Ruby
317
+ # image
318
+ # src = img/ruby_nethttp.png
319
+ # relative_width = 90
320
+ # align = center
321
+
322
+ (('tag:center'))High level API (use Net::HTTP)
323
+
324
+ = Future of my implementation - TLS in Ruby
325
+ # image
326
+ # src = img/ruby_openssl_socket.png
327
+ # relative_width = 90
328
+ # align = center
329
+
330
+ (('tag:center'))Low level API (use OpenSSL::SSL::SSLSocket)
331
+
332
+ = Future of my implementation - Faraday style
333
+ # image
334
+ # src = img/faraday_like_api.png
335
+ # relative_width = 90
336
+ # align = center
337
+
338
+ (('tag:center'))Very high level API
339
+
340
+ = Future of my implementation - Net::HTTP style
341
+ # image
342
+ # src = img/similer_nethttp.png
343
+ # relative_width = 90
344
+ # align = center
345
+
346
+ (('tag:center'))Net::HTTP style API
347
+
348
+ = Future of my implementation - Vaporware
349
+ * The APIs like I've been talking about, doesn't exist yet
350
+ * next year...?
351
+ * um...
352
+
353
+ = Future of my implementation - Raise your hand time!
354
+ (('tag:center'))Are you running some Rails apps on production env?
355
+
356
+ # image
357
+ # src = img/person-raising-hand.svg
358
+ # relative_width = 30
359
+ # align = center
360
+
361
+ = Future of my implementation - Raise your hand time!
362
+ (('tag:center'))Are you running some Rails apps on production ((*without*)) reverse proxies or load balancers?
363
+
364
+ # image
365
+ # src = img/person-raising-hand.svg
366
+ # relative_width = 30
367
+ # align = center
368
+
369
+ # = Future of my implementation - Where could it be used
370
+ #
371
+ # * Are you runs Rails app on production?
372
+ # * Are you use reverse proxy or load balancer?
373
+ # * e.g. Nginx, Apache, H2O, ALB...
374
+ #
375
+
376
+ = Future of my implementation - Speed!
377
+
378
+ * Most Rails app is behind of web server (load balancer)
379
+ * TLS termination is high cost
380
+ * (asset delivery)
381
+
382
+ = Future of my implementation - QUIC diagram (again!)
383
+ # image
384
+ # src = img/protocol-stack-h2-h3-improved-readability.png
385
+ # relative_width = 45
386
+ # align = center
387
+
388
+ (('tag:x-small'))(('tag:center')) image from ((<URL:https://github.com/rmarx/h3-protocol-stack>))
389
+
390
+ = Future of my implementation - Faster language impls
391
+ * C or Rust or...
392
+ * ((<(('socketry/protocol-quic'))|URL:https://github.com/socketry/protocol-quic>)) gem wraps ngtcp2
393
+ * created by Samuel-san (ioquatix)
394
+ * "Unleashing the Power of Asynchronous HTTP with Ruby" in Day 3
395
+ * ((<(('ngtcp2/ngtcp2'))|URL:https://github.com/ngtcp2/ngtcp2>)) written by C
396
+
397
+ = Future of my implementation - ngtcp2 used by curl
398
+ # image
399
+ # src = img/curl-ngtcp2.png
400
+ # relative_width = 85
401
+ # align = center
402
+
403
+ (('tag:center'))((<URL:https://github.com/curl/curl/blob/master/docs/HTTP3.md>))
404
+
405
+ = Future of my implementation - Worth of Pure Ruby
406
+ * Research
407
+ * Implementations that make it easy to change internal behavior are useful
408
+ * QUIC implementation itself
409
+ * Helping QUIC implementation itself
410
+ * e.g. Build data for test its behavior
411
+
412
+ = Future of my implementation - Motivation
413
+ # image
414
+ # src = img/quic-impl-grep-ruby.png
415
+ # relative_width = 70
416
+ # align = center
417
+
418
+ (('tag:x-small'))(('tag:center')) ((<URL:https://github.com/quicwg/base-drafts/wiki/Implementations>))
419
+
420
+ = Summary
421
+
422
+ * Ported aioquic (Python) to Ruby
423
+ * Diffs from language features, library API makes porting hard
424
+ * Ported impl could communicate other impls
425
+ * Creating Rubyish implementation
426
+ * Uses Ruby's built-in features
427
+ * Make it can apply existing idioms
428
+ * This may be where this implementation would be useful
429
+ * Research
430
+ * QUIC implementation itself
431
+
432
+ = Acknowledgments
433
+ * Ruby Association
434
+ * For adopting my project
435
+ * Koichi Sasada-san
436
+ * a mentor of the porting project
437
+ * Kuwayama-san
438
+ * Author of tttls1.3 gem
439
+ * Daisuke Aritomo a.k.a. osyoyu
440
+ * Adviser of this talk
data/config.yaml ADDED
@@ -0,0 +1,23 @@
1
+ ---
2
+ id: hokurikurk01
3
+ base_name: slide
4
+ tags: ["ruby", "rails", "kaigionrails"]
5
+ presentation_date: 2025-12-06
6
+ presentation_start_time:
7
+ presentation_end_time:
8
+ version: 1.0.0
9
+ licenses: ["MIT"]
10
+ slideshare_id:
11
+ speaker_deck_id:
12
+ vimeo_id:
13
+ youtube_id:
14
+ width: 1920
15
+ height: 1080
16
+ source_code_uri: https://github.com/unasuke/hokurikurk01
17
+ author:
18
+ markup_language: :rd
19
+ name: unasuke
20
+ email: yusuke1994525@gmail.com
21
+ rubygems_user: unasuke
22
+ slideshare_user:
23
+ speaker_deck_user:
data/img/bio.png ADDED
Binary file
data/img/claude_1.png ADDED
Binary file
data/img/claude_2.png ADDED
Binary file
data/img/claude_3.png ADDED
Binary file
data/img/claude_4.png ADDED
Binary file
data/img/claude_5.png ADDED
Binary file
data/img/claude_6.png ADDED
Binary file
data/img/claude_7.png ADDED
Binary file
data/img/claude_8.png ADDED
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -0,0 +1,79 @@
1
+ <?xml version="1.0" standalone="no"?>
2
+ <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
3
+ "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
4
+ <svg version="1.0" xmlns="http://www.w3.org/2000/svg"
5
+ width="465.000000pt" height="465.000000pt" viewBox="0 0 465.000000 465.000000"
6
+ preserveAspectRatio="xMidYMid meet">
7
+ <metadata>
8
+ Created by potrace 1.16, written by Peter Selinger 2001-2019
9
+ </metadata><g><rect x="0" y="0" width="465" height="465" fill="#ffffff" />
10
+ <g transform="translate(0.000000,465.000000) scale(0.100000,-0.100000)"
11
+ fill="#000000" stroke="none">
12
+ <path d="M450 3675 l0 -525 525 0 525 0 0 525 0 525 -525 0 -525 0 0 -525z
13
+ m900 0 l0 -375 -375 0 -375 0 0 375 0 375 375 0 375 0 0 -375z"/>
14
+ <path d="M750 3675 l0 -225 225 0 225 0 0 225 0 225 -225 0 -225 0 0 -225z"/>
15
+ <path d="M1800 4125 l0 -75 -75 0 -75 0 0 -150 0 -150 75 0 75 0 0 -75 0 -75
16
+ -75 0 -75 0 0 -300 0 -300 -150 0 -150 0 0 -75 0 -75 150 0 150 0 0 -150 0
17
+ -150 -75 0 -75 0 0 75 0 75 -150 0 -150 0 0 -75 0 -75 -75 0 -75 0 0 225 0
18
+ 225 -75 0 -75 0 0 -150 0 -150 -75 0 -75 0 0 150 0 150 -150 0 -150 0 0 -150
19
+ 0 -150 75 0 75 0 0 -150 0 -150 -75 0 -75 0 0 -75 0 -75 75 0 75 0 0 -75 0
20
+ -75 -75 0 -75 0 0 -75 0 -75 75 0 75 0 0 -75 0 -75 -75 0 -75 0 0 -75 0 -75
21
+ 225 0 225 0 0 150 0 150 375 0 375 0 0 -75 0 -75 -225 0 -225 0 0 -75 0 -75
22
+ 225 0 225 0 0 -150 0 -150 75 0 75 0 0 -150 0 -150 -75 0 -75 0 0 -75 0 -75
23
+ 75 0 75 0 0 75 0 75 75 0 75 0 0 -75 0 -75 75 0 75 0 0 75 0 75 75 0 75 0 0
24
+ -75 0 -75 75 0 75 0 0 -150 0 -150 -75 0 -75 0 0 75 0 75 -75 0 -75 0 0 -150
25
+ 0 -150 225 0 225 0 0 225 0 225 75 0 75 0 0 225 0 225 75 0 75 0 0 -150 0
26
+ -150 225 0 225 0 0 -150 0 -150 150 0 150 0 0 -75 0 -75 75 0 75 0 0 75 0 75
27
+ 75 0 75 0 0 150 0 150 -75 0 -75 0 0 75 0 75 75 0 75 0 0 75 0 75 150 0 150 0
28
+ 0 150 0 150 -75 0 -75 0 0 -75 0 -75 -75 0 -75 0 0 -75 0 -75 -75 0 -75 0 0
29
+ 150 0 150 75 0 75 0 0 75 0 75 75 0 75 0 0 75 0 75 75 0 75 0 0 225 0 225
30
+ -150 0 -150 0 0 -75 0 -75 -75 0 -75 0 0 75 0 75 -75 0 -75 0 0 75 0 75 -150
31
+ 0 -150 0 0 -75 0 -75 -225 0 -225 0 0 75 0 75 75 0 75 0 0 75 0 75 150 0 150
32
+ 0 0 75 0 75 150 0 150 0 0 75 0 75 -225 0 -225 0 0 -75 0 -75 -75 0 -75 0 0
33
+ 375 0 375 -150 0 -150 0 0 75 0 75 -75 0 -75 0 0 -75 0 -75 -75 0 -75 0 0 75
34
+ 0 75 -150 0 -150 0 0 75 0 75 75 0 75 0 0 75 0 75 75 0 75 0 0 -75 0 -75 225
35
+ 0 225 0 0 -75 0 -75 75 0 75 0 0 75 0 75 -75 0 -75 0 0 75 0 75 75 0 75 0 0
36
+ 75 0 75 -375 0 -375 0 0 -75 0 -75 -75 0 -75 0 0 75 0 75 -150 0 -150 0 0 -75z
37
+ m300 -150 l0 -75 -150 0 -150 0 0 75 0 75 150 0 150 0 0 -75z m0 -450 l0 -75
38
+ 75 0 75 0 0 75 0 75 75 0 75 0 0 -75 0 -75 -75 0 -75 0 0 -150 0 -150 -75 0
39
+ -75 0 0 -75 0 -75 -75 0 -75 0 0 -150 0 -150 -75 0 -75 0 0 75 0 75 -75 0 -75
40
+ 0 0 75 0 75 150 0 150 0 0 75 0 75 -75 0 -75 0 0 75 0 75 75 0 75 0 0 75 0 75
41
+ -75 0 -75 0 0 75 0 75 150 0 150 0 0 -75z m600 -75 l0 -150 75 0 75 0 0 -150
42
+ 0 -150 -75 0 -75 0 0 150 0 150 -75 0 -75 0 0 -150 0 -150 -75 0 -75 0 0 150
43
+ 0 150 75 0 75 0 0 150 0 150 75 0 75 0 0 -150z m-450 -975 l0 -375 -75 0 -75
44
+ 0 0 75 0 75 -75 0 -75 0 0 -150 0 -150 150 0 150 0 0 -75 0 -75 -75 0 -75 0 0
45
+ -150 0 -150 75 0 75 0 0 75 0 75 75 0 75 0 0 75 0 75 225 0 225 0 0 -150 0
46
+ -150 -150 0 -150 0 0 75 0 75 -75 0 -75 0 0 -150 0 -150 75 0 75 0 0 -75 0
47
+ -75 -75 0 -75 0 0 75 0 75 -150 0 -150 0 0 -75 0 -75 -75 0 -75 0 0 75 0 75
48
+ 75 0 75 0 0 75 0 75 -75 0 -75 0 0 75 0 75 -150 0 -150 0 0 75 0 75 150 0 150
49
+ 0 0 75 0 75 -75 0 -75 0 0 75 0 75 -225 0 -225 0 0 75 0 75 225 0 225 0 0 150
50
+ 0 150 150 0 150 0 0 150 0 150 75 0 75 0 0 -375z m600 225 l0 -150 -225 0
51
+ -225 0 0 150 0 150 225 0 225 0 0 -150z m-1800 -225 l0 -75 75 0 75 0 0 -75 0
52
+ -75 -75 0 -75 0 0 -75 0 -75 -75 0 -75 0 0 75 0 75 -75 0 -75 0 0 150 0 150
53
+ 150 0 150 0 0 -75z m450 0 l0 -75 -75 0 -75 0 0 75 0 75 75 0 75 0 0 -75z
54
+ m1350 -150 l0 -75 75 0 75 0 0 -75 0 -75 -75 0 -75 0 0 -75 0 -75 -225 0 -225
55
+ 0 0 150 0 150 75 0 75 0 0 75 0 75 150 0 150 0 0 -75z m750 -75 l0 -150 75 0
56
+ 75 0 0 -75 0 -75 75 0 75 0 0 150 0 150 75 0 75 0 0 -150 0 -150 -75 0 -75 0
57
+ 0 -75 0 -75 -150 0 -150 0 0 150 0 150 -75 0 -75 0 0 150 0 150 75 0 75 0 0
58
+ -150z m-2850 -225 l0 -75 -75 0 -75 0 0 75 0 75 75 0 75 0 0 -75z m2550 0 l0
59
+ -75 75 0 75 0 0 -75 0 -75 -225 0 -225 0 0 75 0 75 75 0 75 0 0 75 0 75 75 0
60
+ 75 0 0 -75z m150 -600 l0 -225 -225 0 -225 0 0 225 0 225 225 0 225 0 0 -225z
61
+ m300 -600 l0 -75 -75 0 -75 0 0 75 0 75 75 0 75 0 0 -75z"/>
62
+ <path d="M1950 3225 l0 -75 75 0 75 0 0 75 0 75 -75 0 -75 0 0 -75z"/>
63
+ <path d="M3150 1425 l0 -75 75 0 75 0 0 75 0 75 -75 0 -75 0 0 -75z"/>
64
+ <path d="M3150 3675 l0 -525 525 0 525 0 0 525 0 525 -525 0 -525 0 0 -525z
65
+ m900 0 l0 -375 -375 0 -375 0 0 375 0 375 375 0 375 0 0 -375z"/>
66
+ <path d="M3450 3675 l0 -225 225 0 225 0 0 225 0 225 -225 0 -225 0 0 -225z"/>
67
+ <path d="M3750 2925 l0 -75 150 0 150 0 0 -75 0 -75 -75 0 -75 0 0 -75 0 -75
68
+ 150 0 150 0 0 150 0 150 -75 0 -75 0 0 75 0 75 -150 0 -150 0 0 -75z"/>
69
+ <path d="M450 975 l0 -525 525 0 525 0 0 525 0 525 -525 0 -525 0 0 -525z
70
+ m900 0 l0 -375 -375 0 -375 0 0 375 0 375 375 0 375 0 0 -375z"/>
71
+ <path d="M750 975 l0 -225 225 0 225 0 0 225 0 225 -225 0 -225 0 0 -225z"/>
72
+ <path d="M3000 825 l0 -75 -150 0 -150 0 0 -150 0 -150 150 0 150 0 0 150 0
73
+ 150 75 0 75 0 0 75 0 75 -75 0 -75 0 0 -75z"/>
74
+ <path d="M4050 825 l0 -75 75 0 75 0 0 75 0 75 -75 0 -75 0 0 -75z"/>
75
+ <path d="M1650 600 l0 -150 150 0 150 0 0 150 0 150 -150 0 -150 0 0 -150z"/>
76
+ <path d="M3300 525 l0 -75 75 0 75 0 0 75 0 75 -75 0 -75 0 0 -75z"/>
77
+ <path d="M3900 525 l0 -75 150 0 150 0 0 75 0 75 -150 0 -150 0 0 -75z"/>
78
+ </g>
79
+ </g></svg>
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
data/slide.rab ADDED
@@ -0,0 +1,388 @@
1
+ = Kaigi on Rails 2025におけるsubscreenの実装について
2
+
3
+ : author
4
+ うなすけ
5
+ : content-source
6
+ 北陸Ruby会議01
7
+ : date
8
+ 2025-12-06
9
+ : theme
10
+ theme
11
+
12
+ = 自己紹介
13
+
14
+ * Name: うなすけ
15
+ * Work: フリーランス
16
+ * Kaigi on Rails Organizer
17
+ * (('tag:x-small')) GitHub ((<URL:https://github.com/unasuke>))
18
+ * (('tag:x-small')) Fediverse ((<URL:https://mstdn.unasuke.com/@unasuke>))
19
+ * (('tag:x-small')) X ((<URL:https://x.com/yu_suke1994>))
20
+
21
+
22
+ # image
23
+ # src = img/icon_face.jpeg
24
+ # relative_width = 24
25
+ # align = right
26
+ # relative_margin_right = -8
27
+ # relative_margin_top = 33
28
+
29
+ = Kaigi on Railsとは
30
+
31
+ # blockquote
32
+ # title = https://kaigionrails.org/2025/about/
33
+ Kaigi on Rails is an approachable, inclusive, web-focused tech conference, designed to
34
+ lower the barrier of entry to participating
35
+ in conferences.
36
+
37
+ Kaigi on Railsのコアコンセプトは「初学者から上級者までが楽しめるWeb系の技術カンファレンス」 です。
38
+
39
+
40
+ = Kaigi on Rails 2025
41
+
42
+ # image
43
+ # src = img/kaigionrails_2025_policies.png
44
+ # align = center
45
+ # relative_width = 55
46
+
47
+
48
+ (('tag:center'))EN/JA
49
+
50
+ = Kaigi on Rails 2025
51
+
52
+ # image
53
+ # src = img/kaigionrails_2025_policies.png
54
+ # align = center
55
+ # relative_width = 55
56
+
57
+
58
+ (('tag:center'))国際カンファレンスっぽい!
59
+
60
+ = Kaigi on Rails 2025は国際カンファレンス?
61
+
62
+ * 「これができてれば国際カンファレンス」という基準はない
63
+ * と、思ってるけど……
64
+ * 海外からの参加者
65
+ * 英語による発表
66
+ * 英語によるアナウンス
67
+ * ビザ取得支援
68
+ * 同時通訳
69
+ * 字幕
70
+
71
+
72
+ = Kaigi on Rails 2025は国際カンファレンス?
73
+
74
+ * 「これができてれば国際カンファレンス」という基準はない
75
+ * と、思ってるけど……
76
+ * 海外からの参加者
77
+ * 英語による発表
78
+ * 英語によるアナウンス
79
+ * ビザ取得支援
80
+ * ((*同時通訳*))
81
+ * ((*字幕*))
82
+
83
+
84
+ = Kaigi on Rails 2025の国際化
85
+
86
+ * JA → EN の同時通訳
87
+ * 発表数的に厳しい
88
+ * EN → JA の同時通訳
89
+ * こちらを用意した
90
+ * 全員分のレシーバーを用意するのは厳しい
91
+
92
+ 同時通訳のリソースが十分ではない
93
+
94
+ → 字幕も用意したいよね
95
+
96
+ = Kaigi on Rails 2025の国際化
97
+
98
+ # image
99
+ # src = img/ioquatix_with_transcribe.jpg
100
+ # align = center
101
+ # relative_width = 70
102
+
103
+ = カンファレンスと字幕
104
+
105
+ * VimConf 2024
106
+ * ((<URL:https://pocketalk.jp>))
107
+ * Observability Conference Tokyo 2025
108
+ * ((<URL:https://www.cuckoo.so/jp/>))
109
+
110
+ = Kaigiと字幕
111
+
112
+ * RubyKaigi
113
+ * ((<URL:https://github.com/ruby-no-kai/takeout-app>))
114
+ * ((<URL:https://github.com/ruby-no-kai/signage-app>))
115
+ * 東京Ruby会議12
116
+ * ((<URL:https://github.com/tokyorubykaigi12/captioner>))
117
+
118
+ Fork?
119
+
120
+ = keynote speakers
121
+
122
+ # image
123
+ # src = img/kaigionrails_2025_keynote_speakers.png
124
+ # align = center
125
+ # relative_width = 100
126
+
127
+ = Falcon's author
128
+
129
+ # image
130
+ # src = img/esa_tech_todo.png
131
+ # align = center
132
+ # relative_width = 100
133
+
134
+ = new Falcon app
135
+
136
+ * Falconのアプリって作ったことない
137
+ * ありますか?KaigiEffectで触った人はいる?
138
+ * リアルタイム文字起こしのアプリって作ったことない
139
+ * さっきのコードを読めばなんとなくわかるけど
140
+ * リアルタイムにデータを配信するアプリって……
141
+ * Action Cableではない
142
+ * WebSocketならちょっとあるけど、WebSocketなの?
143
+
144
+ = 壁打ち
145
+
146
+ # image
147
+ # src = img/claude_1.png
148
+ # align = center
149
+ # relative_width = 90
150
+
151
+ = 壁打ち
152
+
153
+ # image
154
+ # src = img/claude_2.png
155
+ # align = center
156
+ # relative_width = 90
157
+
158
+ = 壁打ち
159
+
160
+ # image
161
+ # src = img/claude_3.png
162
+ # align = center
163
+ # relative_width = 90
164
+
165
+ = 壁打ち
166
+
167
+ # image
168
+ # src = img/claude_4.png
169
+ # align = center
170
+ # relative_width = 90
171
+
172
+ = 壁打ち
173
+
174
+ # image
175
+ # src = img/claude_5.png
176
+ # align = center
177
+ # relative_width = 90
178
+
179
+ = 壁打ち
180
+
181
+ # image
182
+ # src = img/claude_6.png
183
+ # align = center
184
+ # relative_width = 90
185
+
186
+ = 壁打ち
187
+
188
+ # image
189
+ # src = img/claude_7.png
190
+ # align = center
191
+ # relative_width = 90
192
+
193
+ = 壁打ち
194
+
195
+ # image
196
+ # src = img/claude_8.png
197
+ # align = center
198
+ # relative_width = 90
199
+
200
+ = Vibe Coding
201
+
202
+ # image
203
+ # src = img/vibe_coding_1.png
204
+ # align = center
205
+ # relative_width = 100
206
+
207
+ = Vibe Coding
208
+
209
+ # image
210
+ # src = img/vibe_coding_2.png
211
+ # align = center
212
+ # relative_width = 100
213
+
214
+ = Vibe Coding (9/22)
215
+
216
+ # image
217
+ # src = img/vibe_coding_3.png
218
+ # align = center
219
+ # relative_width = 60
220
+
221
+ (('tag:center'))本番4日前にやることではない
222
+
223
+ = Vibe codingまとめ
224
+
225
+ * まずはAIと壁打ちして方針決め
226
+ * これは6月頃からやっていた
227
+ * 方針をもとに手元でVibe coding
228
+ * Claude Max
229
+ * AWSの環境を構築するTerraformは人力
230
+ * やるべきことがわかっているので
231
+
232
+ = できたもの
233
+ * ((<URL:https://github.com/kaigionrails/shirataki>))
234
+ * ffmpegで配信を受け取り、音声をAmazon Transcribeに流す
235
+ * Transcribeの結果をBedrockで英訳する
236
+ * 日本語とAI訳をValkeyにstreamする
237
+ * Valkey経由でstreamされた字幕情報をFalconがSSEする
238
+ * ((<URL:https://github.com/kaigionrails/terraform/pull/18>))
239
+ * Valkey serverless
240
+ * shiratakiが動くEC2
241
+ * shiratakiにリクエストを流すALB
242
+ * などなど
243
+
244
+ = Kaigi on Rails 2025での構成
245
+
246
+ # image
247
+ # src = img/shirataki_arch_kaigionrails2025.png
248
+ # align = center
249
+ # relative_width = 100
250
+
251
+ = トラブル集
252
+
253
+ * 本番環境で動かない
254
+ * 配信が止まると全てが止まる
255
+ * 同時通訳との兼ね合い
256
+ * (BedrockのAPI call quotaにひっかかる)
257
+
258
+ = 本番環境で動かないトラブル
259
+
260
+ * 検証環境では動いていたのに本番で動かない!
261
+ * ブラウザからのSSE受信ができていない
262
+ * EC2上のプロセスは動いている
263
+
264
+ = 本番環境で動かないトラブル
265
+
266
+ * 検証環境では動いていたのに本番で動かない!
267
+ * ブラウザからのSSE受信ができていない
268
+ * EC2上のプロセスは動いている
269
+ * 理由
270
+ * 本番へのドメイン登録忘れ
271
+ * ブラウザ(というかOS)がNXDOMAIN?をキャッシュ?
272
+ * ドメイン登録とOS再起動で解決
273
+
274
+ = 配信が止まると全てが止まるトラブル
275
+
276
+ # image
277
+ # src = img/sorah_x_post.png
278
+ # align = center
279
+ # relative_width = 80
280
+
281
+ (('tag:center'))((<URL:https://x.com/sora_h/status/1971479957508587953>))
282
+
283
+ = 配信が止まると全てが止まるトラブル
284
+
285
+ * インターネットへの接続が不安定
286
+ * Cloudflareへのストリーミングが止まる
287
+ * するとCloudflareからのストリーミングも止まる
288
+ * ffmpegによる受信プロセスが終了し、おしまい
289
+
290
+ = 配信が止まると全てが止まるトラブル
291
+
292
+ * インターネットへの接続が不安定
293
+ * Cloudflareへのストリーミングが止まる
294
+ * するとCloudflareからのストリーミングも止まる
295
+ * ffmpegによる受信プロセスが終了し、おしまい
296
+ * 解決策
297
+ * 手元PCでログをずっと見守る
298
+ * 止まったら再起動
299
+ * 部屋から「字幕止まってる」という報告があれば再起動
300
+
301
+ = 同時通訳セッションのトラブル
302
+
303
+ # image
304
+ # src = img/shirataki_arch_kaigionrails2025.png
305
+ # align = center
306
+ # relative_width = 100
307
+
308
+ = 同時通訳セッションのトラブル
309
+
310
+ * 音声の言語は動的に変えられない
311
+ * 環境変数で現在の言語を指定している
312
+ * 同時通訳のセッションはJAもENも流れてくる
313
+ * 翻訳がいらない
314
+
315
+ \n
316
+ # image
317
+ # src = img/shirataki_arch_kaigionrails2025.png
318
+ # align = right
319
+ # relative_width = 35
320
+ # relative_margin_right = -8
321
+ # relative_margin_top = -20
322
+
323
+ = 同時通訳セッションのトラブル
324
+
325
+ * 音声の言語は動的に変えられない
326
+ * 環境変数で現在の言語を指定している
327
+ * 同時通訳のセッションはJAもENも流れてくる
328
+ * 翻訳がいらない
329
+ * 解決策
330
+ * セッション切り替えのタイミングで素早く設定を切り替えて再起動
331
+ * 英語セッションが終わったら戻す
332
+
333
+ \n
334
+ # image
335
+ # src = img/shirataki_arch_kaigionrails2025.png
336
+ # align = right
337
+ # relative_width = 35
338
+ # relative_margin_right = -8
339
+ # relative_margin_top = -20
340
+
341
+ = なんとかKaigi on Rails 2025を乗り切った
342
+
343
+ * おおむね動いていた(と思う)
344
+ * 用意したリソースは十分だった
345
+ * t3.mediumを4台だっけ?(うろおぼえ)
346
+ * ないよりマシ、くらいのものは提供できたのでは?
347
+
348
+ = 見えてきた課題
349
+
350
+ * 前述の問題
351
+ * 配信が止まったときの復旧
352
+ * 動的な翻訳の有無
353
+ * SSEの再接続
354
+ * エラーになったら画面リロード
355
+ * メトリックを取る
356
+ * 今何人見てるのか
357
+ * 属人化
358
+ * 自分の脳内にしかない手順
359
+
360
+ = AIに書かせてみてどうだった?
361
+
362
+ * 時間がないときには本当に助かる
363
+ * 質はまあ……それなり
364
+ * 自分のコードじゃない感じ
365
+ * 責任は自分にあるのはそう
366
+ * 「自分で書いた」感は本当に希薄
367
+
368
+ = 「自分で書きたい」という想い
369
+
370
+ * ((<URL:https://github.com/unasuke/shirataki/tree/hokurikurk01>))
371
+ * 北陸Ruby会議01に向けて少し手を入れた
372
+ * ffmpegの再起動
373
+ * view
374
+ * OpenTelemetry
375
+ * このdiffはほぼ手で書いた
376
+
377
+ = たのしいRuby
378
+
379
+ # image
380
+ # src = img/joyful_ruby.jpg
381
+ # align = center
382
+ # relative_width = 70
383
+
384
+ = まとめっぽく
385
+
386
+ * 自分たちのカンファレンスは自分たちで作りたい
387
+ * カンファレンスをやるのは楽しい
388
+ * Rubyを書くのは楽しい
data/theme.rb ADDED
@@ -0,0 +1,116 @@
1
+ @default_foreground ||= @foreground
2
+ @default_background ||= @background
3
+ @default_shadow_color ||= @shadow_color
4
+
5
+ # pp font_families
6
+ font_color = '#333'
7
+ @default_font = 'BIZ UDPGothic'
8
+ @font_family = find_font_family(@default_font)
9
+ @bold_font = @default_font
10
+ @bold_font_family = find_font_family(@bold_font)
11
+ @monospace_font = 'Cica'
12
+ @monospace_font_family = find_font_family(@monospace_font)
13
+
14
+ @xxxx_large_font_size = screen_size(10 * Pango::SCALE)
15
+ @xxx_large_font_size = screen_size(8 * Pango::SCALE)
16
+ @xx_large_font_size = screen_size(6 * Pango::SCALE)
17
+ @x_large_font_size = screen_size(4.5 * Pango::SCALE)
18
+ @large_font_size = screen_size(4 * Pango::SCALE)
19
+ @normal_font_size = screen_size(3.5 * Pango::SCALE)
20
+ @small_font_size = screen_size(3.2 * Pango::SCALE)
21
+ @x_small_font_size = screen_size(3 * Pango::SCALE)
22
+ @xx_small_font_size = screen_size(2.8 * Pango::SCALE)
23
+ @xxx_small_font_size = screen_size(2.5 * Pango::SCALE)
24
+ @script_font_size = @x_small_font_size
25
+ @large_script_font_size = @small_font_size
26
+ @x_large_script_font_size = @large_font_size
27
+ @title_slide_title_font_size = @xxx_large_font_size
28
+
29
+ @block_quote_fill_color = "#f8f8f8"
30
+ @preformatted_fill_color = "#f8f8f8"
31
+ # @default_headline_line_color = font_color
32
+ @default_headline_line_width = 0
33
+ @default_headline_line_color = '#fff'
34
+
35
+ @title_slide_background_image = 'img/theme/background_title.png'
36
+ @slide_background_image = 'img/theme/background_with_logo.png'
37
+
38
+ # set_foreground(@default_foreground)
39
+ # set_background(@default_background)
40
+
41
+ add_image_path("ruby-images")
42
+ include_theme("default-icon")
43
+ # include_theme("default-title-text")
44
+ include_theme("default-text")
45
+ include_theme("default-title-slide")
46
+ include_theme("default-slide")
47
+ include_theme("default-item-mark")
48
+ include_theme("default-method-list")
49
+ include_theme("default-preformatted")
50
+ include_theme("default-block-quote")
51
+ include_theme("default-foot-text")
52
+ include_theme("default-description")
53
+ include_theme("image")
54
+ include_theme("table")
55
+ include_theme("newline-in-slides")
56
+ include_theme("per-slide-background-color")
57
+ include_theme("background-image-toolkit")
58
+ include_theme("per-slide-background-image")
59
+ include_theme("body-background-image")
60
+ include_theme("tag")
61
+ include_theme("syntax-highlighting")
62
+ include_theme("default-comment")
63
+
64
+ include_theme("title-slide-background-image")
65
+ include_theme("slide-background-image")
66
+
67
+ match(TitleSlide, "*") do |elems|
68
+ elems.horizontal_centering = true
69
+ elems.prop_set("size", @large_font_size)
70
+ set_font_family(elems)
71
+ end
72
+
73
+ match(TitleSlide, Title) do |titles|
74
+ titles.prop_set("size", @title_slide_title_font_size)
75
+ titles.padding_bottom = @space * 2
76
+ titles.prop_set("weight", "SemiBold")
77
+ end
78
+
79
+ match(Slide, HeadLine) do |heads|
80
+ heads.margin_bottom = 50
81
+ heads.prop_set("size", @large_font_size)
82
+ heads.prop_set("weight", "bold")
83
+ end
84
+
85
+ match(TitleSlide) do |slides|
86
+ # slides.margin_left = 900
87
+ slides.vertical_centering = true
88
+ slides.prop_set "foreground", font_color
89
+ slides.prop_set("weight", "bold")
90
+ end
91
+ match(TitleSlide, Subtitle) do |subtitle|
92
+ subtitle.margin_top = -20
93
+ subtitle.prop_set("size", @large_font_size)
94
+ end
95
+ match(TitleSlide, Author) do |author|
96
+ author.margin_top = 50
97
+ author.prop_set("size", @large_font_size)
98
+ author.prop_set("weight", "normal")
99
+ end
100
+ match(TitleSlide, Place) do |place|
101
+ place.prop_set("size", @small_font_size)
102
+ end
103
+ match(TitleSlide, "*") do |elems|
104
+ elems.horizontal_centering = true
105
+ end
106
+
107
+ match(TitleSlide, Date) do |dates|
108
+ dates.prop_set("size", @small_font_size)
109
+ # dates.prop_set("style", "italic")
110
+ end
111
+
112
+ match(TitleSlide, ContentSource) do |sources|
113
+ sources.prop_set("size", @small_font_size)
114
+ sources.margin_bottom = @space
115
+ # sources.prop_set("style", "italic")
116
+ end
metadata ADDED
@@ -0,0 +1,89 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rabbit-slide-unasuke-hokurikurk01
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - unasuke
8
+ bindir: bin
9
+ cert_chain: []
10
+ date: 2025-12-06 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
+ description: https://regional.rubykaigi.org/hokuriku01/
27
+ email:
28
+ - yusuke1994525@gmail.com
29
+ executables: []
30
+ extensions: []
31
+ extra_rdoc_files: []
32
+ files:
33
+ - ".rabbit"
34
+ - README.md
35
+ - Rakefile
36
+ - _slide.md
37
+ - _slide.rab
38
+ - config.yaml
39
+ - img/bio.png
40
+ - img/claude_1.png
41
+ - img/claude_2.png
42
+ - img/claude_3.png
43
+ - img/claude_4.png
44
+ - img/claude_5.png
45
+ - img/claude_6.png
46
+ - img/claude_7.png
47
+ - img/claude_8.png
48
+ - img/esa_tech_todo.png
49
+ - img/icon_face.jpeg
50
+ - img/ioquatix_with_transcribe.jpg
51
+ - img/joyful_ruby.jpg
52
+ - img/kaigionrails_2025_keynote_speakers.png
53
+ - img/kaigionrails_2025_policies.png
54
+ - img/shirataki_arch_kaigionrails2025.png
55
+ - img/shirataki_qr.svg
56
+ - img/sorah_x_post.png
57
+ - img/theme/background_blank.png
58
+ - img/theme/background_title.png
59
+ - img/theme/background_with_logo.png
60
+ - img/vibe_coding_1.png
61
+ - img/vibe_coding_2.png
62
+ - img/vibe_coding_3.png
63
+ - pdf/hokurikurk01-slide.pdf
64
+ - slide.rab
65
+ - theme.rb
66
+ homepage: https://slide.rabbit-shocker.org/authors/unasuke/hokurikurk01/
67
+ licenses:
68
+ - MIT
69
+ metadata:
70
+ source_code_uri: https://github.com/unasuke/hokurikurk01
71
+ markup_language: rd
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.6.9
87
+ specification_version: 4
88
+ summary: 北陸Ruby会議01
89
+ test_files: []