SlideShare una empresa de Scribd logo
1 de 78
Descargar para leer sin conexión
Gophers Riding Elephants:
Writing PostgreSQL Tools in Go
by AJ Bahnken,
Senior Engineer @ Procore
Who am I?
Senior Engineer @ Procore
Work on availability, performance, and (now mostly)
security
Been writing Go code actively for 2 years
Twitter:
Email: aj.bahnken@procore.com
@ajvbahnken
Who is this talk for?
Overview of Go
Go was created by Google
It was built for Google as well
Reliable
Good for teams
Good for building the kind of things they need to build
"Less is exponentially more" by Rob Pike
Go is purposefully lacking certain features.
Link: https://commandcenter.blogspot.com/2012/06/less-is-
exponentially-more.html
Statically Typed
Compiled
Garbage Collected
package main 
import "fmt" 
func main() { 
    fmt.Println("Hello, 世界") 
} 
Why Go with Postgres?
1. Performance
It's pretty fast
Garbage collector is pretty solid
Concurrency is a breeze
package main 
import ( 
  "fmt" 
  "time" 
) 
func say(s string) { 
  for i := 0; i < 5; i++ { 
    time.Sleep(100 * time.Millisecond) 
    fmt.Println(s) 
  } 
} 
func main() { 
  go say("world") 
  say("hello") // Allows for the goroutine to run, by blocking. 
}
$ go run main.go 
world 
hello 
hello 
world 
world 
hello 
hello 
world 
world 
hello 
2. Reliability
Statically Typed (yay!)
bool 
string 
int  int8  int16  int32  int64 
uint uint8 uint16 uint32 uint64 uintptr 
byte // alias for uint8 
rune // alias for int32 
     // represents a Unicode code point 
float32 float64 
complex64 complex128 
Simple
type EventProcessor struct { 
    eventQueue chan Event 
} 
func (ep *EventProcessor) Add(event Event) { 
    ep.eventQueue <­ event 
} 
func (ep *EventProcessor) Start() { 
  for { 
    event := <­ep.eventQueue 
    go event.Process() 
  } 
} 
Testing is simple and built in + race detector
$ ls 
processing.go       processing_test.go  utils.go 
$ go test 
PASS 
ok      ~/pgnetdetective/processing        0.165s 
$ go test ­­race 
PASS 
ok      ~/pgnetdetective/processing        2.133s 
Error handling instead of exceptions
func MyFunc() (string, error) { 
  str, err := run() 
  if err != nil { 
    return "", err 
  } 
  return str, nil 
} 
func MustMyFunc() string { 
  str, err := run() 
  if err != nil { 
    panic("run() returned an err: "+err.String()) 
  } 
  return str 
} 
3. Ease of Use
Tooling
(Gofmt, testing, godocs, go build/run, vim-go)
Familiarity
Library support and ease of installation
$ go get github.com/urfave/cli 
Distribute a single binary anywhere
$ go build 
$ file dbduke 
dbduke: Mach­O 64­bit executable x86_64 
$ GOOS=linux go build 
$ file dbduke 
dbduke: ELF 64­bit LSB executable, x86­64, version 1 (SYSV),  
     statically linked, not stripped 
$ GOOS=linux GOARCH=386 go build 
$ file dbduke 
dbduke: ELF 32­bit LSB executable, Intel 80386, version 1  
    (SYSV), statically linked, not stripped 
