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 +7 -0
- data/.rabbit +2 -0
- data/README.md +24 -0
- data/Rakefile +17 -0
- data/_slide.md +78 -0
- data/_slide.rab +440 -0
- data/config.yaml +23 -0
- data/img/bio.png +0 -0
- data/img/claude_1.png +0 -0
- data/img/claude_2.png +0 -0
- data/img/claude_3.png +0 -0
- data/img/claude_4.png +0 -0
- data/img/claude_5.png +0 -0
- data/img/claude_6.png +0 -0
- data/img/claude_7.png +0 -0
- data/img/claude_8.png +0 -0
- data/img/esa_tech_todo.png +0 -0
- data/img/icon_face.jpeg +0 -0
- data/img/ioquatix_with_transcribe.jpg +0 -0
- data/img/joyful_ruby.jpg +0 -0
- data/img/kaigionrails_2025_keynote_speakers.png +0 -0
- data/img/kaigionrails_2025_policies.png +0 -0
- data/img/shirataki_arch_kaigionrails2025.png +0 -0
- data/img/shirataki_qr.svg +79 -0
- data/img/sorah_x_post.png +0 -0
- data/img/theme/background_blank.png +0 -0
- data/img/theme/background_title.png +0 -0
- data/img/theme/background_with_logo.png +0 -0
- data/img/vibe_coding_1.png +0 -0
- data/img/vibe_coding_2.png +0 -0
- data/img/vibe_coding_3.png +0 -0
- data/pdf/hokurikurk01-slide.pdf +0 -0
- data/slide.rab +388 -0
- data/theme.rb +116 -0
- metadata +89 -0
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
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
|
+
{:relative_width='24' align='right' relative_margin_right='-8' relative_margin_top='20'}
|
|
26
|
+
|
|
27
|
+
# 元ネタない勢(1人)
|
|
28
|
+
|
|
29
|
+
{: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
|
+
{: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
|
data/img/icon_face.jpeg
ADDED
|
Binary file
|
|
Binary file
|
data/img/joyful_ruby.jpg
ADDED
|
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: []
|