Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Go/GAEで作る金融システム / Finance system made with Go and GAE

Go/GAEで作る金融システム / Finance system made with Go and GAE

Next Currency Inc.

October 11, 2018
Tweet

Other Decks in Technology

Transcript

  1. Go/GAEͰ࡞Δ ۚ༥γεςϜ גࣜձࣾωΫετΧϨϯγʔ

  2. Agenda • ձࣾʹ͍ͭͯ • 4ͭͷʮ͍͍ͧʯ - Google App Engine(GAE)͸͍͍ͧ -

    Stackdriver Logging͸͍͍ͧ - Protocol Buffers͸͍͍ͧ - Golang͸͍͍ͧ
  3. ձࣾʹ͍ͭͯ

  4. גࣜձࣾ ωΫετΧϨϯγʔ

  5. None
  6. Ӷҙ੡࡞தʂ

  7. Ծ૝௨՟ަ׵ۀ

  8. ϒϩοΫνΣʔϯ

  9. None
  10. ۚ༥

  11. ͓٬༷ͷ͓ۚΛ ͓༬͔Γ͢Δ

  12. ߴ͍҆શੑ

  13. ۀքͷྲྀΕ͸ૣ͍

  14. ߴ଎ͳ։ൃ͕ ٻΊΒΕΔ

  15. Server Side CONCEPT

  16. Environment is Easy Code is Simple

  17. ؀ڥ͸؆୯ʹ ίʔυ͸୯७ʹ

  18. ࢖༻ٕज़ • Google Cloud Platform - Google App Engine -

    Cloud SQL - Datastore - Cloud Functions • Golang - ϝΠϯͱͳΔϩδοΫ • Node.js - Cloud FunctionsͰͷϩάૢ࡞
  19. ࢖༻ٕज़ • Google Cloud Platform - Google App Engine -

    Cloud SQL - Datastore - Cloud Functions • Golang - ϝΠϯͱͳΔϩδοΫ • Node.js - Cloud FunctionsͰͷϩάૢ࡞
  20. ࢖༻ٕज़ • Google Cloud Platform - Google App Engine -

    Cloud SQL - Datastore - Cloud Functions • Golang - ϝΠϯͱͳΔϩδοΫ • Node.js - Cloud FunctionsͰͷϩάૢ࡞ &BTZ
  21. ࢖༻ٕज़ • Google Cloud Platform - Google App Engine -

    Cloud SQL - Datastore - Cloud Functions • Golang - ϝΠϯͱͳΔϩδοΫ • Node.js - Cloud FunctionsͰͷϩάૢ࡞
  22. ࢖༻ٕज़ • Google Cloud Platform - Google App Engine -

    Cloud SQL - Datastore - Cloud Functions • Golang - ϝΠϯͱͳΔϩδοΫ • Node.js - Cloud FunctionsͰͷϩάૢ࡞ 4JNQMF
  23. ։ൃதʹൃݟͨ͠

  24. ʮ˓˓͸͍͍ͧʯ

  25. 4ͭͷʮ͍͍ͧʯ • Google App Engine(GAE)͸͍͍ͧ • Stackdriver Logging͸͍͍ͧ • Protocol

    Buffers͸͍͍ͧ • Golang͸͍͍ͧ
  26. Google App Engine(GAE)͸ ͍͍ͧ

  27. Google App Engine • Google͕ఏڙ͍ͯ͠ΔPaaS • Python, Java, Node.js, PHP,

    Goʹඪ४ͰରԠ • ඇৗʹߴ͍Մ༻ੑ
  28. What is “͍͍ͧ”?

  29. ָ

  30. ΠϯϑϥߏஙͰͷ՝୊ • Blue/GreenσϓϩΠ͕࣮ݱͰ͖Δ͔ • ద੾ʹεέʔϧΞ΢τͰ͖Δ͔ • ηΩϡϦςΟʹ໰୊͕ͳ͍͔

  31. ΠϯϑϥߏஙͰͷ՝୊ • Blue/GreenσϓϩΠ͕࣮ݱͰ͖Δ͔ - GAEΛ࢖͏ͱղܾ • ద੾ʹεέʔϧΞ΢τͰ͖Δ͔ - GAEΛ࢖͏ͱղܾ •

    ηΩϡϦςΟʹ໰୊͕ͳ͍͔ - GAEΛ࢖͏ͱ෦෼తʹղܾ
  32. GAEͷߏ଄ ("&

  33. GAEͷߏ଄ ("& ϓϩδΣΫτʹͭ

  34. GAEͷߏ଄ ("& "1* ʮ4FSWJDFʯͱ͍͏୯Ґ

  35. GAEͷߏ଄ ("& "1* runtime: go api_version: go1.9 service: api handlers:

    - url: /.* secure: always script: _go_app
  36. GAEͷߏ଄ ("& "1* ໾ׂ͝ͱʹ෼ׂ

  37. GAEͷߏ଄ ("& "1* "ENJO

  38. GAEͷߏ଄ ("& "1* "ENJO #BUDI

  39. GAEͷߏ଄ ("& "1* ࣗಈͰ63-͕ৼΒΕΔ api-dot-project.appspot.com

  40. GAEͷߏ଄ ("& "1* ࣗ෼Ͱ63-Λ ৼΔ͜ͱ΋Ͱ͖Δ

  41. GAEͷߏ଄ ("& "1* WFSTJPO ʮ7FSTJPOʯͱ͍͏୯Ґ ͜ͷ୯ҐͰσϓϩΠ͢Δ

  42. GAEͷߏ଄ ("& "1* WFSTJPO WFSTJPO αʔϏεͷதʹ ෳ਺ͷόʔδϣϯ͕͋Δ

  43. GAEͷߏ଄ ("& "1* WFSTJPO WFSTJPO ࣗಈͰ63-͕ৼΒΕΔ version1-dot-api-dot- project.appspot.com

  44. GAEͷߏ଄ ("& "1* WFSTJPO WFSTJPO 7FSTJPOຖʹ
 τϥϑΟοΫΛ੍ޚ͢Δ

  45. GAEͷߏ଄ ("& "1* WFSTJPO WFSTJPO τϥϑΟοΫ

  46. GAEͷߏ଄ ("& "1* WFSTJPO WFSTJPO τϥϑΟοΫ

  47. GAEͷߏ଄ ("& "1* WFSTJPO WFSTJPO τϥϑΟοΫ

  48. GAEͷߏ଄ ("& "1* WFSTJPO WFSTJPO ʮ*OTUBODFʯͱ͍͏୯Ґ ͜ͷ୯ҐͰॲཧ͞ΕΔ

  49. GAEͷߏ଄ ("& "1* WFSTJPO WFSTJPO

  50. GAEͷߏ଄ ("& "1* WFSTJPO WFSTJPO େ͖͍τϥϑΟοΫ

  51. GAEͷߏ଄ ("& "1* WFSTJPO WFSTJPO େ͖͍τϥϑΟοΫ

  52. GAEͷߏ଄ ("& "1* WFSTJPO WFSTJPO খ͍͞τϥϑΟοΫ

  53. ΠϯϑϥߏஙͰͷ՝୊ • Blue/GreenσϓϩΠ͕࣮ݱͰ͖Δ͔ - GAEΛ࢖͏ͱղܾ • ద੾ʹεέʔϧΞ΢τͰ͖Δ͔ - GAEΛ࢖͏ͱղܾ •

    ηΩϡϦςΟʹ໰୊͕ͳ͍͔ - GAEΛ࢖͏ͱ෦෼తʹղܾ
  54. Blue/GreenσϓϩΠ • GAEͷόʔδϣϯͷػೳͰղܾ • τϥϑΟοΫͷ੾Γସ͑͸Graceful • ϝϯς༻όʔδϣϯࣄલʹσϓϩΠ͓͚ͯ͠͹
 ϝϯς੾Γସ͑΋Easy

  55. εέʔϧΠϯ/Ξ΢τ • ઃఆ͓͚͑ͯ͞͠͹উखʹ΍ͬͯ͘ΕΔ - Goͷ৔߹্ཱ͕ͪΓʹ਺ेϛϦඵ • εέʔϧΞ΢τ΋2छྨ͋Δ - େྔͷϦΫΤετͷͨΊͷAutomatic -

    όον౳௕͍ॲཧͷͨΊͷBasic
  56. ηΩϡϦςΟ • Πϯελϯε΁ͷ৵ೖ͸جຊతʹ͸ෆՄೳ • DDoS΋͋Δఔ౓·Ͱ͸GAEͰ΍ͬͯ͘ΕΔ • ϛυϧ΢ΣΞͷ੬ऑੑ໰୊͕ѹ౗తʹগͳ͍ - Google͕উखʹରԠͯ͘͠ΕΔ •

    ίʔυͷηΩϡϦςΟ͸ผ
  57. ΠϯϑϥߏஙͰ ೰·ͳ͍͍ͯ͘ʂ

  58. Google App Engine(GAE)͸ ͍͍ͧ

  59. Stackdriver Logging͸͍͍ͧ

  60. Stackdriver Logging • ϑϧϚωʔδυͳϩΪϯάαʔϏε • GCPͰग़ྗ͞ΕΔϩά͕શͯू໿͞ΕΔ • Pub/Sub(Queue)ʹ؆୯ʹྲྀͤΔ - Ճ޻΍௨஌ָ͕

    • ϑΟϧλػೳ • GCPͰग़ྗ͞ΕΔϩά͕
 શͯू໿͞ΕΔ
  61. What is “͍͍ͧ”?

  62. GCPͰग़ྗ͞ΕΔ ϩά͕શͯू໿ ͞ΕΔ(3ճ໨)

  63. (ࣗ෼͕GCPΛ ৮ͬͯҰ൪ײಈͨ͠ αʔϏε)

  64. None
  65. None
  66. None
  67. None
  68. None
  69. None
  70. Կ΋ͯ͠ͳ͍ʂʂʂ

  71. None
  72. None
  73. None
  74. None
  75. None
  76. None
  77. None
  78. None
  79. None
  80. None
  81. None
  82. ϩάऩूΛ ߟ͑ͳ͍͍ͯ͘ʂʂ

  83. Stackdriver Logging͸͍͍ͧ

  84. Protocol Buffers͸ ͍͍ͧ

  85. ಥવͰ͕࣭͢໰Ͱ͢

  86. APIυΩϡϝϯτ Ͳ͏ͯ͠·͔͢ʁ

  87. ࣾ಺Wiki

  88. Swagger Blueprint

  89. JSON Schema

  90. ϓϩδΣΫτͷ README

  91. ΋͏1࣭ͭ໰Ͱ͢

  92. ϝϯςφϯε ͞Εͯ·͔͢……?

  93. APIυΩϡϝϯτͷ ՝୊

  94. ࣮૷ͱͷဃ཭

  95. ࣮૷ͱͷဃ཭ • υΩϡϝϯτΛॻ͔ͳͯ͘΋࣮૷͕Ͱ͖Δ • ࣮૷ͷมߋʹυΩϡϝϯτ͕௥ै͠ͳ͍ • υΩϡϝϯτΛهड़͢Δπʔϧͷशಘίετ • ࣮ࡍʹΫϥΠΞϯτͱαʔό͕΍ΓऔΓΛ
 ͠ͳ͍ͱҧ͍ʹؾ͚ͮͳ͍

  96. Protocol Buffers

  97. Protocol Buffers • Google͕։ൃΛ͍ͯ͠Δ
 ΠϯλʔϑΣʔεఆٛݴޠ(IDL) • γϯϓϧͰߴ଎ • ओཁͳݴޠʹରԠ͍ͯ͠Δ -

    Golang - Java - Swfit - Javascript(TypeScript)
  98. gRPC ≠ Protocol Buffers

  99. gRPC HTTP TCP HTTP2 Protocol Buffers JSON XML

  100. Protocol Buffers on HTTP

  101. 4FSWFS $MJFOU {“msg”: “message”} +40/ )551

  102. 4FSWFS $MJFOU 010100101001… #JOBSZ )551

  103. Protocol Buffers ͷ ߏ଄

  104. syntax = "proto3"; package echo; option go_package = "pb"; option

    java_package = ""; option swift_prefix = ""; message EchoRequest { string msg = 1; } message EchoResponse { string echo_msg = 1; } service EchoService { rpc Echo(EchoRequest) returns (EchoResponse) {} } echo.proto
  105. syntax = "proto3"; package echo; option go_package = "pb"; option

    java_package = ""; option swift_prefix = ""; message EchoRequest { string msg = 1; } message EchoResponse { string echo_msg = 1; } service EchoService { rpc Echo(EchoRequest) returns (EchoResponse) {} } echo.proto
  106. syntax = "proto3"; package echo; option go_package = "pb"; option

    java_package = ""; option swift_prefix = ""; message EchoRequest { string msg = 1; } message EchoResponse { string echo_msg = 1; } service EchoService { rpc Echo(EchoRequest) returns (EchoResponse) {} } echo.proto
  107. syntax = "proto3"; package echo; option go_package = "pb"; option

    java_package = ""; option swift_prefix = ""; message EchoRequest { string msg = 1; } message EchoResponse { string echo_msg = 1; } service EchoService { rpc Echo(EchoRequest) returns (EchoResponse) {} } echo.proto
  108. syntax = "proto3"; package echo; option go_package = "pb"; option

    java_package = ""; option swift_prefix = ""; message EchoRequest { string msg = 1; } message EchoResponse { string echo_msg = 1; } service EchoService { rpc Echo(EchoRequest) returns (EchoResponse) {} } echo.proto
  109. $ protoc \ —go_out=plugins=grpc:.\ *.proto

  110. type EchoRequest struct { Msg string `protobuf:"bytes,1,opt,name=msg" json:"msg,omitempty"` XXX_NoUnkeyedLiteral struct{}

    `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } type EchoServiceServer interface { Echo(context.Context, *EchoRequest) (*EchoResponse, error) } echo.pb.go
  111. type EchoRequest struct { Msg string `protobuf:"bytes,1,opt,name=msg" json:"msg,omitempty"` XXX_NoUnkeyedLiteral struct{}

    `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } type EchoServiceServer interface { Echo(context.Context, *EchoRequest) (*EchoResponse, error) } echo.pb.go
  112. type EchoRequest struct { Msg string `protobuf:"bytes,1,opt,name=msg" json:"msg,omitempty"` XXX_NoUnkeyedLiteral struct{}

    `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } type EchoServiceServer interface { Echo(context.Context, *EchoRequest) (*EchoResponse, error) } echo.pb.go
  113. type EchoRequest struct { Msg string `protobuf:"bytes,1,opt,name=msg" json:"msg,omitempty"` XXX_NoUnkeyedLiteral struct{}

    `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } type EchoServiceServer interface { Echo(context.Context, *EchoRequest) (*EchoResponse, error) } echo.pb.go
  114. public final class Echo { private Echo() {} public static

    final class EchoRequest extends com.google.protobuf.GeneratedMessageV3 implements { // @@protoc_insertion_point(message_implements:echo.EchoRequest) private EchoRequest() { msg_ = ""; } public static final int MSG_FIELD_NUMBER = 1; private volatile java.lang.Object msg_; public java.lang.String getMsg() { } } } Echo.java
  115. public final class Echo { private Echo() {} public static

    final class EchoRequest extends com.google.protobuf.GeneratedMessageV3 implements { // @@protoc_insertion_point(message_implements:echo.EchoRequest) private EchoRequest() { msg_ = ""; } public static final int MSG_FIELD_NUMBER = 1; private volatile java.lang.Object msg_; public java.lang.String getMsg() { } } } Echo.java
  116. public final class Echo { private Echo() {} public static

    final class EchoRequest extends com.google.protobuf.GeneratedMessageV3 implements { // @@protoc_insertion_point(message_implements:echo.EchoRequest) private EchoRequest() { msg_ = ""; } public static final int MSG_FIELD_NUMBER = 1; private volatile java.lang.Object msg_; public java.lang.String getMsg() { } } } Echo.java
  117. ͜ΕΛ֤ݴޠͷ ϥΠϒϥϦΛ௨ͯ͠ Binaryʹ͢Δ

  118. What is “͍͍ͧ”?

  119. υΩϡϝϯτʹ࣮૷

  120. Protocol Buffers • ه๏͕Θ͔Γ΍͍͢ • σʔλͷදݱํ๏͕๛͔ - int, double, repeated(Array),

    Map… • ֤ݴޠͷίʔυͦͷ΋ͷΛੜ੒ͯ͠࢖͏ - มߋ͕͋ͬͨ৔߹Ϗϧυ࣌ʹؾ͚ͮΔ
  121. syntax = "proto3"; package echo; option go_package = "pb"; option

    java_package = ""; option swift_prefix = ""; message EchoRequest { string msg = 1; } message EchoResponse { string echo_msg = 1; } service EchoService { rpc Echo(EchoRequest) returns (EchoResponse) {} } echo.proto
  122. syntax = "proto3"; package echo; option go_package = "pb"; option

    java_package = ""; option swift_prefix = ""; message EchoRequest { string msg = 1; } message EchoResponse { string echo_msg = 1; } service EchoService { rpc Echo(EchoRequest) returns (EchoResponse) {} } echo.proto
  123. syntax = "proto3"; package echo; option go_package = "pb"; option

    java_package = ""; option swift_prefix = ""; message EchoRequest { string msg = 1; } message EchoResponse { string echo_msg = 1; } service EchoService { rpc Echo(EchoRequest) returns (EchoResponse) {} } echo.proto
  124. type EchoRequest struct { Msg string `protobuf:"bytes,1,opt,name=msg" json:"msg,omitempty"` XXX_NoUnkeyedLiteral struct{}

    `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } type EchoServiceServer interface { Echo(context.Context, *EchoRequest) (*EchoResponse, error) } echo.pb.go
  125. type EchoRequest struct { Msg string `protobuf:"bytes,1,opt,name=msg" json:"msg,omitempty"` XXX_NoUnkeyedLiteral struct{}

    `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } type EchoServiceServer interface { Echo(context.Context, *EchoRequest) (*EchoResponse, error) } echo.pb.go
  126. type EchoRequest struct { Msg string `protobuf:"bytes,1,opt,name=msg" json:"msg,omitempty"` XXX_NoUnkeyedLiteral struct{}

    `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } type EchoServiceServer interface { Echo(context.Context, *EchoRequest) (*EchoResponse, error) } echo.pb.go
  127. APIυΩϡϝϯτΛ Protocol Buffersʹ دͤΒΕΔʂʂ

  128. APIυΩϡϝϯτͱ ࣮૷ͷဃ཭Λ ؾʹ͠ͳ͍͍ͯ͘ʂ

  129. Protocol Buffers͸ ͍͍ͧ

  130. Golang͸͍͍ͧ

  131. What is “͍͍ͧ”?

  132. γϯϓϧ

  133. γϯϓϧͷ͍͍ͱ͜Ζ • ݴޠ࢓༷ͷཧղ͕༰қ • ฒߦॲཧͷѻ͍ - goroutine - channel •

    γϯϓϧͰ͋Δ͕Ώ͑ͷϏϧυ࣌ؒͷ୹͞
  134. ͑ʁ

  135. ฉ͖๞͖ͨʁ

  136. ۩ମతͳൺֱ

  137. func f(li []int) []int { ret := make([]int, 0) for

    _, n := range li { if n%2 == 0 { ret = append(ret, n) } } for i := range ret { ret[i] = ret[i] * 2 } return ret } Golang li.filter(n => n % 2 === 0) .map(n => n * 2) Javascript
  138. func f(li []int) []int { ret := make([]int, 0) for

    _, n := range li { if n%2 == 0 { ret = append(ret, n) } } for i := range ret { ret[i] = ret[i] * 2 } return ret } Golang li.filter(n => n % 2 === 0) .map(n => n * 2) Javascript ಡΈ΍͍͢ͷ͸Ͳͬͪʁ
  139. func f(li []int) []int { ret := make([]int, 0) for

    _, n := range li { if n%2 == 0 { ret = append(ret, n) } } for i := range ret { ret[i] = ret[i] * 2 } return ret } Golang li.filter(n => n % 2 === 0) .map(n => n * 2) Javascript ੜ࢈ੑ͕ߴ͍ͷ͸ʁ
  140. func f(li []int) []int { ret := make([]int, 0) for

    _, n := range li { if n%2 == 0 { ret = append(ret, n) } } for i := range ret { ret[i] = ret[i] * 2 } return ret } Golang li.filter(n => n % 2 === 0) .map(n => n * 2) Javascript ࣮ߦͷޮ཰͕͍͍ͷ͸ʁ
  141. func f(li []int) []int { ret := make([]int, 0) for

    _, n := range li { if n%2 == 0 { ret = append(ret, n) } } for i := range ret { ret[i] = ret[i] * 2 } return ret } Golang li.filter(n => n % 2 === 0) .map(n => n * 2) Javascript ίϯύΠϥ͕ղऍ͠΍͍͢ͷ͸ʁ
  142. ݴ͍͍ͨ͜ͱ

  143. ͲͬͪͰ΋͍͍

  144. ίʔυʹ͸ ”ҙਤ”Λ දݱ͢Δ΂͖

  145. ίʔυͷҙਤ • ͲΜͳه๏Ͱ͋ͬͯ΋ҙਤ͕ॏཁ • intͷ഑ྻͷۮ਺ͷ஋Λ2ഒʹ͢Δҙਤ͸Կ͔ʁ - ͨͩͷ਺஋ܭࢉ - UserͷεςʔλεͷભҠ -

    ళฮͷStarͷഒ཰
  146. func f(li []int) []int { ret := make([]int, 0) for

    _, n := range li { if n%2 == 0 { ret = append(ret, n) } } for i := range ret { ret[i] = ret[i] * 2 } return ret } Golang li.filter(n => n % 2 === 0) .map(n => n * 2) Javascript
  147. func f(li []int) []int { ret := make([]int, 0) for

    _, n := range li { if n%2 == 0 { ret = append(ret, n) } } for i := range ret { ret[i] = ret[i] * 2 } return ret } Golang li.filter(n => n % 2 === 0) .map(n => n * 2) Javascript ͲͪΒ΋ҙਤ͕ͳ͍
  148. func f(li []int) []int { ret := make([]int, 0) for

    _, n := range li { if n%2 == 0 { ret = append(ret, n) } } for i := range ret { ret[i] = ret[i] * 2 } return ret } Golang li.filter(n => n % 2 === 0) .map(n => n * 2) Javascript ͲͬͪͰ΋͍͍
  149. ͡Ό͋ͳΜͰ Golang?

  150. ϏδωεϩδοΫʹ ूத͠΍͍͢

  151. Javascript • ഑ྻͷཁૉΛಛఆͷ৚݅ͰߜΓ͍ͨʂ - filter͕͋ΔΑʂ • ഑ྻͷཁૉશͯΛૢ࡞Λ͍ͨ͠ʂ - map͕͋ΔΑʂ •

    ഑ྻͷཁૉ͢΂ͯΛ࢖ͬͯ݁ՌΛ࡞Γ͍ͨʂ - reduce͕͋ΔΑʂ
  152. Javascript • ഑ྻͷཁૉΛಛఆͷ৚݅ͰߜΓ͍ͨʂ - filter͕͋ΔΑʂ • ഑ྻͷཁૉશͯΛૢ࡞Λ͍ͨ͠ʂ - map͕͋ΔΑʂ •

    ഑ྻͷཁૉ͢΂ͯΛ࢖ͬͯ݁ՌΛ࡞Γ͍ͨʂ - reduce͕͋ΔΑʂ Ͱ΋શ෦GPSϧʔϓͰ΋࣮ݱͰ͖ΔΑʂ
  153. Golang • ഑ྻͷཁૉΛಛఆͷ৚݅ͰߜΓ͍ͨʂ - forͱifΛ࢖͓͏ • ഑ྻͷཁૉશͯΛૢ࡞Λ͍ͨ͠ʂ - forΛ࢖͓͏ •

    ഑ྻͷཁૉ͢΂ͯΛ࢖ͬͯ݁ՌΛ࡞Γ͍ͨʂ - forΛ࢖͓͏
  154. ۚ༥γεςϜ • ۚ༥ۀքಛ༗ͷυϝΠϯ஌͕ࣝ๲େ • ΤϯδχΞ͸ۚ༥ͷઐ໳ՈͰ͸ͳ͍ • υϝΠϯ஌ࣝͷͨΊʹ࠷େݶ࣌ؒΛ࢖͍͍ͨ - ۚ༥ͷ஌ࣝͷΠϯϓοτ -

    υϝΠϯΤΩεύʔτͱͷ
 ίϛϡχέʔγϣϯ
  155. ΞϓϦέʔγϣϯΛ ॻ͘͜ͱʹ ूதͰ͖Δʂ

  156. Golang͸͍͍ͧ

  157. 4ͭͷʮ͍͍ͧʯ • Google App Engine(GAE)͸͍͍ͧ • Stackdriver Logging͸͍͍ͧ • Protocol

    Buffers͸͍͍ͧ • Golang͸͍͍ͧ
  158. ࠙਌ձͰ ͓࿩͠·͠ΐ͏ʂ

  159. Ұॹʹಇ͍ͯ ͘ΕΔਓ ืूதʂʂʂ