Slide 1

Slide 1 text

Perl to Go Yuji Shimada @xaicron YAPC::TOKYO 2019 ASAKUSABASHI HULIC HALL & HULIC CONFERENCE Jan, 26 2019 [SAT]

Slide 2

Slide 2 text

Ε΀ͫΩ Go 䨗͚ͼΔͯ͡Ҙ

Slide 3

Slide 3 text

㰜΅݄ଙ΄Ӿ殹͡Ο䨗ͣতΗΔͭ͵

Slide 4

Slide 4 text

ͩ΄ϕЄμͽ΅ Perl Ψ 10ଙͦΟ͚՛Ԫͽ 䨗ͣ姆ͧͼͣ͵ͮͫ͠Ω͢ Go ͽ Web API Ψ֢͹ͼ஑͵Ӟ᭗Π΄ίϹΨ࣮΢ၞͯΘ΄ ΁΀ΠΔͯ

Slide 5

Slide 5 text

Go ͽ WebίϤϷξЄτϴЀΨ䨗ͥၞ΢͢ ͬ͹ͥΠഽΗΡ;Ξ͚ͽͯ΃

Slide 6

Slide 6 text

΅͚

Slide 7

Slide 7 text

ίυδЀύ • ΀Ͳ Go ͡ • Perl Monger ͢ Golang ΨতΗΞ͜͹ͼ䦒΁Ϝϫ͹͵;ͩΣ • Go ΄᥺承՛䯭ͽ਍Ό Perl ;΄ፘ晅ᅩ • Web API Ψ֢͹ͼΕΞ͜ • ϓφϕΨ䨗ͥ • Docker Ϡϸϖͭͼ㵕ͯ͡ • Δ;Η

Slide 8

Slide 8 text

΀Ͳ Go ͡

Slide 9

Slide 9 text

΀Ͳ Go ͡ • ίυδЀύ • WebςЄϝЄ;ͭͼΕ͵ Go • πϫЀϖ϶αЀϑЄϸ;ͭͼΕ͵ Go

Slide 10

Slide 10 text

WebςЄϝЄ;ͭͼΕ͵ Go (1) • ฌՔ΅ηЀϤϹΨ晁አͯΡ΄΅ύγЀϕϹЀϖ΁΀͹ͼͣͼ͚ Ρ • μ϶γϖӤͽͭ͡ΘπЀϓϗӤͽίϤϷξЄτϴЀΨ㵕ͯͩ͡ ;͢୮ᆐ΁΀͹ͼ͚Ρ

Slide 11

Slide 11 text

WebςЄϝЄ;ͭͼΕ͵ Go (2) • πЀϓϗ΅ηЀϤϹ;ྲΏΡ;涥ͥΑͿ΄֗φϧϐμ΄ςЄϝЄӤͽ㵕̵ͭ͡ හ܈뺶හጯݣ㪔ΏΡΞ͜΀ොݻ • ςЄϝЄ΄φϧϐμ͚֗͢͵Ηṛ᭛ͽ㵕̵֢ͭ͡ͺϮϯϷ㵁ሲΘΞ͚᥺承͢࿢ ΗΟ΢Ρ • ͫΟ΁πЀϓϗᛔ֛΄ςαχΘੜͫͥͭ͵Α͜͢Ӟᛱጱ΁᩸㵕᭛ଶ͢Ӥ͢Ρ͵ Ηੜͫͥͭ͵͚ • φμϷϤϕ᥺承΄Ξ͜΁϶Ѐόαϭ͢஠ᥝ΀Θ΄΅හጯMBΨ᩻͞ͼͭΔ͚᭿ ͧ͵͚

Slide 12

Slide 12 text

WebςЄϝЄ;ͭͼΕ͵ Go (3) • Go ΄䁰ݳ΅ • ϝαϗϷΨ֢౮ͯ΢Ά϶Ѐόαϭ͢஠ᥝ΀͚͵ΗπЀϓϗ΄ςαχΨಪ ͞Ρͩ;͢ͽͣΡ • ฦ᭗΁䨗ͥͶͧͽ Java Κ C ΁܃䤔ͯΡΑͿṛ᭛͡ͺ፜ϮϯϷͽ㵕֢ͯΡ • gorutine ΁ΞΠ̵ᛔᆐ;㵁ሲጱ΁CPU;ᑮ樌ΨڥአͯΡͩ;͢ͽͣΡ • Ӥ懿΄ᇙ䖀΅ηЀϤϹͽΘ㱢֖΁㰕ͥ

Slide 13

Slide 13 text

πϫЀϖ϶αЀϑЄϸ;ͭͼΕ͵ Go (1) • 樄咲ᘏ͡ΟͯΡ; • CPUΚϮϯϷ΄௔ᚆ͢Ӥ͢͹͵΄; go ΄πЀϞαϸᛔ֛͢ṛ ᭛΀͵Η LL ;晉ᜋ͢΀͚ϹϦϸͽ墋㶨΁πЄϖΨ䨗͚ͼ手ͯ ͩ;͢ͽͣΡ΄ͽφμϷϤϕఽ憝ͽπЄϖΨ䨗ͥͩ;͢਻ฃ • ل樄ͯΡ;ͣΘμϺφπЀϞαϸ͢਻ฃ΀΄ͽϝαϗϷΨኞ ౮ͭͼ晒୮΀䁰ಅ΁ίϐϤͭͼͧ͠ΆΞ͚

Slide 14

Slide 14 text

πϫЀϖ϶αЀϑЄϸ;ͭͼΕ͵ Go (2) • ڥአᘏ͡ΟͯΡ; • ϚϐϕϼЄμ΄᭛ଶ͢ค΁ྲΏͼݻӤͭͼ͚Ρͭϔΰφμς αχΘ䃀͞ͼ͚Ρ΄ͽහ܈MB΄ϝαϗϷΨύγЀϺЄϖͯΡ ΄΅֜΄㺔氂Θ΀͚ • φμϷϤϕ᥺承;晅͚϶Ѐόαϭ͢஠ᥝ΀͚΄ͽϝαϗϷΨ ϪЀ;ͥ͠Ͷͧͽֵ͞ͼ׎ڥ

Slide 15

Slide 15 text

Ӥ懿΄Ξ͜΀ቘኧ΀Ϳͽ匍դͽ͚Σ͚Σ΀ ఺ޱͽֵ͚Κ͚ͯ᥺承Ͷ;ఽͮΡ

Slide 16

Slide 16 text

ΑΩ;΅ၞᤈ͹ͼΡ͡ΟΚ͹ͼΕt

Slide 17

Slide 17 text

΅͚

Slide 18

Slide 18 text

ίυδЀύ • ΀Ͳ Go ͡ • Perl Monger ͢ Golang ΨতΗΞ͜͹ͼ䦒΁Ϝϫ͹͵;ͩΣ • Go ΄᥺承՛䯭ͽ਍Ό Perl ;΄ፘ晅ᅩ • Go ͽ๋ṛ΄ Web API Ψ֢͹ͼΕΞ͜Ѻ • Go ͽ͚͚ے仂ϓφϕΨ䨗ͥʹѺ • ͚͚ఽͮ΁ϠϸϖͭͼϷϷЄφͯΡʹѺ • Δ;Η

Slide 19

Slide 19 text

Perl Monger ͢ Golang ΨতΗΞ͜͹ͼ䦒 ΁Ϝϫ͹͵;ͩΣ • ίυδЀύ • CPAN ͢΀͚ • $GOPATH ͡Οᭈ΢Ο΢΀͚ • ϶αϣ϶Ϸ΄ᓕቘොဩ͢ΖͰ͚ • ηЄςϷЀνϑЄϸ͢΀͚

Slide 20

Slide 20 text

CPAN͢΀͚ (1) • Go ΅ git repository ΄ URL Ψ೰ਧͭͼαЀφϕЄϸͯΡ • CPAN Κ Ruby gems Κ npm ΄Ξ͜΀Ӿ।ᵞ䰱ጱςЄϝЄ͢ ΀͚ • Ӟͺ΄;ͩΣ΁Δ;Δ͹ͼ΀͚΄ͽ͚ͩͩ͜͜;ͭ͵͚ͧͿ ΀΁͚͚͡϶αϣ϶Ϸ΀͚͡΀뺶;റͯ΄͢ࢯ櫞

Slide 21

Slide 21 text

CPAN͢΀͚ (2) • ϶αϣ϶ϷΨറͯ;ͣ΅ • github.com ͽ golang + hogehoge ͯΡ • Έ͵ͯΟννΡ • ํ挷ᘏ΁守ͥ • etc…

Slide 22

Slide 22 text

CPAN΁ၺ͡͹ͼኞͣͼͣ͵΄ͽͺΟ͚

Slide 23

Slide 23 text

❗ͩͩͽ๔䁭ѺѺ

Slide 24