Performance
Reliability
Ease of Use
Interacting with
Postgres in Go
database/sql
Docs: https://golang.org/pkg/database/sql/
Provides core interface for interacting with SQL databases
Open / Close
Begin / Rollback / Commit
Exec / Query / QueryRow
Ping / Connection Pooling
go get github.com/lib/pq
package main 
import ( 
  "database/sql" 
  "fmt" 
  _ "github.com/lib/pq" 
) 
func main() { 
  dbUrl := "postgres://postgres@localhost:5432/postgres" 
  db, err := sql.Open("postgres", dbUrl) 
  if err != nil { 
    panic(err.String()) 
  } 
  var result int 
  err = db.QueryRow('SELECT 1').Scan(&result) 
  if err != nil { 
    panic(err.String()) 
  } 
  fmt.Printf("1 == %d", result) 
} 
http://go-database-sql.org/
Example #1
pgnetdetective
https://github.com/procore/pgnetdetective
?????
tcpdump ­n ­w ~/pg.cap ­i any port 5432 
~1GB every 10 seconds
We needed something faster,
so I decided to rewrite it in Go
https://github.com/google/gopacket
Provides packet processing
capabilities for Go
// If the destination port is 5432... 
if tcp.DstPort == 5432 { 
  // And the packet payload starts with P or Q... 
  raw = fmt.Sprintf("%s", tcp.Payload) 
  if strings.HasPrefix(raw, "P") || strings.HasPrefix(raw, "Q") { 
    // It is a Parse or Query packet, therefore it contains a Query 
    combinedQueryMetrics.Add( 
      metrics.New( 
        NormalizeQuery(raw), 
        1, 
        ip.SrcIP, 
        tcp.Seq, 
      ), 
    ) 
  } 
} else if tcp.SrcPort == 5432 && tcp.ACK { 
  responses = append(responses, &ResponsePacket{
    DstIP: ip.DstIP, 
    Ack:   tcp.Ack, 
    Size:  uint64(len(tcp.Payload)), 
  }) 
} 
So I got some output like this:
******* Query ******* 
Query: SELECT attr.attname FROM pg_attribute attr 
    INNER JOIN pg_constraint cons ON attr.attrelid = cons.conrelid 
    AND attr.attnum = any(cons.conkey) WHERE cons.contype = p 
    AND cons.conrelid = "drawing_log_imports"::regclass 
TotalNetBytes: 170 MB 
TotalResponsePackets: 64041 
TotalQueryPackets: 63 
ummm, catalog queries?
Introducing: Resque
https://github.com/resque/resque
http://resque.github.io/
~10,000 jobs per hour
1-8 tables being touched per job
average of 20 columns per table.
During spikes, this can get up to 120MB per second.
On to Sidekiq we go...
Where Go won with pgnetdetective:
Performance
Community (Ease of Use)
Example #2 dbduke
(not open source + still under active development)
Context:
1. We restore staging/qa/testing databases frequently
2. It's important that they successfully restore
Problem:
1. When restores fail, productivity dies
2. The process of kicking restores off by hand is faulty
Further Context for a Solution:
1. Restores sometimes fail from easily recoverable errors
A tool for making restores of Postgres
databases manageable and fault tolerant.
A tool for making restores of Postgres
databases manageable and fault tolerant.
Manageable
Run dbduke as a daemon with jobs
$ dbduke jobs 
­­­­­­­­­­­­ 
   DBDuke 
­­­­­­­­­­­­ 
* restore ­ 35e1ca93­936b­4c73­8812­b1a69d708791 
   database: postgres 
   dumpfile: /data/lite­dump.dmp 
   started: 17:19:59 Tue Oct 11, 2016 ­0700 
   flags: ­­no­big­tables ­­maintenance 
A tool for making restores of Postgres
databases manageable and fault tolerant.
Fault Tolerance
Treat restores as a state machine
and recover from failure states
Error handling in practice:
1. Error out
2. Log a warning
3. Retry with timeout (with or without backoff)
Error out
db, err := sql.Open("postgres", dbUrl) 
if err != nil { 
  log.Fatalf("Could not open postgres db @ `%s`", dbUrl) 
} 
Log warning
query := "DROP SCHEMA IF EXISTS _migration CASCADE" 
_, err = db.Exec(query) 
if err != nil { 
  log.Warnf("Query `%s` failed with err: %v", query, err) 
} 
Retry with timeout (without backoff)
func (r *Restorer) BlockTillNotInUse() { 
    if r.State == state.InUse { 
        log.Warn("State is currently InUse. Going into retry loop.") 
        for { 
            time.Sleep(time.Second * 15) 
            r.QuitIfTimeout() 
            currentState, err := state.GetCurrentState() 
            if err != nil { 
                log.Errorf( 
                  "Error getting current state. Err: %v", 
                  err, 
                ) 
                break 
            } 
            if currentState != state.InUse { 
                r.State = currentState 
                break 
            } 
        } 
    } 
} 
Manageability + Fault Tolerance
Go makes it easy! ™
Where Go won with dbduke:
Error Handling (Reliability)
Concurrency (Performance/Ease of Use)
In Conclusion
In the context of tool building
Go = Reliability, Performance, and Ease of
Use
Procore is hiring! (big surprise)
http://procore.com/careers
Thank you! Questions?
aj.bahnken@procore.com / @ajvbahnken
Further Resources
Tour of Go
Effective Go (required reading)
Great intoduction to using SQL within Go
Why we import drivers with '_'
Sources
Performance Graph

Más contenido relacionado

La actualidad más candente

