Slide 1

Slide 1 text

Perl + Go࣮ӡ༻ͷ࿩ @mackee_w a.k.a Ϛίϐʔ ໘ന๏ਓΧϠοΫ 2015-12-16 Gotanda.pm #7 vs Yokohama.pm #13

Slide 2

Slide 2 text

͜Μ͹ΜΘ

Slide 3

Slide 3 text

୭ʁ • Yokohama.pm෭ Ϧʔμʔ • twitter:@mackee_w • github:mackee • ໘ന๏ਓΧϠοΫ • ιʔγϟϧήʔϜͷ ։ൃͱӡ༻PG

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

Perl + Go࣮ӡ༻ͷ࿩ @mackee_w a.k.a Ϛίϐʔ ໘ന๏ਓΧϠοΫ 2015-12-16 Gotanda.pm #7 vs Yokohama.pm #13

Slide 6

Slide 6 text

෭୊

Slide 7

Slide 7 text

·ͨ͸ զʑ͸

Slide 8

Slide 8 text

೗Կʹͯ͠Perl ͚ͩΛ࢖͏͜ ͱΛࢭΊͯ https://flic.kr/p/q6cRh

Slide 9

Slide 9 text

GoͱPerlͷΩ ϝϥΛӡ༻͢ ΔΑ͏ʹͳͬ ͔ͨ https://twitter.com/bradfitz/status/335213285815226369

Slide 10

Slide 10 text

Section.0 Perl + Goͷ ߏ੒

Slide 11

Slide 11 text

Unity੡ͷΫϥΠΞϯτ (iOS/Android)

Slide 12

Slide 12 text

ELBͰड͚ͯPerlͷཱͬͯΔ AppαʔόʹϦόʔεϓϩΩγ

Slide 13

Slide 13 text

MySQLͷRDSʹAppαʔό͕ ܨ͛ͯΔ

Slide 14

Slide 14 text

ී௨ͳײ͡ Ͱ͸ʁʁʁ

Slide 15

Slide 15 text

͜ͷߏ੒͕ෳ਺͋ͬͯ

Slide 16

Slide 16 text

Goͷαʔόʹ಺෦APIͰୟ͘

Slide 17

Slide 17 text

No content

Slide 18

Slide 18 text

Section.1 Goͷ࠾༻

Slide 19

Slide 19 text

༩͑ΒΕͨ৚݅ • ૝ఆDAUʹ଱͑ΒΕΔ͜ͱ • γϯάϧϚελʔͩͱͭΒͦ͏ͳײ͕͡աڈ ͷ࣮੷͔Βͯ͠૝ఆ͞ΕΔ • શੈքʹಉ͡ΞϓϦΛ഑৴͢Δ • ϚϧνϦʔδϣϯ/DC΋ࢹ໺ʹ

Slide 20

Slide 20 text

γϟʔσΟϯά͸ʁʁʁ • DBIx::Classͷຐज़ʹΑΓطଘͷίʔυʹ͸ JOIN͕͍ͬͺ͍ • ͦͷ··΍ΔͳΒMySQL Clusterͱ͔Spider Engineͱ͔͚ͩΕͲฐࣾͰ࣮੷ͳ͍͠RDS ࢖͍͍ͨ͠

Slide 21

Slide 21 text

ήʔϜ಺ͷσʔλͷྲྀΕΛݟΔ • શϢʔβ͸ϥϯΫͱݺ͹ΕΔख़࿅౓͝ͱͷ֊ ૚ʹ෼͔ΕͯͦͷதͰϦʔάʹ෼͔ΕΔ • ࢼ߹(ͱݺ͹ΕΔఆ࣌ʹߦΘΕΔGvG)͸Ϧʔά ಺ͷάϧʔϓ͝ͱʹߦΘΕΔ • γʔζϯ࠷ޙʹϦʔά಺ͷ੒੷্ҐऀͰτʔ φϝϯτΛߦ͏

Slide 22

Slide 22 text

Αͬ͠ΌϦʔάͰDB෼͚Α͏ • ͪΐ͏ͲϦʔάΛ஍Ҭผʹ͢Δ࿩͕͋ͬͨͷ ͰͦΕʹͷ͔ͬͬͨ(=>ϚϧνϦʔδϣϯ) • Ͱ΋ݟͨ໨ϫϯϫʔϧυΛ࣮ݱ͢Δ(ϑϨϯυ ΍ΫϥϒҠ੶ͳͲ)ͨΊʹ͸தԝαʔό͕ඞཁ • ͦͯ͠๯಄ͷߏ੒͕ग़དྷ্͕ͬͨ