Slide 24 text

๔䁭 • https://blog.golang.org/modules2019 • ਖ਼๶ጱ΁ҁ2019ଙӾҘ҂΁ Module Indexer Ψ֢ΡԨਧΟͭ ͚ѺѺΚ͹͵΃ѺѺ • Ք஍ CPAN Testers ጱ΀Θ΄Θͽͣͼ͚ͣͳ͜΀䶲ͯ͢Ρҁ㮆 Ոጱ΀Ԩమͽͯ҂

Slide 25

Slide 25 text

๔䁭 • ϶αϣ϶Ϸ΄ύγЀϺЄϖ΄ mirror Θ֢౮Ԩਧ;΄ͩ; • ͩ΢΅ Go 1.13 ͽ䌏䖕ͯΡΕ͵͚΀΄ͽ 2019.8 ΁΅ϷϷЄ φͫ΢Ρ͹Γ͚Ҙ • ֺ͞Ά github.com ៧ͷͼΘ mirror ͡ΟύγЀϺЄϖͽͣΡ Ξ͜΁;͚ͩ͜;Ο͚ͭ

Slide 26

Slide 26 text

minicpan ͽ CPAN mirror 䯤塈ͭͼ 䶅෭ cron ͽ ๅෛͭͼ͚͵෭̸Ψ௏͚ڊͭ Δͯ΃

Slide 27

Slide 27 text

$GOPATH ͡Οᭈ΢Ο΢΀͚ (1) • golang ͽ΄樄咲΅ଉ΁ $GOPATH ΄ӥͽᤈ͜஠ᥝ͘͢Ρ • ͘ΟΜΡ϶αϣ϶Ϸ͢ $GOPATH ΄ӥ΁ᗝ͡΢Ρڹ൉΁΀͹ͼ ͚ͼ͡ͺ $GOPATH ΄ᯈӥͽ樄咲ᤈΥ΀͚;ᶎׯ΀ͩ;΁΀Ρ

Slide 28

Slide 28 text

$GOPATH ͡Οᭈ΢Ο΢΀͚ (2) • Go 1.8 զᴳͽ΅ $GOPATH ΅ϔϢζϸϕͽ $HOME/go ΁΀͹ ͼ͚Ρ • ͷΝ͹;;͹ͺͣΚͯͥ΀͹͵

Slide 29

Slide 29 text

$GOPATH ͡Οᭈ΢Ο΢΀͚ (3) • Go 1.12 ͽفΡ go mod ͽ $GOPATH Ψ䶲΁ͭ΀ͥͼΘΞͥ΀ΡΟ͚ͭ…͢ • ͚ΔΔͽل樄ͫ΢ͼͣ͵͘ΟΜΡϯυϲЄϸ͢ semver ΁䌏䖕ͯΡ஠ᥝ͘͢Ρ • go mod ͽΘϯυϲЄϸ΄κϰϐτϲ΀Ϳ΅ $GOPATH ᯈӥ΁֢Ο΢Ρ΄ͽ ਠق΁䶲΁ͭ΀ͥͼΞͥ΀ΡΥͧͽ΅΀ͫͳ͜ • ͳΘͳΘ $GOPATH ΄ᯈӥͽͰ͹;Κ͹ͼͣ͵͡Ο嬹䙼Ψ䄜͞Ρ΄΅䦒樌͢ ͡͡Πͳ͜ • Go 1.12 ΅ 2019.2 ΁ϷϷЄφԨਧѺҁΘͯͦ͜ͽͯ΃ѺѺ҂

Slide 30

Slide 30 text

϶αϣ϶Ϸ΄ᓕቘොဩ͢ΖͰ͚ (1) • ϶αϣ϶Ϸ΄αЀφϕЄϸ΅ go get πϫЀϖΨֵ͜ • go get -u github.com/motemen/gore ΄Ξ͜΀୵ୗͽׁਂ樛㭚ΘތΗͼαЀφ ϕЄϸͭͼͥ΢Ρ • $GOPATH/src ΁ΘΣΘΣ git clone ͫ΢ͼϠϸϖ͢ᩳΡ • Քࢧ΄ξЄφͶ; $GOPATH/src/github.com/motemen/gore ΀Ϳ • πϫЀϖ϶αЀϑЄϸΘ $GOPATH/bin ΁ϠϸϖͭͼαЀφϕЄϸͭͼͥ΢Ρ • perl ͽ cpanm install Foo::Bar ͯΡ΄;Ͷ͚͵͚Ӟ姼

Slide 31

Slide 31 text

No content

Slide 32

Slide 32 text

϶αϣ϶Ϸ΄ᓕቘොဩ͢ΖͰ͚ (2) • go get ͽαЀφϕЄϸͫ΢Ρ΄΅ git repository ΄ master ΄ HEADѺ • 䋚檭΅ go1 ;͚͜ branch or tag ͘͢΢Άͳ΢Ψ憎ΡͧͿΑ Βၺ᭐ͭͼ͚΀͚ཛྷ䯭 • master ͢ stable ͡Ϳ͜͡΅Υ͡ΟΩ΄ͽ΀͡΀͡㷗͚ͭΘ΄ ͘͢Ρ

Slide 33

Slide 33 text

϶αϣ϶Ϸ΄ᓕቘොဩ͢ΖͰ͚ (3) • go get ͽ΅ version Ψ೰ਧͭͼݐ஑ͯΡͩ;͢ͽͣ΀͚ • ͳΘͳΘ version ᓕቘͫ΢ͼ͚ΡϯυϲЄϸ͢੝΀͚ѺѺ • Go 1.12 ͽفΡ go mod ΁ΞΠ semver Ψֵ͜Ξ͜΁΀Ρ΄ ͽϮЀϓͫ΢ͼ͚Ρ϶αϣ϶Ϸ΁΅ၺ᭐ͭͼ͚͹ͼ΅͚Ρ

Slide 34

Slide 34 text

;΅͚͞

Slide 35

Slide 35 text

WebίϤϷξЄτϴЀ΀ͿΨ䨗ͥ䁰ݳ΅ go get Ψፗളֵͩ͜;΅च๜ጱ΁΅΀͚

Slide 36

Slide 36 text

WebίϤϷξЄτϴЀΨ䨗ͥ;ͣ΄϶αϣ ϶Ϸ΄ᓕቘ (1) • Carton Κ bundler ΄Ξ͜΀̵ϤϺυδμϕᯈӥ΁஠ᥝ΀ϯυϲЄ ϸΨϝЄυϴЀࢴਧͭͼαЀφϕЄϸͯΡ՛奲ΕΨֵͩ͜;͢Α ;ΩͿ • go get Ψֵ͜΄΅ᇙਧ΄ϯυϲЄϸ΄䞉㵕Ψ抠Ώ͵͚;̵͡π ϫЀϖֵ͚͵͚;͡͹ͼ䁰ݳ͢Α;ΩͿ • ͭͭ͡ vendoring / glide / dep / vgo / go mod ;͚Σ͚Σ͘͹ͼ 奾ੴͿ΢ֵ͞Ά͚͚΄Ҙ;΀Ρ

Slide 37

Slide 37 text

WebίϤϷξЄτϴЀΨ䨗ͥ;ͣ΄϶αϣ ϶Ϸ΄ᓕቘ (2) • ୮ᶎ΅ glide / dep / go mod Ψֵ͚ړͧͼ͚ͥ஠ᥝ͘͢Ρ;௏Υ΢Ρ • glide / dep ΅ֵΥ΢ͼ͚ΡϤϺυδμϕ͢ग̵़ͥΑΒΑΒ๗இ᭗Π΁㵕 ͥ΄ͽ㪥Π䟵͞ΡϯώϦЄτϴЀ֗͢ͳ͜ • vgo ΅ go mod ;ͭͼ Go ΁ݐΠ旿Δ΢͵΄ͽ஫΢ͼᜉ͚ • Go 1.12 ͡Ο΅ go mod Ψֵ͹ͼ͚ͥͩ;΁΀Ρ΅Ͱ • 匍ࣁ΄ Go 1.11 ͽ΅ $GO111MODULE =on ΁ͭͼͥ͠;͠手ͭͽͣΡ

Slide 38

Slide 38 text

;͚͜Υͧͽ ΔͶΔͶͩ΀΢ͼ΀͚᮱ړ͘͢Ρఽͮ

Slide 39

Slide 39 text

