SlideShare a Scribd company logo
#SECONRU
Go на практике
Цаль-Цалко Иван
Почему мы решили
написать сервер на Go?
Особенности
● go прививает определенный стиль
Особенности
● передача нескольких значений в качестве
результата
Особенности
● функция defer
Особенности
● обработка ошибок на верхнем уровне
Особенности
● обработка исключительных ситуаций (panic)
Особенности
● статически типизированный язык
● ошибки только в продакшене
● нельзя быстро поменять что-то в продакшене
:)
Utils
● go get
● gofmt
● golint
● go vet
● go test
● go install
● etc...
$ go get github.com/go-sql-driver/mysql
$ go get github.com/mkevac/gopinba
$ go get golang.org/x/net
Utils
● go get
$ gofmt db/sharding.go
Utils
● gofmt
$ golint ./secon.go
secon.go:739:1: exported function Filter should have comment or be unexported
secon.go:740:2: can probably use "var vsf []string" instead
secon.go:750:1: exported function Map should have comment or be unexported
secon.go:910:19: should drop = 0 from declaration of var ops; it is the zero value
secon.go:1177:6: don't use underscores in Go names; func worker_chan should be
workerChan
secon.go:1353:3: should replace i += 1 with i++
secon.go:1521:8: should omit type string from declaration of var a; it will be inferred from
the right-hand side
Utils
● golint
$ go vet ./gamed/
gamed/gamed.go:423: the cancel function returned by context.WithCancel should be
called, not discarded, to avoid a context leak
gamed/gamed.go:439: arg authorized for printf verb %d of wrong type: bool
exit status 1
Utils
● go vet
$ go test .
--- FAIL: TestFileSystemAvatar (0.00s)
avatar_test.go:59: FIleSystemAvatar.GetAvatarURL should not return an error
avatar_test.go:63: FileSystemAvatar.GetAvatarURL wrongly returned
FAIL
FAIL goblueprints/chat 0.011s
$ go test .
ok goblueprints/chat 0.012s
Utils
● go test
$ go test -bench=Counter -cpu=4,16
BenchmarkNaiveCounter-4 300000000 5.19 ns/op
BenchmarkNaiveCounter-16 300000000 5.20 ns/op
BenchmarkMutexCounter-4 10000000 172 ns/op
BenchmarkMutexCounter-16 10000000 155 ns/op
BenchmarkChanCounter-4 5000000 446 ns/op
BenchmarkChanCounter-16 3000000 444 ns/op
BenchmarkAtomicCounter-4 100000000 17.6 ns/op
BenchmarkAtomicCounter-16 100000000 18.1 ns/op
BenchmarkAtomicFloatCounter-4 20000000 72.8 ns/op
BenchmarkAtomicFloatCounter-16 20000000 77.6 ns/op
BenchmarkRwMutexCounter-4 10000000 200 ns/op
BenchmarkRwMutexCounter-16 10000000 197 ns/op
PASS
ok example 23.381s
Utils
● go test -bench=Counter
Utils
● VIM
$ go install -race -v bit.games/autogen gme/data gme/db gme/billing
github.com/go-sql-driver/mysql ...
gamed/src/gme/guild.go:1223: no new variables on left side of :=
gamed/src/gme/guild.go:1223: raid.Boom undefined (type *autogen.DataRaid has no field or method
Boom)
gamed/src/gme/guild.go:1223: multiple-value self.loadBossFight() in single-value context
gamed/src/gme/guild.go:1227: undefined: fight
gamed/src/gme/guild.go:1234: cannot assign to fight.Damge
gamed/src/gme/guild.go:1235: undefined: fight in fight.Fights_count
gamed/src/gme/guild.go:1238: too many errors
Utils
● go install
Data struct
struct DataWorld
player : DataPlayer @diff
items : DataItem[] @default:[] @diff
regions : DataRegion[] @default:[] @diff
dungeons : DataDungeon[] @default:[] @diff
gates : DataGate[] @default:[] @diff
boosters : DataBooster[] @default:[] @diff
...
end
struct DataPlayer
@table:player @pkey:id @owner:id
id : uint32
level : uint32
version : string @strmax:16
reg_time : uint32 @default:0
name : string @default:""
...
end
Data struct
Rpc struct
RPC 51 SAVE_WORLD(
plr_id : string @strmax:128
data : DataWorld
)
error : EnumRpcError
version : uint32
end
Rpc.SaveWorld
WORLD
DIFF Data: 1, 2, 3, 5, 9
Data [new]: 1, 2, 5, 9, 10
Diff:
changed: 1, 5, 10
removed: 3
Diff world
DataDiff struct
struct DataWorldDiff
player : DataPlayer[]
items : DataItem[]
regions : DataRegion[]
dungeons : DataDungeon[]
gates : DataGate[]
...
removed_ids : DataRemovedIds[] @skip_save @skip_load
end
struct DataRemovedIds
class_id : uint32
ids : uint32[]
end
Rpc.SaveWorldDiff
RPC 52 SAVE_WORLD_DIFF(
plr_id : string @strmax:128
data : DataWorldDiff
)
error : EnumRpcError
version : uint32
end
$ go run -race race.go
==================
WARNING: DATA RACE
Read at 0x0000006191e0 by goroutine 8:
main.sumA() example/race.go:99 +0x3d
Previous write at 0x0000006191e0 by goroutine 7:
main.sumA() example/race.go:99 +0x59
$ go run race.go
sum is 3
Data race
Data race
Data race
Chat
github.com/gorilla/websocket
github.com/garyburd/redigo/redis
● global rooms
● guild rooms
● private rooms
clients
8 save message
1 login
2 get user
3 user info
4 user info
6 subscribe room
5 enter room
7 send message
9 publish message
10 broadcast
client
Chat
go
Chat
● handle incoming requests
Chat
● subscribe to room
Chat
● broadcast message to all users in room
$ gox -rebuild -output=./app -osarch="darwin/amd64" …
$ gox -rebuild -output=./app -osarch="linux/amd64" ...
$ gox -rebuild -output=gamed -osarch="linux/amd64" ...
"Stderr: go build github.com/glenn-brown/pcre: no buildable Go
source files in github.com/glenn-brown/pcre"
Cross compilation
github.com/mitchellh/gox
master worker
clients
Deploy server
master
signal
Deploy server
master
worker
[old]
worker
[new]
terminate
create
clients
signal
Deploy server
goclients go
go
db
main
redis
db
shards
Архитектура
Distributed lock
github.com/hjr265/redsync
Profiling
● net pprof
● мониторинг памяти и GC
● github.com/divan/expvarmon
● go tool pprof
● gopinba
$ lynx http://localhost:1234/debug/pprof
Profiling
● net pprof
goroutine profile: total 1044
479
# net.runtime_pollWait+0x58 runtime/netpoll.go:164
# net.(*pollDesc).wait+0x37 net/fd_poll_runtime.go:75
# net.(*pollDesc).waitRead+0x33 net/fd_poll_runtime.go:80
# net.(*netFD).Read+0x1b6 net/fd_unix.go:250
# net.(*conn).Read+0x6f net/net.go:181
# bufio.(*Reader).Read+0x311 bufio/bufio.go:213
# github.com/gorilla/websocket.(*Conn).readFull+0x90 github.com/gorilla/websocket/conn.go:546
# github.com/gorilla/websocket.(*Conn).advanceFrame+0x8e github.com/gorilla/websocket/conn.go:570
# github.com/gorilla/websocket.(*Conn).NextReader+0x56 github.com/gorilla/websocket/conn.go:705
# github.com/gorilla/websocket.(*Conn).ReadMessage+0x2e github.com/gorilla/websocket/conn.go:768
# gme.(*chatConnection).readPump+0x150 gme/chat.go:157
# gme.(*ChatHandler).ServeHTTP+0x1d6 gme/chat.go:1133
# net/http.(*ServeMux).ServeHTTP+0x12f net/http/server.go:2238
# bit.games/webserver.(*Server).ServeHTTP+0x9a bit.games/webserver/webserver.go:69
# net/http.serverHandler.ServeHTTP+0x91 net/http/server.go:2568
# net/http.(*conn).serve+0x611 net/http/server.go:1825
Profiling
● pprof -> goroutines
...
32
# net.runtime_pollWait+0x58 runtime/netpoll.go:164
# net.(*pollDesc).wait+0x37 net/fd_poll_runtime.go:75
# net.(*pollDesc).waitRead+0x33 net/fd_poll_runtime.go:80
# net.(*netFD).Read+0x1b6 net/fd_unix.go:250
# net.(*conn).Read+0x6f net/net.go:181
# bufio.(*Reader).fill+0x116 bufio/bufio.go:97
# bufio.(*Reader).ReadSlice+0xba bufio/bufio.go:338
# github.com/garyburd/redigo/redis.(*conn).readLine+0x48 github.com/garyburd/redigo/redis/conn.go:228
# github.com/garyburd/redigo/redis.(*conn).readReply+0x42 github.com/garyburd/redigo/redis/conn.go:301
# github.com/garyburd/redigo/redis.(*conn).Receive+0x3b github.com/garyburd/redigo/redis/conn.go:384
# github.com/garyburd/redigo/redis.PubSubConn.Receive+0x4b github.com/garyburd/redigo/redis/pubsub.go:97
# gme.(*chatRoom).redisPump+0x101 gme/chat.go:240
# gme.(*chatRoom).subscribeToRedis.func1+0x61 gme/chat.go:318
Profiling
● pprof -> goroutines
Profiling
● мониторинг памяти и GC
Profiling
● github.com/divan/expvarmon
Profiling
● go tool pprof
$ go tool pprof ./app http://127.0.0.1:5555/debug/pprof/profile
(pprof) top5
5055.75kB of 5763.69kB total (87.72%)
Dropped 487 nodes (cum <= 28.82kB)
Showing top 5 nodes out of 62 (cum >= 287.56kB)
flat flat% sum% cum cum%
2747.38kB 47.67% 47.67% 2747.38kB 47.67% runtime.stringtoslicebyte
1122.73kB 19.48% 67.15% 1122.73kB 19.48% github.com/dlclark/regexp2.(*runner).initMatch
551.22kB 9.56% 76.71% 3706.88kB 64.31% gme.InitConfigs.func1
384kB 6.66% 83.37% 384kB 6.66% runtime.hashGrow
250.42kB 4.34% 87.72% 287.56kB 4.99%
github.com/dlclark/regexp2/syntax.(*writer).codeFromTree
(pprof)
Profiling
● go tool pprof
$ (pprof) web
Profiling
● go tool pprof
Profiling
● gopinba
github.com/mkevac/gopinba
Profiling
● gopinba
Profiling
● gopinba
Ошибки
● data race
● distribute mutex
● отправка данных в закрытый канал
● переиспользование переменных в условных операторах
● SelectBySQL(...).Where(...)
● переиспользование Wait group
Output:
value = 50
value = 0
sum = 0
Ошибки
● переиспользование переменных в условных операторах
Ошибки
● SelectBySQL(...).Where(...)
gme/notification.go:97 +0xc5
panic: sync: WaitGroup is reused before previous Wait has returned
Ошибки
● переиспользование Wait group
Цаль-Цалко Иван
ivhome@bit-creative.com
Спасибо за внимание!
Вопросы?

