Slide 1

Slide 1 text

GoͰόΠφϦΛಡΉ +α   Fukuoka.go #10  pixiv.inc Atsushi Takayama

Slide 2

Slide 2 text

• ߴࢁԹ / edvakf ϐΫγϒגࣜձࣾ ࣥߦ໾һCTO ݉ ෱ԬΦϑΟεϚωʔδϟʔ • Go, Ruby, JavaScript, Scala, PHP   ࣗݾ঺հ

Slide 3

Slide 3 text

  func init() {

Slide 4

Slide 4 text

  GoͰόΠφϦΛಡΉ ͱ͍͏ྫΛݩʹɺGoͷ͜ͱΛ஌Ζ͏

Slide 5

Slide 5 text

  όΠφϦΛಡΊΔͱ

Slide 6

Slide 6 text

  ΧοίΠΠ

Slide 7

Slide 7 text

  % cat testdata/hello.wasm | xxd -g1 | head -n 30 00000000: 00 61 73 6d 0d 00 00 00 01 ae 83 80 80 00 30 60 .asm..........0` 00000010: 01 7f 01 7f 60 03 7f 7f 7f 01 7f 60 01 7c 01 7f ....`......`.|.. 00000020: 60 02 7f 7f 01 7f 60 03 7f 7f 7f 00 60 05 7f 7f `.....`.....`... 00000030: 7f 7f 7f 01 7f 60 08 7f 7f 7f 7f 7f 7f 7f 7f 01 .....`.......... 00000040: 7f 60 01 7f 00 60 06 7f 7f 7f 7f 7f 7f 01 7f 60 .`...`.........` 00000050: 02 7f 7f 00 60 04 7f 7f 7f 7f 01 7f 60 00 00 60 ....`.......`..` 00000060: 04 7f 7f 7f 7f 00 60 06 7f 7f 7f 7f 7f 7f 00 60 ......`........` 00000070: 05 7f 7f 7f 7f 7f 00 60 07 7f 7f 7f 7f 7f 7f 7f .......`........ 00000080: 01 7f 60 06 7f 7f 7f 7f 7f 7c 01 7f 60 05 7f 7f ..`......|..`... 00000090: 7e 7f 7f 00 60 0b 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f ~...`........... 000000a0: 7f 01 7f 60 0f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f ...`............ 000000b0: 7f 7f 7f 7f 00 60 03 7f 7f 7f 01 7d 60 07 7f 7f .....`.....}`... 000000c0: 7f 7f 7f 7f 7f 00 60 0a 7f 7f 7f 7f 7f 7f 7f 7f ......`......... 000000d0: 7f 7f 00 60 03 7f 7f 7f 01 7c 60 00 01 7f 60 04 ...`.....|`...`. 000000e0: 7f 7f 7f 7f 01 7e 60 05 7f 7f 7f 7f 7e 01 7f 60 .....~`.....~..` 000000f0: 05 7f 7f 7f 7f 7c 01 7f 60 0c 7f 7f 7f 7f 7f 7f .....|..`....... 00000100: 7f 7f 7f 7f 7f 7f 01 7f 60 10 7f 7f 7f 7f 7f 7f ........`.......

Slide 8

Slide 8 text

  ;Ή;Ή

Slide 9

Slide 9 text

  }

Slide 10