Slide 23

Slide 23 text

͜ͷ࣌఺Ͱ๻͸ GoΛ࠾༻͢Δ ཧ༝Λ୳͍ͯͨ͠

Slide 24

Slide 24 text

http://www.kayac.com/news/2014/07/golang

Slide 25

Slide 25 text

ͦΕ͔ΒԿϲ݄͔ܦͬͯ • झຯͰॻ͍ͨΓଞͷαʔϏεͰϛυϧ΢ΣΞ ͱͯ͠ಈ͍͍ͯΔౕΛݟͨΓ͍ͯͯ͠ಛੑత ͳ΋ͷ͸ݟ͖͑ͯͨ • ιγϟήʔΛ·Δ͖ͬΓϦϓϨʔε͢Δͷ͸ େมͩͱࢥ͏͕ɺػೳ͕ߜΒΕͯͨΒ͍͍ײ ͡ʹͳΔؾ͕͢Δ

Slide 26

Slide 26 text

Ϊδϡπతͳཧ༝෇͚ • Perlଆͷαʔόʹ͸1୆ʹ͖ͭଟ਺ͷϓϩηεཱ͕ͭ͜ͱ ʹͳΔ • ͦͷଟ਺ͷϓϩηε͔ΒͷHTTPϦΫΤετΛ͞͹͘ͷͨ Ίʹಉ͡ϓϩηε਺෼ͷPerlΛཱͯͯͨΒҙຯ෼͔Μͳ͍ ײ͡ʹͳΔͷͰ͸(΋ͪΖΜ಺෦APIͷ࢖͍ํʹΑͬͯ͸ͦ ͏ͳΒͳ͍ؾ΋͢Δ) • ϦιʔεΛޮ཰తʹ࢖͑ΔݴޠͰॻ͘ͷ͕͍͍ؾ͕͢Δʂ

Slide 27

Slide 27 text

Section.2 GoΛॻ͘

Slide 28

Slide 28 text

ࣾ಺ͷPerlͷίʔυ

Slide 29

Slide 29 text

ܕͰΨνΨνʹݻΊ͍ͯΔ ͷ͕΄ͱΜͲ

Slide 30

Slide 30 text

ܕΛຖճॻ͍͍ͯ ΔͳΒͦΕΛ࢖ͬ ͯίϯύΠϧ࣌ʹ ղܾͨ͠΄͏͕Α ͘Ͷʁ

Slide 31

Slide 31 text

ํ਑ • Ͱ͖Δ͚ͩ Go way Λ໨ࢦ͢ • net/httpΛͦͷ··࢖͏ • Ͱ͖Δ͚ͩPerlΛॻ͍͍ͯͨ࣌ͱಉ͡ߟ͑Ͱॻ ͚ΔΑ͏ʹ͢Δ • Goʹͳͬͯศརʹͳͬͨ͜ͱ͸ར༻͢Δ

Slide 32

Slide 32 text

IDLͷ࿩ • IDL = Interface Definition Language • ྫ: JSON Schema, Swagger, Protobuf • RPCͳͲͷΠϯλʔϑΣΠεΛઐ༻ݴޠͰఆٛ ͯͦ͠ΕΛར༻ͯ͠ίʔυΛੜ੒ͨ͠Γ͢Δ

Slide 33

Slide 33 text

ฐࣾͷIDLͷ࿩ • ΋ͱ΋ͱBaalͱ͍͏ಠࣗIDL͕ࣾ಺Ͱ࢖ΘΕ͍ͯ ͨ • BaalͰServiceͱεΩʔϚΛఆٛ͠ɺC#(Unity)ͷ APIୟ͘ίʔυΛੜ੒͢Δ • PerlͰίϯτϩʔϥͷςετΛॻ͘ͱ͖ʹBaalͰ ܕ΍εΩʔϚ͕͍͋ͬͯΔ͔ΛνΣοΫ͢Δ

Slide 34

Slide 34 text

go generateͷػӡ • BaalͰΫϥΠΞϯτ͕ੜ੒Ͱ͖ΔͳΒαʔό (ͷίϯτϩʔϥ)΋ੜ੒Ͱ͖Δ͸ͣ • ΍ͬͯΈͨ -> Ͱ͖ͨ • ϝϦοτ: ϦΫΤετΛύʔεͯ͠Goͷܕʹม ׵͢ΔͷͰิ׬ʹग़ͯ͘Δ࠷ߴ

