Slide 1

Slide 1 text

(P։ൃͰ࣮ࡍʹ΍ͬͨࣄҰ௨Γ

Slide 2

Slide 2 text

ϞόΠϧΞϓϦαʔϏε෦ େࡕࣄ຿ॴ!̍ਓ 3BJMTɺ/PEFɺ(P࢖ͬͯ"1*࡞ͬͯ·͢ (Pྺ൒೥ 3VCZͷਓ ͨͿΜ

Slide 3

Slide 3 text

(PͰ࡞Δಈػ w 3VCZ͕޷͖͚ͩͲ࣮ߦ଎౓͕଎͍ݴޠ΋शಘ͓͖͔ͯͨͬ͠ ͨ w ྫ֎ɺܧঝͳͲͷѻ͍Ͳ͜Ζ͕೉͍͠ػೳΛ͍͋͑ͯΕͳ͍
 γϯϓϧͳࢥ૝ w ެࣜͷϑΥʔϚολʔ͕͋Δ w ฒߦॲཧΛαϙʔτ͍ͯ͠Δ w ͭͷόΠφϦʹͳΔ

Slide 4

Slide 4 text

(PΛ͔ͭͬͯΔՕॴ w '51Λ࢖ͬͨ֎෦࿈ܞ w ϞόΠϧΞϓϦͷϑϩϯτ"1* ϓϩμΫτͷҰ෦ʹ͔ͭΘΕ͍ͯ·͢

Slide 5

Slide 5 text

ࠓ೔࿩͢͜ͱ w Πϯετʔϧ w ։ൃ w ςετ w σϓϩΠ

Slide 6

Slide 6 text

Πϯετʔϧ

Slide 7

Slide 7 text

ʮHPͷόʔδϣϯ؅ཧπʔϧ ͳʹ͔ͭͬͯΔͷʁʯ

Slide 8

Slide 8 text

ʮ͔ͭͬͯ·ͤΜʯ

Slide 9

Slide 9 text

(PΛΠϯετʔϧ͢Δํ๏ w )PNFCSFX w HPFOW w όΠφϦΛμ΢ϯϩʔυ

Slide 10

Slide 10 text

(PΛΠϯετʔϧ͢Δํ๏ w )PNFCSFX w HPFOW w όΠφϦΛμ΢ϯϩʔυ

Slide 11

Slide 11 text

~go ├── bin ├── gobin │ ├── go1.8.3 │ │ └── go │ └── go1.8.3.darwin-amd64.tar.gz ├── pkg │ └── darwin_amd64 │ ├── github.com │ └── golang.org └── src ├── github.com │ ├── cm-nishida-masayuki │ ├── codegangsta │ ├── daviddengcn │ ├── hiroshi-manabe │ ├── jteeuwen │ ├── mitchellh │ └── motemen └── golang.org σΟϨΫτϦߏ੒

Slide 12

Slide 12 text

~go ├── bin ├── gobin │ ├── go1.8.3 │ │ └── go │ └── go1.8.3.darwin-amd64.tar.gz ├── pkg │ └── darwin_amd64 │ ├── github.com │ └── golang.org └── src ├── github.com │ ├── cm-nishida-masayuki │ ├── codegangsta │ ├── daviddengcn │ ├── hiroshi-manabe │ ├── jteeuwen │ ├── mitchellh │ └── motemen └── golang.org (01"5)Λ ௨ͯ͠Δͱ͜Ζ

Slide 13

Slide 13 text

~go ├── bin ├── gobin │ ├── go1.8.3 │ │ └── go │ └── go1.8.3.darwin-amd64.tar.gz ├── pkg │ └── darwin_amd64 │ ├── github.com │ └── golang.org └── src ├── github.com │ ├── cm-nishida-masayuki │ ├── codegangsta │ ├── daviddengcn │ ├── hiroshi-manabe │ ├── jteeuwen │ ├── mitchellh │ └── motemen └── golang.org ௥Ճͨ͠σΟϨΫτϦ μ΢ϩʔυ͖ͯͨ͠όΠφϦΛ͓͘

Slide 14

Slide 14 text

export GOPATH=~/go export GOROOT=$GOPATH/gobin/go1.8.3/go/ export PATH=$PATH:$GOROOT/bin:$GOPATH/bin

Slide 15

Slide 15 text

export GOPATH=~/go export GOROOT=$GOPATH/gobin/go1.8.3/go/ export PATH=$PATH:$GOROOT/bin:$GOPATH/bin ੾Γସ͍͑ͨͱ͖͸ (03005Λมߋ͢Δ

Slide 16

Slide 16 text

ʮϓϩμΫτͷιʔεͬͯ Ͳ͜ʹ͓͘Μʁʯ

Slide 17

Slide 17 text

ʮ(01"5)ͷԼʹ ͓͍ͯ·͢ʯ

Slide 18

Slide 18 text

~go ├── bin ├── gobin │ ├── go1.8.3 │ │ └── go │ └── go1.8.3.darwin-amd64.tar.gz ├── pkg │ └── darwin_amd64 │ ├── github.com │ └── golang.org └── src ├── github.com │ ├── cm-nishida-masayuki │ ├── codegangsta │ ├── daviddengcn │ ├── hiroshi-manabe │ ├── jteeuwen │ ├── mitchellh │ └── motemen └── golang.org ࣗ෼ͷϓϩδΣΫτ΋ (01"5)TSDͷԼʹஔ͘

Slide 19

Slide 19 text

w ૬ର1"5)ࢦఆ w (01"5)TSD͔Βͷઈରύεࢦఆ import "../subpkg" (PͰ͸αϒύοέʔδ΋ ਖ਼͘͠औಘͰ͖ΔΑ͏ઈରύεͰࢦఆ͢ΔͷͰ
 ϓϩδΣΫτ΋(01"5)ҎԼʹஔ͘ͷ͕ແ೉ (PͰαϒύοέʔδΛ Πϯϙʔτ͢Δํ๏ import "github.com/cm-nihsida-masayuki/myprj/subpkg"

Slide 20

Slide 20 text

ʮCVOEMFS΍OQN΍NBWFO Έ͍ͨͳύοέʔδϚωʔδϟʔ Ͳ͏ͯ͠Δͷʁʯ

Slide 21

Slide 21 text

ʮެࣜͰ͸·ͩ͋Γ·ͤΜɻ αʔυύʔςΟͷ HMJEFΛ࢖ͬͯ·͢ʯ

Slide 22

Slide 22 text

HMJEF w HMJEFZBNM w CVOEMFSͰ͍͏(FNpMF w ඞཁͳύοέʔδ͕ॻ͔Ε͍ͯΔ w HMJEFMPDL w CVOEMFSͰ͍͏(FNpMFMPDL w ඞཁͳύοέʔδͷ͞Βʹґଘ͍ͯ͠Δύοέʔδ΍ɺ
 Πϯετʔϧͨ͠ίϛοτϋογϡͳͲ͕ॻ͔Ε͍ͯΔ

Slide 23

Slide 23 text

։ൃ

Slide 24

Slide 24 text

ʮܧঝͳͯ͘େৎ෉ʁʯ

Slide 25

Slide 25 text

ʮ͍͚ͯ·͢ ࠓͷͱ͜Ζ ʯ

Slide 26

Slide 26 text

طଘͷϥΠϒϥϦͷΫϥεͷ ϝιουΛͪΐͬͱม͑ͨ ৽͍͠ΫϥεΛ࡞Γ͍ͨ ๻͕ܧঝ࢖͍͍ͨγʔϯ

Slide 27

Slide 27 text

਌Ϋϥεͷ͢΂ͯͷϝιουΛҾ͖ܧ͗ Ұ෦ͷϝιουΛॻ͖׵͍͑ͨ 8SJUF 3FBE $MPTF TFTTJPO TTI$POO .Z4'51$MJFOU 8SJUF 3FBE $MPTF TFTTJPO 4'51$MJFOU $MPTF Ͱ
 TFTTJPOͱTTI$POO ྆ํͱ͍ͨ͡

Slide 28

Slide 28 text

type Client struct { *sftp.Client SshConn ssh.Conn } func (c *Client) Close() { c.Client.Close() c.SshConn.Close() } ߏ଄ମͷຒΊࠐΈͰͰ͖·͢

Slide 29

Slide 29 text

ςϯϓϨʔτϝιουΈ͍ͨʹ
 ॲཧͷલޙʹڞ௨ॲཧΛೖΕ͍ͨ ๻͕ܧঝ࢖͍͍ͨγʔϯ

Slide 30

Slide 30 text

ྫ͑͹+BWBͰ͔͘ͳΒ͜͏͍͏ॲཧ public class Main { public static void main(String[] args) { Super instance = new Concrete(); instance.execute(); } } public abstract class Super { public void execute() { pre(); doProcess(); after(); } protected abstract void doProcess(); private void pre() { System.out.println("pre"); } private void after() { System.out.println("after"); } } public class Concrete extends Super { @Override protected void doProcess() { System.out.println("process"); } }

Slide 31

Slide 31 text

package main import "fmt" func Around(f func()) { fmt.Println("pre") f() fmt.Println("after") } func main() { Around(func() { fmt.Println("process") }) } ؔ਺͕ϑΝʔετΦϒδΣΫτͳͷͰҾ਺Ͱड͚औΔ͜ͱͰ ࣮ݱͰ͖·͢ *OUFSGBDFΛ࢖ͬͯ΋Ͱ͖·͢

Slide 32

Slide 32 text

ʮύοέʔδΘ͚Ͳ͏ͯ͠Δʯ

Slide 33

Slide 33 text

ʮେ͖Ίʹͬ͘͟Γͱ Θ͚ͯ·͢ʯ

Slide 34

Slide 34 text

├── awsutils ├── config ├── data ├── handler ├── logger ├── main.go ├── model ├── redisutils ├── utils ├── vendor └── version

Slide 35

Slide 35 text

QBDLBHFB QBDLBHFC (PͰ͸॥؀ࢀর͕ίϯύΠϧΤϥʔʹͳΔͷͰɺ ඞͣยํ޲ʹͳΔ୯ҐͰύοέʔδΛΘ͚ͯ·͢

Slide 36

Slide 36 text

ʮྫ֎ͳͯ͘େৎ෉ʁʯ

Slide 37

Slide 37 text

ʮ΄͍ͬ͢͠ʯ

Slide 38

Slide 38 text

func main() { err := func1() if err != nil { panic(err) } } func func1() error { if err := func2(); err != nil { return err } return errors.New("crush in func1") } func func2() error { return errors.New("crush in func2") } ωοτϫʔΫӽ͠ʹ˓˓ %#ɺ֎෦"1*౳ Έ͍ͨͳॲཧ͕ ଟ͍ͱͲ͏ͯ͠΋Τϥʔ͕ଟ͘ͳΔͷͰ൥ࡶͳॲཧʹͳΓ·͢ Ͳ͏ͯ͠΋ࣅͨॲཧΛ ෳ਺ॻ͘ඞཁ͕͋Δ

Slide 39

Slide 39 text

ʮQBOJDɺSFDPWFS͸ʁʯ

Slide 40

Slide 40 text

ʮ૝ఆ͞ΕΔΤϥʔͰ ར༻͢Δͷ͸ඇਪ঑Ͱ͢ʯ

Slide 41

Slide 41 text

HPͷQBOJD w SFDPWFS͠ͳ͍ͱଞͷHPSPVUJOFΛר͖ࠐΈϓϩά ϥϜΛΫϥογϡͤ͞Δ w ෮چޙͦͷؔ਺Λݺͼग़ͨ͠ޙͷޙଓॲཧ͕૸Βͳ͍ w 0VUCPVOE*OEFYͱ͔4FHNFOUBUJPO'BVMUͷΑ ͏ͳຊ౰ͷྫ֎ͷͱ͖ʹ࢖͏૝ఆͳͷͰɺଞύοέʔδ ͷQBOJDΛSFDPWFSͯ͠͠·͏ͱϝϞϦ͕ਖ਼͍͠ঢ়ଶ ͳͷ͔อূͰ͖ͳ͍

Slide 42

Slide 42 text

ͦͷҝωοτϫʔΫΤϥʔ΍ɺͦͷଞͷ࿦ཧతͳΤϥʔͰ ଞͷݴޠͷྫ֎ͷΑ͏ʹQBOJDSFDPWFSΛ࢖͏ͷ͸ޡΓͰ ໭Γ஋ͷFSSPSΛར༻ͯ͠ݺͼग़͠ݩʹ఻͑Δ

Slide 43

Slide 43 text

ʮMPH'BUBMͰϩά͸͍ͨΒ ͓ͪͨΜͰ͚͢Ͳɻɻʯ

Slide 44

Slide 44 text

ʮམͪ·͢ʯ

Slide 45

Slide 45 text

// Fatal is equivalent to Print() followed by a call to os.Exit(1). func Fatal(v ...interface{}) { std.Output(2, fmt.Sprint(v...)) os.Exit(1) } ඪ४ͷMPHύοέʔδͷ'BUBMؔ਺͸ தͰPT&YJU ΛಡΜͰΔͷͰऴྃ͠·͢

Slide 46

Slide 46 text

ʮ(PͩͱґଘϥΠϒϥϦͷ ιʔε΋ϦϙδτϦʹؚΊΔͱ ͖͍͚ͨͲʁʯ

Slide 47

Slide 47 text

ʮΒ͍͠ΜͰ͕͢ɺ ͖͋ΒΊ·ͨ͠ʯ

Slide 48

Slide 48 text

7FOEPSJOH w HPͰ͸WFOEPSσΟϨΫτϦҎԼʹύε͕ͱ͓Δ Ҏ ্ w WFOEPSҎԼʹ͢΂ͯͷϥΠϒϥϦͷιʔεΛஔ͍؅ཧ͠ ͦͷ··ϦϙδτϦʹϓογϡͯ͠͠·͏ w ΞοϓετϦʔϜͷӨڹΛड͚ͳ͍ͷͰ҆ఆͯ͠ίϯύΠϧ Ͱ͖Δ w ϥΠϒϥϦͷιʔεΛॻ͖׵͑ΕΔ

Slide 49

Slide 49 text

7FOEPSJOHఘΊͨཧ༝ w ΞοϓετϦʔϜͷมߋΛऔΓࠐΊͳ͍ औ ΓࠐΈʹ͍͘ w HMJEF౳Ͱ͋Δఔ౓όʔδϣϯ؅ཧͰ͖Δ w (JUIVCͷEJGGϖʔδ͕രൃͨ͠

Slide 50

Slide 50 text

ςετ

Slide 51

Slide 51 text

ʮϑϨʔϜϫʔΫ͸ʁʯ

Slide 52

Slide 52 text

ʮͱ͘ʹϑϨʔϜϫʔΫ͸ͭ ͔ͬͯͳ͍Ͱ͢ʯ

Slide 53

Slide 53 text

func TestFunc(t *testing.T) { if Func1() == "" { t.Error("abc") } } ඪ४ͷUFTUJOHϞδϡʔϧͷ୯७ͳػೳͱ BTTFSUJPOͱͯ͠UFTUJGZΛ͔ͭͬͯ͘Β͍Ͱ͕͢ ࠓͷͱ͜ΖͳΜͱ͔ͳͬͯ·͢ &SSPSʹԿ͔Λ ॻ͖ࠐΊ͹ςετ͕ࣦഊ͢Δ

Slide 54

Slide 54 text

ʮNPDLͲ͏ͯ͠Δͷʁʯ

Slide 55

Slide 55 text

ʮNPDL͍ͨؔ͠਺Λ௚લʹ ஔ͖׵͑ͯ΍ͬͯ·͢ʯ

Slide 56

Slide 56 text

package mock var f1 = func() string { return "not mocking" } func Func1() string { return f1() } package mock import ( "fmt" "testing" ) func TestFunc1(t *testing.T) { fmt.Println(Func1()) } func TestFunc1WithMock(t *testing.T) { f1 = func() string { return "mocking" } fmt.Println(Func1()) } NPDL͍ͨؔ͠਺Λ ม਺ʹ͓ͯ͘͠ NPDL͍ͨؔ͠਺Λ ม਺ʹ͓ͯ͘͠ not mocking mocking

Slide 57

Slide 57 text

σϓϩΠ

Slide 58

Slide 58 text

ʮઃఆϑΝΠϧ͸Ͳ͏͢ΔΜʁ ͍ͬ͜όΠφϦஔ͚ͩ͘
 ͡Όͳ͘ͳΒͳ͍ʁʯ

Slide 59

Slide 59 text

ʮόΠφϦͷதʹؚΊͯ·͢ʯ

Slide 60

Slide 60 text

HPCJOEBUB var _configYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff go-bindata data/ cBytes, err := Asset("config.yaml") HPCJOEBUBίϚϯυΛ࣮ߦ͢Δͱ ϑΝΠϧͷόΠτ഑ྻ͕ຒΊࠐ·ΕͨCJOEBUBHP͕Ͱ͖ "TTFSUؔ਺ʹϑΝΠϧ໊Λ౉͢ͱऔΓग़ͤΔ

Slide 61

Slide 61 text

ʮͲ͏΍ͬͯ σϓϩΠͯ͠Δͷʁʯ

Slide 62

Slide 62 text

ʮ&$4Λ࢖͍ͬͯ·͢ʯ

Slide 63

Slide 63 text

σϓϩΠϑϩʔ &$3 &$4 %PDLFS git push origin v0.0.0 λάΛ1VTI docker build go test .
 GOOS=linux GOARCH=amd64 go build docker push ίϯςφ্ͰHPΛϏϧυͯ͠ςετ 0,ͳΒ&$3ʹ1VTI $MPVE'PSNBUJPO UBTLEFpOJUJPOT࡞੒ ίϯςφͷೖΕସ͑

Slide 64

Slide 64 text

FROM alpine RUN apk add --no-cache ca-certificates RUN mkdir /lib64 && ln -s /lib/libc.musl-x86_64.so.1 /lib64/ld-linux-x86-64.so.2 COPY ./app /app ENTRYPOINT ["/app"] ϦϦʔε༻ͷ%PDLFSpMF ࣮ߦϑΝΠϧΛΠϝʔδʹؚΊ ΤϯτϦϙΠϯτʹࢦఆ͢Δ͚ͩ ΠϝʔδͷαΠζ͸.΄Ͳ
 ಉϓϩδΣΫτͷ3BJMTͩͱ.

Slide 65

Slide 65 text

͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ʂ (Pಋೖͷॿ͚ʹͳΕ͹޾͍Ͱ͢

Slide 66

Slide 66 text

͏͍͋ʔ͸͍͋ΓΜ͙ େࡕࣄ຿ॴͰҰॹʹಇ͍ͯ͘ΕΔਓʂ