rabbit-slide-tommy-mysql-protocol 2013.07.29

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: ee306332cfd09bd3af5e120e1d8e8c78a41e5894
4
+ data.tar.gz: 7c30844cbc28d3ea24ce301ea5ec2580c99e0db8
5
+ SHA512:
6
+ metadata.gz: 1b285b847706dac442e437e397a93b45748db3b604b275e52458868f067d1fdb63d39083e869614ee484e0b2583ba28f71b374ecc6c859281479c32689d61c2b
7
+ data.tar.gz: 5c1c97037edd36faa59ecbbcdda962792f52d8384fa66da731d615b9158806199f8d1f075614482f553dd62a8df03c925053635660ffac4db6e49bd6cd50dd57
data/.rabbit ADDED
@@ -0,0 +1 @@
1
+ mysql-protocol.rab
Binary file
Binary file
Binary file
Binary file
@@ -0,0 +1,24 @@
1
+ = MySQLのプロトコル解説
2
+
3
+ MySQLのプロトコル解説
4
+
5
+ == 作者向け
6
+
7
+ === 表示
8
+
9
+ rake
10
+
11
+ === 公開
12
+
13
+ rake publish
14
+
15
+ == 閲覧者向け
16
+
17
+ === インストール
18
+
19
+ gem install rabbit-slide-tommy-mysql-protocol
20
+
21
+ === 表示
22
+
23
+ rabbit rabbit-slide-tommy-mysql-protocol.gem
24
+
@@ -0,0 +1,24 @@
1
+ = MySQLの プロトコル
2
+
3
+ TODO: スライドの説明
4
+
5
+ == 作者向け
6
+
7
+ === 表示
8
+
9
+ rake
10
+
11
+ === 公開
12
+
13
+ rake publish
14
+
15
+ == 閲覧者向け
16
+
17
+ === インストール
18
+
19
+ gem install rabbit-slide-tommy-mysql-protocol
20
+
21
+ === 表示
22
+
23
+ rabbit rabbit-slide-tommy-mysql-protocol.gem
24
+
@@ -0,0 +1,9 @@
1
+ require "rabbit/task/slide"
2
+
3
+ # Edit ./config.yaml to customize meta data
4
+
5
+ Rabbit::Task::Slide.new do |task|
6
+ # task.spec.files += Dir.glob("doc/**/*.*")
7
+ # task.spec.files -= Dir.glob("private/**/*.*")
8
+ # task.spec.add_runtime_dependency("YOUR THEME")
9
+ end
@@ -0,0 +1,18 @@
1
+ ---
2
+ id: mysql-protocol
3
+ base_name: mysql-protocol
4
+ tags: []
5
+ presentation_date: 2013/07/29
6
+ version: 2013.07.29
7
+ licenses: []
8
+ slideshare_id:
9
+ speaker_deck_id:
10
+ ustream_id:
11
+ vimeo_id:
12
+ author:
13
+ markup_language: :rd
14
+ name: とみたまさひろ
15
+ email: tommy@tmtm.org
16
+ rubygems_user: tommy
17
+ slideshare_user:
18
+ speaker_deck_user:
Binary file
@@ -0,0 +1,566 @@
1
+ = MySQLのプロトコル解説
2
+
3
+ # : subtitle
4
+ # サブタイトル
5
+ : author
6
+ とみたまさひろ
7
+ : institution
8
+ 日本MySQLユーザ会
9
+ : content-source
10
+ MyNA会
11
+ : date
12
+ 2013/07/29
13
+ : allotted-time
14
+ 35m
15
+ : theme
16
+ clear-blue+
17
+
18
+ = 自己紹介
19
+
20
+ # image
21
+ # src = icon.jpg
22
+ # relative-height = 30
23
+ # align = right
24
+ # relative-margin-top = -30
25
+ # relative-margin-right = -10
26
+
27
+ * とみた まさひろ
28
+ * MySQLユーザ会(('note:(名ばかり代表)'))
29
+ * 長野県北部在住
30
+ * プログラマー (Ruby & C)
31
+ * http://((*tmtms*)).hatenablog.com
32
+ * http://twitter.com/((*tmtms*))
33
+ * https://github.com/((*tmtm*))/ruby-mysql
34
+
35
+ = 趣味
36
+
37
+ * 誰も使わないRubyライブラリを作ったり
38
+ * MySQL の yacc ファイル読んだり
39
+ * マンガ読んだり
40
+ * 聖悠紀 / 佐々木淳子 / 岡崎二郎 / 星野之宣 / 長谷川裕一 / 島本和彦 / 桑田乃梨子 / etc
41
+ * 技術書の積読
42
+
43
+ = 昔こんな本を書きました
44
+
45
+ # image
46
+ # src = MyBooks.jpg
47
+ # relative_width = 100
48
+
49
+ = OSS貢献者賞
50
+
51
+ # image
52
+ # src = OSS貢献者賞.jpg
53
+ # relative_height = 100
54
+
55
+ = 本日の誰得枠
56
+
57
+ = MySQLのプロトコル解説
58
+
59
+ = MySQLプロトコルを理解すると\n何がうれしいの?
60
+
61
+ = 言語ネイティブなライブラリを\n作れる(かも)
62
+
63
+ * libmysqlclient に依存しない
64
+
65
+ * Cの制約に縛られない
66
+
67
+ * プリペアドステートメントの C API は複雑
68
+
69
+ = Rubyの場合
70
+
71
+ libmysqlclient 制御下では
72
+
73
+ * 他のスレッドが止まる\n
74
+ (('note:(やり方はあるみたいだけど知らない)'))
75
+
76
+ * GC が動かない
77
+
78
+ = MySQLパケットを中継する\nプログラムを作れる(かも)
79
+
80
+ * MySQL Proxy 風の何か
81
+
82
+ = ということでMySQLプロトコルの解説
83
+
84
+ = Ruby/MySQL を作った時に調べた知識に基づいてます。嘘書いてるかもしれません。
85
+
86
+ = パケット
87
+
88
+ ┌───┬────────┐
89
+ │3 byte│データ長 │
90
+ │1 byte│シーケンス番号 │
91
+ │X byte│データ │
92
+ └───┴────────┘
93
+
94
+ = 数値は基本的に Little Endian
95
+
96
+ = データ長
97
+
98
+ * 0〜0xFFFFFF(約16MB)
99
+ * 0xFFFFFF の場合は継続あり。次のパケットのデータも結合する。
100
+
101
+ = シーケンス番号
102
+
103
+ コマンド発行毎に 0 から始まり、read, write 毎に1ずつ増加。255 までいったらまた 0 に戻る。
104
+
105
+ = 可変長整数(VLI)
106
+
107
+ ┌──────────────┬─────────┐
108
+ │0x00〜0xFA(0〜250) │そのまま │
109
+ │0xFB │NULL │
110
+ │0xFC XX XX │2バイトの正の整数 │
111
+ │0xFD XX XX XX │3バイトの正の整数 │
112
+ │0xFE XX XX XX XX XX XX XX XX│8バイトの正の整数 │
113
+ └──────────────┴─────────┘
114
+
115
+ = 長さつき文字列(LS)
116
+
117
+ 文字列長(VLI) + 文字列のバイト列
118
+
119
+ = 接続
120
+
121
+ = 初期パケット\n(サーバー→クライアント)
122
+
123
+ ┌────┬─────────────────────────────┐
124
+ │ 1 byte │プロトコルバージョン (5.6.10 では 10) (uchar) │
125
+ │ X byte │サーバーバージョン (e.g. "5.6.10") (NUL終端文字列) │
126
+ │ 4 byte │スレッドID (ulong) │
127
+ │ 8 byte │パスワードハッシュ化のためのキー① │
128
+ │ 1 byte │0x00 │
129
+ │ 2 byte │Capability① │
130
+ │ 1 byte │chraset (uchar) │
131
+ │ 2 byte │ステータス (ushort) │
132
+ │ 2 byte │Capability② (5.5以降?) │
133
+ │ 1 byte │パスワードハッシュ化のためのキー①+②の長さ+1 (5.5以降?) │
134
+ │10 byte │0x00 │
135
+ │ X byte │パスワードハッシュ化のためのキー② (12 byte) │
136
+ │ 1 byte │0x00 │
137
+ │ X byte │プラグイン名 "mysql_native_password" (5.5以降?) │
138
+ └────┴─────────────────────────────┘
139
+
140
+ = パスワードのハッシュ化(mysql_native_password)
141
+
142
+ * パスワードが与えられない場合は空文字列
143
+ * 平文を SHA1 でハッシュ化 … A
144
+ * A をさらに SHA1 でハッシュ化 … B
145
+ * パスワードハッシュ化のためのキー①+②+B を SHA1 でハッシュ化 … C
146
+ * A と C を XOR した文字列
147
+
148
+ = 認証用パケット\n(クライアント→サーバー)
149
+
150
+ ┌────┬────────────────┐
151
+ │ 4 byte │クライアントフラグ (ulong) │
152
+ │ 4 byte │最大パケット長 (ulong) │
153
+ │ X byte │charset (VLI) │
154
+ │23 byte │00 │
155
+ │ X byte │ユーザー名 (NUL終端文字列) │
156
+ │ X byte │ハッシュ化されたパスワード (LS) │
157
+ │ X byte │データベース名 (NUL終端文字列) │
158
+ └────┴────────────────┘
159
+
160
+ = クライアントフラグ
161
+
162
+ ┌────┬──────────────────────────┐
163
+ │ 0x00001│長いパスワード │
164
+ │ 0x00002│更新した行数ではなく条件に一致した行数を返す │
165
+ │ 0x00004│全カラムフラグ │
166
+ │ 0x00008│DB名指定 │
167
+ │ 0x00010│DB名.テーブル名.カラム名 指定を許可しない │
168
+ │ 0x00020│圧縮プロトコル │
169
+ │ 0x00080│LOAD DATA LOCAL INFILE を許可 │
170
+ │ 0x00100│関数名と'('の間の空白を無視する │
171
+ │ 0x00200│4.1プロトコル │
172
+ │ 0x00400│wait_timeout の代わりに interactive_timeout を使う │
173
+ │ 0x02000│トランザクションあり │
174
+ │ 0x00800│SSL プロトコル │
175
+ │ 0x08000│4.1認証 │
176
+ │ 0x10000│';' 区切りで複数のクエリを指定可能 │
177
+ │ 0x20000│複数クエリの結果を返す │
178
+ └────┴──────────────────────────┘
179
+
180
+ = Charset & Collation
181
+
182
+ ┌─┬────┬──────────┐
183
+ │# │charset │collation │
184
+ ├─┼────┼──────────┤
185
+ │11│ascii │ascii_general_ci │
186
+ │65│ascii │ascii_bin │
187
+ │33│utf8 │utf8_general_ci │
188
+ │83│utf8 │utf8_bin │
189
+ │45│utf8mb4 │utf8mb4_general_ci │
190
+ │46│utf8mb4 │utf8mb4_bin │
191
+ │95│cp932 │cp932_japanese_ci │
192
+ │96│cp932 │cp932_bin │
193
+ │97│eucjpms │eucjpms_japanese_ci │
194
+ │98│eucjpms │eucjpms_bin │
195
+ │63│binary │binary │
196
+ └─┴────┴──────────┘
197
+
198
+ = コマンド
199
+
200
+ = コマンドパケット\n(クライアント→サーバー)
201
+
202
+ ┌───┬─────────┐
203
+ │1 byte│コマンドコード │
204
+ │ ... │引数 │
205
+ └───┴─────────┘
206
+
207
+ = コマンド
208
+
209
+ ┌──┬────────────┐
210
+ │0x01│切断 │
211
+ │0x02│DB選択 │
212
+ │0x03│クエリ │
213
+ │0x04│フィールドリスト │
214
+ │0x05│DB作成 │
215
+ │0x06│DB破棄 │
216
+ │0x07│リフレッシュ │
217
+ │0x08│シャットダウン │
218
+ │0x09│Statistics │
219
+ │0x0A│プロセス情報 │
220
+ │0x0C│Kill │
221
+ │0x0E│Ping │
222
+ │0x11│ユーザー変更 │
223
+ │0x1B│サーバーオプション設定 │
224
+ └──┴────────────┘
225
+
226
+ = コマンド\n(プリペアドステートメント)
227
+
228
+ ┌──┬──────────┐
229
+ │0x16│作成 │
230
+ │0x17│実行 │
231
+ │0x18│巨大データの送信 │
232
+ │0x19│クローズ │
233
+ │0x1A│リセット │
234
+ │0x1C│結果取り出し │
235
+ └──┴──────────┘
236
+
237
+ = 応答パケット\n(サーバー→クライアント)
238
+
239
+ コマンドによって異なる
240
+
241
+ = エラーパケット\n(サーバー→クライアント)
242
+
243
+ 先頭が 0xFF の応答パケットはエラーパケット
244
+
245
+ ┌───┬─────────┐
246
+ │1 byte│0xFF │
247
+ │2 byte│エラー番号(ushort)│
248
+ │1 byte│0x23(#) │
249
+ │5 byte│SQLSTATE │
250
+ │X byte│エラーメッセージ │
251
+ └───┴─────────┘
252
+
253
+ = 引数なしコマンド
254
+
255
+ = QUITパケット\n(クライアント→サーバー)
256
+
257
+ ┌───┬────┐
258
+ │1 byte│0x01 │
259
+ └───┴────┘
260
+
261
+ = 引数ありコマンド
262
+
263
+ = シャットダウンパケット\n(クライアント→サーバー)
264
+
265
+ ┌───┬─────┐
266
+ │1 byte│0x08 │
267
+ │1 byte│0x00 固定 │
268
+ └───┴─────┘
269
+
270
+ = 応答ありコマンド
271
+
272
+ = Statisticsパケット\n(クライアント→サーバー)
273
+
274
+ ┌───┬────┐
275
+ │1 byte│0x09 │
276
+ └───┴────┘
277
+
278
+ = Statistics応答パケット\n(サーバー→クライアント)
279
+
280
+ ┌───┬─────┐
281
+ │X byte│統計文字列│
282
+ └───┴─────┘
283
+
284
+ (('tag:x-small:"Uptime: 7314 Threads: 1 Questions: 4 Slow queries: 0 Opens: 67 Flush tables: 1 Open tables: 60 Queries per second avg: 0.000"'))
285
+
286
+ = クエリ
287
+
288
+ = クエリパケット\n(クライアント→サーバー)
289
+
290
+ ┌───┬────────┐
291
+ │1 byte│0x03 │
292
+ │X byte│クエリ文字列 │
293
+ └───┴────────┘
294
+
295
+ = クエリ応答パケット\n(サーバー→クライアント)
296
+
297
+ 3種類
298
+
299
+ * 結果セットなし(UPDATE, INSERT 等)
300
+ * 結果セットあり(SELECT 等)
301
+ * LOAD DATA LOCAL INFILE
302
+
303
+ = クエリ応答パケット\n(結果セットなし)
304
+
305
+ ┌───┬───────────┐
306
+ │X byte│0 (VLI) │
307
+ │X byte│Affected Rows (VLI) │
308
+ │X byte│Insert ID (VLI) │
309
+ │2 byte│Server Status (ushort)│
310
+ │2 byte│Warning Count (ushort)│
311
+ │X byte│Message (LS) │
312
+ └───┴───────────┘
313
+
314
+ = クエリ応答パケット\n(結果セットあり)
315
+
316
+ ┌───┬─────────┐
317
+ │X byte│Field Count (VLI) │
318
+ └───┴─────────┘
319
+
320
+ = 結果セット
321
+
322
+ * フィールドパケット * フィールド数
323
+ * レコードパケット * レコード数
324
+ * EOFパケット
325
+
326
+ = フィールドパケット
327
+
328
+ ┌───┬───────────────────────┐
329
+ │4 byte│"def" (LS) │
330
+ │X byte│データベース名 (LS) │
331
+ │X byte│テーブル名 (LS) │
332
+ │X byte│オリジナルテーブル名 (LS) │
333
+ │X byte│カラム名 (LS) │
334
+ │X byte│オリジナルカラム名(LS) │
335
+ │1 byte│12 │
336
+ │2 byte│charset (ushort) │
337
+ │4 byte│長さ (ulong) │
338
+ │1 byte│型 (uchar) │
339
+ │2 byte│フラグ (ushort) │
340
+ │1 byte│少数桁数 (uchar) │
341
+ │2 byte│00 │
342
+ │X byte│デフォルト値 (LS) (フィールドリストコマンド時)│
343
+ └───┴───────────────────────┘
344
+
345
+ = フィールドの型
346
+
347
+ ┌──────┬───┬──────┬──────┐
348
+ │TINYINT │ 0x01 │TIME │ 0x0B │
349
+ │SMALLINT │ 0x02 │YEAR │ 0x0D │
350
+ │MEDIUMINT │ 0x09 │TIMESTAMP │ 0x07 │
351
+ │INT │ 0x03 │CHAR │ 0xFE │
352
+ │BIGINT │ 0x08 │VARCHAR │ 0xFD │
353
+ │FLOAT │ 0x04 │BLOB │ 0xFC │
354
+ │DOUBLE │ 0x05 │BIT │ 0x10 │
355
+ │DECIMAL │ 0xF6 │ENUM │ 0xF7(0xFE?)│
356
+ │DATETIME │ 0x0C │SET │ 0xF8(0xFE?)│
357
+ │DATE │ 0x0A │GEOMETRY │ 0xFF │
358
+ └──────┴───┴──────┴──────┘
359
+
360
+ = フィールドフラグ
361
+
362
+ ┌────────┬────┐
363
+ │NOT NULL │ 0x0001 │
364
+ │PRIMARY KEY │ 0x0002 │
365
+ │UNIQUE │ 0x0004 │
366
+ │INDEX │ 0x0008 │
367
+ │BLOB │ 0x0010 │
368
+ │UNSIGNED │ 0x0020 │
369
+ │ZEROFILL │ 0x0040 │
370
+ │BINARY │ 0x0080 │
371
+ │AUTO_INCREMENT │ 0x0200 │
372
+ │ENUM │ 0x0100 │
373
+ │SET │ 0x0800 │
374
+ │NO DEFAULT VALUE│ 0x1000 │
375
+ └────────┴────┘
376
+
377
+ = レコードパケット
378
+
379
+ ┌───┬─────────────┐
380
+ │X byte│カラム値 (LS) │
381
+ │ ... │(フィールド数分繰り返し) │
382
+ └───┴─────────────┘
383
+
384
+ = EOFパケット
385
+
386
+ * 0xFE で始まる8バイト以内のパケット
387
+
388
+ ┌───┬────────┐
389
+ │1 byte│0xFE │
390
+ │2 byte│Warning Count │
391
+ │2 byte│Server Status │
392
+ └───┴────────┘
393
+
394
+ = クエリ応答パケット\n(LOAD DATA LOCAL INFILE)
395
+
396
+ ┌───┬────────┐
397
+ │1 byte│NULL (VLI) │
398
+ │X byte│ファイル名 │
399
+ └───┴────────┘
400
+
401
+ このパケットを受け取った後、クライアントはローカルファイルのデータをサーバーに送信する。
402
+
403
+ = LOAD DATA LOCAL INFILE
404
+
405
+ C→S LOAD DATA LOCAL INFILE 'filename.tsv'
406
+ INTO TABLE ...
407
+
408
+ C←S 'filename.tsv'
409
+
410
+ C→S filename.tsv の内容
411
+
412
+ C→S EOF(長さ0のパケット)
413
+
414
+
415
+ = プリペアドステートメント
416
+
417
+ = クエリ準備パケット\n(クライアント→サーバー)
418
+
419
+ ┌───┬────────┐
420
+ │1 byte│0x16 │
421
+ │X byte│クエリ文字列 │
422
+ └───┴────────┘
423
+
424
+ = クエリ準備結果パケット\n(サーバー→クライアント)
425
+
426
+ ┌───┬────────────┐
427
+ │4 byte│Statement ID (ulong) │
428
+ │2 byte│Field Count (ushort) │
429
+ │2 byte│Parameter Count (ushort)│
430
+ │1 byte│0x00 │
431
+ │2 byte│Warning Count (ushort) │
432
+ └───┴────────────┘
433
+
434
+ = クエリ実行パケット\n(クライアント→サーバー)
435
+
436
+ ┌───┬────────────┐
437
+ │1 byte│0x17 │
438
+ │4 byte│Statement ID (ulong) │
439
+ │1 byte│Cursor type (uchar) │
440
+ │4 byte│1 (ulong) │
441
+ │X byte│NULL Bitmap │
442
+ │1 byte│1 (uchar) │
443
+ │X byte│パラメータ値の型 │
444
+ │X byte│パラメータ値 │
445
+ └───┴────────────┘
446
+
447
+ = NULL Bitmap
448
+
449
+ * パラメータの値のうち NULL のものを 1、NULL 以外を 0 で表したビットマップ
450
+
451
+ * (パラメータ数-1)/8+1 バイト (ただしパラメータがない場合は 0 バイト)
452
+
453
+ * 例: パラメータが (1, nil, 2, 3, nil) の場合 0x12(0001_0010)
454
+
455
+ = パラメータ値の型
456
+
457
+ * 2 byte * パラメータ数(NULLを除く)
458
+
459
+ * フィールドの型の2バイト表現
460
+
461
+ * 符号なし整数値は 0x8000 を加算
462
+
463
+ 例) 符号なし2byte整数: 0x8002
464
+
465
+ = パラメータ値
466
+
467
+ ┌──────┬─────────────┐
468
+ │値 │データ長と表現 │
469
+ ├──────┼─────────────┤
470
+ │NULL │ 0 byte │
471
+ │1 byte 整数 │ 1 byte │
472
+ │2 byte 整数 │ 2 byte │
473
+ │4 byte 整数 │ 4 byte │
474
+ │8 byte 整数 │ 8 byte │
475
+ │8 byte float│ 8 byte (IEEE754?) │
476
+ │文字列 │ 1 byte + 文字列長 (LS) │
477
+ │日時 │ X byte 後述 │
478
+ └──────┴─────────────┘
479
+
480
+ = 日時表現
481
+
482
+ ┌─────┬────────────────┐
483
+ │DATE │ 4, 年,月,日 │
484
+ │DATETIME │11, 年,月,日,時,分,秒,マイクロ秒│
485
+ │DATETIME │ 7, 年,月,日,時,分,秒 │
486
+ │TIMESTAMP │11, 年,月,日,時,分,秒,マイクロ秒│
487
+ │TIMESTAMP │ 7, 年,月,日,時,分,秒 │
488
+ │TIME │12, 符号,日,時,分,秒,マイクロ秒 │
489
+ │TIME │ 8, 符号,日,時,分,秒 │
490
+ │YEAR │ 2, 年 │
491
+ └─────┴────────────────┘
492
+
493
+ (('tag:x-small:年:2byte, マイクロ秒:4byte, TIMEの日:4byte, 他:1byte'))
494
+
495
+ = クエリ応答パケット\n(サーバー→クライアント)
496
+
497
+ * 通常クエリと同じ
498
+
499
+ = 結果セット
500
+
501
+ * フィールドパケット * フィールド数
502
+ * レコードパケット * レコード数
503
+ * EOFパケット
504
+
505
+ = フィールドパケット
506
+
507
+ * 通常クエリと同じ
508
+
509
+ = レコードパケット
510
+
511
+ ┌───┬──────┐
512
+ │1 byte│未使用 │
513
+ │X byte│NULL Bitmap │
514
+ │X byte│フィールド値│
515
+ └───┴──────┘
516
+
517
+ = NULL bitmap
518
+
519
+ * パラメータの値のうち NULL のものを 1、NULL 以外を 0 で表したビットマップ
520
+
521
+ * 下位2ビットは未使用
522
+
523
+ * (フィールド数 + 1)/8+1 バイト
524
+
525
+ * 例: パラメータが (1, nil, 2, 3, nil) の場合 0x48(0100_10XX)
526
+
527
+ = フィールド値
528
+
529
+ * パラメータの表現と同じ
530
+
531
+ = クエリ破棄パケット\n(クライアント→サーバー)
532
+
533
+ ┌───┬───────────┐
534
+ │1 byte│0x19 │
535
+ │4 byte│Statement ID (ulong) │
536
+ └───┴───────────┘
537
+
538
+ サーバーからの応答は無い
539
+
540
+ = まとめ
541
+
542
+ = 触れなかったこと
543
+
544
+ * SSLプロトコル
545
+
546
+ * 圧縮プロトコル
547
+
548
+ * 複数クエリ
549
+
550
+ * プリペアドステートメント
551
+ * サーバーサイド カーソル
552
+ * 巨大データ送信
553
+
554
+ * MySQL 5.6
555
+
556
+ = まとめ
557
+
558
+ * MySQLのプロトコルは結構複雑
559
+
560
+ * 素直に標準API使ったほうが吉
561
+
562
+ * 特殊なサーバー&クライアント作りたい人は頑張ってください
563
+
564
+ = ご清聴ありがとうございました
565
+
566
+
metadata ADDED
@@ -0,0 +1,70 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rabbit-slide-tommy-mysql-protocol
3
+ version: !ruby/object:Gem::Version
4
+ version: 2013.07.29
5
+ platform: ruby
6
+ authors:
7
+ - とみたまさひろ
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-07-29 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: MySQLのプロトコル解説
28
+ email:
29
+ - tommy@tmtm.org
30
+ executables: []
31
+ extensions: []
32
+ extra_rdoc_files: []
33
+ files:
34
+ - .rabbit
35
+ - config.yaml
36
+ - Rakefile
37
+ - README.rd~
38
+ - README.rd
39
+ - MySQL_Jiten.jpg
40
+ - MySQLBook.jpg
41
+ - MyBooks.jpg
42
+ - icon.jpg
43
+ - OSS貢献者賞.jpg
44
+ - Postfix_Jiten.jpg
45
+ - mysql-protocol.rab
46
+ - pdf/mysql-protocol-mysql-protocol.pdf
47
+ homepage: http://slide.rabbit-shocker.org/authors/tommy/mysql-protocol/
48
+ licenses: []
49
+ metadata: {}
50
+ post_install_message:
51
+ rdoc_options: []
52
+ require_paths:
53
+ - lib
54
+ required_ruby_version: !ruby/object:Gem::Requirement
55
+ requirements:
56
+ - - '>='
57
+ - !ruby/object:Gem::Version
58
+ version: '0'
59
+ required_rubygems_version: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - '>='
62
+ - !ruby/object:Gem::Version
63
+ version: '0'
64
+ requirements: []
65
+ rubyforge_project:
66
+ rubygems_version: 2.0.3
67
+ signing_key:
68
+ specification_version: 4
69
+ summary: MySQLのプロトコル解説
70
+ test_files: []