ηЄςϷЀνϑЄϸ͢΀͚ (1) • Go ΁΅ηЄςϷЀνϑЄϸ΄䷥ਧᇇ΄Ξ͜΀Θ΄͢΀͚ • Δ͹ͫΟ΀य़ࣈ͡ΟতΗΡͩ;΁΀Ρ • go xxx πϫЀϖΨ;΁ͥ͡಑ͺ͡ Makefile Ψ;΁ͥ͡䨗ͥͩ;΁΀Ρ • Ϡϸϖ͢ͳͩΔͽ櫞ͭͥ΀͚΄ͽ̵ͳΩ΀΁ࢯΟ΀͚;͚͞ΆࢯΟ΀͚͢… • ϷϷЄφ䦒΁ tag ಑͹͵Π̵Ϡϸϖͭ͵ϝαϗϷ΁ version ईΗ旿ΩͶΠ΀Ϳਧࣳ ΄㳌ቘ΅ generate ͭ͵͚ཿ • ;ͥ΁ go mod ΁ΞΠ϶αϣ϶Ϸ΄ϝЄυϴЀᓕቘ͢᯿ᥝ΁΀͹ͼ͚ͥ

Slide 40

Slide 40 text

ηЄςϷЀνϑЄϸ͢΀͚ (2) • ౯̸΅ Minilla Κ ExtUtils::MakeMakerҁݘ͚҂ ΁䙼΢ͯͤͼ ͭΔ͹͵ΩΚ… • go mod Θֵ͞ΡΞ͜΁΀Ρ̵ͭΒͷΒͷͩ΄旽΄ϑЄϸΘڊ ͼͣͼΘ͚͚殹΀䶲΅ͯΡ

Slide 41

Slide 41 text

ഄΠᬬ͹ͼΕΡ;ΘΣΘΣ϶αϣ϶Ϸ΄䜷 ͚;͡ͽϜϫ͹ͼ͚͵

Slide 42

Slide 42 text

ͭ͡ΘՔ஍Θ䄜Υ͹ͼ͚ͥ΄ͽ͘͹͵

Slide 43

Slide 43 text

΅͚

Slide 44

Slide 44 text

ίυδЀύ • ΀Ͳ Go ͡ • Perl Monger ͢ Golang ΨতΗΞ͜͹ͼ䦒΁Ϝϫ͹͵;ͩΣ • Go ΄᥺承՛䯭ͽ਍Ό Perl ;΄ፘ晅ᅩ • Web API Ψ֢͹ͼΕΞ͜ • ϓφϕΨ䨗ͥ • Docker Ϡϸϖͭͼ㵕ͯ͡ • Δ;Η

Slide 45

Slide 45 text

Go ΄᥺承՛䯭ͽ਍Ό Perl ;΄ፘ晅ᅩ • ίυδЀύ (1) • 䄜හ;ࣳ΁ͺ͚ͼ • 樛හ΁ͺ͚ͼ • ε϶ЄϜЀϖϷЀν΁ͺ͚ͼ • defer ΁ͺ͚ͼ • gorutine ΁ͺ͚ͼ • context.Context ΁ͺ͚ͼ • package ΁ͺ͚ͼ

Slide 46

Slide 46 text

Go ΄᥺承՛䯭ͽ਍Ό Perl ;΄ፘ晅ᅩ • ίυδЀύ (2) • ګக䯤෈΁ͺ͚ͼҁif / for / while / switch҂ • goto ΁ͺ͚ͼ • Struct ΁ͺ͚ͼ • interface ΁ͺ͚ͼ • code formatter ΁ͺ͚ͼ • linter ΁ͺ͚ͼ

Slide 47

Slide 47 text

䄜හ;ࣳ΁ͺ͚ͼ (1) • 䄜හ΅ calemCase ͽਧ嬝ͯΡ • 䄜හ΁΅ࣳ͘͢Π̵Ӟଶਧ嬝ͫ΢͵Ο㳨΄ࣳ΅դفͽͣ΀͚ • ᯈڜ;φ϶αφ;͚༷͜ஷ͘͢͹ͼፗఽጱ΁ቘᥴͭͻΟ͚͢च ๜ጱ΁΅φ϶αφֵͭ͡Υ΀͚΄ͽ䶲΁ͭ΀ͥͼᜉ͚ • φ϶αφ΅ͬ͹ͥΠ͚͜;ݢ䄜槱΄ᯈڜΕ͵͚΀Θ΄

Slide 48

Slide 48 text

No content

Slide 49

Slide 49 text

䄜හ;ࣳ΁ͺ͚ͼ (2) • Perl ΅ٖ᮱ጱ΁ࣳఘ䁭ΨΘ͹ͼ͚Ρ͢΀ΩͽΘϣώ旿ΗΡ • Scalar::Util::dualvar ΀ͿΨֵ͞ΆӞͺ΄䄜හͽ愢හ΄ࣳ΄㳨 ΄㮔ΨΌͷ旿Ζͩ;Θݢᚆͽ͚ͯͪ • Go ΅ᶉጱࣳ՞ͧ᥺承΀΄ͽࣳ͢͡͹ͷΠͭͼ͚Ρ̵͢ग़ͥ΄ 䁰ݳͽࣳΨ䨗͚ͼࢧΟ΀ͥͼΘπЀϞα϶͢Ξͭ΀΁ͭͼͥ΢ Ρ

Slide 50

Slide 50 text

樛හ΁ͺ͚ͼ (1) • 樛හ΅ func (୚හ) 䜟Π㮔 { … } ;͚͜୵ୗͽ懿ᬿͯΡ • 樛හݷ΅ PascalCase ͽ䨗ͥ; public ;΀Π camelCase ͽ䨗ͥ ; private ΁΀Ρ • ݢ䄜槱୚හΨݑͧ՞ͧΡͩ;ΘͽͣΡ

Slide 51

Slide 51 text

No content

Slide 52

Slide 52 text

樛හ΁ͺ͚ͼ (2) • 樛හ΅愢හ΄㮔Ψᬬͯͩ;ΘͽͣΡ • Perl ͹Γ͚ͽͯ΃Ѻ • 樛හ΅䄜හ΁դف̵ͭ՜΄樛හ΁Ⴡͯͩ;ΘͽͣΡ • ΘͷΣΩ僻ݷ樛හΘ֢΢Ρ

Slide 53

Slide 53 text

No content

Slide 54

Slide 54 text

樛හ΁ͺ͚ͼ (3) • Perl ͽ΅樛හϷϢήϹЀφΨ䄜හ΁ف΢ͼჁͯͩ;ΘͽͣΡͧ Ϳ go ΅Ϳ͹ͷ͡;͚͜; JavaScript ͹Γ͚ఽͮ • ͵Ͷ̵ͭ樛හΨ୚හ΁ͭ͵Π䜟Π㮔΁ͯΡ䁰ݳ΁τνϚώϰЄ Ψق᮱䨗ͥ஠ᥝ͘͢Ρ

Slide 55

Slide 55 text

ε϶ЄϜЀϖϷЀν (1) • go ΅ perl ;ݶͮͽ throw exception Κ try / cache ΄Ξ͜΀ֺक़䱛䯤 ͢΀͚ • ֺक़Ψڊͯ䁰ݳ΅ panic() Ψֵ͜ • perl ͽ΅͠΀ͮΕ΄ die ͽͯ΃Ѻ • panic() ΨκϰϐώͯΡ΄΅ defer func () { recover() } Ψֵ͜;ͽͣΡ • perl ͽ΅͠΀ͮΕ΄ eval ͽͯ΃Ѻ

Slide 56

Slide 56 text

No content

Slide 57

Slide 57 text

̵ͭͭ͡᭗ଉ΅ panic() Ψֵͩ͜;΅വ䅏 ͫ΢ͼ͚ΔͱΩѺѺ

Slide 58

Slide 58 text

ε϶ЄϜЀϖϷЀν (2) • ᛘ޸ጱ΀ε϶ЄͽϤϺψφΨ奰ԧͭ΀ͧ΢Ά΀Ο΀͚䦒΁ᴴ͹ ͼֵ͜Ώͣ • ͭ͵͢͹ͼ recover() ΄ڊኾΘᛔͰ;Α;ΩͿ΀͚ • WebίϤϷξЄτϴЀ΀Ϳͽ΅΂ΡΓΚOutOfIndexጱ΀Θ΄ ͽ϶Ѐόαϭε϶Єͽ panic() ͢咲ኞͯΡݢᚆ௔΅͘Ρ΄ͽϷ μεφϕ΄Ӟኾक़㯎ͽ recover() ͯΡͦΟ͚

Slide 59

Slide 59 text

ε϶ЄϜЀϖϷЀν (3) • go ͽ΅ε϶Є㮔Ψ䜟Π㮔ͽᬬͯͩ;͢വ䅏ͫ΢ͼ͚Ρ • ڹᬿͭ͵Ξ͜΁ go ΄樛හ΅䜟Π㮔Ψ愢හᬬͯͩ;͢ͽ̵ͣच ๜ጱ΁΅๋஍΄䜟Π㮔͢ error αЀόЄϢδЄφΔ͵΅ bool ΁΀ΡΞ͜΁ͯΡ • αЀόЄϢδЄφ΁ͺ͚ͼ΅஍ᬿͭΔͯ

