Slide 1

Slide 1 text

ೖ໳ Go ʕ ~ ؂ࢹϓϥάΠϯ੡࡞Ͱ֮͑Δ Go ~ YOSHIKAWA Ryota (@rrreeeyyy) hbstyle-2014-08-14

Slide 2

Slide 2 text

Go lang?

Slide 3

Slide 3 text

· Google ࣾʹΑͬͯ։ൃ · ੩తͷڧ͍ܕ෇͚ݴޠ (ܕ҆શͰ͋Δ) · GC ʹΑΔϝϞϦ؅ཧ · ฒߦ(Concurrency)ϓϩάϥϛϯάͷαϙʔτ · Cross Compile

Slide 4

Slide 4 text

· Google ࣾʹΑͬͯ։ൃ · ੩తͷڧ͍ܕ෇͚ݴޠ (ܕ҆શͰ͋Δ) · GC ʹΑΔϝϞϦ؅ཧ · ฒߦ(Concurrency)ϓϩάϥϛϯάͷαϙʔτ · Cross Compile

Slide 5

Slide 5 text

Go Tools

Slide 6

Slide 6 text

· docker · flynn · etcd · consul, terraform · kubernetes

Slide 7

Slide 7 text

Why serverengineer and Go?

Slide 8

Slide 8 text

· (͋Δఔ౓) ΏΔ͘ॻ͚Δ · (͋Μ·Γ) ྫ֎ͱ͔Ͱࢮͳͳ͍ · Cross Compile ʹΑΔ഑෍ͷखܰ͞ · ॻ͍ͯ, ίϯύΠϧͯ͠, ഑ͬͯ, ಈ͘ · (ࣾ಺Ͱ) CentOS 4 32bit ͱ͔Ͱಈ͍ͨͱ͍͏ᷚ · ฒߦϓϩάϥϛϯά͕(ׂͱ)؆୯ · (※্ه͸શͯݸਓͷײ૝Ͱ͢)

Slide 9

Slide 9 text

install Go

Slide 10

Slide 10 text

Mac $ brew install go --cross-compile-all Linux ؤுͬͯϏϧυ͢Δ http://golang.org/doc/install

Slide 11

Slide 11 text

։ൃ ͱͯ΋ศརͳͷͰ࢖͏ ଞʹ΋͋ΔͷͰؤுͬͯ୳͢ · gofmt · gocode · godoc · vim-go :

Slide 12

Slide 12 text

Command-line application cli-init (tcnksm/cli-init) Λ࢖ͬͯΈΔ

Slide 13

Slide 13 text

cli-init codegangsta/cli ༻ͷͻͳܗΛੜ੒ͯ͘͠ΕΔ (Go ͷ CLI tool Λ࡞ΔͷʹΑ͘࢖ΘΕ͍ͯΔ) $ go get -d github.com/tcnksm/cli-init $ cd $GOPATH/src/github.com/tcnksm/cli-init && make install $ cli-init -s subcmd,subcmd2,subcmd3 [app-name] ࠓճ͸ $ cli-init check_users

Slide 14

Slide 14 text

package main import ( "github.com/codegangsta/cli" "os" ) func main() { app := cli.NewApp() app.Name = "check_users" app.Version = Version app.Usage = "" app.Author = "YOSHIKAWA Ryota" app.Email = "[email protected]" app.Action = doMain app.Run(os.Args) } func doMain(c *cli.Context) { }

Slide 15

Slide 15 text

get flag, and print

Slide 16

Slide 16 text

: app.Flags = []cli.Flag{ cli.IntFlag{ Name: "w, warning", Value: 5, Usage: "Set WARNING status if more than INTEGER users are logged in"}, cli.IntFlag{ Name: "c, critical", Value: 10, Usage: "Set CRITICAL status if more than INTEGER users are logged in"}, } app.Run(os.Args) } func doMain(c *cli.Context) { fmt.Println(c.Int("w")) }

Slide 17

Slide 17 text

Compile $ go build Execute $ ./check_users 5 $ ./check_users -w 10 10 $ ./check_users --help : $ ./check_users -v 0.1.0

Slide 18

Slide 18 text

Shell command

Slide 19

Slide 19 text

: command_line := "/usr/bin/who" out, err := exec.Command("/bin/sh", "-c", command_line).Output() if err != nil { log.Fatal(err) } :

Slide 20

Slide 20 text

loop

Slide 21

Slide 21 text

: user_count := 0 : scanner := bufio.NewScanner(bytes.NewReader(out)) for scanner.Scan() { if err := scanner.Err(); err != nil { log.Fatal(err) } user_count += 1 } :

Slide 22

Slide 22 text

switch

Slide 23

Slide 23 text

: switch { case user_count > c.Int("c"): fmt.Printf("USERS CRITICAL - %v users currently logged in", user_count) os.Exit(2) case user_count <= c.Int("c") && user_count > c.Int("w"): fmt.Printf("USERS WARNING - %v users currently logged in", user_count) os.Exit(1) case user_count <= c.Int("w") && user_count >= 0: fmt.Printf("USERS OK - %v users currently logged in", user_count) os.Exit(0) } fmt.Printf("UNKNOWN State.") os.Exit(3) :

Slide 24

Slide 24 text

https://gist.github.com/rrreeeyyy/ 50574284bc43a4e5fe97

Slide 25

Slide 25 text

Cross Compile

Slide 26

Slide 26 text

(͍͍ͩͨ)ͨͬͨ͜Ε͚ͩ $ GOOS=linux GOARGH=amd64 go build Linux/amd64 ͳόΠφϦ͕ग़དྷΔ ͳʹ͔Ͱૹ࣮ͬͯ͋͛ͯߦ͢Ε͹ಈ͘

Slide 27

Slide 27 text

·ͱΊ · Go ͸ΠϯϑϥΤϯδχΞ޲͚ͷྑ͍ݴޠ · CLI πʔϧ࡞Δ࣌͸ cli-init ࢖͏ͱศར · Go ͷจ๏ͱ͔৭ʑ঺հ · goroutine ͱ͔ struct ͱ͔ channel ͱ͔... · select ͱ͔... ͷ࿩͸·͍͔ͨͭɻ

Slide 28

Slide 28 text

΄͔ · ࣾ಺Ͱ nouka ͷ go ൛࡞ͬͯΔΑ · ͍ͬ͠ΐʹͦͩͯΑ͏