More Related Content

What's hot

Stability issues of user space
Stability issues of user spaceStability issues of user space
Stability issues of user space
晓东 杜
 
Build microservice with gRPC in golang
Build microservice with gRPC in golangBuild microservice with gRPC in golang
Build microservice with gRPC in golang
Ting-Li Chou
 
Composer: putting dependencies on the score
Composer: putting dependencies on the scoreComposer: putting dependencies on the score
Composer: putting dependencies on the score
Rafael Dohms
 
Commencer avec le TDD
Commencer avec le TDDCommencer avec le TDD
Commencer avec le TDD
Eric Hogue
 
Composer, putting dependencies on the score
Composer, putting dependencies on the scoreComposer, putting dependencies on the score
Composer, putting dependencies on the score
Rafael Dohms
 
Guarding Your Code Against Bugs with Continuous Testing
Guarding Your Code Against Bugs with Continuous TestingGuarding Your Code Against Bugs with Continuous Testing
Guarding Your Code Against Bugs with Continuous Testing
Eric Hogue
 
Kettunen, miaubiz fuzzing at scale and in style
Kettunen, miaubiz   fuzzing at scale and in styleKettunen, miaubiz   fuzzing at scale and in style
Kettunen, miaubiz fuzzing at scale and in styleDefconRussia
 
Javascript is your (Auto)mate
Javascript is your (Auto)mateJavascript is your (Auto)mate
Javascript is your (Auto)mate
Codemotion
 
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
 
Fuzzing softwares for bugs - OWASP Seasides
Fuzzing softwares for bugs - OWASP SeasidesFuzzing softwares for bugs - OWASP Seasides
Fuzzing softwares for bugs - OWASP Seasides
OWASPSeasides
 
연구자 및 교육자를 위한 계산 및 분석 플랫폼 설계 - PyCon KR 2015
연구자 및 교육자를 위한 계산 및 분석 플랫폼 설계 - PyCon KR 2015연구자 및 교육자를 위한 계산 및 분석 플랫폼 설계 - PyCon KR 2015
연구자 및 교육자를 위한 계산 및 분석 플랫폼 설계 - PyCon KR 2015
Jeongkyu Shin
 
Android Platform Debugging and Development
Android Platform Debugging and DevelopmentAndroid Platform Debugging and Development
Android Platform Debugging and Development
Opersys inc.
 
PHP Development Tools
PHP  Development ToolsPHP  Development Tools
PHP Development Tools
Antony Abramchenko
 
Drone 1.0 Feature
Drone 1.0 FeatureDrone 1.0 Feature
Drone 1.0 Feature
Bo-Yi Wu
 
Lights, Camera, Docker: Streaming Video at DramaFever
Lights, Camera, Docker: Streaming Video at DramaFeverLights, Camera, Docker: Streaming Video at DramaFever
Lights, Camera, Docker: Streaming Video at DramaFever
bridgetkromhout
 
How to Write Node.js Module
How to Write Node.js ModuleHow to Write Node.js Module
How to Write Node.js Module
Fred Chien
 
PROCESS WARP「プロセスがデバイス間で移動する」仕組みを作る
PROCESS WARP「プロセスがデバイス間で移動する」仕組みを作るPROCESS WARP「プロセスがデバイス間で移動する」仕組みを作る
PROCESS WARP「プロセスがデバイス間で移動する」仕組みを作る
祐司 伊藤
 
mruby で mackerel のプラグインを作るはなし
mruby で mackerel のプラグインを作るはなしmruby で mackerel のプラグインを作るはなし
mruby で mackerel のプラグインを作るはなし
Hiroshi SHIBATA
 
