SlideShare a Scribd company logo
Go Web Development
erinus@MuzikOnline
2017.07.06
Web
Gin
https://github.com/gin-gonic/gin
written in Go
Gin
• appleboy
•
•
•
/assets Binary File System bindata
/files *.css, *.js, *.png, ...
/pages *.tpl
/claims JSON Web Token
/models Database Table Schema
/protos Post Body Form Body & JSON Body
/routes Routes
/api API Controllers
/web Web Controllers
/assets.go Binary File System bindata
/Makefile Makefile
/reboot.sh Zero-Downtime
/server.go Entry Point
/static.go Binary File System & MultiTemplate
github.com/gin-gonic/gin
Gin
github.com/gin-contrib/multitemplate
Gin
github.com/gin-contrib/sessions
Gin Session
github.com/gin-contrib/secure
Gin
github.com/gin-contrib/static
Gin
github.com/utrack/gin-csrf
Gin CSRF
github.com/facebookgo/grace/gracehttp
github.com/go-sql-driver/mysql
MySQL Database Driver
STD = log.New(os.Stdout, "[STD] ",
log.Ldate|log.Ltime|log.Lshortfile)
DBG = log.New(os.Stdout, "[DBG] ",
log.Ldate|log.Ltime|log.Lshortfile)
ERR = log.New(os.Stdout, "[ERR] ",
log.Ldate|log.Ltime|log.Lshortfile)
Connection Instance
var db *sql.DB
db, err = sql.Open("mysql",
"[username]:[password]@tcp([hostname]:3306)/[database]
?charset=utf8&parseTime=true")
if err != nil { ... }
defer db.Close()
var helper template.FuncMap
helper = template.FuncMap{
"PrefixBelongRoutes": func(ctx *gin.Context
routes ...string) bool { ... },
"BelongRoutes": func(ctx *gin.Context,
routes ...string) bool { ... },
}
var render multitemplate.Render
render = multitemplate.New()
render.Add("login", GetTPL(helper,
"pages/app.tpl", "pages/login.tpl"))
render.Add("index", GetTPL(helper,
"pages/app.tpl", "pages/index.tpl"))
Session Cookie
var cookie sessions.CookieStore
cookie = sessions.NewCookieStore([]byte([secret]))
cookie.Options(sessions.Options{
Path: "/",
Secure: true,
HttpOnly: true,
})
Gin
var router *gin.Engine
router = gin.Default()
P.11
router.HTMLRender = render
router.Use(secure.New(secure.Config{
AllowedHosts: []string{},
SSLRedirect: true,
SSLTemporaryRedirect: true,
SSLHost: "",
STSSeconds: 315360000,
STSIncludeSubdomains: true,
FrameDeny: true,
CustomFrameOptionsValue: "",
ContentTypeNosniff: true,
BrowserXssFilter: true,
ContentSecurityPolicy: "default-src 'self'",
IsDevelopment: true,
}))
router.Use(static.Serve("/files", GetBFS("assets/files")))
Session
router.Use(sessions.Sessions("[session-key]", cookie))
router.Use(static.Serve("/files", GetBFS("assets/files")))
CSRF
router.Use(csrf.Middleware(csrf.Options{
Secret: [secret],
ErrorFunc: func(ctx *gin.Context) {
ctx.Abort()
},
IgnoreRoutes: []string{ ... },
}))
API
func ApiAuthRequired() gin.HandlerFunc {
return func(ctx *gin.Context) {
// validate from JSON Web Token
ctx.Next()
}
}
Web
func WebAuthRequired() gin.HandlerFunc {
return func(ctx *gin.Context) {
// validate from Session
ctx.Next()
}
}
API Route
var api *gin.RouterGroup
api = router.Group("/api")
{ /* API Controllers */ }
api.Use(ApiAuthRequired())
{ /* API Controllers */ }
Web Route
var web *gin.RouterGroup
web = router.Group("/")
{ /* Web Controllers */ }
web.Use(WebAuthRequired())
{ /* Web Controllers */ }
SSL
var x509 tls.Certificate
x509, err = tls.LoadX509KeyPair([crt-path], [key-path])
HTTP
var server *http.Server
server = &http.Server{
Addr: fmt.Sprintf("%s:%d", HOST, PORT),
Handler: router,
TLSConfig: &tls.Config{
Certificates: []tls.Certificate{ x509 },
},
}
HTTP
gracehttp.Serve(server)
Makefile
default:
@go build -o [output] *.go
all:
@go-bindata -o assets.go assets/...
@go build -o [output] *.go
reboot.sh
#!/bin/sh
ps aux | grep [output]
echo "Reloading..."
sudo kill -USR2 $(ps aux | grep [output] | awk 'NR==1{ print $2 }')
echo "Reloaded"
sleep 2
ps aux | grep [output]
Controller
Register
api = router.Group("/")
{
apiroutes.Login(api)
}
Controller
API Controllers
Package apiroutes
func Login(router *gin.RouterGroup) {
router.POST("/login", func(ctx *gin.Context) {
// get data from db and validation
ctx.JSON(http.StatusOK, gin.H{ "uid": uid, })
}
}
Controller
Register
web = router.Group("/")
{
webroutes.Index(web)
}
Controller
Web Controllers
Package webroutes
func Index(router *gin.RouterGroup) {
router.GET("/", func(ctx *gin.Context) {
// get data from db
ctx.HTML(http.StatusOK, "index", gin.H{ "uid": uid, })
}
}
Database
•
Continous Integration
•
Ant DBA
1.
revisions migration
2.
Orator
https://orator-orm.com
written in Python
Orator
•
•
•
•
•
•
Orator Migrations
orator.py
DATABASES = {
'mysql': {
'driver': 'mysql',
'host': '[hostname]',
'database': '[database]',
'user': '[username]',
'password': '[password]',
'prefix': ''
Orator Migrations
migrations
Orator Migrations
migration
> orator make:migration create_users_table
migrations/[timstamp]_create_users_table.py
> orator make:migration modify_users_table
migrations/[timstamp]_modify_users_table.py
Orator Migrations
migrations
> orator migrate
Orator Migrations
migrations
> orator migrate:rollback
Migration Code
create_users_table
class CreateUsersTable(Migration):
def up(self):
if not self.schema.has_table('users'):
with self.schema.create('users') as table:
table.charset = 'utf8mb4'
table.collation = 'utf8mb4_unicode_ci'
table.increments('id')
Migration Code
create_users_table
table.integer('type').unsigned()
table.string('name', 128)
table.string('desc', 512)
table.string('uuid').unique()
table.timestamps()
table.soft_deletes()
Migration Code
create_users_table
def down(self):
self.schema.drop_if_exists('users')
Migration Code
modify_users_table
class ModifyUsersTable(Migration):
def up(self):
if not self.schema.has_table('users'):
with self.schema.table('users') as table:
table.integer('created_user').after('created_at')
table.integer('updated_user').after('updated_at’)
table.integer('deleted_user').nullable()
.after('deleted_at')
Migration Code
modify_users_table
def down(self):
if not self.schema.has_table('users'):
with self.schema.table('users') as table:
table.drop_column('created_user')
table.drop_column('updated_user')
table.drop_column('deleted_user')
Migration Code
modify_users_table
class ModifyUsersTable(Migration):
def up(self):
if not self.schema.has_table('users'):
with self.schema.table('users') as table:
table.drop_unique('%s_%s_%s' %
('users', 'uuid', 'unique'))
table.rename_column('uuid', 'user_uuid')
table.unique('user_uuid')
Migration Code
modify_users_table
def down(self):
if not self.schema.has_table('users'):
with self.schema.table('users') as table:
table.drop_unique('%s_%s_%s' %
('users', 'user_uuid', 'unique'))
table.rename_column('uuid_uuid', 'user')
table.unique('user')
Orator Go
tablenames =
[table.values()[0] for table in db.select('show tables')]
tablenames.remove('migrations')
Orator Go
columns = db.select('show columns from %s' % tablename)
Orator Go
•
•
depart_users users_groups
•
users groups
•
1:N depart_users
M:N users_groups
Go
•
•
DepartUsers UsersGroups
•
Users Groups
•
1:N DepartUsers
M:N UsersGroups
Orator Go
• char, varchar, text
• Timestamp
• short, int, long
Go
• sql.NullString
database/sql
• mysql.NullTime
github.com/go-sql-driver/mysql
• sql.NullInt64
database/sql
Orator ---> Database
---> Orator ---> Go Structs
---> Models, Protos
---> GinAnt
JSON
Go
encoding/json
github.com/json-iterator/go
github.com/json-iterator/go
•
•
• import "encoding/json“
• json.Marhsal
• json.Unmarhsal
• import "github.com/json-
iterator/go"
• jsoniter.Marshal
• jsoniter.Unmarshal
• Host
• 32 Cores (Intel Xeon CPU E5-2630 v3)
• 64 GB Memory
• VMware Workstation Pro 12.5.2
• Guest
• 4 Cores CPU
• 4 GB Memory
• Ubuntu Desktop 16.04.1
• Go 1.8.3 linux/amd64
• Go
encoding/json
•
github.com/json-iterator/go
type User struct {
ID int
Name string
Phones []string
Address UserAddress
}
type UserAddress struct {
Country int
City int
Line1 string
Line2 string
}
Marshal User{
ID: 1,
Name: "erinus",
Phones: []string{
"0975733983",
"0955773991",
},
}
encoding/json
2719.660506ms
github.com/json-iterator/go
1387.888566ms
1.9x
Marshal Array[
User{
ID: 1,
Name: "erinus",
Phones: []string{
"0975733983",
"0955773991",
},
},
repeat 100 times ...
]
encoding/json
244374.287138ms
github.com/json-iterator/go
83927.606927ms
2.9x
Marshal User{
ID: 1,
Name: "erinus",
Phones: []string{
"0975733983",
"0955773991",
},
Address: UserAddress{
Country: 886,
City: 12,
Line1: "13F., No.53, Ln. 118, Renhua St.,",
Line2: "Sanchong Dist., New Taipei City",
},
}
encoding/json
3906.035542ms
github.com/json-iterator/go
1494.293775ms
2.6x
Unmarshal {
"ID": 1,
"Name": "erinus",
"Phones":[
"0975733983",
"0955773991"
]
}
encoding/json
4191.640775ms
github.com/json-iterator/go
901.676825ms
4.6x
Unmarshal [
{
"ID": 1,
"Name": "erinus",
"Phones":[
"0975733983",
"0955773991"
]
},
repeat 100 times ...
]
encoding/json
256959.848113ms
github.com/json-iterator/go
52141.368106ms
4.9x
Unmarshal {
"ID": 1,
"Name": "erinus",
"Phones":[
"0975733983",
"0955773991"
],
"Address": {
"Country": 886,
"City": 12,
"Line1": "13F., No.53, Ln. 118, Renhua St.,",
"Line2": "Sanchong Dist., New Taipei City"
}
}
encoding/json
8112.072724ms
github.com/json-iterator/go
1627.580308ms
4.9x
NGINX SSL Parameters
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-
GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-
POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-
SHA256:ECDHE-ECD SA-AES256-SHA384:ECDHE-RSA-AES256-
SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:DHE-
RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:ECDHE-RSA-
AES128-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AE S128-SHA';
NGINX SSL Parameters
ssl_ecdh_curve secp384r1;
ssl_session_cache shared:SSL:50m;
ssl_session_timeout 1d;
ssl_session_tickets off;
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
Ant
DNS
DNS
NGINX SSL Parameters
add_header Strict-Transport-Security "max-age=63072000;
includeSubDomains; preload";
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
Ant HTTP Headers
HTTP Headers
Q & A
Thanks >.-

More Related Content

What's hot

PuppetDB, Puppet Explorer and puppetdbquery
PuppetDB, Puppet Explorer and puppetdbqueryPuppetDB, Puppet Explorer and puppetdbquery
PuppetDB, Puppet Explorer and puppetdbquery
Puppet
 
Building Awesome CLI apps in Go
Building Awesome CLI apps in GoBuilding Awesome CLI apps in Go
Building Awesome CLI apps in Go
Steven Francia
 
Go debugging and troubleshooting tips - from real life lessons at SignalFx
Go debugging and troubleshooting tips - from real life lessons at SignalFxGo debugging and troubleshooting tips - from real life lessons at SignalFx
Go debugging and troubleshooting tips - from real life lessons at SignalFx
SignalFx
 
Painless Data Storage with MongoDB & Go
Painless Data Storage with MongoDB & Go Painless Data Storage with MongoDB & Go
Painless Data Storage with MongoDB & Go
Steven Francia
 
KubeCon EU 2016: Custom Volume Plugins
KubeCon EU 2016: Custom Volume PluginsKubeCon EU 2016: Custom Volume Plugins
KubeCon EU 2016: Custom Volume Plugins
KubeAcademy
 
JIP Pipeline System Introduction
JIP Pipeline System IntroductionJIP Pipeline System Introduction
JIP Pipeline System Introduction
thasso23
 
Augeas @RMLL 2012
Augeas @RMLL 2012Augeas @RMLL 2012
Augeas @RMLL 2012
Raphaël PINSON
 
Introducing Command Line Applications with Ruby
Introducing Command Line Applications with RubyIntroducing Command Line Applications with Ruby
Introducing Command Line Applications with RubyNikhil Mungel
 
Psycopg2 - Connect to PostgreSQL using Python Script
Psycopg2 - Connect to PostgreSQL using Python ScriptPsycopg2 - Connect to PostgreSQL using Python Script
Psycopg2 - Connect to PostgreSQL using Python Script
Survey Department
 
Vim Script Programming
Vim Script ProgrammingVim Script Programming
Vim Script ProgrammingLin Yo-An
 
Stanford Hackathon - Puppet Modules
Stanford Hackathon - Puppet ModulesStanford Hackathon - Puppet Modules
Stanford Hackathon - Puppet Modules
Puppet
 
Happy Go Programming
Happy Go ProgrammingHappy Go Programming
Happy Go Programming
Lin Yo-An
 
Programming with Python and PostgreSQL
Programming with Python and PostgreSQLProgramming with Python and PostgreSQL
Programming with Python and PostgreSQL
Peter Eisentraut
 
Chef or how to make computers do the work for us
Chef or how to make computers do the work for usChef or how to make computers do the work for us
Chef or how to make computers do the work for us
sickill
 
Ansible roles done right
Ansible roles done rightAnsible roles done right
Ansible roles done right
Dan Vaida
 
并发模型介绍
并发模型介绍并发模型介绍
并发模型介绍
qiang
 
Unleash your inner console cowboy
Unleash your inner console cowboyUnleash your inner console cowboy
Unleash your inner console cowboy
Kenneth Geisshirt
 
MySQL in Go - Golang NE July 2015
MySQL in Go - Golang NE July 2015MySQL in Go - Golang NE July 2015
MySQL in Go - Golang NE July 2015
Mark Hemmings
 
How to Develop Puppet Modules: From Source to the Forge With Zero Clicks
How to Develop Puppet Modules: From Source to the Forge With Zero ClicksHow to Develop Puppet Modules: From Source to the Forge With Zero Clicks
How to Develop Puppet Modules: From Source to the Forge With Zero Clicks
Carlos Sanchez
 
Internal Hive
Internal HiveInternal Hive
Internal Hive
Recruit Technologies
 

What's hot (20)

PuppetDB, Puppet Explorer and puppetdbquery
PuppetDB, Puppet Explorer and puppetdbqueryPuppetDB, Puppet Explorer and puppetdbquery
PuppetDB, Puppet Explorer and puppetdbquery
 
Building Awesome CLI apps in Go
Building Awesome CLI apps in GoBuilding Awesome CLI apps in Go
Building Awesome CLI apps in Go
 
Go debugging and troubleshooting tips - from real life lessons at SignalFx
Go debugging and troubleshooting tips - from real life lessons at SignalFxGo debugging and troubleshooting tips - from real life lessons at SignalFx
Go debugging and troubleshooting tips - from real life lessons at SignalFx
 
Painless Data Storage with MongoDB & Go
Painless Data Storage with MongoDB & Go Painless Data Storage with MongoDB & Go
Painless Data Storage with MongoDB & Go
 
KubeCon EU 2016: Custom Volume Plugins
KubeCon EU 2016: Custom Volume PluginsKubeCon EU 2016: Custom Volume Plugins
KubeCon EU 2016: Custom Volume Plugins
 
JIP Pipeline System Introduction
JIP Pipeline System IntroductionJIP Pipeline System Introduction
JIP Pipeline System Introduction
 
Augeas @RMLL 2012
Augeas @RMLL 2012Augeas @RMLL 2012
Augeas @RMLL 2012
 
Introducing Command Line Applications with Ruby
Introducing Command Line Applications with RubyIntroducing Command Line Applications with Ruby
Introducing Command Line Applications with Ruby
 
Psycopg2 - Connect to PostgreSQL using Python Script
Psycopg2 - Connect to PostgreSQL using Python ScriptPsycopg2 - Connect to PostgreSQL using Python Script
Psycopg2 - Connect to PostgreSQL using Python Script
 
Vim Script Programming
Vim Script ProgrammingVim Script Programming
Vim Script Programming
 
Stanford Hackathon - Puppet Modules
Stanford Hackathon - Puppet ModulesStanford Hackathon - Puppet Modules
Stanford Hackathon - Puppet Modules
 
Happy Go Programming
Happy Go ProgrammingHappy Go Programming
Happy Go Programming
 
Programming with Python and PostgreSQL
Programming with Python and PostgreSQLProgramming with Python and PostgreSQL
Programming with Python and PostgreSQL
 
Chef or how to make computers do the work for us
Chef or how to make computers do the work for usChef or how to make computers do the work for us
Chef or how to make computers do the work for us
 
Ansible roles done right
Ansible roles done rightAnsible roles done right
Ansible roles done right
 
并发模型介绍
并发模型介绍并发模型介绍
并发模型介绍
 
Unleash your inner console cowboy
Unleash your inner console cowboyUnleash your inner console cowboy
Unleash your inner console cowboy
 
MySQL in Go - Golang NE July 2015
MySQL in Go - Golang NE July 2015MySQL in Go - Golang NE July 2015
MySQL in Go - Golang NE July 2015
 
How to Develop Puppet Modules: From Source to the Forge With Zero Clicks
How to Develop Puppet Modules: From Source to the Forge With Zero ClicksHow to Develop Puppet Modules: From Source to the Forge With Zero Clicks
How to Develop Puppet Modules: From Source to the Forge With Zero Clicks
 
Internal Hive
Internal HiveInternal Hive
Internal Hive
 

Similar to Go Web Development

FP - Découverte de Play Framework Scala
FP - Découverte de Play Framework ScalaFP - Découverte de Play Framework Scala
FP - Découverte de Play Framework Scala
Kévin Margueritte
 
Logstash for SEO: come monitorare i Log del Web Server in realtime
Logstash for SEO: come monitorare i Log del Web Server in realtimeLogstash for SEO: come monitorare i Log del Web Server in realtime
Logstash for SEO: come monitorare i Log del Web Server in realtime
Andrea Cardinale
 
Logstash
LogstashLogstash
Logstash
琛琳 饶
 
Xitrum Web Framework Live Coding Demos / Xitrum Web Framework ライブコーディング
Xitrum Web Framework Live Coding Demos / Xitrum Web Framework ライブコーディングXitrum Web Framework Live Coding Demos / Xitrum Web Framework ライブコーディング
Xitrum Web Framework Live Coding Demos / Xitrum Web Framework ライブコーディング
scalaconfjp
 
Xitrum @ Scala Matsuri Tokyo 2014
Xitrum @ Scala Matsuri Tokyo 2014Xitrum @ Scala Matsuri Tokyo 2014
Xitrum @ Scala Matsuri Tokyo 2014
Ngoc Dao
 
Exploring Async PHP (SF Live Berlin 2019)
Exploring Async PHP (SF Live Berlin 2019)Exploring Async PHP (SF Live Berlin 2019)
Exploring Async PHP (SF Live Berlin 2019)
dantleech
 
Crafting Beautiful CLI Applications in Ruby
Crafting Beautiful CLI Applications in RubyCrafting Beautiful CLI Applications in Ruby
Crafting Beautiful CLI Applications in Ruby
Nikhil Mungel
 
IVS CTO Night And Day 2018 Winter - [re:Cap] Serverless & Mobile
IVS CTO Night And Day 2018 Winter - [re:Cap] Serverless & MobileIVS CTO Night And Day 2018 Winter - [re:Cap] Serverless & Mobile
IVS CTO Night And Day 2018 Winter - [re:Cap] Serverless & Mobile
Amazon Web Services Japan
 
Dev ninja -> vagrant + virtualbox + chef-solo + git + ec2
Dev ninja  -> vagrant + virtualbox + chef-solo + git + ec2Dev ninja  -> vagrant + virtualbox + chef-solo + git + ec2
Dev ninja -> vagrant + virtualbox + chef-solo + git + ec2
Yros
 
Kamailio - Surfing Big Waves Of SIP With Style
Kamailio - Surfing Big Waves Of SIP With StyleKamailio - Surfing Big Waves Of SIP With Style
Kamailio - Surfing Big Waves Of SIP With Style
Daniel-Constantin Mierla
 
Play vs Rails
Play vs RailsPlay vs Rails
Play vs Rails
Daniel Cukier
 
Make BDD great again
Make BDD great againMake BDD great again
Make BDD great again
Yana Gusti
 
Express Presentation
Express PresentationExpress Presentation
Express Presentation
aaronheckmann
 
Azure F#unctions
Azure F#unctionsAzure F#unctions
Azure F#unctions
☁️ Mikhail Shilkov
 
Great Developers Steal
Great Developers StealGreat Developers Steal
Great Developers Steal
Ben Scofield
 
Python & Django TTT
Python & Django TTTPython & Django TTT
Python & Django TTTkevinvw
 
Using and scaling Rack and Rack-based middleware
Using and scaling Rack and Rack-based middlewareUsing and scaling Rack and Rack-based middleware
Using and scaling Rack and Rack-based middleware
Alona Mekhovova
 
wwc start-launched
wwc start-launchedwwc start-launched
wwc start-launchedMat Schaffer
 
#NewMeetup Performance
#NewMeetup Performance#NewMeetup Performance
#NewMeetup PerformanceJustin Cataldo
 

Similar to Go Web Development (20)

FP - Découverte de Play Framework Scala
FP - Découverte de Play Framework ScalaFP - Découverte de Play Framework Scala
FP - Découverte de Play Framework Scala
 
Logstash for SEO: come monitorare i Log del Web Server in realtime
Logstash for SEO: come monitorare i Log del Web Server in realtimeLogstash for SEO: come monitorare i Log del Web Server in realtime
Logstash for SEO: come monitorare i Log del Web Server in realtime
 
Logstash
LogstashLogstash
Logstash
 
Xitrum Web Framework Live Coding Demos / Xitrum Web Framework ライブコーディング
Xitrum Web Framework Live Coding Demos / Xitrum Web Framework ライブコーディングXitrum Web Framework Live Coding Demos / Xitrum Web Framework ライブコーディング
Xitrum Web Framework Live Coding Demos / Xitrum Web Framework ライブコーディング
 
Xitrum @ Scala Matsuri Tokyo 2014
Xitrum @ Scala Matsuri Tokyo 2014Xitrum @ Scala Matsuri Tokyo 2014
Xitrum @ Scala Matsuri Tokyo 2014
 
Exploring Async PHP (SF Live Berlin 2019)
Exploring Async PHP (SF Live Berlin 2019)Exploring Async PHP (SF Live Berlin 2019)
Exploring Async PHP (SF Live Berlin 2019)
 
Crafting Beautiful CLI Applications in Ruby
Crafting Beautiful CLI Applications in RubyCrafting Beautiful CLI Applications in Ruby
Crafting Beautiful CLI Applications in Ruby
 
Rails Security
Rails SecurityRails Security
Rails Security
 
IVS CTO Night And Day 2018 Winter - [re:Cap] Serverless & Mobile
IVS CTO Night And Day 2018 Winter - [re:Cap] Serverless & MobileIVS CTO Night And Day 2018 Winter - [re:Cap] Serverless & Mobile
IVS CTO Night And Day 2018 Winter - [re:Cap] Serverless & Mobile
 
Dev ninja -> vagrant + virtualbox + chef-solo + git + ec2
Dev ninja  -> vagrant + virtualbox + chef-solo + git + ec2Dev ninja  -> vagrant + virtualbox + chef-solo + git + ec2
Dev ninja -> vagrant + virtualbox + chef-solo + git + ec2
 
Kamailio - Surfing Big Waves Of SIP With Style
Kamailio - Surfing Big Waves Of SIP With StyleKamailio - Surfing Big Waves Of SIP With Style
Kamailio - Surfing Big Waves Of SIP With Style
 
Play vs Rails
Play vs RailsPlay vs Rails
Play vs Rails
 
Make BDD great again
Make BDD great againMake BDD great again
Make BDD great again
 
Express Presentation
Express PresentationExpress Presentation
Express Presentation
 
Azure F#unctions
Azure F#unctionsAzure F#unctions
Azure F#unctions
 
Great Developers Steal
Great Developers StealGreat Developers Steal
Great Developers Steal
 
Python & Django TTT
Python & Django TTTPython & Django TTT
Python & Django TTT
 
Using and scaling Rack and Rack-based middleware
Using and scaling Rack and Rack-based middlewareUsing and scaling Rack and Rack-based middleware
Using and scaling Rack and Rack-based middleware
 
wwc start-launched
wwc start-launchedwwc start-launched
wwc start-launched
 
#NewMeetup Performance
#NewMeetup Performance#NewMeetup Performance
#NewMeetup Performance
 

More from Cheng-Yi Yu

Crawler 2
Crawler 2Crawler 2
Crawler 2
Cheng-Yi Yu
 
Python Crawler
Python CrawlerPython Crawler
Python Crawler
Cheng-Yi Yu
 
CEF.net
CEF.netCEF.net
CEF.net
Cheng-Yi Yu
 
Facebook Dynamic Ads API
Facebook Dynamic Ads APIFacebook Dynamic Ads API
Facebook Dynamic Ads API
Cheng-Yi Yu
 
Network Device Development - Part 5: Firewall 104 ~ Packet Splitter
Network Device Development - Part 5: Firewall 104 ~ Packet SplitterNetwork Device Development - Part 5: Firewall 104 ~ Packet Splitter
Network Device Development - Part 5: Firewall 104 ~ Packet Splitter
Cheng-Yi Yu
 
Network Device Development - Part 4: Firewall 103 ~ Protocol Filter & Payload...
Network Device Development - Part 4: Firewall 103 ~ Protocol Filter & Payload...Network Device Development - Part 4: Firewall 103 ~ Protocol Filter & Payload...
Network Device Development - Part 4: Firewall 103 ~ Protocol Filter & Payload...
Cheng-Yi Yu
 
2015.10.05 Updated > Network Device Development - Part 2: Firewall 101
2015.10.05 Updated > Network Device Development - Part 2: Firewall 1012015.10.05 Updated > Network Device Development - Part 2: Firewall 101
2015.10.05 Updated > Network Device Development - Part 2: Firewall 101
Cheng-Yi Yu
 
2015.10.05 Updated > Network Device Development - Part 1: Switch
2015.10.05 Updated > Network Device Development - Part 1: Switch2015.10.05 Updated > Network Device Development - Part 1: Switch
2015.10.05 Updated > Network Device Development - Part 1: Switch
Cheng-Yi Yu
 
Android Security Development - Part 2: Malicious Android App Dynamic Analyzi...
Android Security Development - Part 2: Malicious Android App Dynamic Analyzi...Android Security Development - Part 2: Malicious Android App Dynamic Analyzi...
Android Security Development - Part 2: Malicious Android App Dynamic Analyzi...
Cheng-Yi Yu
 
2015.04.24 Updated > Android Security Development - Part 1: App Development
2015.04.24 Updated > Android Security Development - Part 1: App Development 2015.04.24 Updated > Android Security Development - Part 1: App Development
2015.04.24 Updated > Android Security Development - Part 1: App Development
Cheng-Yi Yu
 

More from Cheng-Yi Yu (10)

Crawler 2
Crawler 2Crawler 2
Crawler 2
 
Python Crawler
Python CrawlerPython Crawler
Python Crawler
 
CEF.net
CEF.netCEF.net
CEF.net
 
Facebook Dynamic Ads API
Facebook Dynamic Ads APIFacebook Dynamic Ads API
Facebook Dynamic Ads API
 
Network Device Development - Part 5: Firewall 104 ~ Packet Splitter
Network Device Development - Part 5: Firewall 104 ~ Packet SplitterNetwork Device Development - Part 5: Firewall 104 ~ Packet Splitter
Network Device Development - Part 5: Firewall 104 ~ Packet Splitter
 
Network Device Development - Part 4: Firewall 103 ~ Protocol Filter & Payload...
Network Device Development - Part 4: Firewall 103 ~ Protocol Filter & Payload...Network Device Development - Part 4: Firewall 103 ~ Protocol Filter & Payload...
Network Device Development - Part 4: Firewall 103 ~ Protocol Filter & Payload...
 
2015.10.05 Updated > Network Device Development - Part 2: Firewall 101
2015.10.05 Updated > Network Device Development - Part 2: Firewall 1012015.10.05 Updated > Network Device Development - Part 2: Firewall 101
2015.10.05 Updated > Network Device Development - Part 2: Firewall 101
 
2015.10.05 Updated > Network Device Development - Part 1: Switch
2015.10.05 Updated > Network Device Development - Part 1: Switch2015.10.05 Updated > Network Device Development - Part 1: Switch
2015.10.05 Updated > Network Device Development - Part 1: Switch
 
Android Security Development - Part 2: Malicious Android App Dynamic Analyzi...
Android Security Development - Part 2: Malicious Android App Dynamic Analyzi...Android Security Development - Part 2: Malicious Android App Dynamic Analyzi...
Android Security Development - Part 2: Malicious Android App Dynamic Analyzi...
 
2015.04.24 Updated > Android Security Development - Part 1: App Development
2015.04.24 Updated > Android Security Development - Part 1: App Development 2015.04.24 Updated > Android Security Development - Part 1: App Development
2015.04.24 Updated > Android Security Development - Part 1: App Development
 

Recently uploaded

May Marketo Masterclass, London MUG May 22 2024.pdf
May Marketo Masterclass, London MUG May 22 2024.pdfMay Marketo Masterclass, London MUG May 22 2024.pdf
May Marketo Masterclass, London MUG May 22 2024.pdf
Adele Miller
 
Cracking the code review at SpringIO 2024
Cracking the code review at SpringIO 2024Cracking the code review at SpringIO 2024
Cracking the code review at SpringIO 2024
Paco van Beckhoven
 
Gamify Your Mind; The Secret Sauce to Delivering Success, Continuously Improv...
Gamify Your Mind; The Secret Sauce to Delivering Success, Continuously Improv...Gamify Your Mind; The Secret Sauce to Delivering Success, Continuously Improv...
Gamify Your Mind; The Secret Sauce to Delivering Success, Continuously Improv...
Shahin Sheidaei
 
Globus Compute wth IRI Workflows - GlobusWorld 2024
Globus Compute wth IRI Workflows - GlobusWorld 2024Globus Compute wth IRI Workflows - GlobusWorld 2024
Globus Compute wth IRI Workflows - GlobusWorld 2024
Globus
 
First Steps with Globus Compute Multi-User Endpoints
First Steps with Globus Compute Multi-User EndpointsFirst Steps with Globus Compute Multi-User Endpoints
First Steps with Globus Compute Multi-User Endpoints
Globus
 
Webinar: Salesforce Document Management 2.0 - Smarter, Faster, Better
Webinar: Salesforce Document Management 2.0 - Smarter, Faster, BetterWebinar: Salesforce Document Management 2.0 - Smarter, Faster, Better
Webinar: Salesforce Document Management 2.0 - Smarter, Faster, Better
XfilesPro
 
Exploring Innovations in Data Repository Solutions - Insights from the U.S. G...
Exploring Innovations in Data Repository Solutions - Insights from the U.S. G...Exploring Innovations in Data Repository Solutions - Insights from the U.S. G...
Exploring Innovations in Data Repository Solutions - Insights from the U.S. G...
Globus
 
Into the Box 2024 - Keynote Day 2 Slides.pdf
Into the Box 2024 - Keynote Day 2 Slides.pdfInto the Box 2024 - Keynote Day 2 Slides.pdf
Into the Box 2024 - Keynote Day 2 Slides.pdf
Ortus Solutions, Corp
 
Corporate Management | Session 3 of 3 | Tendenci AMS
Corporate Management | Session 3 of 3 | Tendenci AMSCorporate Management | Session 3 of 3 | Tendenci AMS
Corporate Management | Session 3 of 3 | Tendenci AMS
Tendenci - The Open Source AMS (Association Management Software)
 
Large Language Models and the End of Programming
Large Language Models and the End of ProgrammingLarge Language Models and the End of Programming
Large Language Models and the End of Programming
Matt Welsh
 
Custom Healthcare Software for Managing Chronic Conditions and Remote Patient...
Custom Healthcare Software for Managing Chronic Conditions and Remote Patient...Custom Healthcare Software for Managing Chronic Conditions and Remote Patient...
Custom Healthcare Software for Managing Chronic Conditions and Remote Patient...
Mind IT Systems
 
Enterprise Resource Planning System in Telangana
Enterprise Resource Planning System in TelanganaEnterprise Resource Planning System in Telangana
Enterprise Resource Planning System in Telangana
NYGGS Automation Suite
 
Accelerate Enterprise Software Engineering with Platformless
Accelerate Enterprise Software Engineering with PlatformlessAccelerate Enterprise Software Engineering with Platformless
Accelerate Enterprise Software Engineering with Platformless
WSO2
 
Using IESVE for Room Loads Analysis - Australia & New Zealand
Using IESVE for Room Loads Analysis - Australia & New ZealandUsing IESVE for Room Loads Analysis - Australia & New Zealand
Using IESVE for Room Loads Analysis - Australia & New Zealand
IES VE
 
Providing Globus Services to Users of JASMIN for Environmental Data Analysis
Providing Globus Services to Users of JASMIN for Environmental Data AnalysisProviding Globus Services to Users of JASMIN for Environmental Data Analysis
Providing Globus Services to Users of JASMIN for Environmental Data Analysis
Globus
 
Developing Distributed High-performance Computing Capabilities of an Open Sci...
Developing Distributed High-performance Computing Capabilities of an Open Sci...Developing Distributed High-performance Computing Capabilities of an Open Sci...
Developing Distributed High-performance Computing Capabilities of an Open Sci...
Globus
 
A Sighting of filterA in Typelevel Rite of Passage
A Sighting of filterA in Typelevel Rite of PassageA Sighting of filterA in Typelevel Rite of Passage
A Sighting of filterA in Typelevel Rite of Passage
Philip Schwarz
 
RISE with SAP and Journey to the Intelligent Enterprise
RISE with SAP and Journey to the Intelligent EnterpriseRISE with SAP and Journey to the Intelligent Enterprise
RISE with SAP and Journey to the Intelligent Enterprise
Srikant77
 
Globus Compute Introduction - GlobusWorld 2024
Globus Compute Introduction - GlobusWorld 2024Globus Compute Introduction - GlobusWorld 2024
Globus Compute Introduction - GlobusWorld 2024
Globus
 
BoxLang: Review our Visionary Licenses of 2024
BoxLang: Review our Visionary Licenses of 2024BoxLang: Review our Visionary Licenses of 2024
BoxLang: Review our Visionary Licenses of 2024
Ortus Solutions, Corp
 

Recently uploaded (20)

May Marketo Masterclass, London MUG May 22 2024.pdf
May Marketo Masterclass, London MUG May 22 2024.pdfMay Marketo Masterclass, London MUG May 22 2024.pdf
May Marketo Masterclass, London MUG May 22 2024.pdf
 
Cracking the code review at SpringIO 2024
Cracking the code review at SpringIO 2024Cracking the code review at SpringIO 2024
Cracking the code review at SpringIO 2024
 
Gamify Your Mind; The Secret Sauce to Delivering Success, Continuously Improv...
Gamify Your Mind; The Secret Sauce to Delivering Success, Continuously Improv...Gamify Your Mind; The Secret Sauce to Delivering Success, Continuously Improv...
Gamify Your Mind; The Secret Sauce to Delivering Success, Continuously Improv...
 
Globus Compute wth IRI Workflows - GlobusWorld 2024
Globus Compute wth IRI Workflows - GlobusWorld 2024Globus Compute wth IRI Workflows - GlobusWorld 2024
Globus Compute wth IRI Workflows - GlobusWorld 2024
 
First Steps with Globus Compute Multi-User Endpoints
First Steps with Globus Compute Multi-User EndpointsFirst Steps with Globus Compute Multi-User Endpoints
First Steps with Globus Compute Multi-User Endpoints
 
Webinar: Salesforce Document Management 2.0 - Smarter, Faster, Better
Webinar: Salesforce Document Management 2.0 - Smarter, Faster, BetterWebinar: Salesforce Document Management 2.0 - Smarter, Faster, Better
Webinar: Salesforce Document Management 2.0 - Smarter, Faster, Better
 
Exploring Innovations in Data Repository Solutions - Insights from the U.S. G...
Exploring Innovations in Data Repository Solutions - Insights from the U.S. G...Exploring Innovations in Data Repository Solutions - Insights from the U.S. G...
Exploring Innovations in Data Repository Solutions - Insights from the U.S. G...
 
Into the Box 2024 - Keynote Day 2 Slides.pdf
Into the Box 2024 - Keynote Day 2 Slides.pdfInto the Box 2024 - Keynote Day 2 Slides.pdf
Into the Box 2024 - Keynote Day 2 Slides.pdf
 
Corporate Management | Session 3 of 3 | Tendenci AMS
Corporate Management | Session 3 of 3 | Tendenci AMSCorporate Management | Session 3 of 3 | Tendenci AMS
Corporate Management | Session 3 of 3 | Tendenci AMS
 
Large Language Models and the End of Programming
Large Language Models and the End of ProgrammingLarge Language Models and the End of Programming
Large Language Models and the End of Programming
 
Custom Healthcare Software for Managing Chronic Conditions and Remote Patient...
Custom Healthcare Software for Managing Chronic Conditions and Remote Patient...Custom Healthcare Software for Managing Chronic Conditions and Remote Patient...
Custom Healthcare Software for Managing Chronic Conditions and Remote Patient...
 
Enterprise Resource Planning System in Telangana
Enterprise Resource Planning System in TelanganaEnterprise Resource Planning System in Telangana
Enterprise Resource Planning System in Telangana
 
Accelerate Enterprise Software Engineering with Platformless
Accelerate Enterprise Software Engineering with PlatformlessAccelerate Enterprise Software Engineering with Platformless
Accelerate Enterprise Software Engineering with Platformless
 
Using IESVE for Room Loads Analysis - Australia & New Zealand
Using IESVE for Room Loads Analysis - Australia & New ZealandUsing IESVE for Room Loads Analysis - Australia & New Zealand
Using IESVE for Room Loads Analysis - Australia & New Zealand
 
Providing Globus Services to Users of JASMIN for Environmental Data Analysis
Providing Globus Services to Users of JASMIN for Environmental Data AnalysisProviding Globus Services to Users of JASMIN for Environmental Data Analysis
Providing Globus Services to Users of JASMIN for Environmental Data Analysis
 
Developing Distributed High-performance Computing Capabilities of an Open Sci...
Developing Distributed High-performance Computing Capabilities of an Open Sci...Developing Distributed High-performance Computing Capabilities of an Open Sci...
Developing Distributed High-performance Computing Capabilities of an Open Sci...
 
A Sighting of filterA in Typelevel Rite of Passage
A Sighting of filterA in Typelevel Rite of PassageA Sighting of filterA in Typelevel Rite of Passage
A Sighting of filterA in Typelevel Rite of Passage
 
RISE with SAP and Journey to the Intelligent Enterprise
RISE with SAP and Journey to the Intelligent EnterpriseRISE with SAP and Journey to the Intelligent Enterprise
RISE with SAP and Journey to the Intelligent Enterprise
 
Globus Compute Introduction - GlobusWorld 2024
Globus Compute Introduction - GlobusWorld 2024Globus Compute Introduction - GlobusWorld 2024
Globus Compute Introduction - GlobusWorld 2024
 
BoxLang: Review our Visionary Licenses of 2024
BoxLang: Review our Visionary Licenses of 2024BoxLang: Review our Visionary Licenses of 2024
BoxLang: Review our Visionary Licenses of 2024
 

Go Web Development