Slide 60

Slide 60 text

No content

Slide 61

Slide 61 text

ͩΩ΀ఽͮͽ樛හ΅ग़ͥ΄ξЄφͽ error ΨᬬͯΞ͜΁΀͹ͼ͚Ρ΄ͽ晒ڔ΁㳌ቘͯ Ρ஠ᥝ͘͢ΠΔͯ

Slide 62

Slide 62 text

defer ΁ͺ͚ͼ (1) • defer func() ͯΡ;匍ࣁ΄樛හ͡Ο䝏ͧΡ䦒΁ func() Ψ䋚ᤈͯΡ • Perl ͽ᥺͜ Scope::Guard ΁֒ͼ͚Ρ • go ΄ defer ; Scope::Guard ΄晅͚ • 䜟Π㮔͢΀͚΄ͽ̵Scope::Guard ΄ dismiss ΄Ξ͜΀ͩ;΅ͽͣ΀͚ • φπЄϤΨ䝏ͧ͵䦒ͽ΅΀̵ͥͥ͘ΔͽΘ樛හΨ䝏ͧ͵䦒΁ͭ͡咲㵕ͭ΀͚ • If Κ for ΄Ӿͽ defer Ψ䨗ͥ΄΅఺㾩ͭ͵䞉㵕;΀Ο΀͚ݢᚆ௔͢ṛ͚΄ͽဳ఺

Slide 63

Slide 63 text

No content

Slide 64

Slide 64 text

defer ΁ͺ͚ͼ (2) • 䋚΅Ӥ懿΄πЄϖ΅ε϶ЄΨൎΠͺΌͭͼ͚Ρ • file.Close() ΅ε϶ЄΨᬬͯͩ;͘͢Ρ • ͷΙΩ;ϜЀϖϷЀνͭ΀͚;͘͡Ωͽͯ

Slide 65

Slide 65 text

No content

Slide 66

Slide 66 text

defer ΁ͺ͚ͼ (3) • ͫΟ΁̵defer ͽ咲ኞͭ͵ε϶ЄΨ樛හ΄䜟Π㮔;ͭͼᬬͭ͵ 䁰ݳ΅Ӟૡॢ஠ᥝ΁΀Ρ • 樛හ΁ε϶Є͘͢Ρ͡Ϳ͜͡ͷΙΩ;嘦扯ͭͼ䶲Ψͺͧͼֵ͜ ஠ᥝ͘͢Ρ

Slide 67

Slide 67 text

gorutine ΁ͺ͚ͼ • Go Ψ᨝䖀ͯΡ䱛ᚆ • `go func()` ͯΡͶͧͽ̵㳨φϹϐϖͽ㳌ቘ͢ᩳΡ΄ͽ㪔ڜϤϺ ν϶ϬЀν͢墋㶨΁ͽͣͼͭΔ͜ • gorutine ݶॊ΄ΚΠ;Π΅ channel Ψֵͩ͜;ͽᤈ͜ • Perl ͽ͚͜ AnyEvent Κ Coro ;༷ஷ΅ΑΒӞ姼ͽͯ΃

Slide 68

Slide 68 text

context.Context ΁ͺ͚ͼ • ᇙਧ΄ gorutine Κ Ӟ昧΄㳌ቘ΄Ӿͽձ఺΄ϔЄόΨف΢ͼ୚ͣࢧͭ͵ Π̵κϰЀψϸ㳌ቘΨူ݊ͫͱΡ͵Η΀Ϳ΁ڥአͯΡ • Perl ΄ Amon2 Κ Catalyst (䛖͚ͭ͡) ΀Ϳ΄ $c ;֒͵Ξ͜΀༷ஷ • go ΄䁰ݳ΅ core ΁ف͹ͼ͚Ρ͵Η̵͚Σ͚Σ΀ϯυϲЄϸͽݶͮ API Ψ ڥአͯΡͩ;͢ͽͣΡ΄ͽΗͷΙͥͷΙֵΥ΢ͼ͚Ρ • ᇙ΁WebίϤϷξЄτϴЀΨ֢ΡӤͽ΅ όαϭίγϕΚٖ᮱ε϶Єͽ㳌 ቘΨκϰЀψϸͭ͵͚䦒΀Ϳ΁஠殾΄䱛ᚆͽ;΁ͥ͡୚ͣࢧͯͩ;΁΀Ρ

Slide 69

Slide 69 text

pacakge ΁ͺ͚ͼ (1) • go ͽϯυϲЄϸΨαЀϪЄϕͯΡ䁰ݳ΅ • core ΄䁰ݳ΅ net/http ΄Ξ͜΁ͯΡ • ͳ͜ͽ΀͚䁰ݳ΅ github.com/jmoiron/sqlx ΄Ξ͜΁ͯΡ

Slide 70

Slide 70 text

pacakge ΁ͺ͚ͼ (2) • net/http Ψֵ͜䁰ݳ΅ http.Get(“…”) ΄Ξ͜΁ http Ψ prefix ; ͭͼֵ͜ • net/http ΨαЀϪЄϕͭͼ͚ΡΞϢήαϸͽΘͭ github.com/ xaicron/http ΄Ξ͜΀ package ΨαЀϪЄϕͭΞ͜;ͯΡ; http ΄ prefix ͢ᤩ͹ͼͭΔ͜ • ͳ΄䁰ݳ΅αЀϪЄϕ;ͣ΁㳨ݷΨͺͧΡͩ;͢ͽͣΡ

Slide 71

Slide 71 text

No content

Slide 72

Slide 72 text

pacakge ΁ͺ͚ͼ (3) • package ΄φπЄϤ΁ͺ͚ͼ • sqlx ΄ϔΰϹμϕϷ䯤౮Ψ憎ͼΕΡ;̵Α;ΩͿ΄Ϣήαϸ ͢Ϣ϶ϐϕ΁ᗝ͡΢ͼ͚Ρ΄͢Υ͡Ρ • named.go ΀ͿΨΈΟͥ; package sqlx ;΀͹ͼ͚Ρ΄͢Υ ͡Ρ

Slide 73

Slide 73 text

pacakge ΁ͺ͚ͼ (4) • Perl ΄䁰ݳ΅ `ϔΰϹμϕϷ::Ϣήαϸݷ` ͢ package ݷͶ͢晅͜ • Go ΄䁰ݳ΅φπЄϤ΄塅㾨͢ package ΀΄ͽݶͮϔΰϹμϕ Ϸ΁͘Ρ *.go Ϣήαϸ΅قͼݶͮφπЄϤͽ͘Ρ • Perl ΅ϢήαϸφπЄϤ • Go ΄ϊЄφ΅ݶͮϔΰϹμϕϷ΄Ϣήαϸ΁㳌ቘ͢ړවͭͼ ͚Ρ΄͢ฦ᭗

Slide 74

Slide 74 text

ϞϐξЄυ΄䜷͚͢ Perl ;΅奾䯤晅͜΄ͽ 䶲ΨͺͧΡ஠ᥝ͘͢Ρ

Slide 75

Slide 75 text

ګக䯤෈΁ͺ͚ͼ (1) • If ΁ͺ͚ͼ • if ΁ೡୢ΅஠ᥝ΀ͭ • elseif ͽ΅΀ͥ else if • ӣ殻ᄍᓒৼ͢ਂࣁͭ΀͚͵Η̵ͺ΃΁ if ~ else Ψ䨗ͥ஠ᥝ͢ ͘Ρ

Slide 76

Slide 76 text

ګக䯤෈΁ͺ͚ͼ (2) • for ΁ͺ͚ͼ • for ΁Θೡୢ΅஠ᥝ΀ͭ • for ΄Ӿͽ΅ break ; continue ֵ͢͞Ρ • foreach 䯤෈΅΀͚͢դΥΠ΁ for … := range var { … } 䯤෈ ֵ͢͞Ρ

Slide 77

Slide 77 text

No content

Slide 78

Slide 78 text

while ΁ͺ͚ͼ • while ΀Ϳ;͚͹͵揞୧΀Θ΄΅΀͚ѺѺ • for ΄๵կ෈Ψ΀ͥͱΆ while ΁΀Ρ΄ͽ㺔氂΀ͭ • for n < 100 { n++ } ΄Ξ͜΀ఽͮ

Slide 79

Slide 79 text

switch ΁ͺ͚ͼ • 䘂ݷṛͣ switch ෈ͽ̵ͯ͢go ͽ΅Ξֵ͚ͥΔͯ • case ΄͘;΁ break Ψ䨗ͥ஠ᥝ͢΀͚΄ͽ఺㾩ͱͰེ΄ case ΁ᤈ͹ͼͭΔ͜;͚͜ϝν᩸ͩ͢Π΁͚ͥ • ེ΄ case ΁ᤈͣ͵͚䁰ݳ΅กᐏጱ΁ fallthrough Ψ䨗ͥ஠ᥝ ͘͢Ρ