Puppet at GitHub - PuppetConf 2013
Puppet at GitHub - PuppetConf 2013Puppet at GitHub - PuppetConf 2013
Puppet at GitHub - PuppetConf 2013
Puppet
 
Debug C/C++ Programs More Comfortably @ 2014.12.14 Trace Code Meetup
Debug C/C++ Programs More Comfortably @ 2014.12.14 Trace Code MeetupDebug C/C++ Programs More Comfortably @ 2014.12.14 Trace Code Meetup
Debug C/C++ Programs More Comfortably @ 2014.12.14 Trace Code Meetup
Jian-Hong Pan
 

What's hot (20)

Stability issues of user space
Stability issues of user spaceStability issues of user space
Stability issues of user space
 
Build microservice with gRPC in golang
Build microservice with gRPC in golangBuild microservice with gRPC in golang
Build microservice with gRPC in golang
 
Composer: putting dependencies on the score
Composer: putting dependencies on the scoreComposer: putting dependencies on the score
Composer: putting dependencies on the score
 
Commencer avec le TDD
Commencer avec le TDDCommencer avec le TDD
Commencer avec le TDD
 
Composer, putting dependencies on the score
Composer, putting dependencies on the scoreComposer, putting dependencies on the score
Composer, putting dependencies on the score
 
Guarding Your Code Against Bugs with Continuous Testing
Guarding Your Code Against Bugs with Continuous TestingGuarding Your Code Against Bugs with Continuous Testing
Guarding Your Code Against Bugs with Continuous Testing
 
Kettunen, miaubiz fuzzing at scale and in style
Kettunen, miaubiz   fuzzing at scale and in styleKettunen, miaubiz   fuzzing at scale and in style
Kettunen, miaubiz fuzzing at scale and in style
 
Javascript is your (Auto)mate
Javascript is your (Auto)mateJavascript is your (Auto)mate
Javascript is your (Auto)mate
 
Crafting Beautiful CLI Applications in Ruby
Crafting Beautiful CLI Applications in RubyCrafting Beautiful CLI Applications in Ruby
Crafting Beautiful CLI Applications in Ruby
 
Fuzzing softwares for bugs - OWASP Seasides
Fuzzing softwares for bugs - OWASP SeasidesFuzzing softwares for bugs - OWASP Seasides
Fuzzing softwares for bugs - OWASP Seasides
 
연구자 및 교육자를 위한 계산 및 분석 플랫폼 설계 - PyCon KR 2015
연구자 및 교육자를 위한 계산 및 분석 플랫폼 설계 - PyCon KR 2015연구자 및 교육자를 위한 계산 및 분석 플랫폼 설계 - PyCon KR 2015
연구자 및 교육자를 위한 계산 및 분석 플랫폼 설계 - PyCon KR 2015
 
Android Platform Debugging and Development
Android Platform Debugging and DevelopmentAndroid Platform Debugging and Development
Android Platform Debugging and Development
 
PHP Development Tools
PHP  Development ToolsPHP  Development Tools
PHP Development Tools
 
Drone 1.0 Feature
Drone 1.0 FeatureDrone 1.0 Feature
Drone 1.0 Feature
 
Lights, Camera, Docker: Streaming Video at DramaFever
Lights, Camera, Docker: Streaming Video at DramaFeverLights, Camera, Docker: Streaming Video at DramaFever
Lights, Camera, Docker: Streaming Video at DramaFever
 
How to Write Node.js Module
How to Write Node.js ModuleHow to Write Node.js Module
How to Write Node.js Module
 
PROCESS WARP「プロセスがデバイス間で移動する」仕組みを作る
PROCESS WARP「プロセスがデバイス間で移動する」仕組みを作るPROCESS WARP「プロセスがデバイス間で移動する」仕組みを作る
PROCESS WARP「プロセスがデバイス間で移動する」仕組みを作る
 
mruby で mackerel のプラグインを作るはなし
mruby で mackerel のプラグインを作るはなしmruby で mackerel のプラグインを作るはなし
mruby で mackerel のプラグインを作るはなし
 
Puppet at GitHub - PuppetConf 2013
Puppet at GitHub - PuppetConf 2013Puppet at GitHub - PuppetConf 2013
Puppet at GitHub - PuppetConf 2013
 
Debug C/C++ Programs More Comfortably @ 2014.12.14 Trace Code Meetup
Debug C/C++ Programs More Comfortably @ 2014.12.14 Trace Code MeetupDebug C/C++ Programs More Comfortably @ 2014.12.14 Trace Code Meetup
Debug C/C++ Programs More Comfortably @ 2014.12.14 Trace Code Meetup
 

Similar to SECON'2017, Цаль-Цалко Иван, Go на практике

Jedi Mind Tricks for Git
Jedi Mind Tricks for GitJedi Mind Tricks for Git
Jedi Mind Tricks for Git
Jan Krag
 
Introduction of unit test on android kernel
Introduction of unit test on android kernelIntroduction of unit test on android kernel
Introduction of unit test on android kernel
Johnson Chou
 
Let Grunt do the work, focus on the fun!
Let Grunt do the work, focus on the fun!Let Grunt do the work, focus on the fun!
Let Grunt do the work, focus on the fun!
Dirk Ginader
 
Jedi Mind Tricks in Git
Jedi Mind Tricks in GitJedi Mind Tricks in Git
Jedi Mind Tricks in Git
Johan Abildskov
 
Live deployment, ci, drupal
Live deployment, ci, drupalLive deployment, ci, drupal
Live deployment, ci, drupal
Andrii Podanenko
 
Andriy Shalaenko - GO security tips
Andriy Shalaenko - GO security tipsAndriy Shalaenko - GO security tips
Andriy Shalaenko - GO security tips
OWASP Kyiv
 
