SlideShare a Scribd company logo
1 of 124
Types Working
For You
Richard Dallaway, @d6y
underscore.io
InfoQ.com: News & Community Site
• 750,000 unique visitors/month
• Published in 4 languages (English, Chinese, Japanese and Brazilian
Portuguese)
• Post content from our QCon conferences
• News 15-20 / week
• Articles 3-4 / week
• Presentations (videos) 12-15 / week
• Interviews 2-3 / week
• Books 1 / month
Watch the video with slide
synchronization on InfoQ.com!
http://www.infoq.com/presentations
/scala-patterns-types
Purpose of QCon
- to empower software development by facilitating the spread of
knowledge and innovation
Strategy
- practitioner-driven conference designed for YOU: influencers of
change and innovation in your teams
- speakers and topics driving the evolution and innovation
- connecting and catalyzing the influencers and innovators
Highlights
- attended by more than 12,000 delegates since 2007
- held in 9 cities worldwide
Presented at QCon London
www.qconlondon.com
Modern type system
with lots of power
Two Themes
Straightforward Scala
Types Working for Us
Progression
Part 1 Straightforward Scala
Part 2 Functional Programming
Part 3 Typelevel Programming
Straightforward Scala
— Part 1 —
The only problem was we had no idea what the code
was doing at first.
We came across a strange symbol we hadn’t seen in
our projects before
The spaceship operator <|*|>
Someone said out loud “what the hell is that?”
http://jimplush.com/talk/
The only problem was we had no idea what the code
was doing at first.
We came across a strange symbol we hadn’t seen in
our projects before
The spaceship operator <|*|>
Someone said out loud “what the hell is that?”
http://jimplush.com/talk/
The only problem was we had no idea what the code
was doing at first.
We came across a strange symbol we hadn’t seen in
our projects before
The spaceship operator <|*|>
Someone said out loud “what the hell is that?”
http://jimplush.com/talk/
The only problem was we had no idea what the code
was doing at first.
We came across a strange symbol we hadn’t seen in
our projects before
The spaceship operator <|*|>
Someone said out loud “what the hell is that?”
http://jimplush.com/talk/
“It’s about having a maintainable
code base where you can have 

people cross projects easily and
get new hires up to speed rapidly”
Power!
Protect the team from it
and
Get the benefit of it
What can we do?
1. Expressions, types, & values
2. Objects and classes
3. Algebraic data types
4. Structural recursion
5. Sequencing computation
6. Type classes
1. Expressions, types, & values
2. Objects and classes
3. Algebraic data types
4. Structural recursion
5. Sequencing computation
6. Type classes
Algebraic data types
Structural recursion
Algebraic data types
data into code
Structural recursion
transformation
Model data with logical
ors and logical ands
A website visitor is:
• anonymous; or
• logged in
A logged in user has:
• an ID; and
• facts we know about
them
Two Patterns
and (product types)
or (sum types)
Sum and product together
make algebraic data types
Structure of the code
follows the structure of
the data
A website visitor is:
• anonymous; or
• logged in
sealed trait Visitor
case class Anonymous()

extends Visitor
case class User()

extends Visitor
A logged in user has:
• an ID; and
• facts we know about
them

An anonymous has:
• an ID
sealed trait Visitor
case class Anonymous()

extends Visitor
case class User()

extends Visitor
sealed trait Visitor
case class Anonymous(id: Id)

extends Visitor
case class User(id: Id, facts: Set[Fact])

