SlideShare una empresa de Scribd logo
1 de 67
Descargar para leer sin conexión
自作Webフレームワーク
uconを作った話
わかめ まさひろ
わかめ まさひろ @vvakame
TypeScript
Masahiro Wakame
DefinitelyTyped
appengine/go
photo from golang.org/doc/gopher/
GoogleAppEngine/Go
神 いわゆる GOD
諸君、私はappengine/goが好きだ
• 2008年4月 始まる
• サーバレスアーキテクチャ
• 2011年5月 Go対応始まる
• 2015年7月 Go, GAになる
• 2016年4月 Go 1.6対応
1.9.35→❌
1.9.36を使おう!
Eric Schmidt said.
https://www.youtube.com/watch?v=HgWHeT_OwHc&t=1461
GCP Next 2016 Day 1 Keynote
GAE用ライブラリ作ってます
• testerator github.com/favclip/testrator
• UnitTest高速化
• qbg github.com/favclip/qbg
• Datastore用TypeSafeクエリビルダ
• smg github.com/favclip/smg
• Search API用TypeSafeラッパ
productionで利用中!
GoCon 2015 Summer
• appengine専用じゃないけど
• jwg github.com/favclip/jwg
• genbase github.com/favclip/genbase
• GoCon 2015で話をしました!
• SlideShare goo.gl/45lZDK
gb
• gb
• getgb.io/
• gb keeps the peace of our project🌹
• gb gae
• github.com/PalmStoneGames/gb-gae
Google API Discovery Service
誰か知ってる?
APIs Explorer is 神
https://developers.google.com/apis-explorer/
APIs Explorer
• 誰でも簡単に使える
• 実際のAPIが叩かれる
• 結果を共有しやすい
• コードからUIが生成されている
Cloud Endpoints
• appengine専用の仕組み
• cloud.google.com/endpoints/
• 自前APIでAPIs Explorer使える
• APIの構造がわかる!
• 実例がわかる!(DevTool)
• UIを省く極道管理画面も!
周辺ツールも充実
• クライアントライブラリの自動生成
• golangだとこの辺全部そう
• github.com/google/google-api-go-
client
• TypeScript用型定義の生成
• www.npmjs.com/package/gapidts
but…
Googleの闇の領域
ユーザ GAE闇
path mapping
request format
Version切替後reqをなかった事に
custom domain不可
go-endpoints
• CloudEndpoints用framework
• github.com/GoogleCloudPlatform/
go-endpoints
• Service & Method の組み合わせで定義
• w http.ResponseWriterが取れない
• CloudEndpoints的には不要なので…
評価
• 細かい事を気にしなければかなり良い
• カスタムドメイン不可がやはり辛い
• デバッグ不可能な闇の領域が辛い
• ちょいちょいそこが不安定な気が…
• 拡張性が低い
• 横断的な処理を入れにくい…
僕達が必要なもの
Alt Cloud Endpoints
• APIs Explorer的なものが欲しい!
• サバクラの意思疎通が楽
• デバッグが楽
• コード→仕様が良い
• 仕様→コード は努力が必要(努力やだ
• クライアントコードの生成
• 変わったら壊れてほしい
代替ツールの検討
各ツールの評価
• RAML
• API Blueprint (apiary.io
• JSON Schema v4
• Swagger
• gRPC
✨swagger✨
• Swaggerが一番良さそう!
• 個人の見解です
• Open API Initiative発足
• Swagger仕様をbaseに
• 長いものには巻かれたい
• Qiitaに少し書きました goo.gl/BLS3uH
既存GoなSwagger実装の話
最初からswagger対応
の物を選ぶと楽そう
既存Go実装の比較
• go-swagger
• goswagger.io/
• type safeじゃない
• yvasiyarov/swagger
• github.com/yvasiyarov/swagger
• comment baseでつらい
• type safeじゃない
既存Go実装の比較
• go-restful
• github.com/emicklei/go-restful/
• type safeじゃない
• goa
• goa.design/
• type safeじゃない
• DSLがヤバイ
既存Go実装の比較
• grpc-gateway
• github.com/gengo/grpc-gateway
• gRPCのJSONなreverse proxy
• いつのまにかswagger対応してた
• appengineだと❌
既存Webフレームワーク
重要なポイント
• net/httpに近いほうがわかりやすい
• あまりに独自っぽいのはちょっと…
• go-endpointsからの移行
• しばらくCloudEndpointsと両立したい
• コード上の互換性があると嬉しい…
• swagger-uiが使える
既存フレームワーク調べた
• なるべくnet/httpに近い
• revel→❌
• なるべくCloudEndpointsのまま
• net/http→❌
• goji→❌
• Swagger対応!
• martini→❌
結論
•自分でつくろう
趣味に走ったわけではないです
自分で作る話
前提
• appengine縛りにはしない
• とはいえappengineで使えないと困る
• net/httpに近いAPI
• 柔軟性
• go-endpointsとの互換性
• swaggerはopt-in
やっていく
ucon
https://github.com/favclip/ucon
名付け親
某a2cさん
martiniとか
ginとかに
対抗して
名付け親
某a2cさん
uconと
名付けよう!
In japan, ucon (= turmeric) is
to be effective in hangover.
決めた後
某a2cさん
💩
←ゆるさない!!
仕様紹介
まずgo-endpoints
s := &fooService{}



api, err := endpoints.RegisterService(s, "foo", "v1", "Foo API", true)

if err != nil {

panic(err.Error())

}



info := api.MethodByName("Get").Info()

info.HTTPMethod, info.Path, info.Desc = “GET", "/foo/{id}", “Fooを1件取得する"
…
type IntIDRequest struct {

ID int64 `json:"id,string"`

}

func (s *fooService) Get(r *http.Request, req *IntIDRequest) (*FooJSON, error) {
…
}
まずgo-endpoints
s := &fooService{}



api, err := endpoints.RegisterService(s, "foo", "v1", "Foo API", true)

if err != nil {

panic(err.Error())

}



info := api.MethodByName("Get").Info()

info.HTTPMethod, info.Path, info.Desc = “GET", "/foo/{id}", “Fooを1件取得する"
…
type IntIDRequest struct {

ID int64 `json:"id,string"`

}

func (s *fooService) Get(r *http.Request, req *IntIDRequest) (*FooJSON, error) {
…
}
Handler
Response
Setup
まずgo-endpoints
s := &fooService{}



api, err := endpoints.RegisterService(s, "foo", "v1", "Foo API", true)

if err != nil {

panic(err.Error())

}



info := api.MethodByName("Get").Info()

info.HTTPMethod, info.Path, info.Desc = “GET", "/foo/{id}", “Fooを1件取得する"
…
type IntIDRequest struct {

ID int64 `json:"id,string"`

}

func (s *fooService) Get(r *http.Request, req *IntIDRequest) (*FooJSON, error) {
…
}
Request
Response
闇の領域でもろもろ変換されてる
ucon Features
• net/http との類似性
• Routing
• Method, Path Matching
• Middleware
• Bubble
• Dependency Injection
• Plugin
API likes net/http
ucon.HandleFunc("GET", "/", func(w http.ResponseWriter, r *http.Request) {})
API likes net/http
ucon.HandleFunc("GET", "/", func(w http.ResponseWriter, r *http.Request) {})
Routing
ucon.HandleFunc(“*", “/“, …
ucon.HandleFunc(“OPTIONS", “/“, …
ucon.HandleFunc(“GET", “/“, …
ucon.HandleFunc(“POST", “/“, …
ucon.HandleFunc(“GET", “/api/user“, …
ucon.HandleFunc(“GET", “/api/user/me“, …
ucon.HandleFunc(“GET", “/api/user/{id}“, …
Routing rule
• METHODが一致する
• * 指定も可 厳密一致優先
• Request Pathが一致する
• 複数候補ある場合より長い節一致
• Request GET /api/user/123
• 🌟 GET /api/user/{id}
• ❌ GET /api/user
• 先登録優先
Middleware
• 1 request毎の処理に介入
• JavaでいうServletFilter
• ASP.NET MVCでいうFilter
• Logging, DI, CORS用Header,
error→JSON変換 etc, etc…
Middleware
Middleware
Middleware
Middleware
Handler
ServeHTTP DI
Cache-Control
Cookie
appengine.Context
etc, etc…
CORS Header
Path, Query, Body → JSON
*http.Request
http.ResponseWriter
Middleware
type MiddlewareFunc func(b *Bubble) error
type Bubble struct {

R *http.Request

W http.ResponseWriter

Context context.Context

RequestHandler interface{}



ArgumentTypes []reflect.Type

Arguments []reflect.Value

Returns []reflect.Value

}

func (b *Bubble) Next() error {
…

}
func (b *Bubble) do() error {

hv := reflect.ValueOf(b.handler())

…



b.Returns = hv.Call(b.Arguments)



return nil

}
var httpReqType = reflect.TypeOf((*http.Request)(
var httpRespType = reflect.TypeOf((*http.Response
func HTTPRWDI() MiddlewareFunc {

return func(b *Bubble) error {

for idx, argT := range b.ArgumentTypes {

if argT == httpReqType {

b.Arguments[idx] = reflect.ValueOf(b.R)

continue

}

if argT == httpRespType {

b.Arguments[idx] = reflect.ValueOf(b.W)

continue

}

}



return b.Next()

}

}
built-in middleware
• HTTPRWDI
• *http.Request, http.ResponseWriterのDI
• NetContextDI
• net/contextのContextをDI
built-in middleware
• RequestObjectMapper
• path parameter, query paramter, post
bodyをObjectに変換しDI
• ResponseMapper
• HandlerがreturnしたObjectやerrorを
JSONに変換
Plugin
• プロセス起動時1回だけ動作
• 全Handlerの走査
• Handler→Plugin間の値の伝達機構
• swaggerはplugin
• 全Handlerの情報から処理
• swagger.json出力用Handlerの追加
Plugin
type pluginContainer struct {

base interface{}

}



type HandlersScannerPlugin interface {

HandlersScannerProcess(m *ServeMux, rds []*RouteDefinition) error

}

type RouteDefinition struct {

Method string

PathTemplate *PathTemplate

HandlerContainer HandlerContainer

}
func (m *ServeMux) Prepare() {

for _, plugin := range m.plugins {

used := false

if sc := plugin.HandlersScanner(); sc != nil {

err := sc.HandlersScannerProcess(m, m.router.handlers)

if err != nil {

panic(err)

}

used = true

}

if !used {

panic(fmt.Sprintf("unused plugin: %#v", plugin))

}

}

}
Plugin
type pluginContainer struct {

base interface{}

}



type HandlersScannerPlugin interface {

HandlersScannerProcess(m *ServeMux, rds []*RouteDefinition) error

}

type RouteDefinition struct {

Method string

PathTemplate *PathTemplate

HandlerContainer HandlerContainer

}
func (m *ServeMux) Prepare() {

for _, plugin := range m.plugins {

used := false

if sc := plugin.HandlersScanner(); sc != nil {

err := sc.HandlersScannerProcess(m, m.router.handlers)

if err != nil {

panic(err)

}

used = true

}

if !used {

panic(fmt.Sprintf("unused plugin: %#v", plugin))

}

}

}
swagger plugin usage
swPlugin := swagger.NewPlugin(…)

ucon.Plugin(swPlugin)
s := &fooService{}



tag := swPlugin.AddTag(&swagger.Tag{Name: "Foo", Description: ""})

var info *swagger.HandlerInfo



info = swagger.NewHandlerInfo(s.List)

ucon.Handle("GET", "/api/foo/{id}", info)

info.Description, info.Tags = "Fooを1件取得する", []string{tag.Name}
…
type IntIDRequest struct {

ID int64 `json:"id,string"`

}

func (s *fooService) Get(r *http.Request, req *IntIDRequest) (*FooJSON, error) {
…
}
go-endpoints(再掲
s := &fooService{}



api, err := endpoints.RegisterService(s, "foo", "v1", "Foo API", true)

if err != nil {

panic(err.Error())

}



info := api.MethodByName("Get").Info()

info.HTTPMethod, info.Path, info.Desc = “GET", "/foo/{id}", “Fooを1件取得する"
…
type IntIDRequest struct {

ID int64 `json:"id,string"`

}

func (s *fooService) Get(r *http.Request, req *IntIDRequest) (*FooJSON, error) {
…
}
コード規模の話
• 本体 1329行
• ls | grep .go | grep -v _test.go | xargs wc -l
• swaggerプラグイン 1138行
• find ./swagger -type f | grep .go | grep -v sample | grep -v _test.go | xargs wc -l
利用事例
利用サイト
• favclip
• 技術書典 応募サイト
• 怖くてOSSにでけんかったすまんな…
• Topgate社内では今後使っていくはず…
swagger関連ツール
• swagger-uiの話
• Go用クライアントライブラリの話
• TypeScript用型定義ファイル生成の話
求む!
求む!
• 利用してみてブログ書く
• 利用してみて質問する
• 利用してみて…
自分が使えるようになると
満足するタイプ
We are hiring
We are hiring 1
• 開発:テレビ朝日
• jwg, genbase 他 必要に応じて製造
• http://www.favclip.com/
• appengine/go開発者絶賛募集中!
We are hiring 2
• Topgate社も絶賛募集中です
• appengineできる人
• HTML, CSS, JS得意な人
• その他
雑談
https://github.com/golang/proposal/blob/master/
design/15292-generics.md
👍for Web app

Más contenido relacionado

Similar a GoCon2016 spring 自作Webフレームワーク uconを作った話

初めての Data api
初めての Data api初めての Data api
初めての Data apiYuji Takayama
 
T2 - 関ジャバ1月27日
T2 - 関ジャバ1月27日T2 - 関ジャバ1月27日
T2 - 関ジャバ1月27日Go Tanaka
 
初めての Data api cms どうでしょう - 大阪夏の陣
初めての Data api   cms どうでしょう - 大阪夏の陣初めての Data api   cms どうでしょう - 大阪夏の陣
初めての Data api cms どうでしょう - 大阪夏の陣Yuji Takayama
 
Data api workshop at Co-Edo
Data api workshop at Co-EdoData api workshop at Co-Edo
Data api workshop at Co-EdoYuji Takayama
 
Data APIの背景と活用方法 MTCafe Nagoya Ver.
Data APIの背景と活用方法 MTCafe Nagoya Ver.Data APIの背景と活用方法 MTCafe Nagoya Ver.
Data APIの背景と活用方法 MTCafe Nagoya Ver.Hajime Fujimoto
 
Go言語入門者が Webアプリケーション を作ってみた話 #devfest #gdgkyoto
Go言語入門者が Webアプリケーション を作ってみた話 #devfest #gdgkyotoGo言語入門者が Webアプリケーション を作ってみた話 #devfest #gdgkyoto
Go言語入門者が Webアプリケーション を作ってみた話 #devfest #gdgkyotoShoot Morii
 
Microsoft Graph API Library for Go
Microsoft Graph API Library for GoMicrosoft Graph API Library for Go
Microsoft Graph API Library for Goyaegashi
 
初めての Data API CMS どうでしょう - 仙台編 -
初めての Data API   CMS どうでしょう - 仙台編 -初めての Data API   CMS どうでしょう - 仙台編 -
初めての Data API CMS どうでしょう - 仙台編 -Yuji Takayama
 
「Windows 8 ストア アプリ開発 tips」 hokuriku.net vol.11 (2013年1月26日)
「Windows 8 ストア アプリ開発 tips」  hokuriku.net vol.11 (2013年1月26日)「Windows 8 ストア アプリ開発 tips」  hokuriku.net vol.11 (2013年1月26日)
「Windows 8 ストア アプリ開発 tips」 hokuriku.net vol.11 (2013年1月26日)Fujio Kojima
 
Data apiで実現 進化するwebの世界
Data apiで実現 進化するwebの世界Data apiで実現 進化するwebの世界
Data apiで実現 進化するwebの世界Yuji Takayama
 
Movable Type 6の新機能 Data APIの活用法
Movable Type 6の新機能 Data APIの活用法Movable Type 6の新機能 Data APIの活用法
Movable Type 6の新機能 Data APIの活用法Hajime Fujimoto
 
お父さんのための実用JavaScriptプログラミング~入門篇~
お父さんのための実用JavaScriptプログラミング~入門篇~お父さんのための実用JavaScriptプログラミング~入門篇~
お父さんのための実用JavaScriptプログラミング~入門篇~Che Renkov
 
ハンズオン勉強会 はじめてのJavaScriptとSPARQL
ハンズオン勉強会 はじめてのJavaScriptとSPARQLハンズオン勉強会 はじめてのJavaScriptとSPARQL
ハンズオン勉強会 はじめてのJavaScriptとSPARQLTaisuke Fukuno
 
第3回Webkit/HTML5勉強会 - File APIと加速度センサー
第3回Webkit/HTML5勉強会 - File APIと加速度センサー第3回Webkit/HTML5勉強会 - File APIと加速度センサー
第3回Webkit/HTML5勉強会 - File APIと加速度センサーnakamura001
 
ソーシャルアプリ勉強会(第一回資料)配布用
ソーシャルアプリ勉強会(第一回資料)配布用ソーシャルアプリ勉強会(第一回資料)配布用
ソーシャルアプリ勉強会(第一回資料)配布用Yatabe Terumasa
 
Express Web Application Framework
Express Web Application FrameworkExpress Web Application Framework
Express Web Application FrameworkLearningTech
 
OSSから学ぶSwift実践テクニック
OSSから学ぶSwift実践テクニックOSSから学ぶSwift実践テクニック
OSSから学ぶSwift実践テクニック庸介 高橋
 
Chrome Extensionsの基本とデザインパターン
Chrome Extensionsの基本とデザインパターンChrome Extensionsの基本とデザインパターン
Chrome Extensionsの基本とデザインパターンYoichiro Tanaka
 

Similar a GoCon2016 spring 自作Webフレームワーク uconを作った話 (20)

初めての Data api
初めての Data api初めての Data api
初めての Data api
 
T2 - 関ジャバ1月27日
T2 - 関ジャバ1月27日T2 - 関ジャバ1月27日
T2 - 関ジャバ1月27日
 
初めての Data api cms どうでしょう - 大阪夏の陣
初めての Data api   cms どうでしょう - 大阪夏の陣初めての Data api   cms どうでしょう - 大阪夏の陣
初めての Data api cms どうでしょう - 大阪夏の陣
 
Data api workshop at Co-Edo
Data api workshop at Co-EdoData api workshop at Co-Edo
Data api workshop at Co-Edo
 
Data APIの背景と活用方法 MTCafe Nagoya Ver.
Data APIの背景と活用方法 MTCafe Nagoya Ver.Data APIの背景と活用方法 MTCafe Nagoya Ver.
Data APIの背景と活用方法 MTCafe Nagoya Ver.
 
Go言語入門者が Webアプリケーション を作ってみた話 #devfest #gdgkyoto
Go言語入門者が Webアプリケーション を作ってみた話 #devfest #gdgkyotoGo言語入門者が Webアプリケーション を作ってみた話 #devfest #gdgkyoto
Go言語入門者が Webアプリケーション を作ってみた話 #devfest #gdgkyoto
 
Microsoft Graph API Library for Go
Microsoft Graph API Library for GoMicrosoft Graph API Library for Go
Microsoft Graph API Library for Go
 
初めての Data API CMS どうでしょう - 仙台編 -
初めての Data API   CMS どうでしょう - 仙台編 -初めての Data API   CMS どうでしょう - 仙台編 -
初めての Data API CMS どうでしょう - 仙台編 -
 
「Windows 8 ストア アプリ開発 tips」 hokuriku.net vol.11 (2013年1月26日)
「Windows 8 ストア アプリ開発 tips」  hokuriku.net vol.11 (2013年1月26日)「Windows 8 ストア アプリ開発 tips」  hokuriku.net vol.11 (2013年1月26日)
「Windows 8 ストア アプリ開発 tips」 hokuriku.net vol.11 (2013年1月26日)
 
Data apiで実現 進化するwebの世界
Data apiで実現 進化するwebの世界Data apiで実現 進化するwebの世界
Data apiで実現 進化するwebの世界
 
後期03
後期03後期03
後期03
 
Movable Type 6の新機能 Data APIの活用法
Movable Type 6の新機能 Data APIの活用法Movable Type 6の新機能 Data APIの活用法
Movable Type 6の新機能 Data APIの活用法
 
お父さんのための実用JavaScriptプログラミング~入門篇~
お父さんのための実用JavaScriptプログラミング~入門篇~お父さんのための実用JavaScriptプログラミング~入門篇~
お父さんのための実用JavaScriptプログラミング~入門篇~
 
ハンズオン勉強会 はじめてのJavaScriptとSPARQL
ハンズオン勉強会 はじめてのJavaScriptとSPARQLハンズオン勉強会 はじめてのJavaScriptとSPARQL
ハンズオン勉強会 はじめてのJavaScriptとSPARQL
 
第3回Webkit/HTML5勉強会 - File APIと加速度センサー
第3回Webkit/HTML5勉強会 - File APIと加速度センサー第3回Webkit/HTML5勉強会 - File APIと加速度センサー
第3回Webkit/HTML5勉強会 - File APIと加速度センサー
 
ソーシャルアプリ勉強会(第一回資料)配布用
ソーシャルアプリ勉強会(第一回資料)配布用ソーシャルアプリ勉強会(第一回資料)配布用
ソーシャルアプリ勉強会(第一回資料)配布用
 
Ajax 応用
Ajax 応用Ajax 応用
Ajax 応用
 
Express Web Application Framework
Express Web Application FrameworkExpress Web Application Framework
Express Web Application Framework
 
OSSから学ぶSwift実践テクニック
OSSから学ぶSwift実践テクニックOSSから学ぶSwift実践テクニック
OSSから学ぶSwift実践テクニック
 
Chrome Extensionsの基本とデザインパターン
Chrome Extensionsの基本とデザインパターンChrome Extensionsの基本とデザインパターン
Chrome Extensionsの基本とデザインパターン
 

Más de Masahiro Wakame

ng-japan 2015 TypeScript+AngularJS 1.3
ng-japan 2015 TypeScript+AngularJS 1.3ng-japan 2015 TypeScript+AngularJS 1.3
ng-japan 2015 TypeScript+AngularJS 1.3Masahiro Wakame
 
TypeScriptは明日から使うべき
TypeScriptは明日から使うべきTypeScriptは明日から使うべき
TypeScriptは明日から使うべきMasahiro Wakame
 
TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部
TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部
TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部Masahiro Wakame
 
Google Glassでできること XE12版 最新開発情報 Mirror API & GDK
Google Glassでできること XE12版 最新開発情報 Mirror API & GDKGoogle Glassでできること XE12版 最新開発情報 Mirror API & GDK
Google Glassでできること XE12版 最新開発情報 Mirror API & GDKMasahiro Wakame
 
コンパイラ指向ReVIEW
コンパイラ指向ReVIEWコンパイラ指向ReVIEW
コンパイラ指向ReVIEWMasahiro Wakame
 
20ヶ月を取り戻す Dart flight school
20ヶ月を取り戻す Dart flight school20ヶ月を取り戻す Dart flight school
20ヶ月を取り戻す Dart flight schoolMasahiro Wakame
 
Google Glassでできること XE11版 最新開発情報 Mirror API & GDK
Google Glassでできること XE11版 最新開発情報 Mirror API & GDKGoogle Glassでできること XE11版 最新開発情報 Mirror API & GDK
Google Glassでできること XE11版 最新開発情報 Mirror API & GDKMasahiro Wakame
 
CEATEC Glassware(Google Glassアプリ)開発の指南と開発事例
CEATEC Glassware(Google Glassアプリ)開発の指南と開発事例CEATEC Glassware(Google Glassアプリ)開発の指南と開発事例
CEATEC Glassware(Google Glassアプリ)開発の指南と開発事例Masahiro Wakame
 
ReVIEW & CI - ChefでCI環境構築
ReVIEW & CI - ChefでCI環境構築ReVIEW & CI - ChefでCI環境構築
ReVIEW & CI - ChefでCI環境構築Masahiro Wakame
 
Firefox OS勉強会 2nd TypeScript+AngularJS
Firefox OS勉強会 2nd TypeScript+AngularJSFirefox OS勉強会 2nd TypeScript+AngularJS
Firefox OS勉強会 2nd TypeScript+AngularJSMasahiro Wakame
 
AngularJS+TypeScript - AngularJS 1周年記念勉強会
AngularJS+TypeScript - AngularJS 1周年記念勉強会AngularJS+TypeScript - AngularJS 1周年記念勉強会
AngularJS+TypeScript - AngularJS 1周年記念勉強会Masahiro Wakame
 
Buildinsider OFFLINE TypeScriptの基礎から実践・利用事例まで
Buildinsider OFFLINE TypeScriptの基礎から実践・利用事例までBuildinsider OFFLINE TypeScriptの基礎から実践・利用事例まで
Buildinsider OFFLINE TypeScriptの基礎から実践・利用事例までMasahiro Wakame
 
俺とお前とGoogleware
俺とお前とGoogleware俺とお前とGoogleware
俺とお前とGooglewareMasahiro Wakame
 
Datastoreへのアクセスを楽してMemcacheアクセスに置き換えるライブラリ作った
Datastoreへのアクセスを楽してMemcacheアクセスに置き換えるライブラリ作ったDatastoreへのアクセスを楽してMemcacheアクセスに置き換えるライブラリ作った
Datastoreへのアクセスを楽してMemcacheアクセスに置き換えるライブラリ作ったMasahiro Wakame
 

Más de Masahiro Wakame (20)

ng-japan 2015 TypeScript+AngularJS 1.3
ng-japan 2015 TypeScript+AngularJS 1.3ng-japan 2015 TypeScript+AngularJS 1.3
ng-japan 2015 TypeScript+AngularJS 1.3
 
TypeScriptは明日から使うべき
TypeScriptは明日から使うべきTypeScriptは明日から使うべき
TypeScriptは明日から使うべき
 
TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部
TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部
TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部
 
Google Glass XE17版
Google Glass XE17版Google Glass XE17版
Google Glass XE17版
 
Google Glassでできること XE12版 最新開発情報 Mirror API & GDK
Google Glassでできること XE12版 最新開発情報 Mirror API & GDKGoogle Glassでできること XE12版 最新開発情報 Mirror API & GDK
Google Glassでできること XE12版 最新開発情報 Mirror API & GDK
 
コンパイラ指向ReVIEW
コンパイラ指向ReVIEWコンパイラ指向ReVIEW
コンパイラ指向ReVIEW
 
20ヶ月を取り戻す Dart flight school
20ヶ月を取り戻す Dart flight school20ヶ月を取り戻す Dart flight school
20ヶ月を取り戻す Dart flight school
 
TypeScript 独習会
TypeScript 独習会TypeScript 独習会
TypeScript 独習会
 
Google Glassでできること XE11版 最新開発情報 Mirror API & GDK
Google Glassでできること XE11版 最新開発情報 Mirror API & GDKGoogle Glassでできること XE11版 最新開発情報 Mirror API & GDK
Google Glassでできること XE11版 最新開発情報 Mirror API & GDK
 
CEATEC Glassware(Google Glassアプリ)開発の指南と開発事例
CEATEC Glassware(Google Glassアプリ)開発の指南と開発事例CEATEC Glassware(Google Glassアプリ)開発の指南と開発事例
CEATEC Glassware(Google Glassアプリ)開発の指南と開発事例
 
ReVIEW & CI - ChefでCI環境構築
ReVIEW & CI - ChefでCI環境構築ReVIEW & CI - ChefでCI環境構築
ReVIEW & CI - ChefでCI環境構築
 
Firefox OS勉強会 2nd TypeScript+AngularJS
Firefox OS勉強会 2nd TypeScript+AngularJSFirefox OS勉強会 2nd TypeScript+AngularJS
Firefox OS勉強会 2nd TypeScript+AngularJS
 
AngularJS+TypeScript - AngularJS 1周年記念勉強会
AngularJS+TypeScript - AngularJS 1周年記念勉強会AngularJS+TypeScript - AngularJS 1周年記念勉強会
AngularJS+TypeScript - AngularJS 1周年記念勉強会
 
Buildinsider OFFLINE TypeScriptの基礎から実践・利用事例まで
Buildinsider OFFLINE TypeScriptの基礎から実践・利用事例までBuildinsider OFFLINE TypeScriptの基礎から実践・利用事例まで
Buildinsider OFFLINE TypeScriptの基礎から実践・利用事例まで
 
俺とお前とGoogleware
俺とお前とGoogleware俺とお前とGoogleware
俺とお前とGoogleware
 
Datastoreへのアクセスを楽してMemcacheアクセスに置き換えるライブラリ作った
Datastoreへのアクセスを楽してMemcacheアクセスに置き換えるライブラリ作ったDatastoreへのアクセスを楽してMemcacheアクセスに置き換えるライブラリ作った
Datastoreへのアクセスを楽してMemcacheアクセスに置き換えるライブラリ作った
 
TypeScript 勉強会
TypeScript 勉強会TypeScript 勉強会
TypeScript 勉強会
 
TypeScript Hands-on
TypeScript Hands-onTypeScript Hands-on
TypeScript Hands-on
 
わかめモナ化LT
わかめモナ化LTわかめモナ化LT
わかめモナ化LT
 
NFC app launcher
NFC app launcherNFC app launcher
NFC app launcher
 

Último

Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Hiroshi Tomioka
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NTT DATA Technology & Innovation
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Gamesatsushi061452
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルCRI Japan, Inc.
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video UnderstandingToru Tamaki
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)Hiroshi Tomioka
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイスCRI Japan, Inc.
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...Toru Tamaki
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 

Último (11)

Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 

GoCon2016 spring 自作Webフレームワーク uconを作った話