rabbit-slide-unasuke-rubykaigi-2022 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: ddc84c9fd7a2417f61ad285f71cd65f46d2b3f7528c4d116efbd35f392e7fc02
4
+ data.tar.gz: 4e5f4a89cfd7d0d7b72b5ded2af19b31eb0690c45b4c8726d6fe914791bf93f9
5
+ SHA512:
6
+ metadata.gz: 45fd641033d6ae1af37db849e3c5153506330b6a9b89aa5514f9cc77ba4adaf4f1244f0d4203de7816fa1afb59b2cf88742061e9a779b9ec8bc730b77f00680b
7
+ data.tar.gz: f229f3fdbccb51fe6a9f9074e510f381c3786a6ca00f9faa8e4c8fb1c456de1014ff63126708110793575d618c100f80abfb69adbf246e0ecc2581132a6b9517
data/.rabbit ADDED
@@ -0,0 +1 @@
1
+ --size 1200,675 slide.rab
data/README.rd ADDED
@@ -0,0 +1,24 @@
1
+ = Do Pure Ruby Dream of Encrypted Binary Protocol?
2
+
3
+ https://rubykaigi.org/2022/presentations/yu_suke1994.html
4
+
5
+ == 作者向け
6
+
7
+ === 表示
8
+
9
+ rake
10
+
11
+ === 公開
12
+
13
+ rake publish
14
+
15
+ == 閲覧者向け
16
+
17
+ === インストール
18
+
19
+ gem install rabbit-slide-unasuke-rubykaigi-2022
20
+
21
+ === 表示
22
+
23
+ rabbit rabbit-slide-unasuke-rubykaigi-2022.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/config.yaml ADDED
@@ -0,0 +1,25 @@
1
+ ---
2
+ id: rubykaigi-2022
3
+ base_name: slide
4
+ tags:
5
+ - ruby
6
+ - quic
7
+ - rubykaigi
8
+ presentation_date: 2022-09-09
9
+ presentation_start_time:
10
+ presentation_end_time:
11
+ version: 1.0.0
12
+ licenses: ['MIT']
13
+ slideshare_id:
14
+ speaker_deck_id:
15
+ ustream_id:
16
+ vimeo_id:
17
+ youtube_id:
18
+ author:
19
+ markup_language: :rd
20
+ name: unasuke
21
+ email: yusuke1994525@gmail.com
22
+ rubygems_user: unasuke
23
+ slideshare_user:
24
+ speaker_deck_user:
25
+ source_code_uri: "https://github.com/unasuke/rubykaigi-2022"
data/img/aioquic.png ADDED
Binary file
Binary file
Binary file
Binary file
Binary file
data/img/kwik.png ADDED
Binary file
Binary file
Binary file
data/img/quic-go.png ADDED
Binary file
data/img/quiche.png ADDED
Binary file
data/img/talk_2021.png ADDED
Binary file
Binary file
data/slide.rab ADDED
@@ -0,0 +1,378 @@
1
+ = Do Pure Ruby Dreams Encrypted Binary Protocol?
2
+
3
+ : author
4
+ unasuke (Yusuke Nakamura)
5
+ : content-source
6
+ RubyKaigi 2022
7
+ : date
8
+ 2022-09-09
9
+ : theme
10
+ theme
11
+
12
+ = Self introduction
13
+
14
+ * Name: unasuke (Yusuke Nakamura)
15
+ * Work: freelance Web app developer @ Tokyo
16
+ * Rails app developer (mainly)
17
+ * Itamae gem maintainer, Kaigi on Rails Organizer
18
+ * (('tag:x-small')) GitHub ((<URL:https://github.com/unasuke>))
19
+ * (('tag:x-small')) Mastodon ((<URL:https://mstdn.unasuke.com/@unasuke>))
20
+ * (('tag:x-small')) Twitter ((<URL:https://twitter.com/yu_suke1994>))
21
+
22
+
23
+ # image
24
+ # src = img/icon_face.jpeg
25
+ # relative_width = 24
26
+ # align = right
27
+ # relative_margin_right = -8
28
+ # relative_margin_top = 33
29
+
30
+ # = [AD] Day.3 : Ruby Music Mixin 2022 by pixiv Inc.
31
+ #
32
+ # # image
33
+ # # src = img/pixiv_ruby_music_mixin.png
34
+ # # relative_width = 30
35
+
36
+
37
+ = At first, do PureRuby Dream of Encrypted Binary Protocol?
38
+
39
+ (('tag:x-large')) A: There is a harsh reality. 😭
40
+
41
+ = A brief explanation of what QUIC is
42
+
43
+ * QUIC: standarized at 2021 by RFC 9000 etc
44
+ * Using UDP for communication
45
+
46
+ : TCP
47
+ low efficiency, high reliability
48
+
49
+ : UDP
50
+ high efficiency, low reliability → faster than TCP
51
+
52
+ = Did you remember my last year talk about QUIC?
53
+
54
+ # image
55
+ # src = img/talk_2021.png
56
+ # relative_width = 70
57
+
58
+ (('tag:x-small'))(('tag:center'))
59
+ ((<URL:https://slide.rabbit-shocker.org/authors/unasuke/rubykaigi-takeout-2021/>))
60
+
61
+ = Ractor, I dropped out
62
+
63
+ It's too difficult.Because...
64
+
65
+ * Implementating communication protorol is very hard work
66
+ * debugging code using Ractor is very hard in now
67
+ * debug.gem, I hope it will be a savior in the future...
68
+
69
+ Try to solve two problems in one time is difficult.
70
+
71
+ → I gave up to use Ractor in first implementation 😇
72
+
73
+ = It's a binary protocol
74
+ message like that
75
+
76
+ # enscript javascript
77
+ { "message": "Hello!", "kind": "greet" }
78
+
79
+ parse it by ruby
80
+
81
+ # enscript ruby
82
+ require "json"
83
+ request = JSON.parse('{ "message": "Hello!", "kind": "greet" }')
84
+ pp request["message"] # => "Hello!"
85
+
86
+ = It's a binary protocol
87
+ QUIC message
88
+
89
+ c000000001088394c8f03e5157080000449e7b9aec34d1b1c98dd7689fb8ec11
90
+ d242b123dc9bd8bab936b47d92ec356c0bab7df5976d27cd449f63300099f399
91
+ 1c260ec4c60d17b31f8429157bb35a1282a643a8d2262cad67500cadb8e7378c
92
+ 8eb7539ec4d4905fed1bee1fc8aafba17c750e2c7ace01e6005f80fcb7df6212
93
+ 30c83711b39343fa028cea7f7fb5ff89eac2308249a02252155e2347b63d58c5
94
+ 457afd84d05dfffdb20392844ae812154682e9cf012f9021a6f0be17ddd0c208
95
+ 4dce25ff9b06cde535d0f920a2db1bf362c23e596d11a4f5a6cf3948838a3aec
96
+ 4e15daf8500a6ef69ec4e3feb6b1d98e610ac8b7ec3faf6ad760b7bad1db4ba3
97
+ ...
98
+
99
+
100
+ = It's a binary protocol
101
+ Reading QUIC message (same as last year's slide)
102
+
103
+ # image
104
+ # src = img/quic_initial_packet_reading_1.png
105
+ # relative_width = 70
106
+
107
+ = It's a binary protocol
108
+ Reading QUIC message (same as last year's slide)
109
+
110
+ # image
111
+ # src = img/quic_initial_packet_reading_2.png
112
+ # relative_width = 70
113
+
114
+ = It's a binary protocol
115
+ Reading QUIC message (same as last year's slide)
116
+
117
+ # image
118
+ # src = img/quic_initial_packet_reading_3.png
119
+ # relative_width = 70
120
+
121
+ = It's a binary protocol
122
+ Reading QUIC message (same as last year's slide)
123
+
124
+ # image
125
+ # src = img/quic_initial_packet_reading_4.png
126
+ # relative_width = 70
127
+
128
+ = It's a binary protocol
129
+ Reading QUIC message (same as last year's slide)
130
+
131
+ # image
132
+ # src = img/quic_initial_packet_reading_5.png
133
+ # relative_width = 70
134
+
135
+ = It's a binary protocol
136
+ Reading QUIC message (same as last year's slide)
137
+
138
+ # image
139
+ # src = img/quic_initial_packet_reading_6.png
140
+ # relative_width = 70
141
+
142
+ = It's a binary protocol
143
+ Convert to bit-by-bit representation
144
+
145
+ # enscript ruby
146
+ "Hello".unpack1("B*")
147
+ # => "0100100001100101011011000110110001101111"
148
+
149
+
150
+ = It's a binary protocol
151
+ Oops!
152
+
153
+ # enscript ruby
154
+
155
+ data = "Hello".unpack1("B*")
156
+ # ...snip...
157
+ data.unpack1("B*") # unpack twice!
158
+ # => "001100000011000100110000001100000011000100110....
159
+
160
+ I wasted a lot of time because of this mistake. 🕖
161
+
162
+ = How are the other language implementations
163
+ Look around some QUIC impletemtations
164
+
165
+ * kwik (Java)
166
+ * quic-go (Go)
167
+ * cloudflare/quiche (Rust)
168
+ * aioquic (Python)
169
+
170
+ = kwik (Java) : QUIC impletemtations
171
+ # image
172
+ # src = img/kwik.png
173
+ # relative_width = 100
174
+
175
+ (('tag:xx-small'))
176
+ ((<URL:https://github.com/ptrd/kwik/blob/d1c52e6ac3/src/main/java/net/luminis/quic/packet/QuicPacket.java#L89>))
177
+
178
+ = quic-go (Go) : QUIC impletemtations
179
+ # image
180
+ # src = img/quic-go.png
181
+ # relative_width = 100
182
+
183
+ (('tag:xx-small'))
184
+ ((<URL:https://github.com/lucas-clemente/quic-go/blob/66f6fe0b711bc/packet_unpacker.go#L29-L34>))
185
+
186
+ = cloudflare/quiche (Rust) : QUIC impletemtations
187
+ # image
188
+ # src = img/quiche.png
189
+ # relative_width = 100
190
+
191
+ (('tag:xx-small'))
192
+ ((<URL:https://github.com/cloudflare/quiche/blob/3131c0d37/octets/src/lib.rs#L329-L336>))
193
+
194
+ = aioquic (Python) : QUIC impletemtations
195
+ # image
196
+ # src = img/aioquic.png
197
+ # relative_width = 70
198
+
199
+ (('tag:xx-small'))
200
+ ((<URL:https://github.com/aiortc/aioquic/blob/c758b4d936/src/aioquic/quic/packet.py#L477-L481>))
201
+
202
+ = back to the Ruby
203
+ * Those languages have Byte specific class or types
204
+ * but Ruby is not
205
+ * but we can use String or array of Integer
206
+
207
+ I would like to see a binary protocol implementation by Ruby that already exists.
208
+
209
+ → MessagePack!
210
+
211
+ = msgpack/msgpack-ruby
212
+ MessagePack is an efficient binary serialization format.
213
+
214
+ ((<URL:https://msgpack.org>))
215
+
216
+ = msgpack/msgpack-ruby
217
+ # image
218
+ # src = img/msgpack-ruby.png
219
+ # relative_width = 80
220
+
221
+ (('tag:xx-small'))
222
+ ((<URL:https://github.com/msgpack/msgpack-ruby/blob/0775a9a6a5/ext/msgpack/unpacker.c#L75-L85>))
223
+
224
+
225
+ = compare languages
226
+ benchmaek for bytes manipulation (AWS c5.large Ubuntu 22.04)
227
+
228
+ # image
229
+ # src = img/bench_result.png
230
+ # relative_width = 65
231
+
232
+ = compare String and array of Integer
233
+
234
+ $ bundle exec ruby main.rb
235
+ Warming up --------------------------------------
236
+ hello_world_upcase_string 848.029k i/s - 872.655k times in 1.029039s (1.18μs/i)
237
+ hello_world_upcase_integer 1.268M i/s - 1.291M times in 1.018188s (788.58ns/i)
238
+ Calculating -------------------------------------
239
+ hello_world_upcase_string 861.605k i/s - 2.544M times in 2.952730s (1.16μs/i)
240
+ hello_world_upcase_integer 1.285M i/s - 3.804M times in 2.961585s (778.48ns/i)
241
+
242
+ Comparison:
243
+ hello_world_upcase_integer : 1284551.4 i/s
244
+ hello_world_upcase_string : 861605.1 i/s - 1.49x slower
245
+
246
+ = How to prevent mistake?
247
+
248
+ # enscript ruby
249
+
250
+ class UnpackedString < String
251
+ def unpack1()
252
+ raise RuntimeError
253
+ end
254
+ end
255
+
256
+ = It's an encrypted protocol
257
+
258
+ # image
259
+ # src = img/quic_initial_packet_reading_2.png
260
+ # relative_width = 70
261
+
262
+ = It's an encrypted protocol
263
+
264
+ compare String and array of Integer (re)
265
+
266
+ $ bundle exec ruby main.rb
267
+ Warming up --------------------------------------
268
+ hello_world_upcase_string 848.029k i/s - 872.655k times in 1.029039s (1.18μs/i)
269
+ hello_world_upcase_integer 1.268M i/s - 1.291M times in 1.018188s (788.58ns/i)
270
+ Calculating -------------------------------------
271
+ hello_world_upcase_string 861.605k i/s - 2.544M times in 2.952730s (1.16μs/i)
272
+ hello_world_upcase_integer 1.285M i/s - 3.804M times in 2.961585s (778.48ns/i)
273
+
274
+ Comparison:
275
+ hello_world_upcase_integer : 1284551.4 i/s
276
+ hello_world_upcase_string : 861605.1 i/s - 1.49x slower
277
+
278
+ = It's an encrypted protocol
279
+ leading "0" gone
280
+
281
+ # enscript ruby
282
+
283
+ "01001".to_i(16) # => 4097
284
+ "01001".to_i(16).to_s(16) # => "1001"
285
+
286
+ = XOR between String
287
+
288
+ # enscript ruby
289
+
290
+ def xor(a, b)
291
+ a.unpack("C*").zip(b.unpack("C*")).map do |x, y|
292
+ x ^ y
293
+ end.pack("C*")
294
+ end
295
+
296
+ = It's an encrypted protocol
297
+
298
+ # enscript ruby
299
+
300
+ data[0] = [(data[0].unpack1('H*').to_i(16) ^
301
+ (mask[0].unpack1('H*').to_i(16) & 0x0f)).to_s(16)].pack("H*")
302
+
303
+ # https://www.rfc-editor.org/rfc/rfc9001#figure-6
304
+ pn_length = (data[0].unpack1('H*').to_i(16) & 0x03) + 1
305
+
306
+ packet_number =
307
+ (data[pn_offset...pn_offset+pn_length].unpack1("H*").to_i(16) ^
308
+ mask[1...1+pn_length].unpack1("H*").to_i(16)).to_s(16)
309
+
310
+ # fill zero because leading "0" gone
311
+ data[pn_offset...pn_offset+pn_length] =
312
+ [("0" * (pn_length * 2 - packet_number.length)) + packet_number].pack("H*")
313
+ self.class.new(data, protected: false).tap {|p| p.parse}
314
+
315
+ Remove Initial packet protection
316
+
317
+ = XOR between byte (Python)
318
+
319
+ # enscript Python
320
+
321
+ bytes([aa ^ bb for aa, bb in zip(a, b)])
322
+
323
+ (('tag:xx-small'))
324
+ ((<URL:https://programming-idioms.org/idiom/238/xor-byte-arrays/4146/python>))
325
+
326
+ = What should we do?
327
+ If there is no constraint for "Pure Ruby"...
328
+
329
+ * Write extension library by system programming language
330
+ * C or Rust
331
+ * Rust is popular
332
+ * ((<URL:https://github.com/rubygems/rubygems/pull/5613>))
333
+ * "Add support for bundle gem --rust command"
334
+
335
+ = QUIC, Some headers and many frames
336
+ * two type of headers
337
+ * long header, short header
338
+ * 20 types of frames
339
+ * padding, ping, ack, etc...
340
+
341
+ = QUIC, Some headers and many frames
342
+
343
+ # enscript ruby
344
+
345
+ private def find_frame_type(frame)
346
+ case [frame[0..7]].pack("B*")
347
+ when "\x00"
348
+ :padding
349
+ when "\x01"
350
+ :ping
351
+ when "\x02".."\x03"
352
+ :ack
353
+ # ......
354
+
355
+ Is it time for pattern matching? (This is a bad case. Too simple.)
356
+
357
+ = But, I'm negative about introducing special class for bytes data
358
+ * It may break the existing code base
359
+ * Ruby has 20+ years of history
360
+ * "Bytes" is a very common noun, especially computer science
361
+ * "bytes" gem was already taken 😏
362
+
363
+ So...
364
+
365
+ * Use another name of the String class
366
+ * Create own helper methods of bit operation
367
+ * Create extension library (if absolutely necessary)
368
+
369
+ = Conclusion
370
+ * handling/manipulating binary data in Ruby is hard
371
+ * than other languages that support bytes data as standard
372
+ * bit operation is slow
373
+ * should convert data on encrypt/decrypt operations
374
+
375
+ Why did I choose the "Pure Ruby" way?
376
+
377
+ * To avoid problems coming from ractor or multithreading
378
+ * Problems will appear near future...maybe...🤔
data/theme.rb ADDED
@@ -0,0 +1,111 @@
1
+ @default_foreground ||= @foreground
2
+ @default_background ||= @background
3
+ @default_shadow_color ||= @shadow_color
4
+
5
+ rubykaigi_color = '#2c2c31'
6
+ rubykaigi_purple = '#41414f'
7
+ @default_font = 'Poppins'
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 = 'HackGen'
12
+ @monospace_font_family = find_font_family(@monospace_font)
13
+
14
+ @default_item1_mark_color = rubykaigi_purple
15
+ @default_item2_mark_color = rubykaigi_purple
16
+
17
+ @xxxx_large_font_size = screen_size(10 * Pango::SCALE)
18
+ @xxx_large_font_size = screen_size(8 * Pango::SCALE)
19
+ @xx_large_font_size = screen_size(6 * Pango::SCALE)
20
+ @x_large_font_size = screen_size(4.5 * Pango::SCALE)
21
+ @large_font_size = screen_size(4 * Pango::SCALE)
22
+ @normal_font_size = screen_size(3.5 * Pango::SCALE)
23
+ @small_font_size = screen_size(3.2 * Pango::SCALE)
24
+ @x_small_font_size = screen_size(3 * Pango::SCALE)
25
+ @xx_small_font_size = screen_size(2.8 * Pango::SCALE)
26
+ @xxx_small_font_size = screen_size(2.5 * Pango::SCALE)
27
+ @script_font_size = @x_small_font_size
28
+ @large_script_font_size = @small_font_size
29
+ @x_large_script_font_size = @large_font_size
30
+ @title_slide_title_font_size = @xxx_large_font_size
31
+
32
+ @block_quote_fill_color = "#f8f8f8"
33
+ @preformatted_fill_color = "#f8f8f8"
34
+ @default_headline_line_color = rubykaigi_color
35
+ @description_term_line_color = @default_headline_line_color
36
+
37
+ @title_slide_background_image = 'img/title_background_logo_center.png'
38
+ @slide_background_image = 'img/background.png'
39
+
40
+ # set_foreground(@default_foreground)
41
+ # set_background(@default_background)
42
+
43
+ add_image_path("ruby-images")
44
+ include_theme("default-icon")
45
+ include_theme("default-title-text")
46
+ include_theme("default-text")
47
+ include_theme("default-title-slide")
48
+ include_theme("default-slide")
49
+ include_theme("default-item-mark")
50
+ include_theme("default-method-list")
51
+ include_theme("default-preformatted")
52
+ include_theme("default-block-quote")
53
+ include_theme("default-foot-text")
54
+ include_theme("default-description")
55
+ include_theme("image")
56
+ include_theme("table")
57
+ include_theme("newline-in-slides")
58
+ include_theme("per-slide-background-color")
59
+ include_theme("background-image-toolkit")
60
+ include_theme("per-slide-background-image")
61
+ include_theme("body-background-image")
62
+ include_theme("tag")
63
+ include_theme("syntax-highlighting")
64
+ include_theme("default-comment")
65
+
66
+ include_theme("title-slide-background-image")
67
+ include_theme("slide-background-image")
68
+
69
+ match(TitleSlide, Title) do |titles|
70
+ titles.padding_top = @space * 28
71
+ titles.prop_set("size", screen_size(4.9 * Pango::SCALE))
72
+ titles.prop_set("weight", "SemiBold")
73
+ end
74
+
75
+ match(Slide, HeadLine) do |heads|
76
+ heads.prop_set("size", @large_font_size)
77
+ heads.prop_set("weight", "bold")
78
+ end
79
+
80
+ match(TitleSlide) do |slides|
81
+ # slides.margin_left = 900
82
+ slides.vertical_centering = true
83
+ slides.prop_set("foreground", rubykaigi_color)
84
+ slides.prop_set("weight", "SemiBold")
85
+ end
86
+
87
+ match(TitleSlide, Subtitle) do |subtitle|
88
+ subtitle.margin_top = -20
89
+ subtitle.prop_set("weight", "normal")
90
+ subtitle.prop_set("size", @large_font_size)
91
+ end
92
+ match(TitleSlide, Author) do |author|
93
+ author.margin_top = 25
94
+ author.prop_set("weight", "normal")
95
+ end
96
+ match(TitleSlide, Place) do |place|
97
+ place.prop_set("weight", "normal")
98
+ place.prop_set("size", @small_font_size)
99
+ end
100
+ match(TitleSlide, Date) do |date|
101
+ date.prop_set("weight", "normal")
102
+ end
103
+ match(TitleSlide, ContentSource) do |cs|
104
+ cs.prop_set("weight", "normal")
105
+ end
106
+ match(TitleSlide, "*") do |elems|
107
+ elems.horizontal_centering = true
108
+ end
109
+ match(Slide) do |slide|
110
+ slide.prop_set("foreground", rubykaigi_color)
111
+ end
metadata ADDED
@@ -0,0 +1,82 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rabbit-slide-unasuke-rubykaigi-2022
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - unasuke
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2022-09-10 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rabbit
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 2.0.2
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 2.0.2
27
+ description: https://rubykaigi.org/2022/presentations/yu_suke1994.html
28
+ email:
29
+ - yusuke1994525@gmail.com
30
+ executables: []
31
+ extensions: []
32
+ extra_rdoc_files: []
33
+ files:
34
+ - ".rabbit"
35
+ - README.rd
36
+ - Rakefile
37
+ - config.yaml
38
+ - img/aioquic.png
39
+ - img/background.png
40
+ - img/background_plain.png
41
+ - img/bench_result.png
42
+ - img/icon_face.jpeg
43
+ - img/kwik.png
44
+ - img/msgpack-ruby.png
45
+ - img/pixiv_ruby_music_mixin.png
46
+ - img/quic-go.png
47
+ - img/quic_initial_packet_reading_1.png
48
+ - img/quic_initial_packet_reading_2.png
49
+ - img/quic_initial_packet_reading_3.png
50
+ - img/quic_initial_packet_reading_4.png
51
+ - img/quic_initial_packet_reading_5.png
52
+ - img/quic_initial_packet_reading_6.png
53
+ - img/quiche.png
54
+ - img/talk_2021.png
55
+ - img/title_background_logo_center.png
56
+ - pdf/rubykaigi-2022-slide.pdf
57
+ - slide.rab
58
+ - theme.rb
59
+ homepage: https://slide.rabbit-shocker.org/authors/unasuke/rubykaigi-2022/
60
+ licenses:
61
+ - MIT
62
+ metadata: {}
63
+ post_install_message:
64
+ rdoc_options: []
65
+ require_paths:
66
+ - lib
67
+ required_ruby_version: !ruby/object:Gem::Requirement
68
+ requirements:
69
+ - - ">="
70
+ - !ruby/object:Gem::Version
71
+ version: '0'
72
+ required_rubygems_version: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ requirements: []
78
+ rubygems_version: 3.3.7
79
+ signing_key:
80
+ specification_version: 4
81
+ summary: Do Pure Ruby Dream of Encrypted Binary Protocol?
82
+ test_files: []