extends Visitor
Structural recursion
def serveAd(v: Visitor): Advert = ???
Structure of the code
follows the structure of
the data
def serveAd(v: Visitor): Advert = ???
def serveAd(v: Visitor): Advert =
v match {
case User(_, info) => relevantAd(info)
case Anonymous(id) => adRotation(id)
}
def serveAd(v: Visitor): Advert =
v match {
case User(_, info) => relevantAd(info)
case Anonymous(id) => adRotation(id)
}
def serveAd(v: Visitor): Advert =
v match {
case User(_, info) => relevantAd(info)
case Anonymous(id) => adRotation(id)
}
Structure
ADT & Structural Recursion
Straightforward part of Scala.
Clear, productive, occurs frequently.
Be opinionated in what you use.
Structure helps us.
Help from FP Ideas
— Part 2 —
Combining lists
Concatenating strings
Union of sets
Combining things in a loop
Chaining logical operations
Adding numbers
Building up a JavaScript expression
Showing errors in a UI
...
A combine function and
an empty value
Addition
Empty Combine
0 +
Set
Empty Combine
Set.empty union
For any T
Empty Combine
A zero for T
A way to
combine two Ts
and give me
back a T
A combine function and
an empty value
Monoid
A combine function and
an empty value
…and laws
The boss asks…
What’s the total visits to the web site?
def report(vs: List[Int]): Int = ???
For any T
Empty Combine
A zero for T
A way to
combine two Ts
and give me
back a T
For any T
trait Monoid[T] {
def empty: T
def combine(x: T, y: T): T
}
val addition = new Monoid[Int] {
def empty = 0
def combine(x: Int, y: Int) = x+y
}
fold
def fold(vs: List[Int]): Int =
vs match {
case Nil => 0
case v :: rest => v + fold(rest)
}
fold(List(1,2,3))

// 6
fold(1,2,3)
1 + fold(2,3)
2 + fold(3)
3 + fold()
0
0 + 3 + 2 + 1 = 6
fold(1,2,3)
1 + fold(2,3)
2 + fold(3)
3 + fold()
0
0 + 3 + 2 + 1 = 6
fold(1,2,3)
1 + fold(2,3)
2 + fold(3)
3 + fold()
0
0 + 3 + 2 + 1 = 6
fold(1,2,3)
1 + fold(2,3)
2 + fold(3)
3 + fold()
0
0 + 3 + 2 + 1 = 6
fold(1,2,3)
1 + fold(2,3)
2 + fold(3)
3 + fold()
0
0 + 3 + 2 + 1 = 6
fold(1,2,3)
1 + fold(2,3)
2 + fold(3)
3 + fold()
0
0 + 3 + 2 + 1 = 6
def fold(vs: List[Int]): Int =
vs match {
case Nil => 0
case v :: rest => v + fold(rest)
}
fold(List(1,2,3))

// 6
def fold(vs: List[Int], m: Monoid[Int]): Int =
vs match {
case Nil => 0
case v :: rest => v + fold(rest)
}
fold(List(1,2,3), addition)

// 6
def fold(vs: List[Int], m: Monoid[Int]): Int =
vs match {
case Nil => m.empty
case v :: rest => m.combine(v, fold(rest,m))
}
fold(List(1,2,3), addition)

// 6
def fold[T](vs: List[T], m: Monoid[T]): T =
vs match {
case Nil => m.empty
case v :: rest => m.combine(v, fold(rest,m))
}
fold(List(1,2,3), addition)

// 6
Split on cases,
inspect values you have
def fold[T](vs: List[T], m: Monoid[T]): T =
vs match {
case Nil => ???
case v :: rest => ???
}
fold(List(1,2,3), addition)

// 6
def fold[T](vs: List[T], m: Monoid[T]): T =
vs match {
case Nil => m.empty
case v :: rest => ???
}
fold(List(1,2,3), addition)

// 6
But back to Monoids…
The boss asks…
What’s the total visits to the web site?
def report(vs: List[Int]): Int =
fold(vs, addition)
Benefits
Composition
Flexibility
Problem Solving
The boss asks…
How many distinct visitors?
def report(vs: List[Visitor]): Int = ???
Set
Empty Combine
Set.empty union
The boss says…
Argh! 

The servers are OutOfMemory
HyperLogLog
Empty Combine
new HLL() HLL.plus
Armon Dadgar (Papers We Love, 2015)

“Bloom Filters and HyperLogLog”
The boss asks…
Who are the really keen 

visitors to the site?
Count-Min Sketch
Empty Combine
new CMS() CMS.plus
Laura Bledaite (Scala eXchange 2015) 