Tulsa tech fest 2010 - web speed and scalability
Tulsa tech fest 2010  - web speed and scalabilityTulsa tech fest 2010  - web speed and scalability
Tulsa tech fest 2010 - web speed and scalability
Jason Ragsdale
 
Caching: A Guided Tour - 10/12/2010
Caching: A Guided Tour - 10/12/2010Caching: A Guided Tour - 10/12/2010
Caching: A Guided Tour - 10/12/2010
Jason Ragsdale
 
Use case for using the ElastiCache for Redis in production
Use case for using the ElastiCache for Redis in productionUse case for using the ElastiCache for Redis in production
Use case for using the ElastiCache for Redis in production
知教 本間
 
20130714 php matsuri - highly available php
20130714   php matsuri - highly available php20130714   php matsuri - highly available php
20130714 php matsuri - highly available php
Graham Weldon
 
High scale flavour
High scale flavourHigh scale flavour
High scale flavour
Tomas Doran
 
Play concurrency
Play concurrencyPlay concurrency
Play concurrency
Justin Long
 
Back tobasicswebinar part6-rev.
Back tobasicswebinar part6-rev.Back tobasicswebinar part6-rev.
Back tobasicswebinar part6-rev.
MongoDB
 

La actualidad más candente (20)

Ehcache 3 @ BruJUG
Ehcache 3 @ BruJUGEhcache 3 @ BruJUG
Ehcache 3 @ BruJUG
 
Web20expo Filesystems
Web20expo FilesystemsWeb20expo Filesystems
Web20expo Filesystems
 
Python performance profiling
Python performance profilingPython performance profiling
Python performance profiling
 
High Performance Systems in Go - GopherCon 2014
High Performance Systems in Go - GopherCon 2014High Performance Systems in Go - GopherCon 2014
High Performance Systems in Go - GopherCon 2014
 
Store Beyond Glorp
Store Beyond GlorpStore Beyond Glorp
Store Beyond Glorp
 
Flickr Php
Flickr PhpFlickr Php
Flickr Php
 
Tulsa tech fest 2010 - web speed and scalability
Tulsa tech fest 2010  - web speed and scalabilityTulsa tech fest 2010  - web speed and scalability
Tulsa tech fest 2010 - web speed and scalability
 
Caching: A Guided Tour - 10/12/2010
Caching: A Guided Tour - 10/12/2010Caching: A Guided Tour - 10/12/2010
Caching: A Guided Tour - 10/12/2010
 
Use case for using the ElastiCache for Redis in production
Use case for using the ElastiCache for Redis in productionUse case for using the ElastiCache for Redis in production
Use case for using the ElastiCache for Redis in production
 
Know thy cost (or where performance problems lurk)
Know thy cost (or where performance problems lurk)Know thy cost (or where performance problems lurk)
Know thy cost (or where performance problems lurk)
 
Drupal performance
Drupal performanceDrupal performance
Drupal performance
 
20130714 php matsuri - highly available php
20130714   php matsuri - highly available php20130714   php matsuri - highly available php
20130714 php matsuri - highly available php
 
How Shit Works: Storage
How Shit Works: StorageHow Shit Works: Storage
How Shit Works: Storage
 
High scale flavour
High scale flavourHigh scale flavour
High scale flavour
 
Scaling High Traffic Web Applications
Scaling High Traffic Web ApplicationsScaling High Traffic Web Applications
Scaling High Traffic Web Applications
 
Big Data! Great! Now What? #SymfonyCon 2014
Big Data! Great! Now What? #SymfonyCon 2014Big Data! Great! Now What? #SymfonyCon 2014
Big Data! Great! Now What? #SymfonyCon 2014
 
Memcached
MemcachedMemcached
Memcached
 
Play concurrency
Play concurrencyPlay concurrency
Play concurrency
 
Back tobasicswebinar part6-rev.
Back tobasicswebinar part6-rev.Back tobasicswebinar part6-rev.
Back tobasicswebinar part6-rev.
 
Rebooting design in RavenDB
Rebooting design in RavenDBRebooting design in RavenDB
Rebooting design in RavenDB
 

Destacado

Destacado (20)

PostgreSQL Hooks for Fun and Profit
PostgreSQL Hooks for Fun and ProfitPostgreSQL Hooks for Fun and Profit
PostgreSQL Hooks for Fun and Profit
 
PostgreSQL + ZFS best practices
PostgreSQL + ZFS best practicesPostgreSQL + ZFS best practices
PostgreSQL + ZFS best practices
 