Slide 80

Slide 80 text

No content

Slide 81

Slide 81 text

goto ΁ͺ͚ͼ • go ΁΅ goto ͘͢ΡѺΚ͹͵΃ѺѺ • goto ͢΀͚᥺承΅㷗͚ͭ͡Οͩ΢΅๋ṛͽͯ΃ (e.g. parser Ψ 䨗ͥ䦒΀Ϳ)

Slide 82

Slide 82 text

Struct ΁ͺ͚ͼ • ᥺ΥͰ;Ꭳ΢͵䯤᭜֛ • Struct ΁͵͚ͭͼ̵ϮϊϐϖΨኞΚͯͩ;͢ͽͣΡ΄ͽͩ΢͢ ΀͚;তΔΟ΀͚ • Perl ΄ηϣυδμϕ͹Γ͚Θ΄ • 抍กͭڊͯ;奰ΥΟ΀͚΄ͽ托奞΅፜ͣΔͯ

Slide 83

Slide 83 text

interface ΁ͺ͚ͼ • Interface ΁΅伋͵ͯΏͣ樛හ΄ਧ嬝Ψ䨗ͣΔͯ • go ΄ interface ΅ Java ;晅͹ͼกᐏጱ΁μ϶φҁGo ͽ΅ Struct҂΁奄ͻͣΔͱΩ • Struct ΄ො΁ interface ͢伋͵ͯΏͣϮϊϐϖΨͯΏͼ䋚ᤰͭ͵;ͣ΁̵interfcae Ψ䋚ᤰͭ͵;͚͜ᇫ丆΁΀ΠΔͯ • Interface ΁͘ΔΠ΁Θग़ͥ΄ਧ嬝Ψ䨗͚ͼͭΔ͜;䋚ᤰͯΡ㯎͢य़䄜΀͵Η̵ग़ ͥ΄䁰ݳ interface ΁΅1뺶හ㮆ᑕଶͭ͡䨗͡΢ΔͱΩ • 抍กͭڊͯ;奰ΥΟ΀͚΄ͽ托奞΅፜ͣΔͯ

Slide 84

Slide 84 text

code formatter ΁ͺ͚ͼ (1) • go ΅ϔϢζϸϕͽ go fmt ;͚͜πϫЀϖ͘͢Ρ΄ͽͩ΢Ψֵ ͩ͜;ͽπЄϖΨෆ୵ͯΡͩ;͢ͽͣΡ • go ͽ΅ go fmt Ψ᭗ͯͩ;͢୮͵Πڹ΁΀͹ͼ͚Ρ͵Η̵πЄ ϔΰЀνφόαϸ΅قӮኴو᭗ • perl ͽ΅ perltidy Κ App::PRT ΀Ϳ͘͢ΠΔͯ΃Ѻ

Slide 85

Slide 85 text

code formatter ΁ͺ͚ͼ (2) • perl ΄䁰ݳ΅̵parser ΅ C ͽ䨗͡΢ͼ͠Π͡ͺ㵕ጱ΁ AST Ψ 䯤塈ͯΡ͵Ηᶉጱᥴຉͽ΅ᴴኴ͘͢͹͵ΠͭΔ̵ͯ͢go ͽ΅ ͳΘͳΘπЀϞαϸ᥺承ͽ͘Ρ͵Ηͩ΄旽Π΅䜷͚Κͯͥ΀ͼ ͚Ρ • perl ͽΘ PPI Κ Compiler::LexerΚ Compiler::Parser Ψֵ͞Ά ͡΀Π΄ϹϦϸͽᶉጱᥴຉ΅ݢᚆͽͯ͢ਠኃ΁ΚΡ΄΅΀͡΀ ͡櫞͚ͭͽͯ΃

Slide 86

Slide 86 text

code formatter ΁ͺ͚ͼ (3) • go fmt ΨΘ;΁ͭ͵ go import Κ go returns ΀Ϳ΄ϑЄϸΘ ͘Ρ • च๜ጱ΁΅πЄϖ᮱ړ΄ෆ୵΅Ӟ姼ͽ̵import ΄ෆ୵ϸЄϸ ͢ͷΝ͹;晅͹͵Π return ෈Ψ愆ਠͭͼͥ΢͵ΠͯΡ • य़ͣͥ䄜ΥΟ΀͚΄ͽϤϺυδμϕ㶨֖ͽֵ͜Θ΄Ψࢴਧͯ ΢Ά㺔氂΀ͭ

Slide 87

Slide 87 text

linter ΁ͺ͚ͼ • go ΅ᶉጱᥴຉ͢ go ᛔ֛ͽΚΠΚ͚ͯ͵Η̵linter Θ꧌䋚ͭͼ͚Δͯ • 䰤伛πϫЀϖ;ͭͼ͘Ρ go vet ΚςЄϖϞЄϓΰ΄ go lint ΅๋֗ᴴֵ͜;͚͚ͽ ͭΝ͜ • go vet ΅πЀϞαϸε϶Є΁΅΀Ο΀͚ͧͿϮϯϷϷЄμ΀ͿͫΔͬΔ΀㺔氂΁΀ Πͳ͜΀πЄϖΨර͞ͼͥ΢Δͯ • go lint ΅ΞΠΞ͚πЄϔΰЀνφόαϸΨ suggest ͭͼͥ΢Δͯ • ͫΟ΁ͣΗ奞͡΀ώδϐμΨᤈ͚͵͚䁰ݳ΅ https://github.com/dominikh/go-tools Ψ手ͯͩ;ΘͽͣΔͯ

Slide 88

Slide 88 text

formatter Θ linter Θᛔړͽ͚ͷ͚ͷπϫ ЀϖΨݜͥ΄ͽ΅΀ͥ Editer ΁戔ਧͯΡͩ ;͢਻ฃ΀΄ͽͳ΄Ξ͜΁ͭΔͭΝ͜

Slide 89

Slide 89 text

΅͚

Slide 90

Slide 90 text

ίυδЀύ • ΀Ͳ Go ͡ • Perl Monger ͢ Golang ΨতΗΞ͜͹ͼ䦒΁Ϝϫ͹͵;ͩΣ • Go ΄᥺承՛䯭ͽ਍Ό Perl ;΄ፘ晅ᅩ • Web API Ψ֢͹ͼΕΞ͜ • ϓφϕΨ䨗ͥ • Docker Ϡϸϖͭͼ㵕ͯ͡ • Δ;Η

Slide 91

Slide 91 text

Go ͽ๋ṛ΄ Web API Ψ֢͹ͼΕΞ͜Ѻ • ίυδЀύ • WebςЄϝЄΨᒈͼΡ • πЄϖ΄䄜ๅ͘͢͹͵Οܨଷ΁ϠϸϖͯΡ • Database ΁ίμψφͯΡ • Web API Ψ䨗͚ͼ͚ͥ

Slide 92

Slide 92 text

WebςЄϝЄΨᒈͼΡ (1) • net/http Ψֵͩ͜;ͽ墋㶨΁ Web ςЄϝЄΨᒈͼΡͩ;͢ͽͣΡ • net/http ΅ςЄϝЄ΁Θμ϶αίЀϕ΁Θ΀Ρṛ䱛ᚆ΀϶αϣ϶ϷЄ • ςЄϝЄ΄䁰ݳ΅ٖ᮱ͽ㵛ಋ΁ gorutine Ψኞ౮ͭͼϷμεφϕ͢奰Υ͹͵ ΟᏈ䬤ͭͼͥ΢Ρ΄ͽ΀΁Θᘍ͞Ͱ΁ϷϊЄφΨ㵁ሲጱ΁ֵͩ͜;͢ͽͣΡ • Graceful ShutdownΘ墋㶨΁䋚匍ͽͣΡ΄ͽΞ͚ • HTTP/2 ΁Θ䌏䖕ͭͼ͚Ρ

Slide 93

Slide 93 text

ͩͩ΁πЄϖΨ䨗ͥ

Slide 94

Slide 94 text

WebςЄϝЄΨᒈͼͼΕΡ (2) • middleware ΁䌏䖕ͭͼΕΡ • Plack ΄ midleware ;ΑΒݶ༷ͮஷ΄Θ΄΀΄ͽ Plack Κ͹ ͼ΢Ά䮭㵛ͽͯ • ͚ͺΘ΄όϫϚλ΄ኮ؟Ψ毣΁௏͚ၶ͡ΏͼͥͶ͚ͫ

Slide 95

Slide 95 text

ͩͩ΁πЄϖΨ䨗ͥ

Slide 96

Slide 96 text