“Count-Min Sketch in Real Data Applications”
We can safely run 

a parallel version 

of fold
Laws
a + 0 = a
(a + b) + c = a + (b + c)
Identity & Associativity
a combine empty = a
(a combine b) combine c 

= a combine (b combine c)
a combine b
combine combine
c d e f
Errors: 10 Warnings: 0
Its a monoid
I know this
…so we fold
Summary
Types and laws give us flexibility &
help lead us to solutions.
They help us every day.
A Taste of Typelevel
— Part 3 —
Date Metric
Mon Low
Tue High
csv(
List(“Date”, “Metric”),
List(
List(“Mon”, “Low”),
List(“Tue”, “High”) )
)
Date
Mon Low
Tue High
csv(
List(“Date”),
List(
List(“Mon”, “Low”),
List(“Tue”, “High”) )
)
How can we prevent that error
happening again?
def csv(
hdrs: List[String],
rows: List[List[String]]
): String = ???
def csv[N <: Nat](
hdrs: List[String],
rows: List[List[String]]
): String = ???
import shapeless._
import syntax.sized._
def csv[N <: Nat](
hdrs: Sized[List[String], N],
rows: List[Sized[List[String], N]]
): String = ???
import shapeless._
import syntax.sized._
csv(
Sized(“Date”),
List(
Sized(“Mon”, “Low”),
Sized(“Tue”, “High”) )
)
csv(
Sized(“Date”),
List(
Sized(“Mon”, “Low”),
Sized(“Tue”, “High”) )
)
Sized[List, 1]
Sized[List, 2]
How?
Sized(“Date”) constructs
Sized[Nat]
Nat implements numbers as
types
sealed trait Nat
trait Succ[P <: Nat] extends Nat
trait Zero extends Nat
Zero 0
Succ[Zero] 1
Succ[Succ[Zero]] 2
Succ[Succ[Succ[Zero]]] 3
sealed trait Nat
trait Succ[P <: Nat] extends Nat
trait Zero extends Nat
sealed trait Nat
trait Succ[P <: Nat] extends Nat
trait Zero extends Nat
type One = Succ[Zero]
type Two = Succ[One]
implicitly[Succ[Zero] =:= One]
implicitly[Succ[One] =:= Succ[Succ[Zero]]]
sealed trait Nat
trait Succ[P <: Nat] extends Nat
trait Zero extends Nat
type One = Succ[Zero]
type Two = Succ[One]
implicitly[Succ[Zero] =:= One]
implicitly[Succ[One] =:= Succ[Succ[Zero]]]
sealed trait Nat
trait Succ[P <: Nat] extends Nat
trait Zero extends Nat
type One = Succ[Zero]
type Two = Succ[One]
implicitly[Succ[Zero] =:= One]
implicitly[Succ[One] =:= Succ[Succ[Zero]]]
sealed trait Nat
trait Succ[P <: Nat] extends Nat
trait Zero extends Nat
type One = Succ[Zero]
type Two = Succ[One]
implicitly[Succ[Zero] =:= Two]
error:
Cannot prove that Succ[Zero] =:= Two.
Merging Fields
case class User(

id : Long,

name : String,

email : Option[String])
val user = User(

123L, 

“Bruce Wayne”,

Some(“bruce@example.org”))
PATCH /user/123
{

“name” : “Batman”

}
case class User(

id : Long,

name : String,

email : Option[String])
case class Update(

name : Option[String],

email : Option[Option[String]])
val user = User(

123L, 

“Bruce Wayne”,

Some(“bruce@example.org”))
val update = Update( 

Some(“Batman”), 

None)
How do we get to…
User(

123L, 

“Batman”, 

Some(“bruce@example.org”))
Bulletin
https://github.com/davegurnell/bulletin
How?
User String Option[String] …
Option[String]
Option[

Option[String]
]
…Update
How?
User String Option[String] …
Option[String]
Option[

Option[String]
]
…Update
Head
How?
User String Option[String] …
Option[String]
Option[

Option[String]
]
…Update
Head The Rest…
How?
Type constraints
Implicit methods
HLists
Labelled generic
Macros
…
val user = User(

123L, 

"Bruce Wayne”,

Some(“bruce@example.org”))
val update = Update( 

Some(“Batman”), 

None)
import bulletin._
val updated = user.merge(update)
// User(

