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 複雑な