WebςЄϝЄΨᒈͼͼΕΡ (3) • middleware Ψ䨗ͥ;ͣ΄ဳ఺ᅩ • http.responseWriter.WriteHeader() ͭ͵͘;΅ Header Ψ᭄ے ͯΡͩ;͢ͽͣ΀͚΄ͽ䶲ΨͺͧΡ஠ᥝ͘͢Ρ • ͵;͞Ά Content-Length Κ X-Frame-Open ΀Ϳ΄ Header Ψ middleware ΄஍㳌ቘͽ᭄ےͯΡͩ;͢ࢯ櫞 • Ε΀ͫΩͿͭ͜ͼΔͯ͡ҘҘ

Slide 97

Slide 97 text

Web ςЄϝЄΨᒈͼΡ (4) • Graceful Shutdown ΁䌏䖕ͯΡ • ςЄϝЄΨෛ͚ͭ gorutine ͽ᩸㵕ͭͼ̵main ͽ signal ϕ ϶ϐϤͯΡͩ;ͽ̵ྲ斃ጱ墋㶨΁䋚匍ͽͣΡ

Slide 98

Slide 98 text

ͩͩ΁πЄϖΨ䨗ͥ

Slide 99

Slide 99 text

net/http 墋㶨ͽͯ΃Ѻ

Slide 100

Slide 100 text

䄜ๅ͘͢͹͵Οܨଷ΁ϠϸϖͯΡ (1) • Ͷ͚͵̵͚ςЄϝЄΨ䨗͚ͼΡ䦒΅πЄϖΨ䨗ͣ䟵͞͵Οᛔ㵕 ጱ΁Ϡϸϖ͢ᩳ͹ͼٚ᩸㵕ͭͼΑ͚ͭͽͯ΃ • realize Ψֵ͜;墋㶨΁䋚匍ͽͣΔͯ • realize Ψ᩸㵕ͯΡ;ᛔ᫝΄ςЄϝЄΘᒈͷӤ͢͹ͼϢήαϸ ΄䄜ๅΚίμψφϺν͢憎Ο΢ͼ䮭͚ͭͽͯ΄ͽͲΈֵ͚Δ ͭΝ͜

Slide 101

Slide 101 text

䄜ๅ͘͢͹͵Οܨଷ΁ϠϸϖͯΡ (2) • go get github.com/oxequa/realize ͭͼ realize start ͯΡͶͧ ͽ *.go Ϣήαϸ΄哶憙Ψͭͼͥ΢Δͯ • 戔ਧϢήαϸ΅ڡࢧ᩸㵕䦒΁ .realize.yaml ΁ͺͥΟ΢Ρ΄ͽ̵ ͘;΅奞ͥ͡抠ෆͭͼ͚ͣΔͭΝ͜

Slide 102

Slide 102 text

Database ΁ίμψφͯΡ (1) • database/sql ΄αЀόЄϢδЄφΨ䋚ᤰͭ͵ driver Ψֵͩ͜; ͽ Database ΁ίμψφͽͣΔͯ • Perl ΄ DBI ΄Ξ͜΀Θ΄ͽϔϢήμϕ • Քࢧ΅ github.com/go-sql-driver/mysql Ψֵ͚Δͯ

Slide 103

Slide 103 text

Database ΁ίμψφͯΡ (2) • go-sql-driver-mysql ΅ go ͽقͼ䨗͡΢ͼ͠Π̵libmysqlclient ΁ׁਂͭͼ͚΀͚ • ͩ΢΁ΞΠಅ̸ libmysqlclient Ψֵ͹ͼ͚Ρग़ͥ΄᥺承;䞉 㵕͢吖΀Ρ;ͩΣ͘͢ΠΔͯ

Slide 104

Slide 104 text

Database ΁ίμψφͯΡ (3) • database/sql ΅πϚμτϴЀϤЄϷЀνΨᤈ͚Δͯ • ͜Δͥͺ͡͞ΆϞϢζЄϫЀφ͢ڊΡӞොͽϜϫΠͿͩΣΘ͘ Ρ

Slide 105

Slide 105 text

Database ΁ίμψφͯΡ (4) • πϚμτϴЀΨ揳ΠͯͤͼͭΔ͜㺔氂 • Ϸμεφϕ͢ϝЄφϕͭ͵;ͣ΀Ϳͽ go ΄ concurrency ͢䃀य़ͭͼӞ 䶲΁ mysql ΁πϚμτϴЀΨ揳͹ͼͭΔ͚ max_connection ΨηЄϝЄ ͭ͵ΠϷϊЄφΨ͚ᷣͺΌͭͼͭΔ͜ݢᚆ௔͘͢Ρ • Δ͵̵僻洏΁ idel ΄ള姆͢ྜ͹ͼͭΔ͜ • DB.SetMaxIdleConns() ; DB.SetMaxOpenConns() ͽګகͯΡͩ;͢ ͽͣΡͩ͢΄㮔΁΀΁Ψف΢΢Ά͚͚͡΅ίϤϷξЄτϴЀ΄ᥝկེᒫ

Slide 106

Slide 106 text

Database ΁ίμψφͯΡ (5) • wait_timeout ΁୚͹͡͡Ρڹ΁ίϤϷξЄτϴЀ㯎͡ΟπϚμ τϴЀΨᏈ䬤ͭ͵͚ • DB.SetConnMaxLifetime() ͽګகݢᚆ • wait_timeout ͭ͵Π֜Ο͡΄ቘኧͽ MySQL ͡ΟπϚμτϴЀ ͢ڔෙͫ΢͵䁰ݳ΅ίϤϷξЄτϴЀ͢ϷμεφϕΨᤈ͹ͼڡ Ηͼړ͡Ρ΄ͽͩͩ΄϶γЀϖϕϷϐϤΨಪ͞Ρ΄΁ํ㵁

Slide 107

Slide 107 text

Database ΁ίμψφͯΡ (6) • Query() Κ Exec() ͽϤϹЄφϨϸύЄΨֵ͹͵䁰ݳ̵Prepare Statement ͢咲ᤈͫ΢ͼͭΔ͜ • Prepare ΅πϚμτϴЀ㶨֖ͽٖ᮱ጱ΁κϰϐτϲͫ΢Ρ • ͭͭ͡ग़ͥ΄ WebίϤϷξЄτϴЀͽ΅䯭̸΀μεϷЄ͢咲ᤈͫ΢Ρ΄ͽϟϐϕሲ΅͡΀Π͚֗ • Prepare Ψ咲ᤈͱͰ΁ϤϹЄφϨϸύЄΨ go ͽᗝ䟵ͯΡ΄͢অΔ͚ͭ • fmt.Sprintf() Ψֵ͜ොဩ͢ϖκϲϮЀϕͫ΢ͼ͚Ρ̵͢SQL Injection ͢ோ͚ • MySQL ΄䁰ݳ̵Open䦒΄ params ΁ interpolateParams=true ΨͺͧΡͩ;ͽ driver ΄Ӿͽᗝ䟵 Ψͭͼͥ΢Ρ΄ͽμεϷЄ΄咲ᤈහ͢仂Ρ • 托ͭͥ΅ http://dsas.blog.klab.org/archives/52191467.html

Slide 108

Slide 108 text

Database ΁ίμψφͯΡ (7) • 䋚檭΁ϔЄόΨ SELECT ͭͼΕΔͭΝ͜ • 1ϹπЄϖͶͧݐ஑ͭ͵͚䁰ݳ΅ DB.QueryRow(…).Scan(…) Ψ ͺ͚͡Δͯ • Scan() ΁΅ϪαЀόЄΨჁͯ஠ᥝ͘͢ΠΔͯ • go ΄୚හ΅㮔Ⴡͭ΀͵Η

Slide 109

Slide 109 text

No content

Slide 110

Slide 110 text

Database ΁ίμψφͯΡ (8) • 愢හᤈݐ஑ͯΡ䦒΅ DB.Query(…) Ψֵ͚Δͯ • 䜟Π㮔΅αϓϹЄόЄ΁΀͹ͼ͚ͼ̵ͳ΢ʹ΢Ψ Scan() ͭͼ ͚ͥ୵ • ε϶Є͢咲ኞͯΡ堞ಅ͢ग̵़ͥ奾䯤儴櫏΁΀ΠΔͯ

Slide 111

Slide 111 text

No content

Slide 112

Slide 112 text

Database ΁ίμψφͯΡ (9) • ϕ϶ЀσμτϴЀΨڥአͭͼ INSERT ͯΡ • ϕ϶ЀσμτϴЀΨڥአͯΡ䁰ݳ΅ DB.Begin() Ψ咲ᤈͭͼ Tx Ψݑͧݐ Ρ • ͩ΄ Tx Ψֵ͹ͼ Tx.Exec() Ψᤈͩ͜;ͽϕ϶ЀσμτϴЀ㳌ቘ΁΀Ρ • Tx ͽ΅΀ͥ DB.Exec() ͭ͵䁰ݳ΅ϕ϶ЀσμτϴЀ㳌ቘ΁΀Ο΀͚΄ ͽဳ఺