// 123L, 

// “Batman”, 

// Some(“bruce@example.org”))
val user = User(

123L, 

"Bruce Wayne”,

Some(“bruce@example.org”))
val update = Update( 

Some(“Batman”), 

None)
import bulletin._
val updated = user.merge(update)
// User(

// 123L, 

// “Batman”, 

// Some(“bruce@example.org”))
Summary
The compiler can help (maybe more than
you thought).
Reduce boilerplate code.
Using Power Tools
Can go one of two ways…
Using Power Tools
Can go one of two ways…
What the hell
is that?
It’s a monoid!

I know this
Simple
Types
Power
Share
2008
‘The name Scala stands for
“scalable language.”



The language is so named
because it was designed
to grow with the demands of its
users.’
What have we seen?
Some straightforward parts of Scala

—Clear, maintainable, helpful
Encoding ideas in types

—flexibility, leads us to solutions



Let the compiler do it 

—when it make sense for your demands
Summary
Scala scaling with your needs

—be opinionated in what you use, more when needed
Types working for us, not stopping us

—functional programming, share what you learn
Thanks!
Richard Dallaway, @d6y
underscore.io
Thanks!
Richard Dallaway, @d6y
underscore.io
Amanda Laucher
Wesley Reisz
Noel Welsh
Dave Gurnell
Miles Sabin
Jono Ferguson
Julio Capote
Alessandro Zoffoli
Watch the video with slide synchronization on
InfoQ.com!
http://www.infoq.com/presentations/scala-
patterns-types

More Related Content

What's hot

What's hot (8)

Table Retrieval and Generation
Table Retrieval and GenerationTable Retrieval and Generation
Table Retrieval and Generation
 
mm-ADT: A Multi-Model Abstract Data Type
mm-ADT: A Multi-Model Abstract Data Typemm-ADT: A Multi-Model Abstract Data Type
mm-ADT: A Multi-Model Abstract Data Type
 
Introduction to r
Introduction to rIntroduction to r
Introduction to r
 
Scala vs java 8
Scala vs java 8Scala vs java 8
Scala vs java 8
 
Polyglot persistence for Java developers - moving out of the relational comfo...
Polyglot persistence for Java developers - moving out of the relational comfo...Polyglot persistence for Java developers - moving out of the relational comfo...
Polyglot persistence for Java developers - moving out of the relational comfo...
 
The Ring programming language version 1.6 book - Part 182 of 189
The Ring programming language version 1.6 book - Part 182 of 189The Ring programming language version 1.6 book - Part 182 of 189
The Ring programming language version 1.6 book - Part 182 of 189
 
Types and Immutability: why you should care
Types and Immutability: why you should careTypes and Immutability: why you should care
Types and Immutability: why you should care
 
Json demo
Json demoJson demo
Json demo
 

Similar to Types Working for You, Not Against You

Breaking down data silos with the open data protocol
Breaking down data silos with the open data protocolBreaking down data silos with the open data protocol
Breaking down data silos with the open data protocol
Woodruff Solutions LLC
 
Patterns of Enterprise Application Architecture (by example)
Patterns of Enterprise Application Architecture (by example)Patterns of Enterprise Application Architecture (by example)
Patterns of Enterprise Application Architecture (by example)
Paulo Gandra de Sousa
 
What's next in Julia
What's next in JuliaWhat's next in Julia
What's next in Julia
Jiahao Chen
 

Similar to Types Working for You, Not Against You (20)

Adopting F# at SBTech
Adopting F# at SBTechAdopting F# at SBTech
Adopting F# at SBTech
 
Lambdas: Myths and Mistakes
Lambdas: Myths and MistakesLambdas: Myths and Mistakes
Lambdas: Myths and Mistakes
 
F sharp - an overview
F sharp - an overviewF sharp - an overview
F sharp - an overview
 
