Enviar búsqueda
Cargar
GoCon2016 spring 自作Webフレームワーク uconを作った話
•
4 recomendaciones
•
4,527 vistas
Masahiro Wakame
Seguir
GoCon2016 spring 自作Webフレームワーク uconを作った話 http://gocon.connpass.com/event/27521/
Leer menos
Leer más
Tecnología
Denunciar
Compartir
Denunciar
Compartir
1 de 67
Descargar ahora
Descargar para leer sin conexión
Recomendados
速くなければスマフォじゃない - インターンバージョン-
速くなければスマフォじゃない - インターンバージョン-
Kazunari Hara
BACKBONE.JSにJasmineでテストコード書いてみた (LT資料)
BACKBONE.JSにJasmineでテストコード書いてみた (LT資料)
Toshio Ehara
20090704rubyist九州
20090704rubyist九州
koki_h
Lightweight Language Tiger 2010
Lightweight Language Tiger 2010
biscuitjam
Go言語で作る webアプリ@gocon 2013 spring
Go言語で作る webアプリ@gocon 2013 spring
Takuya Ueda
Goのパッケージ構成で 試行錯誤してみた話 ~ Gocon 2015 Summer
Goのパッケージ構成で 試行錯誤してみた話 ~ Gocon 2015 Summer
Hirokazu Fukami
GoCon 2015 Summer GoのASTをいじくって新しいツールを作る
GoCon 2015 Summer GoのASTをいじくって新しいツールを作る
Masahiro Wakame
ヒカルのGo 資料 Webアプリケーションの作り方
ヒカルのGo 資料 Webアプリケーションの作り方
Yosuke Furukawa
Recomendados
速くなければスマフォじゃない - インターンバージョン-
速くなければスマフォじゃない - インターンバージョン-
Kazunari Hara
BACKBONE.JSにJasmineでテストコード書いてみた (LT資料)
BACKBONE.JSにJasmineでテストコード書いてみた (LT資料)
Toshio Ehara
20090704rubyist九州
20090704rubyist九州
koki_h
Lightweight Language Tiger 2010
Lightweight Language Tiger 2010
biscuitjam
Go言語で作る webアプリ@gocon 2013 spring
Go言語で作る webアプリ@gocon 2013 spring
Takuya Ueda
Goのパッケージ構成で 試行錯誤してみた話 ~ Gocon 2015 Summer
Goのパッケージ構成で 試行錯誤してみた話 ~ Gocon 2015 Summer
Hirokazu Fukami
GoCon 2015 Summer GoのASTをいじくって新しいツールを作る
GoCon 2015 Summer GoのASTをいじくって新しいツールを作る
Masahiro Wakame
ヒカルのGo 資料 Webアプリケーションの作り方
ヒカルのGo 資料 Webアプリケーションの作り方
Yosuke Furukawa
初めての Data api
初めての Data api
Yuji Takayama
T2 - 関ジャバ1月27日
T2 - 関ジャバ1月27日
Go Tanaka
初めての Data api cms どうでしょう - 大阪夏の陣
初めての Data api cms どうでしょう - 大阪夏の陣
Yuji Takayama
Data api workshop at Co-Edo
Data api workshop at Co-Edo
Yuji Takayama
Data APIの背景と活用方法 MTCafe Nagoya Ver.
Data APIの背景と活用方法 MTCafe Nagoya Ver.
Hajime Fujimoto
Go言語入門者が Webアプリケーション を作ってみた話 #devfest #gdgkyoto
Go言語入門者が Webアプリケーション を作ってみた話 #devfest #gdgkyoto
Shoot Morii
Microsoft Graph API Library for Go
Microsoft Graph API Library for Go
yaegashi
初めての 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日)
Fujio Kojima
Data apiで実現 進化するwebの世界
Data apiで実現 進化するwebの世界
Yuji Takayama
後期03
後期03
Takenori Nakagawa
Movable Type 6の新機能 Data APIの活用法
Movable Type 6の新機能 Data APIの活用法
Hajime Fujimoto
お父さんのための実用JavaScriptプログラミング~入門篇~
お父さんのための実用JavaScriptプログラミング~入門篇~
Che Renkov
ハンズオン勉強会 はじめてのJavaScriptとSPARQL
ハンズオン勉強会 はじめてのJavaScriptとSPARQL
Taisuke Fukuno
第3回Webkit/HTML5勉強会 - File APIと加速度センサー
第3回Webkit/HTML5勉強会 - File APIと加速度センサー
nakamura001
ソーシャルアプリ勉強会(第一回資料)配布用
ソーシャルアプリ勉強会(第一回資料)配布用
Yatabe Terumasa
Ajax 応用
Ajax 応用
Katsuyuki Seino
Express Web Application Framework
Express Web Application Framework
LearningTech
OSSから学ぶSwift実践テクニック
OSSから学ぶSwift実践テクニック
庸介 高橋
Chrome Extensionsの基本とデザインパターン
Chrome Extensionsの基本とデザインパターン
Yoichiro Tanaka
ng-japan 2015 TypeScript+AngularJS 1.3
ng-japan 2015 TypeScript+AngularJS 1.3
Masahiro Wakame
TypeScriptは明日から使うべき
TypeScriptは明日から使うべき
Masahiro Wakame
Más contenido relacionado
Similar a GoCon2016 spring 自作Webフレームワーク uconを作った話
初めての Data api
初めての Data api
Yuji Takayama
T2 - 関ジャバ1月27日
T2 - 関ジャバ1月27日
Go Tanaka
初めての Data api cms どうでしょう - 大阪夏の陣
初めての Data api cms どうでしょう - 大阪夏の陣
Yuji Takayama
Data api workshop at Co-Edo
Data api workshop at Co-Edo
Yuji Takayama
Data APIの背景と活用方法 MTCafe Nagoya Ver.
Data APIの背景と活用方法 MTCafe Nagoya Ver.
Hajime Fujimoto
Go言語入門者が Webアプリケーション を作ってみた話 #devfest #gdgkyoto
Go言語入門者が Webアプリケーション を作ってみた話 #devfest #gdgkyoto
Shoot Morii
Microsoft Graph API Library for Go
Microsoft Graph API Library for Go
yaegashi
初めての 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日)
Fujio Kojima
Data apiで実現 進化するwebの世界
Data apiで実現 進化するwebの世界
Yuji Takayama
後期03
後期03
Takenori Nakagawa
Movable Type 6の新機能 Data APIの活用法
Movable Type 6の新機能 Data APIの活用法
Hajime Fujimoto
お父さんのための実用JavaScriptプログラミング~入門篇~
お父さんのための実用JavaScriptプログラミング~入門篇~
Che Renkov
ハンズオン勉強会 はじめてのJavaScriptとSPARQL
ハンズオン勉強会 はじめてのJavaScriptとSPARQL
Taisuke Fukuno
第3回Webkit/HTML5勉強会 - File APIと加速度センサー
第3回Webkit/HTML5勉強会 - File APIと加速度センサー
nakamura001
ソーシャルアプリ勉強会(第一回資料)配布用
ソーシャルアプリ勉強会(第一回資料)配布用
Yatabe Terumasa
Ajax 応用
Ajax 応用
Katsuyuki Seino
Express Web Application Framework
Express Web Application Framework
LearningTech
OSSから学ぶSwift実践テクニック
OSSから学ぶSwift実践テクニック
庸介 高橋
Chrome Extensionsの基本とデザインパターン
Chrome Extensionsの基本とデザインパターン
Yoichiro Tanaka
Similar a GoCon2016 spring 自作Webフレームワーク uconを作った話
(20)
初めての Data api
初めての Data api
T2 - 関ジャバ1月27日
T2 - 関ジャバ1月27日
初めての Data api cms どうでしょう - 大阪夏の陣
初めての Data api cms どうでしょう - 大阪夏の陣
Data api workshop at Co-Edo
Data api workshop at Co-Edo
Data APIの背景と活用方法 MTCafe Nagoya Ver.
Data APIの背景と活用方法 MTCafe Nagoya Ver.
Go言語入門者が Webアプリケーション を作ってみた話 #devfest #gdgkyoto
Go言語入門者が Webアプリケーション を作ってみた話 #devfest #gdgkyoto
Microsoft Graph API Library for Go
Microsoft Graph API Library for Go
初めての 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日)
Data apiで実現 進化するwebの世界
Data apiで実現 進化するwebの世界
後期03
後期03
Movable Type 6の新機能 Data APIの活用法
Movable Type 6の新機能 Data APIの活用法
お父さんのための実用JavaScriptプログラミング~入門篇~
お父さんのための実用JavaScriptプログラミング~入門篇~
ハンズオン勉強会 はじめてのJavaScriptとSPARQL
ハンズオン勉強会 はじめてのJavaScriptとSPARQL
第3回Webkit/HTML5勉強会 - File APIと加速度センサー
第3回Webkit/HTML5勉強会 - File APIと加速度センサー
ソーシャルアプリ勉強会(第一回資料)配布用
ソーシャルアプリ勉強会(第一回資料)配布用
Ajax 応用
Ajax 応用
Express Web Application Framework
Express Web Application Framework
OSSから学ぶSwift実践テクニック
OSSから学ぶSwift実践テクニック
Chrome Extensionsの基本とデザインパターン
Chrome Extensionsの基本とデザインパターン
Más de Masahiro Wakame
ng-japan 2015 TypeScript+AngularJS 1.3
ng-japan 2015 TypeScript+AngularJS 1.3
Masahiro Wakame
TypeScriptは明日から使うべき
TypeScriptは明日から使うべき
Masahiro Wakame
TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部
TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部
Masahiro Wakame
Google Glass XE17版
Google Glass XE17版
Masahiro Wakame
Google Glassでできること XE12版 最新開発情報 Mirror API & GDK
Google Glassでできること XE12版 最新開発情報 Mirror API & GDK
Masahiro Wakame
コンパイラ指向ReVIEW
コンパイラ指向ReVIEW
Masahiro Wakame
20ヶ月を取り戻す Dart flight school
20ヶ月を取り戻す Dart flight school
Masahiro Wakame
TypeScript 独習会
TypeScript 独習会
Masahiro Wakame
Google Glassでできること XE11版 最新開発情報 Mirror API & GDK
Google Glassでできること XE11版 最新開発情報 Mirror API & GDK
Masahiro Wakame
CEATEC Glassware(Google Glassアプリ)開発の指南と開発事例
CEATEC Glassware(Google Glassアプリ)開発の指南と開発事例
Masahiro Wakame
ReVIEW & CI - ChefでCI環境構築
ReVIEW & CI - ChefでCI環境構築
Masahiro Wakame
Firefox OS勉強会 2nd TypeScript+AngularJS
Firefox OS勉強会 2nd TypeScript+AngularJS
Masahiro Wakame
AngularJS+TypeScript - AngularJS 1周年記念勉強会
AngularJS+TypeScript - AngularJS 1周年記念勉強会
Masahiro Wakame
Buildinsider OFFLINE TypeScriptの基礎から実践・利用事例まで
Buildinsider OFFLINE TypeScriptの基礎から実践・利用事例まで
Masahiro Wakame
俺とお前とGoogleware
俺とお前とGoogleware
Masahiro Wakame
Datastoreへのアクセスを楽してMemcacheアクセスに置き換えるライブラリ作った
Datastoreへのアクセスを楽してMemcacheアクセスに置き換えるライブラリ作った
Masahiro Wakame
TypeScript 勉強会
TypeScript 勉強会
Masahiro Wakame
TypeScript Hands-on
TypeScript Hands-on
Masahiro Wakame
わかめモナ化LT
わかめモナ化LT
Masahiro Wakame
NFC app launcher
NFC app launcher
Masahiro Wakame
Más de Masahiro Wakame
(20)
ng-japan 2015 TypeScript+AngularJS 1.3
ng-japan 2015 TypeScript+AngularJS 1.3
TypeScriptは明日から使うべき
TypeScriptは明日から使うべき
TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部
TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部
Google Glass XE17版
Google Glass XE17版
Google Glassでできること XE12版 最新開発情報 Mirror API & GDK
Google Glassでできること XE12版 最新開発情報 Mirror API & GDK
コンパイラ指向ReVIEW
コンパイラ指向ReVIEW
20ヶ月を取り戻す Dart flight school
20ヶ月を取り戻す Dart flight school
TypeScript 独習会
TypeScript 独習会
Google Glassでできること XE11版 最新開発情報 Mirror API & GDK
Google Glassでできること XE11版 最新開発情報 Mirror API & GDK
CEATEC Glassware(Google Glassアプリ)開発の指南と開発事例
CEATEC Glassware(Google Glassアプリ)開発の指南と開発事例
ReVIEW & CI - ChefでCI環境構築
ReVIEW & CI - ChefでCI環境構築
Firefox OS勉強会 2nd TypeScript+AngularJS
Firefox OS勉強会 2nd TypeScript+AngularJS
AngularJS+TypeScript - AngularJS 1周年記念勉強会
AngularJS+TypeScript - AngularJS 1周年記念勉強会
Buildinsider OFFLINE TypeScriptの基礎から実践・利用事例まで
Buildinsider OFFLINE TypeScriptの基礎から実践・利用事例まで
俺とお前とGoogleware
俺とお前とGoogleware
Datastoreへのアクセスを楽してMemcacheアクセスに置き換えるライブラリ作った
Datastoreへのアクセスを楽してMemcacheアクセスに置き換えるライブラリ作った
TypeScript 勉強会
TypeScript 勉強会
TypeScript Hands-on
TypeScript Hands-on
わかめモナ化LT
わかめモナ化LT
NFC app launcher
NFC app launcher
Último
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Hiroshi Tomioka
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NTT DATA Technology & Innovation
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
atsushi061452
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
Toru Tamaki
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
Hiroshi Tomioka
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...
Toru Tamaki
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
iPride Co., Ltd.
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
iPride Co., Ltd.
Último
(11)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
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
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
論文紹介: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月発表)
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
GoCon2016 spring 自作Webフレームワーク uconを作った話
1.
自作Webフレームワーク uconを作った話 わかめ まさひろ
2.
わかめ まさひろ @vvakame TypeScript Masahiro
Wakame DefinitelyTyped appengine/go photo from golang.org/doc/gopher/
3.
GoogleAppEngine/Go 神 いわゆる GOD
4.
諸君、私はappengine/goが好きだ • 2008年4月 始まる •
サーバレスアーキテクチャ • 2011年5月 Go対応始まる • 2015年7月 Go, GAになる • 2016年4月 Go 1.6対応 1.9.35→❌ 1.9.36を使おう!
5.
Eric Schmidt said. https://www.youtube.com/watch?v=HgWHeT_OwHc&t=1461 GCP
Next 2016 Day 1 Keynote
6.
GAE用ライブラリ作ってます • testerator github.com/favclip/testrator •
UnitTest高速化 • qbg github.com/favclip/qbg • Datastore用TypeSafeクエリビルダ • smg github.com/favclip/smg • Search API用TypeSafeラッパ productionで利用中!
7.
GoCon 2015 Summer •
appengine専用じゃないけど • jwg github.com/favclip/jwg • genbase github.com/favclip/genbase • GoCon 2015で話をしました! • SlideShare goo.gl/45lZDK
8.
gb • gb • getgb.io/ •
gb keeps the peace of our project🌹 • gb gae • github.com/PalmStoneGames/gb-gae
9.
Google API Discovery
Service 誰か知ってる?
10.
APIs Explorer is
神 https://developers.google.com/apis-explorer/
11.
APIs Explorer • 誰でも簡単に使える •
実際のAPIが叩かれる • 結果を共有しやすい • コードからUIが生成されている
12.
Cloud Endpoints • appengine専用の仕組み •
cloud.google.com/endpoints/ • 自前APIでAPIs Explorer使える • APIの構造がわかる! • 実例がわかる!(DevTool) • UIを省く極道管理画面も!
13.
周辺ツールも充実 • クライアントライブラリの自動生成 • golangだとこの辺全部そう •
github.com/google/google-api-go- client • TypeScript用型定義の生成 • www.npmjs.com/package/gapidts
14.
but…
15.
Googleの闇の領域 ユーザ GAE闇 path mapping request
format Version切替後reqをなかった事に custom domain不可
16.
go-endpoints • CloudEndpoints用framework • github.com/GoogleCloudPlatform/ go-endpoints •
Service & Method の組み合わせで定義 • w http.ResponseWriterが取れない • CloudEndpoints的には不要なので…
17.
評価 • 細かい事を気にしなければかなり良い • カスタムドメイン不可がやはり辛い •
デバッグ不可能な闇の領域が辛い • ちょいちょいそこが不安定な気が… • 拡張性が低い • 横断的な処理を入れにくい…
18.
僕達が必要なもの
19.
Alt Cloud Endpoints •
APIs Explorer的なものが欲しい! • サバクラの意思疎通が楽 • デバッグが楽 • コード→仕様が良い • 仕様→コード は努力が必要(努力やだ • クライアントコードの生成 • 変わったら壊れてほしい
20.
代替ツールの検討
21.
各ツールの評価 • RAML • API
Blueprint (apiary.io • JSON Schema v4 • Swagger • gRPC
22.
✨swagger✨ • Swaggerが一番良さそう! • 個人の見解です •
Open API Initiative発足 • Swagger仕様をbaseに • 長いものには巻かれたい • Qiitaに少し書きました goo.gl/BLS3uH
23.
既存GoなSwagger実装の話 最初からswagger対応 の物を選ぶと楽そう
24.
既存Go実装の比較 • go-swagger • goswagger.io/ •
type safeじゃない • yvasiyarov/swagger • github.com/yvasiyarov/swagger • comment baseでつらい • type safeじゃない
25.
既存Go実装の比較 • go-restful • github.com/emicklei/go-restful/ •
type safeじゃない • goa • goa.design/ • type safeじゃない • DSLがヤバイ
26.
既存Go実装の比較 • grpc-gateway • github.com/gengo/grpc-gateway •
gRPCのJSONなreverse proxy • いつのまにかswagger対応してた • appengineだと❌
27.
既存Webフレームワーク
28.
重要なポイント • net/httpに近いほうがわかりやすい • あまりに独自っぽいのはちょっと… •
go-endpointsからの移行 • しばらくCloudEndpointsと両立したい • コード上の互換性があると嬉しい… • swagger-uiが使える
29.
既存フレームワーク調べた • なるべくnet/httpに近い • revel→❌ •
なるべくCloudEndpointsのまま • net/http→❌ • goji→❌ • Swagger対応! • martini→❌
30.
結論 •自分でつくろう 趣味に走ったわけではないです
31.
自分で作る話
32.
前提 • appengine縛りにはしない • とはいえappengineで使えないと困る •
net/httpに近いAPI • 柔軟性 • go-endpointsとの互換性 • swaggerはopt-in やっていく
33.
ucon https://github.com/favclip/ucon
34.
名付け親 某a2cさん martiniとか ginとかに 対抗して
35.
名付け親 某a2cさん uconと 名付けよう! In japan, ucon
(= turmeric) is to be effective in hangover.
36.
決めた後 某a2cさん 💩 ←ゆるさない!!
37.
仕様紹介
38.
まず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) { … }
39.
まず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
40.
まず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 闇の領域でもろもろ変換されてる
41.
ucon Features • net/http
との類似性 • Routing • Method, Path Matching • Middleware • Bubble • Dependency Injection • Plugin
42.
API likes net/http ucon.HandleFunc("GET",
"/", func(w http.ResponseWriter, r *http.Request) {})
43.
API likes net/http ucon.HandleFunc("GET",
"/", func(w http.ResponseWriter, r *http.Request) {})
44.
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}“, …
45.
Routing rule • METHODが一致する •
* 指定も可 厳密一致優先 • Request Pathが一致する • 複数候補ある場合より長い節一致 • Request GET /api/user/123 • 🌟 GET /api/user/{id} • ❌ GET /api/user • 先登録優先
46.
Middleware • 1 request毎の処理に介入 •
JavaでいうServletFilter • ASP.NET MVCでいうFilter • Logging, DI, CORS用Header, error→JSON変換 etc, etc…
47.
Middleware Middleware Middleware Middleware Handler ServeHTTP DI Cache-Control Cookie appengine.Context etc, etc… CORS
Header Path, Query, Body → JSON *http.Request http.ResponseWriter
48.
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() } }
49.
built-in middleware • HTTPRWDI •
*http.Request, http.ResponseWriterのDI • NetContextDI • net/contextのContextをDI
50.
built-in middleware • RequestObjectMapper •
path parameter, query paramter, post bodyをObjectに変換しDI • ResponseMapper • HandlerがreturnしたObjectやerrorを JSONに変換
51.
Plugin • プロセス起動時1回だけ動作 • 全Handlerの走査 •
Handler→Plugin間の値の伝達機構 • swaggerはplugin • 全Handlerの情報から処理 • swagger.json出力用Handlerの追加
52.
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)) } } }
53.
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)) } } }
54.
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) { … }
55.
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) { … }
56.
コード規模の話 • 本体 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
57.
利用事例
58.
利用サイト • favclip • 技術書典
応募サイト • 怖くてOSSにでけんかったすまんな… • Topgate社内では今後使っていくはず…
59.
swagger関連ツール • swagger-uiの話 • Go用クライアントライブラリの話 •
TypeScript用型定義ファイル生成の話
60.
求む!
61.
求む! • 利用してみてブログ書く • 利用してみて質問する •
利用してみて… 自分が使えるようになると 満足するタイプ
62.
We are hiring
63.
We are hiring
1 • 開発:テレビ朝日 • jwg, genbase 他 必要に応じて製造 • http://www.favclip.com/ • appengine/go開発者絶賛募集中!
64.
We are hiring
2 • Topgate社も絶賛募集中です • appengineできる人 • HTML, CSS, JS得意な人 • その他
65.
雑談
66.
https://github.com/golang/proposal/blob/master/ design/15292-generics.md
67.
👍for Web app
Descargar ahora