awkでつくってわかるWebアプリケーション / Web Application Implementation in awk
by
yammerjp
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
1 awkでつくってわかる Webアプリケーション やんまー (中山 慶祐) / GMO PEPABO inc. 2024.02.10 YAPC::Hiroshima 2024
Slide 2
Slide 2 text
GMOペパボ株式会社 EC事業部 ECグループ プロダクトチーム エンジニアリングリード 2021年 新卒入社 2 自己紹介 中山 慶祐 Nakayama Keisuke あだ名: やんまー (yammer) Webアプリケーションエンジニア 趣味: 🤿, dotfiles盆栽, awk : @yammerjp https://twitter.com/yammerjp https://github.com/yammerjp
Slide 3
Slide 3 text
3 アジェンダ 1. 自己紹介 2. awkとは? 3. HTTPサーバ 1. レスポンス 2. リクエストヘッダ 3. リクエストボディ 4. その他 5. デモ
Slide 4
Slide 4 text
4 アジェンダ 1. 自己紹介 2. awkとは? 3. HTTPサーバ 1. レスポンス 2. リクエストヘッダ 3. リクエストボディ 4. その他 5. デモ プログラミング言語awkで ブログシステムを作った話 https://github.com/yammerjp/awkblog
Slide 5
Slide 5 text
5 awkとは?
Slide 6
Slide 6 text
1977 awk 2024 YAPC::Hiroshima 2010 Rust 2009 Go 1995 PHP, Ruby, JavaScript 1987 Perl 1972 C 6 awkとは 1977〜
Slide 7
Slide 7 text
7 awkとは テキスト処理に特化 pattern { action }
Slide 8
Slide 8 text
8 awkとは テキスト処理に特化 $foo | awk ’{ print $1 }’
Slide 9
Slide 9 text
9 awkとは テキスト処理に特化 $foo | awk ’{ print $1 }’ ここがプログラム
Slide 10
Slide 10 text
10 awkとは テキスト処理に特化 😢 classもない 😢 構造体もない 😢 try-catchもない 😢 パッケージマネージャもない
Slide 11
Slide 11 text
11 awkとは 複数の処理系 awk (One True Awk) gawk (GNU Awk) nawk mawk …
Slide 12
Slide 12 text
12 awkとは 複数の処理系 awk (One True Awk) gawk (GNU Awk) nawk mawk … TCP/IPなどの 様々な拡張
Slide 13
Slide 13 text
13 awkとは TCP/IP通信ができる
Slide 14
Slide 14 text
14 awkとは TCP/IP通信ができる Webアプリケーションが作れる
Slide 15
Slide 15 text
15 awkとは TCP/IP通信ができる (色々がんばれば) Webアプリケーションが作れる
Slide 16
Slide 16 text
16 awkとは (色々がんばれば) 今日はこれについて話します
Slide 17
Slide 17 text
17 HTTPサーバ
Slide 18
Slide 18 text
18 HTTPサーバ クライアント (Webブラウザ) サーバ (gawk)
Slide 19
Slide 19 text
19 HTTPサーバ クライアント (Webブラウザ) 「記事みたい」 サーバ (gawk)
Slide 20
Slide 20 text
20 HTTPサーバ クライアント (Webブラウザ) サーバ (gawk) 「記事みたい」 「ホレッ」 (HTMLを返す)
Slide 21
Slide 21 text
21 HTTPサーバ クライアント (Webブラウザ) サーバ (gawk)
Slide 22
Slide 22 text
22 クライアント (Webブラウザ) サーバ (gawk) 「記事を投稿するよ」 HTTPサーバ
Slide 23
Slide 23 text
23 クライアント (Webブラウザ) サーバ (gawk) 「記事を投稿するよ」 「おk」 (HTMLを返す) HTTPサーバ
Slide 24
Slide 24 text
24 クライアント (Webブラウザ) サーバ (gawk) 「記事を投稿するよ」 「おk」 (HTMLを返す) HTTPサーバ ↑これを実装
Slide 25
Slide 25 text
25 HTTPサーバ 「おk」 (HTMLを返す)
Slide 26
Slide 26 text
26 HTTPサーバ 「おk」 (HTMLを返す) まずはレスポンス側を実装
Slide 27
Slide 27 text
27 HTTPレスポンス
Slide 28
Slide 28 text
28 HTTPレスポンス HTTPレスポンスとは
Slide 29
Slide 29 text
29 HTTPレスポンス HTTP/1.1 200 OK Content-Length: 61 Content-Type: text/html; charset=utf-8 投稿しました
Slide 30
Slide 30 text
30 HTTPレスポンス HTTP/1.1 200 OK Content-Length: 61 Content-Type: text/html; charset=utf-8 投稿しました このようなテキストを 出力すればいい
Slide 31
Slide 31 text
31 HTTPレスポンス awkで実装すると
Slide 32
Slide 32 text
32 HTTPレスポンス https://gist.github.com/yammerjp/7ca4aedf5e15cbdb6c7f02401cfacfe2
Slide 33
Slide 33 text
33 HTTPレスポンス ↑ファイルに保存して実行できる $ gawk -f main.awk _ https://gist.github.com/yammerjp/7ca4aedf5e15cbdb6c7f02401cfacfe2
Slide 34
Slide 34 text
34 HTTPレスポンス https://gist.github.com/yammerjp/7ca4aedf5e15cbdb6c7f02401cfacfe2 ↑ファイルに保存して実行できる $ gawk -f main.awk _
Slide 35
Slide 35 text
35 HTTPレスポンス - responseを出力する - 出力先はTCPのポート 8080に接続してきた クライアント |& … 双方向パイプ 入出力先を指定 できる記法 https://gist.github.com/yammerjp/7ca4aedf5e15cbdb6c7f02401cfacfe2 ↑ファイルに保存して実行できる $ gawk -f main.awk _
Slide 36
Slide 36 text
36 HTTPレスポンス 大体できた
Slide 37
Slide 37 text
37 HTTPレスポンス あとはリクエストをもとに 変数responseの中身を 変えればいい
Slide 38
Slide 38 text
38 HTTPリクエスト
Slide 39
Slide 39 text
39 HTTPリクエストヘッダ クライアント (Webブラウザ) サーバ (gawk) 「記事を投稿するよ」 「おk」 (HTMLを返す)
Slide 40
Slide 40 text
40 HTTPリクエストヘッダ 「記事を投稿するよ」
Slide 41
Slide 41 text
41 HTTPリクエストヘッダ 「記事を投稿するよ」 つぎはリクエスト側を実装
Slide 42
Slide 42 text
42 HTTPレスポンス HTTPリクエストとは
Slide 43
Slide 43 text
43 HTTPリクエストヘッダ POST /articles HTTP/1.1 Host: example.com Content-Length: 41 Content-Type: application/x-www-form-urlencoded Accept: text/html title=YAPC&content=%E6%9C%80%E9%AB%98%21
Slide 44
Slide 44 text
44 HTTPリクエストヘッダ POST /articles HTTP/1.1 Host: example.com Content-Length: 41 Content-Type: application/x-www-form-urlencoded Accept: text/html title=YAPC&content=%E6%9C%80%E9%AB%98%21 このようなテキストを 読み込めばいい
Slide 45
Slide 45 text
45 HTTPリクエストヘッダ POST /articles HTTP/1.1 Host: example.com Content-Length: 41 Content-Type: application/x-www-form-urlencoded Accept: text/html title=YAPC&content=%E6%9C%80%E9%AB%98%21 ヘッダ ボディ
Slide 46
Slide 46 text
46 HTTPリクエストヘッダ POST /articles HTTP/1.1 Host: example.com Content-Length: 41 Content-Type: application/x-www-form-urlencoded Accept: text/html title=YAPC&content=%E6%9C%80%E9%AB%98%21 ヘッダ ボディ まずはヘッダを 読み込むことを考える
Slide 47
Slide 47 text
47 HTTPリクエストヘッダ
Slide 48
Slide 48 text
48 HTTPリクエストヘッダ POST /articles HTTP/1.1 Host: example.com Content-Length: 41 Content-Type: application/x-www-form-urlencoded Accept: text/html title=YAPC&content=%E6%9C%80%E9%AB%98%21 ヘッダ ボディ リクエストヘッダは
Slide 49
Slide 49 text
49 HTTPリクエストヘッダ POST /articles HTTP/1.1 Host: example.com Content-Length: 41 Content-Type: application/x-www-form-urlencoded Accept: text/html title=YAPC&content=%E6%9C%80%E9%AB%98%21 ヘッダ ボディ リクエストヘッダは 行ごとに空行まで読めばいい 行 行 行 行 行
Slide 50
Slide 50 text
50 HTTPリクエストヘッダ POST /articles HTTP/1.1 Host: example.com Content-Length: 41 Content-Type: application/x-www-form-urlencoded Accept: text/html title=YAPC&content=%E6%9C%80%E9%AB%98%21 ヘッダ ボディ リクエストヘッダは 行ごとに空行まで読めばいい 空行
Slide 51
Slide 51 text
51 HTTPリクエストヘッダ POST /articles HTTP/1.1 Host: example.com Content-Length: 41 Content-Type: application/x-www-form-urlencoded Accept: text/html title=YAPC&content=%E6%9C%80%E9%AB%98%21 ヘッダ ボディ 行ごとに 行 行 行 行 行
Slide 52
Slide 52 text
52 HTTPリクエストヘッダ POST /articles HTTP/1.1 Host: example.com Content-Length: 41 Content-Type: application/x-www-form-urlencoded Accept: text/html title=YAPC&content=%E6%9C%80%E9%AB%98%21 ヘッダ ボディ 行ごとに 行 行 行 行 行 RS = ”\r\n” 入力の区切り文字 (一回の入力で どこまで読むかを宣言)
Slide 53
Slide 53 text
53 HTTPリクエストヘッダ POST /articles HTTP/1.1 Host: example.com Content-Length: 41 Content-Type: application/x-www-form-urlencoded Accept: text/html title=YAPC&content=%E6%9C%80%E9%AB%98%21 ヘッダ ボディ リクエストヘッダは 行ごとに空行まで読めばいい 空行
Slide 54
Slide 54 text
54 HTTPリクエストヘッダ POST /articles HTTP/1.1 Host: example.com Content-Length: 41 Content-Type: application/x-www-form-urlencoded Accept: text/html title=YAPC&content=%E6%9C%80%E9%AB%98%21 ヘッダ ボディ リクエストヘッダは 行ごとに空行まで読めばいい 空行 空行ならば (1行のByte数) = 0
Slide 55
Slide 55 text
55 HTTPリクエストヘッダ POST /articles HTTP/1.1 Host: example.com Content-Length: 41 Content-Type: application/x-www-form-urlencoded Accept: text/html title=YAPC&content=%E6%9C%80%E9%AB%98%21 ヘッダ ボディ リクエストヘッダは 行ごとに空行まで読めばいい 空行 空行でないならば (1行のByte数) > 0
Slide 56
Slide 56 text
56 HTTPリクエストヘッダ POST /articles HTTP/1.1 Host: example.com Content-Length: 41 Content-Type: application/x-www-form-urlencoded Accept: text/html title=YAPC&content=%E6%9C%80%E9%AB%98%21 ヘッダ ボディ リクエストヘッダは 行ごとに空行まで読めばいい 空行 while(INET |& getline && length($0)) {
Slide 57
Slide 57 text
57 HTTPリクエストヘッダ POST /articles HTTP/1.1 Host: example.com Content-Length: 41 Content-Type: application/x-www-form-urlencoded Accept: text/html title=YAPC&content=%E6%9C%80%E9%AB%98%21 ヘッダ ボディ リクエストヘッダは 行ごとに空行まで読めばいい 空行 while(INET |& getline && length($0)) { 1回の入力で 読んだByte数
Slide 58
Slide 58 text
58 HTTPレスポンス 実装すると
Slide 59
Slide 59 text
59 HTTPリクエストヘッダ https://gist.github.com/yammerjp/7ca4aedf5e15cbdb6c7f02401cfacfe2
Slide 60
Slide 60 text
60 HTTPリクエストヘッダ 行ごとに 空行まで https://gist.github.com/yammerjp/7ca4aedf5e15cbdb6c7f02401cfacfe2
Slide 61
Slide 61 text
61 HTTPレスポンス ヘッダが読めた
Slide 62
Slide 62 text
62 HTTPリクエストボディ
Slide 63
Slide 63 text
63 HTTPリクエストヘッダ POST /articles HTTP/1.1 Host: example.com Content-Length: 41 Content-Type: application/x-www-form-urlencoded Accept: text/html title=YAPC&content=%E6%9C%80%E9%AB%98%21 ヘッダ ボディ
Slide 64
Slide 64 text
64 HTTPリクエストヘッダ POST /articles HTTP/1.1 Host: example.com Content-Length: 41 Content-Type: application/x-www-form-urlencoded Accept: text/html title=YAPC&content=%E6%9C%80%E9%AB%98%21 ヘッダ ボディ つぎはボディを 読み込むことを考える
Slide 65
Slide 65 text
65 HTTPリクエストヘッダ POST /articles HTTP/1.1 Host: example.com Content-Length: 41 Content-Type: application/x-www-form-urlencoded Accept: text/html title=YAPC&content=%E6%9C%80%E9%AB%98%21 ヘッダ ボディ 長さがContent-Length からわかる
Slide 66
Slide 66 text
66 HTTPリクエストヘッダ POST /articles HTTP/1.1 Host: example.com Content-Length: 41 Content-Type: application/x-www-form-urlencoded Accept: text/html title=YAPC&content=%E6%9C%80%E9%AB%98%21 ヘッダ ボディ 指定されたByte数読み込む
Slide 67
Slide 67 text
67 HTTPリクエストヘッダ POST /articles HTTP/1.1 Host: example.com Content-Length: 41 Content-Type: application/x-www-form-urlencoded Accept: text/html title=YAPC&content=%E6%9C%80%E9%AB%98%21 ヘッダ ボディ 指定されたByte数読み込む awkにそんな機能はない🥺
Slide 68
Slide 68 text
68 HTTPリクエストヘッダ POST /articles HTTP/1.1 Host: example.com Content-Length: 41 Content-Type: application/x-www-form-urlencoded Accept: text/html title=YAPC&content=%E6%9C%80%E9%AB%98%21 ヘッダ ボディ でも諦めたくない
Slide 69
Slide 69 text
69 HTTPリクエストヘッダ POST /articles HTTP/1.1 Host: example.com Content-Length: 41 Content-Type: application/x-www-form-urlencoded Accept: text/html title=YAPC&content=%E6%9C%80%E9%AB%98%21 ヘッダ ボディ でも諦めたくない gawkなら、頑張ればできる
Slide 70
Slide 70 text
70 HTTPリクエストヘッダ POST /articles HTTP/1.1 Host: example.com Content-Length: 41 Content-Type: application/x-www-form-urlencoded Accept: text/html title=YAPC&content=%E6%9C%80%E9%AB%98%21 ヘッダ ボディ RS = ”\r\n” 入力の区切り文字 (一回の入力で どこまで読むかを宣言)
Slide 71
Slide 71 text
71 HTTPリクエストヘッダ POST /articles HTTP/1.1 Host: example.com Content-Length: 41 Content-Type: application/x-www-form-urlencoded Accept: text/html title=YAPC&content=%E6%9C%80%E9%AB%98%21 ヘッダ ボディ RS = ” . ”... 入力の区切り文字 (一回の入力で どこまで読むかを宣言)
Slide 72
Slide 72 text
72 HTTPリクエストヘッダ POST /articles HTTP/1.1 Host: example.com Content-Length: 41 Content-Type: application/x-www-form-urlencoded Accept: text/html title=YAPC&content=%E6%9C%80%E9%AB%98%21 ヘッダ ボディ RS = ” . ”... gawkでは区切り文字を 正規表現にできる
Slide 73
Slide 73 text
73 HTTPリクエストヘッダ POST /articles HTTP/1.1 Host: example.com Content-Length: 41 Content-Type: application/x-www-form-urlencoded Accept: text/html title=YAPC&content=%E6%9C%80%E9%AB%98%21 ヘッダ ボディ RS = ” . ”... gawkでは区切り文字を 正規表現にできる ” . ” … 任意の一文字
Slide 74
Slide 74 text
74 HTTPリクエストヘッダ POST /articles HTTP/1.1 Host: example.com Content-Length: 41 Content-Type: application/x-www-form-urlencoded Accept: text/html title=YAPC&content=%E6%9C%80%E9%AB%98%21 ヘッダ ボディ RS = ” . ”... 入力の1文字目を 区切り文字にする
Slide 75
Slide 75 text
75 HTTPリクエストヘッダ POST /articles HTTP/1.1 Host: example.com Content-Length: 41 Content-Type: application/x-www-form-urlencoded Accept: text/html title=YAPC&content=%E6%9C%80%E9%AB%98%21 ヘッダ ボディ RS = ” . ”...
Slide 76
Slide 76 text
76 HTTPリクエストヘッダ POST /articles HTTP/1.1 Host: example.com Content-Length: 41 Content-Type: application/x-www-form-urlencoded Accept: text/html title=YAPC&content=%E6%9C%80%E9%AB%98%21 ヘッダ ボディ RS = ” . ”... getlineを一回呼ぶと
Slide 77
Slide 77 text
77 HTTPリクエストヘッダ POST /articles HTTP/1.1 Host: example.com Content-Length: 41 Content-Type: application/x-www-form-urlencoded Accept: text/html title=YAPC&content=%E6%9C%80%E9%AB%98%21 ヘッダ ボディ RS = ” . ”... 入力結果 $0 は空 区切り文字は t
Slide 78
Slide 78 text
78 HTTPリクエストヘッダ POST /articles HTTP/1.1 Host: example.com Content-Length: 41 Content-Type: application/x-www-form-urlencoded Accept: text/html title=YAPC&content=%E6%9C%80%E9%AB%98%21 ヘッダ ボディ RS = ” . ”... 入力結果 $0 は空 区切り文字は t ← RT に記録される
Slide 79
Slide 79 text
79 HTTPリクエストヘッダ POST /articles HTTP/1.1 Host: example.com Content-Length: 41 Content-Type: application/x-www-form-urlencoded Accept: text/html title=YAPC&content=%E6%9C%80%E9%AB%98%21 ヘッダ ボディ RS = ” . ”... 1Byte読めた😃
Slide 80
Slide 80 text
80 HTTPリクエストヘッダ POST /articles HTTP/1.1 Host: example.com Content-Length: 41 Content-Type: application/x-www-form-urlencoded Accept: text/html title=YAPC&content=%E6%9C%80%E9%AB%98%21 ヘッダ ボディ RS = ” .{41} ”
Slide 81
Slide 81 text
81 HTTPリクエストヘッダ POST /articles HTTP/1.1 Host: example.com Content-Length: 41 Content-Type: application/x-www-form-urlencoded Accept: text/html title=YAPC&content=%E6%9C%80%E9%AB%98%21 ヘッダ ボディ RS = ” .{41} ” getlineを一回呼ぶと
Slide 82
Slide 82 text
82 HTTPリクエストヘッダ POST /articles HTTP/1.1 Host: example.com Content-Length: 41 Content-Type: application/x-www-form-urlencoded Accept: text/html title=YAPC&content=%E6%9C%80%E9%AB%98%21 ヘッダ ボディ RS = ” .{41} ” 82 入力結果 $0 は空 区切り文字は title=YAPC&content=%E6% ↑ RT に記録される
Slide 83
Slide 83 text
83 HTTPリクエストヘッダ POST /articles HTTP/1.1 Host: example.com Content-Length: 41 Content-Type: application/x-www-form-urlencoded Accept: text/html title=YAPC&content=%E6%9C%80%E9%AB%98%21 ヘッダ ボディ RS = ” .{41} ” ボディを読めた😃
Slide 84
Slide 84 text
84 HTTPリクエストヘッダ POST /articles HTTP/1.1 Host: example.com Content-Length: 41 Content-Type: application/x-www-form-urlencoded Accept: text/html title=YAPC&content=%E6%9C%80%E9%AB%98%21 ヘッダ ボディ RS = ” .{41} ” ボディを読めた😃 読めて欲しかった
Slide 85
Slide 85 text
85 HTTPリクエストヘッダ POST /articles HTTP/1.1 Host: example.com Content-Length: 41 Content-Type: application/x-www-form-urlencoded Accept: text/html title=YAPC&content=%E6%9C%80%E9%AB%98%21 ヘッダ ボディ RS = ” .{41} ” ボディを読めた😃 動かない🥺
Slide 86
Slide 86 text
86 HTTPリクエストヘッダ POST /articles HTTP/1.1 Host: example.com Content-Length: 41 Content-Type: application/x-www-form-urlencoded Accept: text/html title=YAPC&content=%E6%9C%80%E9%AB%98%21 ヘッダ ボディ RS = ” .{??} ” なぜか、ボディ末尾に 差し掛かると止まる🥺 86 86 ↓読み込めない
Slide 87
Slide 87 text
87 HTTPリクエストヘッダ POST /articles HTTP/1.1 Host: example.com Content-Length: 41 Content-Type: application/x-www-form-urlencoded Accept: text/html title=YAPC&content=%E6%9C%80%E9%AB%98%21 ヘッダ ボディ RS = ” .{??} ” 87 87 ↓読み込めない 原因不明🥺
Slide 88
Slide 88 text
88 HTTPリクエストヘッダ POST /articles HTTP/1.1 Host: example.com Content-Length: 41 Content-Type: application/x-www-form-urlencoded Accept: text/html title=YAPC&content=%E6%9C%80%E9%AB%98%21 ヘッダ ボディ RS = ” .{??} ” 88 88 ↓読み込めない オワタ\(^o^)/
Slide 89
Slide 89 text
89 HTTPリクエストヘッダ POST /articles HTTP/1.1 Host: example.com Content-Length: 41 Content-Type: application/x-www-form-urlencoded Accept: text/html title=YAPC&content=%E6%9C%80%E9%AB%98%21 ヘッダ ボディ RS = ” .{??} ” 89 89 ↓読み込めない 諦める
Slide 90
Slide 90 text
90 HTTPリクエストヘッダ POST /articles HTTP/1.1 Host: example.com Content-Length: 41 Content-Type: application/x-www-form-urlencoded Accept: text/html title=YAPC&content=%E6%9C%80%E9%AB%98%21 ヘッダ ボディ RS = ” .{??} ” 90 90 ↓読み込めない 後ろの方は読まない
Slide 91
Slide 91 text
91 HTTPリクエストヘッダ POST /articles HTTP/1.1 Host: example.com Content-Length: 41 Content-Type: application/x-www-form-urlencoded Accept: text/html title=YAPC&content=%E6%9C%80%E9%AB%98%21 ヘッダ ボディ RS = ” .{??} ” 91 91 ↓読み込めない 内容が欠けると困る
Slide 92
Slide 92 text
92 HTTPリクエストヘッダ POST /articles HTTP/1.1 Host: example.com Content-Length: 41 Content-Type: application/x-www-form-urlencoded Accept: text/html title=YAPC&content=%E6%9C%80%E9%AB%98%21xx ヘッダ ボディ RS = ” .{??} ” 92 92 ↓読み込めない 内容が欠けると困る →事前に、不要な文字を足しておく
Slide 93
Slide 93 text
93 HTTPリクエストボディ クライアント (Webブラウザ) サーバ (gawk)
Slide 94
Slide 94 text
94 HTTPリクエストボディ クライアント (Webブラウザ) サーバ (gawk) リバースプロキシ (Nginx)
Slide 95
Slide 95 text
95 HTTPリクエストボディ クライアント (Webブラウザ) サーバ (gawk) リバースプロキシ (Nginx) ボディの末尾に 512Byte程、無駄 な文字を付与する ボディの後ろ 512Byteは 読み飛ばす
Slide 96
Slide 96 text
96 HTTPリクエストボディ クライアント (Webブラウザ) サーバ (gawk) リバースプロキシ (Nginx) Nginxは proxy_set_body という設定で、ボディを加工できる title=YAPC::Hiroshima2024&co ntent=%E6%9C%80%E9%AB% 98%21 title=YAPC::Hiroshima2024&co ntent=%E6%9C%80%E9%AB% 98%21_____________________ __________________________ __________________________ __________________________ _… title=YAPC::Hiroshima2024&co ntent=%E6%9C%80%E9%AB% 98%21_____________________ __________________________ __________________________ __________________________ _… 全部読み込まずに レスポンスを返す
Slide 97
Slide 97 text
97 HTTPレスポンス 実装すると
Slide 98
Slide 98 text
98 HTTPリクエストボディ これでやっとボディを読めた
Slide 99
Slide 99 text
99 HTTPレスポンス おつかれさまでした♨
Slide 100
Slide 100 text
100 HTTPレスポンス ここまでの処理を 実装したファイル src/lib/http.awk https://github.com/yammerjp/awkblog
Slide 101
Slide 101 text
101 その他 まだ1/67files src/lib/http.awk
Slide 102
Slide 102 text
102 その他 時間がないので 他のトピックは 紹介にとどめます
Slide 103
Slide 103 text
103 その他
Slide 104
Slide 104 text
104 その他 PostgreSQLとの通信 - gawkはC言語で拡張を書ける - 公式の拡張 gawkextlib ↑PostgreSQLクライアントもある - ビルド済みのDockerイメージを公開中 yammerjp/gawk-pgsql-docker https://github.com/yammerjp/gawk-pgsql-docker
Slide 105
Slide 105 text
105 その他 GitHubログイン - gawkのTCP/IPはTLS使えず - curlコマンドでGitHub APIと通信 - OAuth2.0のフローを踏むことで認可
Slide 106
Slide 106 text
106 その他 セッション管理 - OpenSSLコマンドを実行 - 共通鍵暗号で暗号化してCookieに保存 - gawkextlibのRedisクライアントを使 えばRedis管理も理論上は可能 ぜひ誰か実装してみてください
Slide 107
Slide 107 text
107 その他 ユニットテスト - 簡単なアサーション関数を用意して書く { # 略 assertEqual(”expected value”, actual) }
Slide 108
Slide 108 text
108 その他 テンプレートエンジン - 起動時にテンプレートをすべてパース し、1つのawkプログラムにコンパイル する方式 - 別の方式含め2回くらい作り直した - awkはテキスト処理が得意。簡潔に強 力なテンプレートエンジンが作れる
Slide 109
Slide 109 text
109 その他 画像アップロード - awkはバイナリを扱うのが難しい - Amazon S3の署名付きアップロード を利用 - OpenSSLコマンドを組み合わせ、 awkプログラム内で署名を生成する - オブジェクトストレージ最高!
Slide 110
Slide 110 text
110 その他 URLデコード - ブラウザのフォーム送信を受け取り - UTF-8のバイト列規則に従い変換 %E3%81%82 → あ 余談: awkblogにはJSON APIもあるが、JSON デコードはgawkextlibのJSON拡張を利用
Slide 111
Slide 111 text
111 その他 ルーティング - awkでは、関数ポインタやラムダ式の 代わりに @変数名 で、変数に保存さ れた文字列の関数を呼び出せる - パスをkey, コントローラの関数名を valueとした配列をつくる
Slide 112
Slide 112 text
112 その他 MVC - Webアプリケーションでよくある構成 - Model … src/models/ - View … views/ - Controller … src/controllers/
Slide 113
Slide 113 text
113 その他 Markdown - awkblogでは、Markdownにも対応 - awkで書かれたMarkdownパーサを 改造して取り込ませていただいた lumenpink/md2html https://github.com/lumenpink/md2html
Slide 114
Slide 114 text
114 デモ
Slide 115
Slide 115 text
115 https://awkblog.net
Slide 116
Slide 116 text
116 まとめ
Slide 117
Slide 117 text
awkは楽しい 117
Slide 118
Slide 118 text
いちから実装するしかないので Webアプリケーション全体を 俯瞰できる 118
Slide 119
Slide 119 text
でも 119
Slide 120
Slide 120 text
大変すぎる すぐバグる 120
Slide 121
Slide 121 text
200 OKを返しているのに エラーが起きまくる 121
Slide 122
Slide 122 text
結論 122
Slide 123
Slide 123 text
Webアプリケーションは awkじゃない言語で作ろう 123 複雑な