Breaking down data silos with the open data protocol
Breaking down data silos with the open data protocolBreaking down data silos with the open data protocol
Breaking down data silos with the open data protocol
 
Deep Anomaly Detection from Research to Production Leveraging Spark and Tens...
 Deep Anomaly Detection from Research to Production Leveraging Spark and Tens... Deep Anomaly Detection from Research to Production Leveraging Spark and Tens...
Deep Anomaly Detection from Research to Production Leveraging Spark and Tens...
 
Performing Data Science with HBase
Performing Data Science with HBasePerforming Data Science with HBase
Performing Data Science with HBase
 
Extreme Swift
Extreme SwiftExtreme Swift
Extreme Swift
 
Linq in C# 3.0: An Overview
Linq in C# 3.0: An OverviewLinq in C# 3.0: An Overview
Linq in C# 3.0: An Overview
 
PoEAA by Example
PoEAA by ExamplePoEAA by Example
PoEAA by Example
 
Patterns of Enterprise Application Architecture (by example)
Patterns of Enterprise Application Architecture (by example)Patterns of Enterprise Application Architecture (by example)
Patterns of Enterprise Application Architecture (by example)
 
.NET Fest 2018. Антон Молдован. One year of using F# in production at SBTech
.NET Fest 2018. Антон Молдован. One year of using F# in production at SBTech.NET Fest 2018. Антон Молдован. One year of using F# in production at SBTech
.NET Fest 2018. Антон Молдован. One year of using F# in production at SBTech
 
What's next in Julia
What's next in JuliaWhat's next in Julia
What's next in Julia
 
Software Architecture: Principles, Patterns and Practices
Software Architecture: Principles, Patterns and PracticesSoftware Architecture: Principles, Patterns and Practices
Software Architecture: Principles, Patterns and Practices
 
PyData Paris 2015 - Track 1.2 Gilles Louppe
PyData Paris 2015 - Track 1.2 Gilles LouppePyData Paris 2015 - Track 1.2 Gilles Louppe
PyData Paris 2015 - Track 1.2 Gilles Louppe
 
Tutorial semantic wikis and applications
Tutorial   semantic wikis and applicationsTutorial   semantic wikis and applications
Tutorial semantic wikis and applications
 
A Map of the PyData Stack
A Map of the PyData StackA Map of the PyData Stack
A Map of the PyData Stack
 
R and Data Science
R and Data ScienceR and Data Science
R and Data Science
 
Introduction to R Short course Fall 2016
Introduction to R Short course Fall 2016Introduction to R Short course Fall 2016
Introduction to R Short course Fall 2016
 
Fast REST APIs Development with MongoDB
Fast REST APIs Development with MongoDBFast REST APIs Development with MongoDB
Fast REST APIs Development with MongoDB
 
Scala 3 Is Coming: Martin Odersky Shares What To Know
Scala 3 Is Coming: Martin Odersky Shares What To KnowScala 3 Is Coming: Martin Odersky Shares What To Know
Scala 3 Is Coming: Martin Odersky Shares What To Know
 

More from C4Media

More from C4Media (20)

Streaming a Million Likes/Second: Real-Time Interactions on Live Video
Streaming a Million Likes/Second: Real-Time Interactions on Live VideoStreaming a Million Likes/Second: Real-Time Interactions on Live Video
Streaming a Million Likes/Second: Real-Time Interactions on Live Video
 
Next Generation Client APIs in Envoy Mobile
Next Generation Client APIs in Envoy MobileNext Generation Client APIs in Envoy Mobile
Next Generation Client APIs in Envoy Mobile
 
Software Teams and Teamwork Trends Report Q1 2020
Software Teams and Teamwork Trends Report Q1 2020Software Teams and Teamwork Trends Report Q1 2020
Software Teams and Teamwork Trends Report Q1 2020
 
Understand the Trade-offs Using Compilers for Java Applications
Understand the Trade-offs Using Compilers for Java ApplicationsUnderstand the Trade-offs Using Compilers for Java Applications
Understand the Trade-offs Using Compilers for Java Applications
 