Slide 10 text

  func main() {

Slide 11

Slide 11 text

  ͜͏΍ͬͯಡΉͷ͸ਏ͍ͷͰ

Slide 12

Slide 12 text

  ߏ଄ମʹϚοϐϯά͠·͢

Slide 13

Slide 13 text

  type Module struct { Header ModuleHeader Sections []Section } type ModuleHeader struct { Magic [4]byte Version uint32 } type Section struct { ... }

Slide 14

Slide 14 text

  ΋ͪΖΜ࢖͏ͷ͸

Slide 15

Slide 15 text

  type Reader interface { Read(p []byte) (n int, err error) } ετϦʔϜΛҙࣝ͢Δͱ͖͸ io.Reader Λ࢖͏ io.Reader

Slide 16

Slide 16 text

  // 4όΠτΛio.Reader͔ΒಡΈࠐΉ var buf [4]byte num, err := r.Read(buf[:]) [4]byte ͸ʮ഑ྻʯ buf[0:4] ͱ͔ buf[:] Ͱ഑ྻͷҰ෦΁ͷϙΠϯλʔΛؚΉʮεϥΠεʯ Readʹ౉ͤΔͷ͸ʮεϥΠεʯ NόΠτಡΉ

Slide 17

Slide 17 text

  import "encoding/binary" var num int64 err := binary.Read(r, binary.LittleEndian, &num) binary.Read ͷୈࡾҾ਺͸ interface{} ৭ΜͳܕͷϙΠϯλʔ͕౉ͤΔ int/floatΛಡΉ

Slide 18

Slide 18 text

  int/float͚ͩͰͳ͘

Slide 19

Slide 19 text

  b := []byte{0x18, 0x2d, 0x44, 0x54, 0xfb, 0x21, 0x09, 0x40, 0xff, 0x01, 0x02, 0x03, 0xbe, 0xef} r := bytes.NewReader(b) var data struct { PI float64 Uate uint8 Mine [3]byte Too uint16 } err := binary.Read(r, binary.LittleEndian, &data) ߏ଄ମΛؙ͝ͱಡΉ

Slide 20

Slide 20 text

  binary.Readศར

Slide 21

Slide 21 text

  fmt.Printf("%v\n", data) // => {3.141592653589793 255 [1 2 3] 61374} fmt.Printf("%+v\n", data) // => {PI:3.141592653589793 Uate:255 Mine:[1 2 3] Too:61374} fmt.Printf("%#v\n", data) // => struct { PI float64; Uate uint8; Mine [3]uint8; Too uint16 }{PI: 3.141592653589793, Uate:0xff, Mine:[3]uint8{0x1, 0x2, 0x3}, Too:0xefbe} fmtͷ%v

Slide 22

Slide 22 text

  LLฒͷ࢖͍উख

Slide 23

Slide 23 text

  Α͘ݴΘΕΔGoͷັྗ

Slide 24

Slide 24 text

  ඪ४ϥΠϒϥϦ͕γϯϓϧ͔ͭڧྗ ͓Θ͔Γ͍͚ͨͩͨͩΖ͏͔ʁ

Slide 25

Slide 25 text

  Α͘ݴΘΕΔGoͷܽ఺

Slide 26

Slide 26 text

  Τϥʔॲཧ͕DRY͡Όͳ͍

Slide 27

Slide 27 text

  var buf [4]byte num, err := r.Read(buf[:]) if err != nil { // Τϥʔॲཧ } var num int64 err = binary.Read(r, binary.LittleEndian, &num) if err != nil { // Τϥʔॲཧ } err = binary.Read(r, binary.LittleEndian, &data) if err != nil { // Τϥʔॲཧ

Slide 28

Slide 28 text

 

Slide 29

Slide 29 text

  type decoder struct { r io.Reader err error } func (d *decoder) read(r io.Reader, buf []byte) { if d.err != nil || len(buf) == 0 { return } _, d.err = r.Read(buf) } // https://github.com/sbinet/wasm/blob/master/decoder.go

Slide 30

Slide 30 text

  • Rob Pikeઌੜᐌ͘ɺ • Errors are values (Τϥʔ͸ͨͩͷฦΓ஋) • Τϥʔ͸ྫ֎ͱ͸ҧ͏ɻνΣοΫ͢ΔͷͰ͸ͳ͘ɺ ద੾ʹॲཧͤΑ • https://youtu.be/PAAkCSZUG1c?t=16m14s

Slide 31

Slide 31 text

  }

Slide 32

Slide 32 text

  ͦ΋ͦ΋Կ࡞ͬͯΔͷʁ

Slide 33

Slide 33 text

  WebAssemblyʹৄ͘͠ͳΓ͔ͨͬͨ

Slide 34

Slide 34 text

 

Slide 35

Slide 35 text

  • C΍GoΛWasmʹίϯύΠϧ͢Δͷ͸طʹͰ͖Δ • ࠓޙͨ͘͞Μͷݴޠ͕WasmʹίϯύΠϧͰ͖ΔΑ͏ ʹͳΔ͸ͣ • Goͷ্ͰWasmΛ࣮ߦ͢Δະདྷ΋དྷΔ͸ͣ

Slide 36

Slide 36 text

  Wasm→Ruby ISeqίϯύΠϥʔ mRuby→WasmίϯύΠϥʔ

Slide 37

Slide 37 text

  Ӷҙ࡞੒த

Slide 38

Slide 38 text

  • https://github.com/edvakf/wasm • https://github.com/edvakf/wagyu • ׬੒͠ͳͯ͘΋ɺ࣮༻త͡Όͳͯ͘΋ɺษڧ͢Δ͜ͱ ࣗମָ͕͚͠Ε͹͍͍ɻͦΜͳϓϩάϥϜΛॻ͜͏ͱ ࢥͬͯ΍ͬͯ·͢ɻ

Slide 39

Slide 39 text

  os.Exit(0)