Slide 113

Slide 113 text

No content

Slide 114

Slide 114 text

͚Σ͚Σ䨗͚ͼͣ͵ͧͿ ኞͽΚΡ΄奾䯤ͣͺ͚

Slide 115

Slide 115 text

database/sql ΄϶ϐϞЄΨֵ͜ • github.com/jmoiron/sqlx Ψֵ͜;̵DB.Get() Κ DB.Select() ͽ Struct ΁ϫϐϡЀνͭͼͥ΢Ρ̵ͭrows ΄ Close() ΀ͿΘ晒ڔ΁ ᤈ͹ͼͥ΢Ρ • Struct ΁΅όνΨͺ͡͹ͼ `db:”column”` ΀Ϳ;䨗͚ͼ͚ͧΆ䌏䖕 ͭͼͥ΢Ρ • sqlx ΅ database/sql ΄ͯΏͼ΄ل樄樛හΨ䋚ᤰͭͼ͚Ρ΄ͽ̵ QueryRow() ΀ͿΘͳ΄ΔΔֵͩ͜;͢ͽͣΡ

Slide 116

Slide 116 text

No content

Slide 117

Slide 117 text

No content

Slide 118

Slide 118 text

͡΀ΠφϐκϷͭΔͭ͵΃ѺѺ

Slide 119

Slide 119 text

ϕ϶ЀσμτϴЀ㳌ቘΨ䮭΁ͯΡ • github.com/Code-Hex/sqlx-transactionmanager Ψֵ͜;ϕ϶ЀσμτϴЀ 㳌ቘ͢䮭΁΀ΠΔͯ • Perl ΄ DBIx::TransactionManager ΄Ξ͜΀Θ΄ • Ϛφϕͭ͵ϕ϶ЀσμτϴЀΨ墋㶨΁䨗ͥͩ;͢ͽͣΡ • sqlx΄϶ϐϞЄ΁΀͹ͼ͚Ρ΄ͽͯΏͼ΄樛හ͢ڥአݢᚆ • ֵ͜䦒΅ tm ϞϐξЄυ΄ϕ϶ЀσμτϴЀϣϺϐμ΄ΕΨڥአͭ͵ො͢Ϝϫ Π΁͚ͥ

Slide 120

Slide 120 text

No content

Slide 121

Slide 121 text

Ͷ͚Όͯ͹ͣΠѺ

Slide 122

Slide 122 text

μεϷЄϠϸύЄΨֵ͜ • Κ͹·Π IN ܄Ψᛔێͽ䨗ͥ΄΅ᬔ͚Θ΄͘͢Ρ΄ͽμεϷϠϸύЄΨ ֵ͚ΔͭΝ͜ • ᛔړ΅ github.com/Masterminds/squirrel Ψֵ͹ͼ͚Δͯ • JOIN ΨތΖͶ͚͵͚΄ξЄφ΄μεϷЄ͢ኞ౮ͽͣΡ΄ͽ׎ڥ • Perl ΄ SQL::Maker ͹Γֵ͚͚ͪͩͷ • لୗϖκϲϮЀϕ΁ςЀϤϸ͢掓੄΀΄ͽֵ͚ො΅ͳͷΟ݇ᆙ΄ͩ;

Slide 123

Slide 123 text

ͿΩ΀μεϷЄ͢咲ᤈͫ΢ͼ͚Ρ͡ᎣΡ • ίϤϷξЄτϴЀ͢य़ͣͥ΀͹ͼͥΡ;Ԩ๗ͱ΂μεϷЄ͢咲ኞͯΡͩ;͢Δ Δ͘ΠΔͯ • ͳΩ΀;ͣ΅咲ᤈͫ΢ͼ͚ΡμεϷЄΨԃ᥃΁ͭ͵͚ͽͯ΃ • tcpdump Ψ;΢ΆΥ͡ΡͧͿ樄咲Ӿ΅櫏΁Ϻν΁ڊͭ͵͚ • github.com/gchaincl/sqlhooks Ψֵ͞Ά墋㶨΁μεϷЄΨϺλЀνͽͣΔͯ • perl ͽ͚͜ Devel::KTYProf Κ DBI:x::QueryLog ΄Ξ͜΀Θ΄

Slide 124

Slide 124 text

No content

Slide 125

Slide 125 text

ͫͼ

Slide 126

Slide 126 text

ͩͩΔͽͣ͵Ο Web API Ψ ͪΠ͹;ͧ͡ͳ͜ͽͯ΃ѺѺ

Slide 127

Slide 127 text

Web API Ψ䨗͚ͼ͚ͥ (1) • RESTful ͹Γ͚ JSON Ψᬬͯ API Ψ䨗͚ͼ͚ͥ • Twitter͹Γ͚ͷΝ͹;ͭ͵ϮϐψЄυΨಭᑤͽͣΡ API Ψ戔懯ͭΔͯ • POST /users • GET /users/{user_id} • POST /messages • GET /messages/{message_id} • Ε͵͚΀ఽͮ

Slide 128

Slide 128 text

Web API Ψ䨗͚ͼ͚ͥ (1) • ᇙਧ΄ HTTP Method ͡ͺᇙਧ΄ path զक़Ύ΄ίμψφ΅ε϶Є΁ͭ ͵͚ • {user_id} ΀ͿΨ͚͚ఽͮ΁઀樄ͭ͵͚ • ;௏͚Δͯ΃ • net/http ኞͽӤ懿Ψ伋͵ͯ΄΅΀͡΀͡ᬔ͚ • HTTPϸЄόЄ΄ github.com/gorilla/mux Ψֵ͚ΔͭΝ͜

Slide 129

Slide 129 text

No content

Slide 130

Slide 130 text

gollila/mux Ψֵ͞ΆͶ͚Ό φϐκϷͧ͡Δͯ΃

Slide 131

Slide 131 text

negroni Ψֵ͜ • net/http ኞͽ΅ HandlerFunc() ͪ;΁ middleware Ψ晒አͭͼ ͚͡΀ͥͼ΅΀ΟͰय़䄜ΗΩͿ͜΀΄ͽ negroni Ψֵ͚Δͯ • negroni Ψֵͩ͜;ͽ̵ᇙਧ΄ path ΁䌏ͭͼͶͧ middleware Ψ晒አͭ͵Π̵愢හ΄ middleware Ψق֛΁晒አͯΡͩ;͢ φϐκϷ;ͧ͡ΡΞ͜΁΀ΠΔͯ

Slide 132

Slide 132 text

Web API ΄䯤౮ (1) • Handler -> Service -> Repository ;͚͜Ξ͜΁㳌ቘ͢ၞ΢ΡΞ ͜΁䋚ᤰͭΔͯ • ݱ̸΅ interface ΨՕͭ͵ΚΠݐΠΨᤈ͜ • ͚ͩ͜͜䯤౮Ψ;Ρͩ;ͽݱ䍅ͽ΄䱛ᚆ͢ړ櫝ͫ΢ϓφϕΘ䨗 ͣΚͯͥ΀ΠΔͯ

Slide 133

Slide 133 text

Web API ΄䯤౮ (2) • Handler • HTTP Request Ψݑͧ՞ͧͼϞ϶ϮЄό΄㳌ቘΨᤈ͚ Service Ψ޷Ήڊͯ • Service ΁ HTTP 樛昧΄Θ΄΅Ⴡͫ΀͚

Slide 134

Slide 134 text

Web API ΄䯤౮ (3) • Service • ϠυϚφϺυϐμΨ䨗ͥ;ͩΣ • ͳ΄ݷ΄᭗ΠςЄϠφ΄ᙋ

Slide 135

Slide 135 text

Web API ΄䯤౮ (4) • Repository • ϔЄόϦЄφΚͳ΄՜΄φϕϹЄυΎ΄ίμψφΨ檱ᠰͯΡ Θ΄ • 愢櫏΅Ϻυϐμ΀Ϳ΅䨗͡΀͚΄͢ቘమ • sqlx.DB ΅ repository ΄ Struct ΄Ӿ΁೮͵ͱΡΞ͜΁ͯΡ

Slide 136

Slide 136 text

No content

Slide 137

Slide 137 text

No content

Slide 138

Slide 138 text

No content

Slide 139

Slide 139 text

ίυδЀύ • ΀Ͳ Go ͡ • Perl Monger ͢ Golang ΨতΗΞ͜͹ͼ䦒΁Ϝϫ͹͵;ͩΣ • Go ΄᥺承՛䯭ͽ਍Ό Perl ;΄ፘ晅ᅩ • Web API Ψ֢͹ͼΕΞ͜ • ϓφϕΨ䨗ͥ • Docker Ϡϸϖͭͼ㵕ͯ͡ • Δ;Η

Slide 140

Slide 140 text