Tracxn Research - Insurance Tech Landscape, February 2017
Tracxn Research - Insurance Tech Landscape, February 2017Tracxn Research - Insurance Tech Landscape, February 2017
Tracxn Research - Insurance Tech Landscape, February 2017
 
Introduction to Big Data
Introduction to Big DataIntroduction to Big Data
Introduction to Big Data
 
Tracxn Research - Healthcare Analytics Landscape, February 2017
Tracxn Research - Healthcare Analytics Landscape, February 2017Tracxn Research - Healthcare Analytics Landscape, February 2017
Tracxn Research - Healthcare Analytics Landscape, February 2017
 
Lessons & Use-Cases at Scale - Dr. Pete Stanski
Lessons & Use-Cases at Scale - Dr. Pete StanskiLessons & Use-Cases at Scale - Dr. Pete Stanski
Lessons & Use-Cases at Scale - Dr. Pete Stanski
 
Enabling the Real Time Analytical Enterprise
Enabling the Real Time Analytical EnterpriseEnabling the Real Time Analytical Enterprise
Enabling the Real Time Analytical Enterprise
 
Introduction to Cloud Computing with Amazon Web Services
Introduction to Cloud Computing with Amazon Web ServicesIntroduction to Cloud Computing with Amazon Web Services
Introduction to Cloud Computing with Amazon Web Services
 
Webinar: 10-Step Guide to Creating a Single View of your Business
Webinar: 10-Step Guide to Creating a Single View of your BusinessWebinar: 10-Step Guide to Creating a Single View of your Business
Webinar: 10-Step Guide to Creating a Single View of your Business
 
Introduction to Amazon DynamoDB
Introduction to Amazon DynamoDBIntroduction to Amazon DynamoDB
Introduction to Amazon DynamoDB
 
Getting Started with Amazon Redshift
Getting Started with Amazon RedshiftGetting Started with Amazon Redshift
Getting Started with Amazon Redshift
 
2015 Internet Trends Report
2015 Internet Trends Report2015 Internet Trends Report
2015 Internet Trends Report
 
Open Machine Data Analysis Stack with Docker, CrateDB, and Grafana @Chadev+Lunch
Open Machine Data Analysis Stack with Docker, CrateDB, and Grafana @Chadev+LunchOpen Machine Data Analysis Stack with Docker, CrateDB, and Grafana @Chadev+Lunch
Open Machine Data Analysis Stack with Docker, CrateDB, and Grafana @Chadev+Lunch
 
K8S in prod
K8S in prodK8S in prod
K8S in prod
 
Google Cloud Spanner Preview
Google Cloud Spanner PreviewGoogle Cloud Spanner Preview
Google Cloud Spanner Preview
 
PostgreSQL High Availability in a Containerized World
PostgreSQL High Availability in a Containerized WorldPostgreSQL High Availability in a Containerized World
PostgreSQL High Availability in a Containerized World
 
System Architecture of Cloud-based Web GIS for Real-Time Macroeconomic Loss E...
System Architecture of Cloud-based Web GIS for Real-Time Macroeconomic Loss E...System Architecture of Cloud-based Web GIS for Real-Time Macroeconomic Loss E...
System Architecture of Cloud-based Web GIS for Real-Time Macroeconomic Loss E...
 
GIAF UK Winter 2015 - Analytical techniques: A practical guide to answering b...
GIAF UK Winter 2015 - Analytical techniques: A practical guide to answering b...GIAF UK Winter 2015 - Analytical techniques: A practical guide to answering b...
GIAF UK Winter 2015 - Analytical techniques: A practical guide to answering b...
 
PostgreSQL WAL for DBAs
PostgreSQL WAL for DBAs PostgreSQL WAL for DBAs
PostgreSQL WAL for DBAs
 
Web engineering notes unit 3
Web engineering notes unit 3Web engineering notes unit 3
Web engineering notes unit 3
 

Similar a Gophers Riding Elephants: Writing PostgreSQL tools in Go

Similar a Gophers Riding Elephants: Writing PostgreSQL tools in Go (20)

Pilot Tech Talk #10 — Practical automation by Kamil Cholewiński
Pilot Tech Talk #10 — Practical automation by Kamil CholewińskiPilot Tech Talk #10 — Practical automation by Kamil Cholewiński
Pilot Tech Talk #10 — Practical automation by Kamil Cholewiński
 
Golang @ Tokopedia
Golang @ TokopediaGolang @ Tokopedia
Golang @ Tokopedia
 