Building Chromium on an Embedded Platform using Ozone-Wayland Layer (GENIVI 1...
Building Chromium on an Embedded Platform using Ozone-Wayland Layer (GENIVI 1...Building Chromium on an Embedded Platform using Ozone-Wayland Layer (GENIVI 1...
Building Chromium on an Embedded Platform using Ozone-Wayland Layer (GENIVI 1...
Igalia
 
Openstack 簡介
Openstack 簡介Openstack 簡介
Openstack 簡介
kao kuo-tung
 
Hacking with ruby2ruby
Hacking with ruby2rubyHacking with ruby2ruby
Hacking with ruby2ruby
Marc Chung
 
Год в Github bugbounty, опыт участия
Год в Github bugbounty, опыт участияГод в Github bugbounty, опыт участия
Год в Github bugbounty, опыт участия
defcon_kz
 
Git Distributed Version Control System
Git   Distributed Version Control SystemGit   Distributed Version Control System
Git Distributed Version Control SystemVictor Wong
 
Delivering Go.CD with Terraform and Docker
Delivering Go.CD with Terraform and DockerDelivering Go.CD with Terraform and Docker
Delivering Go.CD with Terraform and Docker
Jorrit Salverda
 
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
 
Toolbox of a Ruby Team
Toolbox of a Ruby TeamToolbox of a Ruby Team
Toolbox of a Ruby Team
Arto Artnik
 
What the heck went wrong?
What the heck went wrong?What the heck went wrong?
What the heck went wrong?Andy McKay
 
Ceph Day Melbourne - Troubleshooting Ceph
Ceph Day Melbourne - Troubleshooting Ceph Ceph Day Melbourne - Troubleshooting Ceph
Ceph Day Melbourne - Troubleshooting Ceph
Ceph Community
 
PFIセミナー資料 H27.10.22
PFIセミナー資料 H27.10.22PFIセミナー資料 H27.10.22
PFIセミナー資料 H27.10.22
Yuya Takei
 
Bangpypers april-meetup-2012
Bangpypers april-meetup-2012Bangpypers april-meetup-2012
Bangpypers april-meetup-2012
Deepak Garg
 
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
 

Similar to SECON'2017, Цаль-Цалко Иван, Go на практике (20)

Jedi Mind Tricks for Git
Jedi Mind Tricks for GitJedi Mind Tricks for Git
Jedi Mind Tricks for Git
 
Introduction of unit test on android kernel
Introduction of unit test on android kernelIntroduction of unit test on android kernel
Introduction of unit test on android kernel
 
Let Grunt do the work, focus on the fun!
Let Grunt do the work, focus on the fun!Let Grunt do the work, focus on the fun!
Let Grunt do the work, focus on the fun!
 
Jedi Mind Tricks in Git
Jedi Mind Tricks in GitJedi Mind Tricks in Git
Jedi Mind Tricks in Git
 
Live deployment, ci, drupal
Live deployment, ci, drupalLive deployment, ci, drupal
Live deployment, ci, drupal
 
Andriy Shalaenko - GO security tips
Andriy Shalaenko - GO security tipsAndriy Shalaenko - GO security tips
Andriy Shalaenko - GO security tips
 
Building Chromium on an Embedded Platform using Ozone-Wayland Layer (GENIVI 1...
Building Chromium on an Embedded Platform using Ozone-Wayland Layer (GENIVI 1...Building Chromium on an Embedded Platform using Ozone-Wayland Layer (GENIVI 1...
Building Chromium on an Embedded Platform using Ozone-Wayland Layer (GENIVI 1...
 
Openstack 簡介
Openstack 簡介Openstack 簡介
Openstack 簡介
 
Git hooks
Git hooksGit hooks
Git hooks
 
Hacking with ruby2ruby
Hacking with ruby2rubyHacking with ruby2ruby
Hacking with ruby2ruby
 
Год в Github bugbounty, опыт участия
Год в Github bugbounty, опыт участияГод в Github bugbounty, опыт участия
Год в Github bugbounty, опыт участия
 
Git Distributed Version Control System
Git   Distributed Version Control SystemGit   Distributed Version Control System
Git Distributed Version Control System
 
Delivering Go.CD with Terraform and Docker
Delivering Go.CD with Terraform and DockerDelivering Go.CD with Terraform and Docker
Delivering Go.CD with Terraform and Docker
 
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
 
Toolbox of a Ruby Team
Toolbox of a Ruby TeamToolbox of a Ruby Team
Toolbox of a Ruby Team
 
What the heck went wrong?
What the heck went wrong?What the heck went wrong?
What the heck went wrong?
 
Ceph Day Melbourne - Troubleshooting Ceph
Ceph Day Melbourne - Troubleshooting Ceph Ceph Day Melbourne - Troubleshooting Ceph
Ceph Day Melbourne - Troubleshooting Ceph
 
PFIセミナー資料 H27.10.22
PFIセミナー資料 H27.10.22PFIセミナー資料 H27.10.22
PFIセミナー資料 H27.10.22
 
Bangpypers april-meetup-2012
Bangpypers april-meetup-2012Bangpypers april-meetup-2012
Bangpypers april-meetup-2012
 
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
 

More from SECON

SECON'2017, LAZADA Effartlrss Shopping, Как мы тестируем?
 SECON'2017, LAZADA Effartlrss Shopping, Как мы тестируем? SECON'2017, LAZADA Effartlrss Shopping, Как мы тестируем?
SECON'2017, LAZADA Effartlrss Shopping, Как мы тестируем?
SECON
 
SECON'2017, Куприенко Игорь, Университет 4.0: Ждать Нельзя Внедрять
SECON'2017, Куприенко Игорь, Университет 4.0: Ждать Нельзя ВнедрятьSECON'2017, Куприенко Игорь, Университет 4.0: Ждать Нельзя Внедрять
SECON'2017, Куприенко Игорь, Университет 4.0: Ждать Нельзя Внедрять
SECON
 
SECON'2017, Васильков Василий, Elm в production
SECON'2017, Васильков Василий, Elm в productionSECON'2017, Васильков Василий, Elm в production
SECON'2017, Васильков Василий, Elm в production
SECON
 
SECON'2017, Емельянов Игорь, Я хочу стать программистом: первые шаги.
SECON'2017, Емельянов Игорь, Я хочу стать программистом: первые шаги.SECON'2017, Емельянов Игорь, Я хочу стать программистом: первые шаги.
SECON'2017, Емельянов Игорь, Я хочу стать программистом: первые шаги.
SECON
 
SECON'2017, Тыкушин Анатолий, Болдырев Михаил, Расследование кибер-преступлений
SECON'2017, Тыкушин Анатолий, Болдырев Михаил, Расследование кибер-преступленийSECON'2017, Тыкушин Анатолий, Болдырев Михаил, Расследование кибер-преступлений
SECON'2017, Тыкушин Анатолий, Болдырев Михаил, Расследование кибер-преступлений
SECON
 
SECON'2017, Рожкова Надежда, Бухгалтерские лайфхаки для IT компаний
SECON'2017, 	Рожкова Надежда, Бухгалтерские лайфхаки для IT компанийSECON'2017, 	Рожкова Надежда, Бухгалтерские лайфхаки для IT компаний
SECON'2017, Рожкова Надежда, Бухгалтерские лайфхаки для IT компаний
SECON
 
SECON'2017, Янов Альберт, Управленческий учет в компании: для чего он нужен и...
SECON'2017, Янов Альберт, Управленческий учет в компании: для чего он нужен и...SECON'2017, Янов Альберт, Управленческий учет в компании: для чего он нужен и...
SECON'2017, Янов Альберт, Управленческий учет в компании: для чего он нужен и...
SECON
 
SECON'2017, Емелина Елена, Управленческий учет в софтверной компании на коленке
SECON'2017, Емелина Елена, Управленческий учет в софтверной компании на коленкеSECON'2017, Емелина Елена, Управленческий учет в софтверной компании на коленке
SECON'2017, Емелина Елена, Управленческий учет в софтверной компании на коленке
SECON
 
SECON'2017, Кузнецов Михаил, Самоуправляемая компания без бюрократии и фигни
SECON'2017, Кузнецов Михаил, Самоуправляемая компания без бюрократии и фигниSECON'2017, Кузнецов Михаил, Самоуправляемая компания без бюрократии и фигни
SECON'2017, Кузнецов Михаил, Самоуправляемая компания без бюрократии и фигни
SECON
 
SECON'2017, Коротков Анатолий, #noprojects #nomvp .. куда катится мир?
SECON'2017, Коротков Анатолий, #noprojects #nomvp .. куда катится мир?SECON'2017, Коротков Анатолий, #noprojects #nomvp .. куда катится мир?
SECON'2017, Коротков Анатолий, #noprojects #nomvp .. куда катится мир?
SECON
 
SECON'2017, Трошин Алексей, Выжить без менеджера: шаблоны правильных коммуник...
SECON'2017, Трошин Алексей, Выжить без менеджера: шаблоны правильных коммуник...SECON'2017, Трошин Алексей, Выжить без менеджера: шаблоны правильных коммуник...
SECON'2017, Трошин Алексей, Выжить без менеджера: шаблоны правильных коммуник...
SECON
 
SECON'2017, Цветцих Денис, Как добавить работе по Agile предсказуемости, не п...
SECON'2017, Цветцих Денис, Как добавить работе по Agile предсказуемости, не п...SECON'2017, Цветцих Денис, Как добавить работе по Agile предсказуемости, не п...
SECON'2017, Цветцих Денис, Как добавить работе по Agile предсказуемости, не п...
SECON
 
SECON'2017, Мартынов Антон, Опыт использования удаленных команд при реализаци...
SECON'2017, Мартынов Антон, Опыт использования удаленных команд при реализаци...SECON'2017, Мартынов Антон, Опыт использования удаленных команд при реализаци...
SECON'2017, Мартынов Антон, Опыт использования удаленных команд при реализаци...
SECON
 
SECON'2017, Неволин Роман, Функциональный C#
SECON'2017, Неволин Роман, Функциональный C#SECON'2017, Неволин Роман, Функциональный C#
SECON'2017, Неволин Роман, Функциональный C#
SECON
 
SECON'2017, Мелехова Анна, Архитектура как стихия. Обуздываем энтропию проекта
SECON'2017, Мелехова Анна, Архитектура как стихия. Обуздываем энтропию проектаSECON'2017, Мелехова Анна, Архитектура как стихия. Обуздываем энтропию проекта
SECON'2017, Мелехова Анна, Архитектура как стихия. Обуздываем энтропию проекта
SECON
 
SECON'2017, Макарычев Костантин, Использование Spark для машинного обучения
SECON'2017, Макарычев Костантин, Использование Spark для машинного обученияSECON'2017, Макарычев Костантин, Использование Spark для машинного обучения
SECON'2017, Макарычев Костантин, Использование Spark для машинного обучения
SECON
 
SECON'2017, Журавлев Денис, Маркетинг без маркетолога
SECON'2017, Журавлев Денис, Маркетинг без маркетологаSECON'2017, Журавлев Денис, Маркетинг без маркетолога
SECON'2017, Журавлев Денис, Маркетинг без маркетолога
SECON
 
SECON'2017, Шатров Михаил, Инструменты успешного предпринимателя
SECON'2017, Шатров Михаил, Инструменты успешного предпринимателяSECON'2017, Шатров Михаил, Инструменты успешного предпринимателя
SECON'2017, Шатров Михаил, Инструменты успешного предпринимателя
SECON
 
SECON'2017, Цымбал Дмитрий, Компания - Компания. Дружба на этом уровне.
SECON'2017, Цымбал Дмитрий, Компания - Компания. Дружба на этом уровне.SECON'2017, Цымбал Дмитрий, Компания - Компания. Дружба на этом уровне.
SECON'2017, Цымбал Дмитрий, Компания - Компания. Дружба на этом уровне.
SECON
 
SECON'2017, Кошак Павел, Покажи миру язык. Пять секретов грамотной локализации
SECON'2017, Кошак Павел, Покажи миру язык. Пять секретов грамотной локализацииSECON'2017, Кошак Павел, Покажи миру язык. Пять секретов грамотной локализации
SECON'2017, Кошак Павел, Покажи миру язык. Пять секретов грамотной локализации
SECON
 

More from SECON (20)

SECON'2017, LAZADA Effartlrss Shopping, Как мы тестируем?
 SECON'2017, LAZADA Effartlrss Shopping, Как мы тестируем? SECON'2017, LAZADA Effartlrss Shopping, Как мы тестируем?
SECON'2017, LAZADA Effartlrss Shopping, Как мы тестируем?
 
SECON'2017, Куприенко Игорь, Университет 4.0: Ждать Нельзя Внедрять
SECON'2017, Куприенко Игорь, Университет 4.0: Ждать Нельзя ВнедрятьSECON'2017, Куприенко Игорь, Университет 4.0: Ждать Нельзя Внедрять
SECON'2017, Куприенко Игорь, Университет 4.0: Ждать Нельзя Внедрять
 
SECON'2017, Васильков Василий, Elm в production
SECON'2017, Васильков Василий, Elm в productionSECON'2017, Васильков Василий, Elm в production
SECON'2017, Васильков Василий, Elm в production
 
SECON'2017, Емельянов Игорь, Я хочу стать программистом: первые шаги.
SECON'2017, Емельянов Игорь, Я хочу стать программистом: первые шаги.SECON'2017, Емельянов Игорь, Я хочу стать программистом: первые шаги.
SECON'2017, Емельянов Игорь, Я хочу стать программистом: первые шаги.
 
SECON'2017, Тыкушин Анатолий, Болдырев Михаил, Расследование кибер-преступлений
SECON'2017, Тыкушин Анатолий, Болдырев Михаил, Расследование кибер-преступленийSECON'2017, Тыкушин Анатолий, Болдырев Михаил, Расследование кибер-преступлений
SECON'2017, Тыкушин Анатолий, Болдырев Михаил, Расследование кибер-преступлений
 
SECON'2017, Рожкова Надежда, Бухгалтерские лайфхаки для IT компаний
SECON'2017, 	Рожкова Надежда, Бухгалтерские лайфхаки для IT компанийSECON'2017, 	Рожкова Надежда, Бухгалтерские лайфхаки для IT компаний
SECON'2017, Рожкова Надежда, Бухгалтерские лайфхаки для IT компаний
 
SECON'2017, Янов Альберт, Управленческий учет в компании: для чего он нужен и...
SECON'2017, Янов Альберт, Управленческий учет в компании: для чего он нужен и...SECON'2017, Янов Альберт, Управленческий учет в компании: для чего он нужен и...
SECON'2017, Янов Альберт, Управленческий учет в компании: для чего он нужен и...
 
SECON'2017, Емелина Елена, Управленческий учет в софтверной компании на коленке
SECON'2017, Емелина Елена, Управленческий учет в софтверной компании на коленкеSECON'2017, Емелина Елена, Управленческий учет в софтверной компании на коленке
SECON'2017, Емелина Елена, Управленческий учет в софтверной компании на коленке
 
SECON'2017, Кузнецов Михаил, Самоуправляемая компания без бюрократии и фигни
SECON'2017, Кузнецов Михаил, Самоуправляемая компания без бюрократии и фигниSECON'2017, Кузнецов Михаил, Самоуправляемая компания без бюрократии и фигни
SECON'2017, Кузнецов Михаил, Самоуправляемая компания без бюрократии и фигни
 
SECON'2017, Коротков Анатолий, #noprojects #nomvp .. куда катится мир?
SECON'2017, Коротков Анатолий, #noprojects #nomvp .. куда катится мир?SECON'2017, Коротков Анатолий, #noprojects #nomvp .. куда катится мир?
SECON'2017, Коротков Анатолий, #noprojects #nomvp .. куда катится мир?
 
SECON'2017, Трошин Алексей, Выжить без менеджера: шаблоны правильных коммуник...
SECON'2017, Трошин Алексей, Выжить без менеджера: шаблоны правильных коммуник...SECON'2017, Трошин Алексей, Выжить без менеджера: шаблоны правильных коммуник...
SECON'2017, Трошин Алексей, Выжить без менеджера: шаблоны правильных коммуник...
 
SECON'2017, Цветцих Денис, Как добавить работе по Agile предсказуемости, не п...
SECON'2017, Цветцих Денис, Как добавить работе по Agile предсказуемости, не п...SECON'2017, Цветцих Денис, Как добавить работе по Agile предсказуемости, не п...
SECON'2017, Цветцих Денис, Как добавить работе по Agile предсказуемости, не п...
 
SECON'2017, Мартынов Антон, Опыт использования удаленных команд при реализаци...
SECON'2017, Мартынов Антон, Опыт использования удаленных команд при реализаци...SECON'2017, Мартынов Антон, Опыт использования удаленных команд при реализаци...
SECON'2017, Мартынов Антон, Опыт использования удаленных команд при реализаци...
 
SECON'2017, Неволин Роман, Функциональный C#
SECON'2017, Неволин Роман, Функциональный C#SECON'2017, Неволин Роман, Функциональный C#
SECON'2017, Неволин Роман, Функциональный C#
 
SECON'2017, Мелехова Анна, Архитектура как стихия. Обуздываем энтропию проекта
SECON'2017, Мелехова Анна, Архитектура как стихия. Обуздываем энтропию проектаSECON'2017, Мелехова Анна, Архитектура как стихия. Обуздываем энтропию проекта
SECON'2017, Мелехова Анна, Архитектура как стихия. Обуздываем энтропию проекта
 
SECON'2017, Макарычев Костантин, Использование Spark для машинного обучения
SECON'2017, Макарычев Костантин, Использование Spark для машинного обученияSECON'2017, Макарычев Костантин, Использование Spark для машинного обучения
SECON'2017, Макарычев Костантин, Использование Spark для машинного обучения
 
SECON'2017, Журавлев Денис, Маркетинг без маркетолога
SECON'2017, Журавлев Денис, Маркетинг без маркетологаSECON'2017, Журавлев Денис, Маркетинг без маркетолога
SECON'2017, Журавлев Денис, Маркетинг без маркетолога
 
SECON'2017, Шатров Михаил, Инструменты успешного предпринимателя
SECON'2017, Шатров Михаил, Инструменты успешного предпринимателяSECON'2017, Шатров Михаил, Инструменты успешного предпринимателя
SECON'2017, Шатров Михаил, Инструменты успешного предпринимателя
 
SECON'2017, Цымбал Дмитрий, Компания - Компания. Дружба на этом уровне.
SECON'2017, Цымбал Дмитрий, Компания - Компания. Дружба на этом уровне.SECON'2017, Цымбал Дмитрий, Компания - Компания. Дружба на этом уровне.
SECON'2017, Цымбал Дмитрий, Компания - Компания. Дружба на этом уровне.
 
SECON'2017, Кошак Павел, Покажи миру язык. Пять секретов грамотной локализации
SECON'2017, Кошак Павел, Покажи миру язык. Пять секретов грамотной локализацииSECON'2017, Кошак Павел, Покажи миру язык. Пять секретов грамотной локализации
SECON'2017, Кошак Павел, Покажи миру язык. Пять секретов грамотной локализации
 

Recently uploaded

PHP Frameworks: I want to break free (IPC Berlin 2024)
PHP Frameworks: I want to break free (IPC Berlin 2024)PHP Frameworks: I want to break free (IPC Berlin 2024)
PHP Frameworks: I want to break free (IPC Berlin 2024)
Ralf Eggert
 
20240607 QFM018 Elixir Reading List May 2024
20240607 QFM018 Elixir Reading List May 202420240607 QFM018 Elixir Reading List May 2024
20240607 QFM018 Elixir Reading List May 2024
Matthew Sinclair
 
Elizabeth Buie - Older adults: Are we really designing for our future selves?
Elizabeth Buie - Older adults: Are we really designing for our future selves?Elizabeth Buie - Older adults: Are we really designing for our future selves?
Elizabeth Buie - Older adults: Are we really designing for our future selves?
Nexer Digital
 
GridMate - End to end testing is a critical piece to ensure quality and avoid...
GridMate - End to end testing is a critical piece to ensure quality and avoid...GridMate - End to end testing is a critical piece to ensure quality and avoid...
GridMate - End to end testing is a critical piece to ensure quality and avoid...
ThomasParaiso2
 
FIDO Alliance Osaka Seminar: FIDO Security Aspects.pdf
FIDO Alliance Osaka Seminar: FIDO Security Aspects.pdfFIDO Alliance Osaka Seminar: FIDO Security Aspects.pdf
FIDO Alliance Osaka Seminar: FIDO Security Aspects.pdf
FIDO Alliance
 
Generative AI Deep Dive: Advancing from Proof of Concept to Production
Generative AI Deep Dive: Advancing from Proof of Concept to ProductionGenerative AI Deep Dive: Advancing from Proof of Concept to Production
Generative AI Deep Dive: Advancing from Proof of Concept to Production
Aggregage
 
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
James Anderson
 
Epistemic Interaction - tuning interfaces to provide information for AI support
Epistemic Interaction - tuning interfaces to provide information for AI supportEpistemic Interaction - tuning interfaces to provide information for AI support
Epistemic Interaction - tuning interfaces to provide information for AI support
Alan Dix
 
The Art of the Pitch: WordPress Relationships and Sales
The Art of the Pitch: WordPress Relationships and SalesThe Art of the Pitch: WordPress Relationships and Sales
The Art of the Pitch: WordPress Relationships and Sales
Laura Byrne
 
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdfFIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
FIDO Alliance
 
Alt. GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using ...
Alt. GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using ...Alt. GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using ...
Alt. GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using ...
James Anderson
 
GraphSummit Singapore | The Future of Agility: Supercharging Digital Transfor...
GraphSummit Singapore | The Future of Agility: Supercharging Digital Transfor...GraphSummit Singapore | The Future of Agility: Supercharging Digital Transfor...
GraphSummit Singapore | The Future of Agility: Supercharging Digital Transfor...
Neo4j
 
UiPath Test Automation using UiPath Test Suite series, part 5
UiPath Test Automation using UiPath Test Suite series, part 5UiPath Test Automation using UiPath Test Suite series, part 5
UiPath Test Automation using UiPath Test Suite series, part 5
DianaGray10
 
Free Complete Python - A step towards Data Science
Free Complete Python - A step towards Data ScienceFree Complete Python - A step towards Data Science
Free Complete Python - A step towards Data Science
RinaMondal9
 
Pushing the limits of ePRTC: 100ns holdover for 100 days
Pushing the limits of ePRTC: 100ns holdover for 100 daysPushing the limits of ePRTC: 100ns holdover for 100 days
Pushing the limits of ePRTC: 100ns holdover for 100 days
Adtran
 
Transcript: Selling digital books in 2024: Insights from industry leaders - T...
Transcript: Selling digital books in 2024: Insights from industry leaders - T...Transcript: Selling digital books in 2024: Insights from industry leaders - T...
Transcript: Selling digital books in 2024: Insights from industry leaders - T...
BookNet Canada
 
Securing your Kubernetes cluster_ a step-by-step guide to success !
Securing your Kubernetes cluster_ a step-by-step guide to success !Securing your Kubernetes cluster_ a step-by-step guide to success !
Securing your Kubernetes cluster_ a step-by-step guide to success !
KatiaHIMEUR1
 
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdf
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdfSmart TV Buyer Insights Survey 2024 by 91mobiles.pdf
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdf
91mobiles
 
Introduction to CHERI technology - Cybersecurity
Introduction to CHERI technology - CybersecurityIntroduction to CHERI technology - Cybersecurity
Introduction to CHERI technology - Cybersecurity
mikeeftimakis1
 
UiPath Test Automation using UiPath Test Suite series, part 4
UiPath Test Automation using UiPath Test Suite series, part 4UiPath Test Automation using UiPath Test Suite series, part 4
UiPath Test Automation using UiPath Test Suite series, part 4
DianaGray10
 

Recently uploaded (20)

PHP Frameworks: I want to break free (IPC Berlin 2024)
PHP Frameworks: I want to break free (IPC Berlin 2024)PHP Frameworks: I want to break free (IPC Berlin 2024)
PHP Frameworks: I want to break free (IPC Berlin 2024)
 
20240607 QFM018 Elixir Reading List May 2024
20240607 QFM018 Elixir Reading List May 202420240607 QFM018 Elixir Reading List May 2024
20240607 QFM018 Elixir Reading List May 2024
 
Elizabeth Buie - Older adults: Are we really designing for our future selves?
Elizabeth Buie - Older adults: Are we really designing for our future selves?Elizabeth Buie - Older adults: Are we really designing for our future selves?
Elizabeth Buie - Older adults: Are we really designing for our future selves?
 
GridMate - End to end testing is a critical piece to ensure quality and avoid...
GridMate - End to end testing is a critical piece to ensure quality and avoid...GridMate - End to end testing is a critical piece to ensure quality and avoid...
GridMate - End to end testing is a critical piece to ensure quality and avoid...
 
FIDO Alliance Osaka Seminar: FIDO Security Aspects.pdf
FIDO Alliance Osaka Seminar: FIDO Security Aspects.pdfFIDO Alliance Osaka Seminar: FIDO Security Aspects.pdf
FIDO Alliance Osaka Seminar: FIDO Security Aspects.pdf
 
Generative AI Deep Dive: Advancing from Proof of Concept to Production
Generative AI Deep Dive: Advancing from Proof of Concept to ProductionGenerative AI Deep Dive: Advancing from Proof of Concept to Production
Generative AI Deep Dive: Advancing from Proof of Concept to Production
 
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
 
Epistemic Interaction - tuning interfaces to provide information for AI support
Epistemic Interaction - tuning interfaces to provide information for AI supportEpistemic Interaction - tuning interfaces to provide information for AI support
Epistemic Interaction - tuning interfaces to provide information for AI support
 
The Art of the Pitch: WordPress Relationships and Sales
The Art of the Pitch: WordPress Relationships and SalesThe Art of the Pitch: WordPress Relationships and Sales
The Art of the Pitch: WordPress Relationships and Sales
 
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdfFIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
 
Alt. GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using ...
Alt. GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using ...Alt. GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using ...
Alt. GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using ...
 
GraphSummit Singapore | The Future of Agility: Supercharging Digital Transfor...
GraphSummit Singapore | The Future of Agility: Supercharging Digital Transfor...GraphSummit Singapore | The Future of Agility: Supercharging Digital Transfor...
GraphSummit Singapore | The Future of Agility: Supercharging Digital Transfor...
 
UiPath Test Automation using UiPath Test Suite series, part 5
UiPath Test Automation using UiPath Test Suite series, part 5UiPath Test Automation using UiPath Test Suite series, part 5
UiPath Test Automation using UiPath Test Suite series, part 5
 
Free Complete Python - A step towards Data Science
Free Complete Python - A step towards Data ScienceFree Complete Python - A step towards Data Science
Free Complete Python - A step towards Data Science
 
Pushing the limits of ePRTC: 100ns holdover for 100 days
Pushing the limits of ePRTC: 100ns holdover for 100 daysPushing the limits of ePRTC: 100ns holdover for 100 days
Pushing the limits of ePRTC: 100ns holdover for 100 days
 
Transcript: Selling digital books in 2024: Insights from industry leaders - T...
Transcript: Selling digital books in 2024: Insights from industry leaders - T...Transcript: Selling digital books in 2024: Insights from industry leaders - T...
Transcript: Selling digital books in 2024: Insights from industry leaders - T...
 
Securing your Kubernetes cluster_ a step-by-step guide to success !
Securing your Kubernetes cluster_ a step-by-step guide to success !Securing your Kubernetes cluster_ a step-by-step guide to success !
Securing your Kubernetes cluster_ a step-by-step guide to success !
 
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdf
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdfSmart TV Buyer Insights Survey 2024 by 91mobiles.pdf
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdf
 
Introduction to CHERI technology - Cybersecurity
Introduction to CHERI technology - CybersecurityIntroduction to CHERI technology - Cybersecurity
Introduction to CHERI technology - Cybersecurity
 
UiPath Test Automation using UiPath Test Suite series, part 4
UiPath Test Automation using UiPath Test Suite series, part 4UiPath Test Automation using UiPath Test Suite series, part 4
UiPath Test Automation using UiPath Test Suite series, part 4
 

SECON'2017, Цаль-Цалко Иван, Go на практике

  • 3. Особенности ● go прививает определенный стиль
  • 4. Особенности ● передача нескольких значений в качестве результата
  • 8. Особенности ● статически типизированный язык ● ошибки только в продакшене ● нельзя быстро поменять что-то в продакшене :)
  • 9. Utils ● go get ● gofmt ● golint ● go vet ● go test ● go install ● etc...
  • 10. $ go get github.com/go-sql-driver/mysql $ go get github.com/mkevac/gopinba $ go get golang.org/x/net Utils ● go get
  • 12. $ golint ./secon.go secon.go:739:1: exported function Filter should have comment or be unexported secon.go:740:2: can probably use "var vsf []string" instead secon.go:750:1: exported function Map should have comment or be unexported secon.go:910:19: should drop = 0 from declaration of var ops; it is the zero value secon.go:1177:6: don't use underscores in Go names; func worker_chan should be workerChan secon.go:1353:3: should replace i += 1 with i++ secon.go:1521:8: should omit type string from declaration of var a; it will be inferred from the right-hand side Utils ● golint
  • 13. $ go vet ./gamed/ gamed/gamed.go:423: the cancel function returned by context.WithCancel should be called, not discarded, to avoid a context leak gamed/gamed.go:439: arg authorized for printf verb %d of wrong type: bool exit status 1 Utils ● go vet
  • 14. $ go test . --- FAIL: TestFileSystemAvatar (0.00s) avatar_test.go:59: FIleSystemAvatar.GetAvatarURL should not return an error avatar_test.go:63: FileSystemAvatar.GetAvatarURL wrongly returned FAIL FAIL goblueprints/chat 0.011s $ go test . ok goblueprints/chat 0.012s Utils ● go test
  • 15. $ go test -bench=Counter -cpu=4,16 BenchmarkNaiveCounter-4 300000000 5.19 ns/op BenchmarkNaiveCounter-16 300000000 5.20 ns/op BenchmarkMutexCounter-4 10000000 172 ns/op BenchmarkMutexCounter-16 10000000 155 ns/op BenchmarkChanCounter-4 5000000 446 ns/op BenchmarkChanCounter-16 3000000 444 ns/op BenchmarkAtomicCounter-4 100000000 17.6 ns/op BenchmarkAtomicCounter-16 100000000 18.1 ns/op BenchmarkAtomicFloatCounter-4 20000000 72.8 ns/op BenchmarkAtomicFloatCounter-16 20000000 77.6 ns/op BenchmarkRwMutexCounter-4 10000000 200 ns/op BenchmarkRwMutexCounter-16 10000000 197 ns/op PASS ok example 23.381s Utils ● go test -bench=Counter
  • 17. $ go install -race -v bit.games/autogen gme/data gme/db gme/billing github.com/go-sql-driver/mysql ... gamed/src/gme/guild.go:1223: no new variables on left side of := gamed/src/gme/guild.go:1223: raid.Boom undefined (type *autogen.DataRaid has no field or method Boom) gamed/src/gme/guild.go:1223: multiple-value self.loadBossFight() in single-value context gamed/src/gme/guild.go:1227: undefined: fight gamed/src/gme/guild.go:1234: cannot assign to fight.Damge gamed/src/gme/guild.go:1235: undefined: fight in fight.Fights_count gamed/src/gme/guild.go:1238: too many errors Utils ● go install
  • 18. Data struct struct DataWorld player : DataPlayer @diff items : DataItem[] @default:[] @diff regions : DataRegion[] @default:[] @diff dungeons : DataDungeon[] @default:[] @diff gates : DataGate[] @default:[] @diff boosters : DataBooster[] @default:[] @diff ... end struct DataPlayer @table:player @pkey:id @owner:id id : uint32 level : uint32 version : string @strmax:16 reg_time : uint32 @default:0 name : string @default:"" ... end
  • 20. Rpc struct RPC 51 SAVE_WORLD( plr_id : string @strmax:128 data : DataWorld ) error : EnumRpcError version : uint32 end
  • 22. WORLD DIFF Data: 1, 2, 3, 5, 9 Data [new]: 1, 2, 5, 9, 10 Diff: changed: 1, 5, 10 removed: 3 Diff world
  • 23. DataDiff struct struct DataWorldDiff player : DataPlayer[] items : DataItem[] regions : DataRegion[] dungeons : DataDungeon[] gates : DataGate[] ... removed_ids : DataRemovedIds[] @skip_save @skip_load end struct DataRemovedIds class_id : uint32 ids : uint32[] end
  • 24. Rpc.SaveWorldDiff RPC 52 SAVE_WORLD_DIFF( plr_id : string @strmax:128 data : DataWorldDiff ) error : EnumRpcError version : uint32 end
  • 25. $ go run -race race.go ================== WARNING: DATA RACE Read at 0x0000006191e0 by goroutine 8: main.sumA() example/race.go:99 +0x3d Previous write at 0x0000006191e0 by goroutine 7: main.sumA() example/race.go:99 +0x59 $ go run race.go sum is 3 Data race
  • 29. clients 8 save message 1 login 2 get user 3 user info 4 user info 6 subscribe room 5 enter room 7 send message 9 publish message 10 broadcast client Chat go
  • 32. Chat ● broadcast message to all users in room
  • 33. $ gox -rebuild -output=./app -osarch="darwin/amd64" … $ gox -rebuild -output=./app -osarch="linux/amd64" ... $ gox -rebuild -output=gamed -osarch="linux/amd64" ... "Stderr: go build github.com/glenn-brown/pcre: no buildable Go source files in github.com/glenn-brown/pcre" Cross compilation github.com/mitchellh/gox
  • 39. Profiling ● net pprof ● мониторинг памяти и GC ● github.com/divan/expvarmon ● go tool pprof ● gopinba
  • 41. goroutine profile: total 1044 479 # net.runtime_pollWait+0x58 runtime/netpoll.go:164 # net.(*pollDesc).wait+0x37 net/fd_poll_runtime.go:75 # net.(*pollDesc).waitRead+0x33 net/fd_poll_runtime.go:80 # net.(*netFD).Read+0x1b6 net/fd_unix.go:250 # net.(*conn).Read+0x6f net/net.go:181 # bufio.(*Reader).Read+0x311 bufio/bufio.go:213 # github.com/gorilla/websocket.(*Conn).readFull+0x90 github.com/gorilla/websocket/conn.go:546 # github.com/gorilla/websocket.(*Conn).advanceFrame+0x8e github.com/gorilla/websocket/conn.go:570 # github.com/gorilla/websocket.(*Conn).NextReader+0x56 github.com/gorilla/websocket/conn.go:705 # github.com/gorilla/websocket.(*Conn).ReadMessage+0x2e github.com/gorilla/websocket/conn.go:768 # gme.(*chatConnection).readPump+0x150 gme/chat.go:157 # gme.(*ChatHandler).ServeHTTP+0x1d6 gme/chat.go:1133 # net/http.(*ServeMux).ServeHTTP+0x12f net/http/server.go:2238 # bit.games/webserver.(*Server).ServeHTTP+0x9a bit.games/webserver/webserver.go:69 # net/http.serverHandler.ServeHTTP+0x91 net/http/server.go:2568 # net/http.(*conn).serve+0x611 net/http/server.go:1825 Profiling ● pprof -> goroutines
  • 42. ... 32 # net.runtime_pollWait+0x58 runtime/netpoll.go:164 # net.(*pollDesc).wait+0x37 net/fd_poll_runtime.go:75 # net.(*pollDesc).waitRead+0x33 net/fd_poll_runtime.go:80 # net.(*netFD).Read+0x1b6 net/fd_unix.go:250 # net.(*conn).Read+0x6f net/net.go:181 # bufio.(*Reader).fill+0x116 bufio/bufio.go:97 # bufio.(*Reader).ReadSlice+0xba bufio/bufio.go:338 # github.com/garyburd/redigo/redis.(*conn).readLine+0x48 github.com/garyburd/redigo/redis/conn.go:228 # github.com/garyburd/redigo/redis.(*conn).readReply+0x42 github.com/garyburd/redigo/redis/conn.go:301 # github.com/garyburd/redigo/redis.(*conn).Receive+0x3b github.com/garyburd/redigo/redis/conn.go:384 # github.com/garyburd/redigo/redis.PubSubConn.Receive+0x4b github.com/garyburd/redigo/redis/pubsub.go:97 # gme.(*chatRoom).redisPump+0x101 gme/chat.go:240 # gme.(*chatRoom).subscribeToRedis.func1+0x61 gme/chat.go:318 Profiling ● pprof -> goroutines
  • 45. Profiling ● go tool pprof $ go tool pprof ./app http://127.0.0.1:5555/debug/pprof/profile (pprof) top5 5055.75kB of 5763.69kB total (87.72%) Dropped 487 nodes (cum <= 28.82kB) Showing top 5 nodes out of 62 (cum >= 287.56kB) flat flat% sum% cum cum% 2747.38kB 47.67% 47.67% 2747.38kB 47.67% runtime.stringtoslicebyte 1122.73kB 19.48% 67.15% 1122.73kB 19.48% github.com/dlclark/regexp2.(*runner).initMatch 551.22kB 9.56% 76.71% 3706.88kB 64.31% gme.InitConfigs.func1 384kB 6.66% 83.37% 384kB 6.66% runtime.hashGrow 250.42kB 4.34% 87.72% 287.56kB 4.99% github.com/dlclark/regexp2/syntax.(*writer).codeFromTree (pprof)
  • 46. Profiling ● go tool pprof $ (pprof) web
  • 51. Ошибки ● data race ● distribute mutex ● отправка данных в закрытый канал ● переиспользование переменных в условных операторах ● SelectBySQL(...).Where(...) ● переиспользование Wait group
  • 52. Output: value = 50 value = 0 sum = 0 Ошибки ● переиспользование переменных в условных операторах
  • 54. gme/notification.go:97 +0xc5 panic: sync: WaitGroup is reused before previous Wait has returned Ошибки ● переиспользование Wait group