ϓφϕΨ䨗ͥ (1) • ϓφϕ΄䨗ͣො • ϓφϕ΅ *_test.go ;͚͜͜ݷڹͽ΄Ϣήαϸ΁䨗ͥ • ֺ͞Ά̵server.go Ͷ͹͵Ο server_test.go • testing ϶αϣ϶ϷΨ import ͭͼ func TestXXX(t *testing.T) ͡ΟতΔΡ樛හΨ䨗ͥ

Slide 141

Slide 141 text

ϓφϕΨ䨗ͥ (2) • ϓφϕ΄䋚ᤈ΄՛ො • go test ͽ䋚ᤈͽͣΡ • go test ./… ͽٚ䒐ጱ΁ϓφϕͭͼͥ΢Ρ • Perl ΄ prove ΄Ξ͜΀Θ΄

Slide 142

Slide 142 text

Service ΄ϓφϕΨᘍ͞Ρ (1) • ΔͰ Service ΄ϓφϕΨ䨗ͥͩ;Ψᘍ͞Δͯ • Repository ΅ interface Ψ伋͵ͭͼ͚΢Ά͚͚΄ͽ̵ϓφϕӾ ͽ Struct Ψਧ嬝ͭͼͨ͘΢Ά૧๊ͭ͞Ρͩ;͢ͽ̵ͣService Ͷͧ΁ᵞӾͯΡͩ;͢ͽͣΔͯ

Slide 143

Slide 143 text

Service ΄ϓφϕΨᘍ͞Ρ (2) • ducktyping ͶͧͶ; Service ΄ӾͽͷΙΩ;๗இͭ͵ Repository ΄Ϯ ϊϐϖ͢޷Ά΢ͼ͚Ρ͡Υ͡Ο΀͚͡Θͭ΢ΔͱΩ • gomock Ψֵ͜;̵樛හ΄޷Ήڊͭ΄殼ଧΚ޷Ήڊͭࢧහ΀ͿΨϓφϕ ͯΡͩ;͢ͽͣΔͯ • gomock ΅ mockgen ;͚͜πϫЀϖͿψϐϕͽڥአͭΔͯ • mockgen ΁ϯϐμͭ͵͚ go ϢήαϸΨჁͯ; interface Ψ伋͵ͭ͵ go ϢήαϸΨ generate ͭͼͥ΢Δͯ

Slide 144

Slide 144 text

MySQL Ψֵ͹͵ϓφϕ (1) • github.com/lestrrat-go/test-mysqld Ψͺ͜͡ • ΕΩ΀य़অͣ Test::mysqld ΄ go ϪЄϓΰЀν ͽͯ΃ • test ΄͵Ή΁ਠق΁μϷЄЀ΀ MySQL ΨᒈͷӤͨͼͥ΢ΡΚ ͺ • ΘͷΣΩ MySQL ΄ᒈͷӤͨ΁䦒樌͢͡͡Ρ΄΅᭿ͧΟ΢΀͚

Slide 145

Slide 145 text

MySQL Ψֵ͹͵ϓφϕ (2) • ϓφϕΨṛ᭛΁ࢧͭ͵͚䁰ݳ΅Ԫڹ΁愢හ΄ MySQL Ψ Docker ΀Π MySQL::Sandbox ΀ΠͽᒈͷӤͨͼ͚͠ͼࢧͯ΄͢ፘ䄜ΥΟͰ͚͚䶲ͭ͢Δ ͯ • Perl Ͷ;ව̸ͩ΄͘͵Π΅ΚΠੱͥͫ΢ͼ͚ͼᛔړΘค Test::mysqld Ψ࿞ 姆۸ͯΡොဩΚApp::Prove::Plugin::MySQLParallel Ψ䨗͚͵ΠͭͼΔͭ͵ • Test::mysqld::pool ;͡ App::Prove::Plugin::MySQLPool ;͚͡Σ͚Σ͘Ρ • Go ͽ͚͚ఽͮ΁ΚΡොဩ΅Θ͜ͷΝ͚ᎸᑪͭΔͯ

Slide 146

Slide 146 text

WebςЄϝЄ΄ϓφϕ • net/http ΁΅ httptest ;͚͜ WebςЄϝЄϓφϕአ΄϶αϣ϶ ϷЄ͘͢͹ͼͩ΢Ψͺ͜͡;墋㶨΁ϓφϕΨ䨗ͥͩ;͢ͽͣΔͯ • httptest.Server Ψֵ͜;䋚檭΁ςЄϝЄΨᒈͷӤͨͼͥ΢Ρ • net.Listen(“tcp”, “127.0.0.1:0”) ;ͥ͡;̵ᑮ͚ͼ͚ΡportΨ Listen ͭͼͥ΢Δͯ • Test::TCP ጱ΀䱛ᚆ͘͢͹ͼ׎ڥͽͯ΃

Slide 147

Slide 147 text

΅͚

Slide 148

Slide 148 text

ίυδЀύ • ΀Ͳ Go ͡ • Perl Monger ͢ Golang ΨতΗΞ͜͹ͼ䦒΁Ϝϫ͹͵;ͩΣ • Go ΄᥺承՛䯭ͽ਍Ό Perl ;΄ፘ晅ᅩ • Web API Ψ֢͹ͼΕΞ͜ • ϓφϕΨ䨗ͥ • Docker Ϡϸϖͭͼ㵕ͯ͡ • Δ;Η

Slide 149

Slide 149 text

DockerͽϠϸϖͭͼ㵕ͯ͡ (2) • φϓϐϤ;ͭͼ΅ • golang:latest 厏हͽ go Ψ Linux ݻͧ΁Ϡϸϖ • alpine / busybox / scratch ΀Ϳ΄敽ᰁ΀αϮЄυ΁Ϡϸϖͭ ͵ϝαϗϷΨ COPY • ;͚͜ၞ΢ͽͯ

Slide 150

Slide 150 text

DockerͽϠϸϖͭͼ㵕ͯ͡ (2) • net/http ϞϐξЄυΨڥአͭͼ͚Ρ;̵dynamic link ΁΀͹ͼͭΔ̵͚ϝα ϗϷΨπϡЄͭ͵Ͷͧͽ΅㵕͡΀͚ • `go build -a -tags netgo -installsuffix netgo` ΀Ϳ;ͭͼϠϸϖͯΡͩ;ͽ static link ΁΀͹ͼͥ΢Δͯ • ׁਂͭͼ͚Ρ϶αϣ϶Ϸͽ cgo Ψֵ͹ͼ͚Ρ䁰ݳ΅ͳ΢Θ dynamik link ΁ ΀Ρ΄ͽզӥ΄Ξ͜΁ͭΔͯ • `go build -a -tags netgo -installsuffix netgo --ldflags '-extldflags "-static"'`

Slide 151

Slide 151 text

DockerͽϠϸϖͭͼ㵕ͯ͡ (3) • WebςЄϝЄ΅ net/http Ψֵͩ͜;͢Α;ΩͿ΀΄ͽ dynamic link ΁΀͹ͼͭΔ͜΄΅ϜϫΠ͢ͷ • ̵ͭͭ͡golang:latest ͽͳ΄ΔΔ docker build ͭͼͭΔ͜; πЀϓϗ͢ 700MB ᑕଶ΁΀͹ͼͭΔ͜΄ͽ̵හMB͡Οහ܈ MBᑕଶ΄ੜͫ΀ Linux ΨڥአͯΡͩ;Ψ͠㵣ΗͭΔͯ

Slide 152

Slide 152 text

΅͚

Slide 153

Slide 153 text

ίυδЀύ • ΀Ͳ Go ͡ • Perl Monger ͢ Golang ΨতΗΞ͜͹ͼ䦒΁Ϝϫ͹͵;ͩΣ • Go ΄᥺承՛䯭ͽ਍Ό Perl ;΄ፘ晅ᅩ • Web API Ψ֢͹ͼΕΞ͜ • ϓφϕΨ䨗ͥ • Docker Ϡϸϖͭͼ㵕ͯ͡ • Δ;Η

Slide 154

Slide 154 text

Δ;Η • Perl ͽङ͹͵Ꭳ挷Ψͺ͡͹ͼ Go ͽ WebςЄϝЄΨ䨗͚ͼ͚ͥ ොဩ΁ͺ͚ͼ扖ͭΔͭ͵ • ᛔړᛔ᫝ΔͶ娞ଶ͚֗͢΄ͽ୚ͣ姆ͣ毇䔴͹ͼ͚ͣ͵͚ͽͯ • Perl ֵ͹ͼ͚͵Ո͢奾䯤 Go Ψֵ͹ͼ͚Ρ΄ͽ̵Ϳͩ͡ͽΕ͵ Ξ͜΀϶αϣ϶Ϸ͘͢͹͵Πͭͼ΀ΩͶ͚͚͡ͽͯ΃

Slide 155

Slide 155 text

ͭ͠Δ͚