PAC 2019 virtual Christoph NEUMÜLLER
PAC 2019 virtual Christoph NEUMÜLLERPAC 2019 virtual Christoph NEUMÜLLER
PAC 2019 virtual Christoph NEUMÜLLER
 
PuppetConf 2016: Multi-Tenant Puppet at Scale – John Jawed, eBay, Inc.
PuppetConf 2016: Multi-Tenant Puppet at Scale – John Jawed, eBay, Inc.PuppetConf 2016: Multi-Tenant Puppet at Scale – John Jawed, eBay, Inc.
PuppetConf 2016: Multi-Tenant Puppet at Scale – John Jawed, eBay, Inc.
 
OSDC 2016 - Continous Integration in Data Centers - Further 3 Years later by ...
OSDC 2016 - Continous Integration in Data Centers - Further 3 Years later by ...OSDC 2016 - Continous Integration in Data Centers - Further 3 Years later by ...
OSDC 2016 - Continous Integration in Data Centers - Further 3 Years later by ...
 
High Performance Drupal
High Performance DrupalHigh Performance Drupal
High Performance Drupal
 
Demystifying the Go Scheduler
Demystifying the Go SchedulerDemystifying the Go Scheduler
Demystifying the Go Scheduler
 
Static Code Analysis PHP[tek] 2023
Static Code Analysis PHP[tek] 2023Static Code Analysis PHP[tek] 2023
Static Code Analysis PHP[tek] 2023
 
Be a better developer with Docker (revision 3)
Be a better developer with Docker (revision 3)Be a better developer with Docker (revision 3)
Be a better developer with Docker (revision 3)
 
Continuous Delivery for Python Developers – PyCon Otto
Continuous Delivery for Python Developers – PyCon OttoContinuous Delivery for Python Developers – PyCon Otto
Continuous Delivery for Python Developers – PyCon Otto
 
Bio bigdata
Bio bigdata Bio bigdata
Bio bigdata
 
Meetup - retour sur la DrupalCon Dublin 2016
Meetup - retour sur la DrupalCon Dublin 2016Meetup - retour sur la DrupalCon Dublin 2016
Meetup - retour sur la DrupalCon Dublin 2016
 
node.js 실무 - node js in practice by Jesang Yoon
node.js 실무 - node js in practice by Jesang Yoonnode.js 실무 - node js in practice by Jesang Yoon
node.js 실무 - node js in practice by Jesang Yoon
 
Performant Django - Ara Anjargolian
Performant Django - Ara AnjargolianPerformant Django - Ara Anjargolian
Performant Django - Ara Anjargolian
 
Django dev-env-my-way
Django dev-env-my-wayDjango dev-env-my-way
Django dev-env-my-way
 
Reproducibility in artificial intelligence
Reproducibility in artificial intelligenceReproducibility in artificial intelligence
Reproducibility in artificial intelligence
 
PyParis 2017 / Writing a C Python extension in 2017, Jean-Baptiste Aviat
PyParis 2017 / Writing a C Python extension in 2017, Jean-Baptiste Aviat PyParis 2017 / Writing a C Python extension in 2017, Jean-Baptiste Aviat
PyParis 2017 / Writing a C Python extension in 2017, Jean-Baptiste Aviat
 
Api Versioning with Docker and Nginx
Api Versioning with Docker and NginxApi Versioning with Docker and Nginx
Api Versioning with Docker and Nginx
 
Nagios Conference 2012 - Nathan Vonnahme - Writing Custom Nagios Plugins in Perl
Nagios Conference 2012 - Nathan Vonnahme - Writing Custom Nagios Plugins in PerlNagios Conference 2012 - Nathan Vonnahme - Writing Custom Nagios Plugins in Perl
Nagios Conference 2012 - Nathan Vonnahme - Writing Custom Nagios Plugins in Perl
 
Go at Skroutz
Go at SkroutzGo at Skroutz
Go at Skroutz
 

Último

Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Safe Software
 
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Victor Rentea
 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Victor Rentea
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
?#DUbAI#??##{{(☎️+971_581248768%)**%*]'#abortion pills for sale in dubai@
 

Último (20)

ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challenges
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdfRising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
 
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
 
Vector Search -An Introduction in Oracle Database 23ai.pptx
Vector Search -An Introduction in Oracle Database 23ai.pptxVector Search -An Introduction in Oracle Database 23ai.pptx
Vector Search -An Introduction in Oracle Database 23ai.pptx
 
[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf
 
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
 
Six Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal OntologySix Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal Ontology
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : Uncertainty
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor Presentation
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 

Gophers Riding Elephants: Writing PostgreSQL tools in Go