Kafka Needs No Keeper
Kafka Needs No KeeperKafka Needs No Keeper
Kafka Needs No Keeper
 
High Performing Teams Act Like Owners
High Performing Teams Act Like OwnersHigh Performing Teams Act Like Owners
High Performing Teams Act Like Owners
 
Does Java Need Inline Types? What Project Valhalla Can Bring to Java
Does Java Need Inline Types? What Project Valhalla Can Bring to JavaDoes Java Need Inline Types? What Project Valhalla Can Bring to Java
Does Java Need Inline Types? What Project Valhalla Can Bring to Java
 
Service Meshes- The Ultimate Guide
Service Meshes- The Ultimate GuideService Meshes- The Ultimate Guide
Service Meshes- The Ultimate Guide
 
Shifting Left with Cloud Native CI/CD
Shifting Left with Cloud Native CI/CDShifting Left with Cloud Native CI/CD
Shifting Left with Cloud Native CI/CD
 
CI/CD for Machine Learning
CI/CD for Machine LearningCI/CD for Machine Learning
CI/CD for Machine Learning
 
Fault Tolerance at Speed
Fault Tolerance at SpeedFault Tolerance at Speed
Fault Tolerance at Speed
 
Architectures That Scale Deep - Regaining Control in Deep Systems
Architectures That Scale Deep - Regaining Control in Deep SystemsArchitectures That Scale Deep - Regaining Control in Deep Systems
Architectures That Scale Deep - Regaining Control in Deep Systems
 
ML in the Browser: Interactive Experiences with Tensorflow.js
ML in the Browser: Interactive Experiences with Tensorflow.jsML in the Browser: Interactive Experiences with Tensorflow.js
ML in the Browser: Interactive Experiences with Tensorflow.js
 
Build Your Own WebAssembly Compiler
Build Your Own WebAssembly CompilerBuild Your Own WebAssembly Compiler
Build Your Own WebAssembly Compiler
 
User & Device Identity for Microservices @ Netflix Scale
User & Device Identity for Microservices @ Netflix ScaleUser & Device Identity for Microservices @ Netflix Scale
User & Device Identity for Microservices @ Netflix Scale
 
Scaling Patterns for Netflix's Edge
Scaling Patterns for Netflix's EdgeScaling Patterns for Netflix's Edge
Scaling Patterns for Netflix's Edge
 
Make Your Electron App Feel at Home Everywhere
Make Your Electron App Feel at Home EverywhereMake Your Electron App Feel at Home Everywhere
Make Your Electron App Feel at Home Everywhere
 
The Talk You've Been Await-ing For
The Talk You've Been Await-ing ForThe Talk You've Been Await-ing For
The Talk You've Been Await-ing For
 
Future of Data Engineering
Future of Data EngineeringFuture of Data Engineering
Future of Data Engineering
 
Automated Testing for Terraform, Docker, Packer, Kubernetes, and More
Automated Testing for Terraform, Docker, Packer, Kubernetes, and MoreAutomated Testing for Terraform, Docker, Packer, Kubernetes, and More
Automated Testing for Terraform, Docker, Packer, Kubernetes, and More
 

Recently uploaded

Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
panagenda
 

Recently uploaded (20)

TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdf
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
 
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live StreamsTop 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
 
Top 10 Most Downloaded Games on Play Store in 2024
Top 10 Most Downloaded Games on Play Store in 2024Top 10 Most Downloaded Games on Play Store in 2024
Top 10 Most Downloaded Games on Play Store in 2024
 
HTML Injection Attacks: Impact and Mitigation Strategies
HTML Injection Attacks: Impact and Mitigation StrategiesHTML Injection Attacks: Impact and Mitigation Strategies
HTML Injection Attacks: Impact and Mitigation Strategies
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
Manulife - Insurer Innovation Award 2024
Manulife - Insurer Innovation Award 2024Manulife - Insurer Innovation Award 2024
Manulife - Insurer Innovation Award 2024
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
 

Types Working for You, Not Against You