Slide 35

Slide 35 text

࣮ࡍͷBaalͷྫ ϑϨϯυਃ੥ namespace Data.Request { entity FriendRequestRequest { /# ਃ੥͢ΔϢʔβ #/ UserId: !long; /# ਃ੥͞ΕΔϢʔβ #/ TargetUserId: !long; } } namespace Data.Response { entity FriendRequestResponse { /# 1: ਃ੥த 2: ਃ੥͞Εத 3: ϑϨϯυొ࿥ࡁΈ #/ Status: !integer; } }

Slide 36

Slide 36 text

࣮ࡍͷBaalͷྫ ϑϨϯυਃ੥ namespace Service { service FriendService { /# ༑ͩͪਃ੥ /api/friend/request POST #/ Request: <= !Data.Request.FriendRequestRequest => !Data.Response.FriendRequestResponse; } }

Slide 37

Slide 37 text

ੜ੒͞Εͨίʔυ

Slide 38

Slide 38 text

ੜ੒͞Εͨίʔυ

Slide 39

Slide 39 text

͜ͷίʔυΛ࢖͏ͱ͜Ζ

Slide 40

Slide 40 text

͜ͷίʔυΛ࢖͏ͱ͜Ζ ิ׬ʹग़ͯ͘Δʂʂʂ

Slide 41

Slide 41 text

Go͔ΒDBΛѻ͏࿩ • ORMΛ࢖ΘͣʹΫΤϦϏϧμʔΛ࢖͏Α͏ʹͨ͠ • ϥΠϒϥϦ࠾༻ͷํ਑ͱͯ͠ʮࣗ෼͕ॻ͚ͦ͏ɺ ࣗ෼͕ϝϯςͰ͖ͦ͏ʯͳ΋ͷͱ͍͏ͷ͕͋Γ ·ͨ͠ • Ҏલgorp࢖ͬͨ͜ͱ͕͋ͬͯͦΜͳʹ޷͖͡Όͳ ͔ͬͨ

Slide 42

Slide 42 text

Go͔ΒDBΛѻ͏࿩ • ͱ͸͍͑DDLͱGoͷstructͱಉ͜͡ͱΛ2౓ॻ ͘ͷ͸ਏ͍ • ͷͰGoͷstructΛλά෇͖Ͱॻ͍ͨΒDDLʹม ׵͢ΔͷΛॻ͍ͨ -> ࢖͑ͨ࠷ߴ • ੾Γग़ͨ͠ -> github.com/mackee/go-genddl

Slide 43

Slide 43 text

͜Ε͕

Slide 44

Slide 44 text

͜͏ͳΔ

Slide 45

Slide 45 text

Section.3 Perl͔ΒGo

Slide 46

Slide 46 text

Perl͔ΒGoʹͭͳ͙ • GoͷAPIαʔό͸εςʔτϨεͳRESTful JSON API • ೝূͳ͠ɺηογϣϯͳ͠ • FurlͰͭͳ͍ͰϦΫΤετΛJSONʹύʔε͢ ΔΫϥεΛPerlଆʹ༻ҙͯͦ͠ΕΛ࢖͏

Slide 47

Slide 47 text

Goଆ͕མͪͯΔ࣌͸ʁ • Goଆ͕མͪͯશαʔόμ΢ϯ͸ආ͚͍ͨ • ํ਑1: ಺෦APIΛ༻͍ΔAPIΛݶఆ͢Δ • ํ਑2: མ͍ͪͯͯ΋ͳΜͱ͔Ͱ͖Δ৔߹͸ͳΜͱ͔͢ Δ • ํ਑3: མ͍ͪͯͯ΋ͳΜͱ͔Ͱ͖ͳ͍৔߹͸ૉ௚ʹࢮ ΜͰΤϥʔΛग़͢

Slide 48

Slide 48 text

ͳΜͱ͔Ͱ͖Δ৔߹͸ͳΜͱ͔ ͢Δ • ྫ: ϩάΠϯޙʹදࣔ͞ΕΔϚΠϖʔδͷ͓஌ ΒͤAPI(࣮͸͓஌Βͤ͸தԝαʔόʹ಺෦API Ͱ໰͍߹Θͤͯ഑৴͍ͯ͠Δʂʂʂ) • ࢮΜͰ͍Δ৔߹ -> 200Ҏ֎͕ؼ͖ͬͯͨ࣌ͷ ྫ֎ΛΩϟονۭͯͬ͠ΆΛฦ͢ -> શମͱ͠ ͯ͸ੜ͔͢

Slide 49

Slide 49 text

τϥϯβΫγϣϯ͕࢖͑ͳ͍໰ ୊ • ผαʔόผDBͳͷͰ౰વͦͷؒͰී௨ͷτϥϯβ Ϋγϣϯ͸࢖͑ͳ͍ • ͳͷͰGoଆAPIΛႈ౳(ಉ͡ϦΫΤετΛԿ౓ୟ͍ ͯ΋ಉ݁͡ՌʹͳΔ)ʹͳΔΑ͏ʹ഑ྀ͢Δ • ྫ: ϑϨϯυਃ੥Λ2౓ୟ͍ͯ΋ʮϑϨϯυਃ੥͠ ͨΑʔʯͱฦ͢ɻDBͷঢ়ଶ͸2౓໨͸ͦͷ··

Slide 50

Slide 50 text

Section.4 Ωϝϥͷӡ ༻

Slide 51

Slide 51 text

σϓϩΠํ๏ • consulͷϚϧνDCͰͦΕͧΕߏ੒͞Ε͍ͯΔ • ͦΕͧΕͷDCʹconsul eventΛൃߦ͢Δ -> stretcher ͰS3ʹ্͛ͨtarballΛpull͖ͯͯ͠σϓϩΠ • σϓϩΠ͢Δ΋ͷ͸ಉ͡tarballʂʂ̍̍ • daemontoolsͰཱͬͯΔαʔϏε͕ҧ͏

Slide 52

Slide 52 text

GoͷϏϧυํ๏ • σϓϩΠεΫϦϓτ಺ͰϏϧυ͍ͯ͠Δ • ґଘύοέʔδ΋ͦ͜Ͱͱ͍ͬͯΔ • ςετ͍ͯ͠Δ΋ͷͱࠩ෼͕ग़ΔՄೳੑ͕͋Δ…… ͪΐͬͱා͍ • ґଘύοέʔδ͸ࣗ෼ͷσΟϨΫτϦҎԼʹִ཭͍ͯ͠ Δ(vendoringͬΆ͍͚ΕͲόʔδϣϯ؅ཧ͸͍ͯ͠ͳ͍)

Slide 53

Slide 53 text

No content

Slide 54

Slide 54 text

࣮ࡍʹӡ༻ʹೖͬͯ • GoଆىҼͷόά΍τϥϒϧ͸ͳ͠(!) • ຊ౰ʹؾΛ͚ͭ·ͬͯ͘ॻ͍͍ͯΔͷͰͦΕ͕ޭ Λ૗͍ͯ͠Δؾ͕͠ͳ͍Ͱ΋ͳ͍ • ͋ͱCPU΁ͷෛՙ͕ΊͪΌগͳͯ͘ຊ౰ʹಈ͍ͯ ͍Δͷ͔৺഑ʹͳΔϨϕϧ(ൺֱର৅͸DBIx::Class ͱDateTimeΛΨϯΨϯ࢖͍ͬͯΔPerlଆͷαʔό)

Slide 55

Slide 55 text

೰Έ • νʔϜ಺ʹGoͷίʔυʹखΛग़ͤΔਓ͕গͳ ͍ • ͦΜͳʹػձ͕ଟ͘ͳ͍ͷ΋͋Δ • ؾ߹ೖΕͯॻ͔ͳ͍ͱ͍͚ͳ͍͠ɺԿΑΓจ Խݍ/ߟ͑ํ͕ҧ͏ͷͰֶͼ௚͠ʹͳΔ

Slide 56

Slide 56 text

·ͱΊ • GoͰϑϨϯυͱ͔࣮૷͢Δͷ͕ඇৗʹ಄Λ͜Ͷ͘Γճͯ͠๐͸ ͖ͳ͕Β΍͚ͬͨΕͲษڧʹͳͬͨؾ͕͢Δ • ϚΠΫϩαʔϏεతʹαʔό෼͚Δͷ͸ΞϦ͔΋͠Εͳ͍(Ψνϟ ͱ͔ڞ௨Ͱ͠ΐ) • ͕ɺτϥϯβΫγϣϯ͕΍͸Γ೉఺ • GoͰϑϧεϖοΫͷιγϟήʔΛॻ͘ͷ͸ࠓͷஈ֊Ͱ͸ແཧʂɹ ͚ͩΕͲϥΠϒϥϦ(ಛʹORM)ͷ஌ݟ͕ஷ·Ε͹ߦ͚Δؾ͕͢Δ