SlideShare une entreprise Scribd logo
1  sur  213
Télécharger pour lire hors ligne
F#in
 the
Real
 World
Hi, my name is Yan Cui.
agenda
Domain Modelling!
Infrastructure!
Game Logic!
Algorithms!
DSLs
1MILLION USERS
ACTIVE
DAILY
250MILLION DAY
PER
REQUEST
2MONTH
TB
P E R
sec
ops
25,000
we are polyglot
C#
why F#?
time to market
correctness
efficient
tame complexity
Collectables
Wager Size
Special Symbol
Avg Wager Size
Web Server call
• Line Win!
– X number of matching symbols on adjacent columns!
– Positions have to be a ‘line’!
– Wild symbols substitute for other symbols!
!
• Scatter Win!
– X number of matching symbols anywhere!
– Triggers bonus game
What symbols should land?!
Any special symbol wins?!
Did the player win anything?
What the player’s new
average wager?
Should the player receive
collectables?
type Symbol = Standard! of string!
! ! ! | Wild
type Symbol = Standard! of string!
! ! ! | Wild
e.g.! Standard “hat”!
! Standard “shoe”!
! Standard “bonus”!
! …
type Symbol = Standard! of string!
! ! ! | Wild
i.e.! Wild
!
!
!
type Win = LineWin of int * Symbol * int!
! | ScatterWin of Symbol * int
!
!
!
type Win = LineWin of int * Symbol * int!
! | ScatterWin of Symbol * int
e.g.! LineWin (5, Standard “shoe”, 4)
!
!
!
type Win = LineWin of int * Symbol * int!
! | ScatterWin of Symbol * int
e.g.! ScatterWin (Standard “bonus”, 3)
type LineNum = int!
type Count! = int!
!
type Win = LineWin of LineNum * Symbol * Count!
! | ScatterWin of Symbol * Count
closed hierarchy
no Nulls
make invalid states
unrepresentable
[Measure]!
type Pence
e.g.! 42Pence!
! 153Pence!
! …
10Meter / 2Second ! = 5Meter/Second!
10Meter * 2Second ! = 20Meter Second !
10Meter + 10Meter ! = 20Meter!
10Meter * 10! ! ! = 100Meter!
10Meter * 10Meter ! = 100Meter2!
10Meter + 2Second ! // error!
10Meter + 2 ! ! ! // error
10Meter / 2Second ! = 5Meter/Second!
10Meter * 2Second ! = 20Meter Second !
10Meter + 10Meter ! = 20Meter!
10Meter * 10! ! ! = 100Meter!
10Meter * 10Meter ! = 100Meter2!
10Meter + 2Second ! // error!
10Meter + 2 ! ! ! // error
type Wager = int64Pence!
type Multiplier = int!
!
type Payout = Coins! of Wager!
! ! | MultipliedCoins of Multiplier * Wager!
! ! | Multi! of Payout list!
! ! | BonusGame
type Wager = int64Pence!
type Multiplier = int!
!
type Payout = Coins! of Wager!
! ! | MultipliedCoins of Multiplier * Wager!
! ! | Multi! of Payout list!
! ! | BonusGame
type Wager = int64Pence!
type Multiplier = int!
!
type Payout = Coins! of Wager!
! ! | MultipliedCoins of Multiplier * Wager!
! ! | Multi! of Payout list!
! ! | BonusGame
type State = !
{!
AvgWager! : Wager!
SpecialSymbol : Symbol!
Collectables : MapCollectable, Count!
}
immutable by default
Recap
lightweight syntax
for types 
hierarchies
great for domain
modelling
make invalid states
unrepresentable
better correctness
order of magnitude
increase in productivity
player states are big
Stateless Server DatabaseClient
1:1 read-write ratio
ServerClient
Session 1
Session 2
ServerClient Database
Elastic Load Balancer
S3
Auto scaling Group
Server A Server B
...
EC2
CloudFront
Stateful Server
The Actor Model
An actor is the fundamental unit of computation
which embodies the 3 things!
• Processing!
• Storage!
• Communication!
that are essential to computation.!
!
-Carl Hewitt*
* http://bit.ly/HoNHbG
The Actor Model
• Everything is an actor!
• An actor has a mailbox!
• When an actor receives a message it can:!
– Create new actors!
– Send messages to actors!
– Designate how to handle the next message
Stateful Server
• Gatekeeper!
– Manages the local list of active workers!
– Spawns new workers!
!
• Worker!
– Manages the states for a player!
– Optimistic locking!
– Persist state after period of inactivity
Stateful Server
Game Server
Player A
Player B
S3
Worker C
Worker B
Gatekeeper
RequestHandlers
Asynchronous
Stateful Server
Game Server
Worker C
Worker B
Gatekeeper
Worker A
ok
RequestHandlers
Player A
Player B
Asynchronous
S3
Stateful Server
Game Server
S3
Worker C
Worker B
Gatekeeper
Worker A
RequestHandlers
Player A
Player B
Asynchronous
Stateful Server
Game Server
S3
Worker C
Gatekeeper
Worker A
RequestHandlers
Player A
Player B
Asynchronous
Stateful Server
Game Server
Worker C
Worker A
Gatekeeper
error
RequestHandlers
Player A
Player B
S3
Asynchronous
type Agent‘T = MailboxProcessor‘T!
!
!
!
type Agent‘T = MailboxProcessor‘T!
!
type Message = !
| Get of AsyncReplyChannel…!
| Put of State * Version * AsyncReplyChannel…
type Agent‘T = MailboxProcessor‘T!
!
type Message = !
| Get of AsyncReplyChannel…!
| Put of State * Version * AsyncReplyChannel…
type Result‘T =!
| Success! of ’T!
| Failure! of Exception!
!
!
!
type Result‘T =!
| Success! of ’T!
| Failure! of Exception!
!
type GetResult = ResultState * Version!
type PutResult = Resultunit!
type Agent‘T = MailboxProcessor‘T!
!
type Message = !
| Get of AsyncReplyChannelGetResult!
| Put of State * Version * AsyncReplyChannelPutResult
type Agent‘T = MailboxProcessor‘T!
!
type Message = !
| Get of AsyncReplyChannelGetResult!
| Put of State * Version * AsyncReplyChannelPutResult
type Worker (playerId) =!
let agent = AgentMessage.Start(fun inbox -!
let state = getCurrentState playerId!
!
let rec workingState (state, version) = !
async { … }!
and closedState () =!
async { … }!
!
workingState (state, 1))
type Worker (playerId) =!
let agent = AgentMessage.Start(fun inbox -!
let state = getCurrentState playerId!
!
let rec workingState (state, version) = !
async { … }!
and closedState () =!
async { … }!
!
workingState (state, 1))
type Worker (playerId) =!
let agent = AgentMessage.Start(fun inbox -!
let state = getCurrentState playerId!
!
let rec workingState (state, version) = !
async { … }!
and closedState () =!
async { … }!
!
workingState (state, 1))
type Worker (playerId) =!
let agent = AgentMessage.Start(fun inbox -!
let state = getCurrentState playerId!
!
let rec workingState (state, version) = !
async { … }!
and closedState () =!
async { … }!
!
workingState (state, 1))
type Worker (playerId) =!
let agent = AgentMessage.Start(fun inbox -!
let state = getCurrentState playerId!
!
let rec workingState (state, version) = !
async { … }!
and closedState () =!
async { … }!
!
workingState (state, 1))
let rec workingState (state, version) = !
async { !
let! msg = inbox.TryReceive(60000)!
match msg with!
| None - !
do! persist state!
return! closedState()!
…!
}!
let rec workingState (state, version) = !
async { !
let! msg = inbox.TryReceive(60000)!
match msg with!
| None - !
do! persist state!
return! closedState()!
…!
}!
let rec workingState (state, version) = !
async { !
let! msg = inbox.TryReceive(60000)!
match msg with!
| None - !
do! persist state!
return! closedState()!
…!
}!
non-blocking I/O
let rec workingState (state, version) = !
async { !
let! msg = inbox.TryReceive(60000)!
match msg with!
| None - !
do! persist state!
return! closedState()!
…!
}!
let rec workingState (state, version) = !
async { !
let! msg = inbox.TryReceive(60000)!
match msg with!
| None - !
do! persist state!
return! closedState()!
…!
}!
let rec workingState (state, version) = !
async { !
let! msg = inbox.TryReceive(60000)!
match msg with!
…!
| Some(Get(reply)) -!
reply.Reply | Success(state, version)!
return! workingState(state, version)!
…!
}!
let rec workingState (state, version) = !
async { !
let! msg = inbox.TryReceive(60000)!
match msg with!
…!
| Some(Put(newState, v, reply)) when version = v -!
reply.Reply | Success()!
return! workingState(newState, version+1)!
…!
}
let rec workingState (state, version) = !
async { !
let! msg = inbox.TryReceive(60000)!
match msg with!
…!
| Some(Put(_, v, reply)) -!
reply.Reply | Failure(VersionMismatch(version, v))!
return! workingState(state, version)!
}
let rec workingState (state, version) = !
async { !
let! msg = inbox.TryReceive(60000)!
match msg with!
| None ! ! ! ! ! ! - …!
| Some(Get(reply)) ! ! ! ! - …!
| Some(Put(newState, v, reply)) when version = v - …!
| Some(Put(_, v, reply)) ! ! ! - …!
}
and closedState () = !
async { !
let! msg = inbox.Receive()!
match msg with!
| Get(reply) -!
reply.Reply | Failure(WorkerStopped)!
return! closedState()!
| Put(_, _, reply) -!
reply.Reply | Failure(WorkerStopped)!
return! closedState()!
}
and closedState () = !
async { !
let! msg = inbox.Receive()!
match msg with!
| Get(reply) -!
reply.Reply | Failure(WorkerStopped)!
return! closedState()!
| Put(_, _, reply) -!
reply.Reply | Failure(WorkerStopped)!
return! closedState()!
}
5x efficient
improvement
60% latency drop
no databases
90% cost saving
Recap
Agents!
• no locks!
• async message passing!
!
Agents!
• no locks!
• async message passing!
• self-contained!
• easy to reason with
Cricket
akka.Net
Orleans
Async Workflow!
• non-blocking I/O!
• no callbacks
Pattern Matching!
• clear  concise
Caught a Gnome
EXP Item Gold
Quest Progress
Caught a Gnome
Level Up
Quest Progress
EXP Item Gold
Caught a Gnome
Quest Complete
Level Up
Quest Progress
EXP Item Gold
Caught a Gnome
New Quest
Quest Complete
Quest Progress
EXP Item Gold
Caught a Gnome
Quest Complete
New Quest
Level Up
Quest Progress
New Quest
Achievement
Progress
EXP Item Gold
Quest Complete
Level Up
Caught a Gnome
Level Up
Quest Progress
EXP Item Gold
Caught a Gnome
Quest Complete
New Quest
Achievement
Progress
Achievement
Complete
Level Up
Quest Progress
EXP Item Gold
Caught a Gnome
Quest Complete
New Quest
Achievement
Progress
Achievement
Complete
100+ actions
triggered by different
abstraction layers
non-functional
requirements
message-broker
pattern
Caught Gnome Trapping
Queue
Levelling
Quests
Achievements
Analytics
Partner
Reporting
Caught Gnome Trapping
Queue
Levelling
Quests
Achievements
Analytics
Partner
Reporting
Ignore
Process
Process
Process
Process
Ignore
Caught Gnome Trapping
Queue
Levelling
Quests
Achievements
Analytics
Partner
Reporting
EXP
Item
Gold
Caught Gnome Trapping
Queue
Levelling
Quests
Achievements
Analytics
Partner
Reporting
EXP
Item
Gold
Caught Gnome Trapping
Queue
Levelling
Quests
Achievements
Analytics
Partner
Reporting
EXP
Item
Gold
Process
Ignore
Ignore
Ignore
Process
Ignore
Caught Gnome Trapping
Queue
Levelling
Quests
Achievements
Analytics
Partner
Reporting
EXP
Item
Gold
Level Up
Caught Gnome Trapping
Queue
Levelling
Quests
Achievements
Analytics
Partner
Reporting
EXP
Item
Gold
Level Up
need lots of facts
type Fact =!
| GotExp! ! of Exp!
| GotGold! ! of Gold!
| GotItem! ! of Item * Count!
| CaughtMonster! of Monster * Bait * Location!
| LevelUp! ! of OldLevel * NewLevel!
…
type Reward =!
| GotExp! ! of Exp!
| GotGold! ! of Gold!
| GotItem! ! of Item * Count!
!
type StateChange =!
| LevelUp! ! of OldLevel * NewLevel!
…
type Fact =!
| StateChange! of StateChange!
| Reward! ! of Reward!
| Trapping! ! of Trapping!
| Fishing! ! of Fishing!
…
let process fact =!
match fact with!
| StateChange(stateChange)! - …!
| Reward(reward)! ! ! - …!
| Trapping(trapping)! ! - …!
…
C# interop
…!
var fact = Fact.NewStateChange(!
! StateChange.NewLevelUp(oldLvl, newLvl));!
…
type IFact = interface end!
!
type Reward =!
| GotExp! ! of Exp!
| GotGold! ! of Gold!
| GotItem! ! of Item * Count!
interface IFact
type IFact = interface end!
!
type Reward =!
| GotExp! ! of Exp!
| GotGold! ! of Gold!
| GotItem! ! of Item * Count!
interface IFact
let process (fact : IFact) =!
match fact with!
| :? StateChange ! as stateChange!- …!
| :? Reward ! ! as reward! ! - …!
| :? Trapping! ! as trapping! - …!
…!
| _ - raise | NotSupportedFact fact
let process (fact : IFact) =!
match fact with!
| :? StateChange ! as stateChange!- …!
| :? Reward ! ! as reward! ! - …!
| :? Trapping! ! as trapping! - …!
…!
| _ - raise | NotSupportedFact fact
simple
flexible
saver
location bait
attraction rate
catch rate
auto-tuning
trapping stats
Monster
strength
speed
intelligence
Trap
strength
speed
technology
Monster
strength
speed
intelligence
Trap
strength
speed
technology
Catch Rate %
trial-and-error
“…if you require constant diligence you’re
setting everyone up for failure and hurt”
genetic algorithms
F#-powered DSLs.!
Awesome!
wanna find
correlations?
wanna find
correlations?
you can DIY it! !
;-)
why was
payment service
slow last night?
Pain Driven Development
Amazon!
! .CloudWatch!
! .Selector
github.com/fsprojects/Amazon.CloudWatch.Selector
Find metrics whose 5
min average exceeded
1 second during last
12 hours
cloudWatch.Select(
unitIs “milliseconds” +
average () 1000.0
@ last 12 hours
| intervalOf 5 minutes)
cloudWatch.Select(“
unitIs ‘milliseconds’ and
average  1000.0
duringLast 12 hours
at intervalOf 5 minutes”)
did any cache
nodes’ CPU spike
yesterday?
cloudWatch.Select(
namespaceLike “elasticache” +
nameLike “cpu” +
max () 80.0
@ last 24 hours
| intervalOf 15 minutes)
cloudWatch.Select(
namespaceLike “elasticache” +
nameLike “cpu” +
max () 80.0
@ last 24 hours
| intervalOf 15 minutes)
regex support
Amazing
F#
=
Recap
managed!
key-value store
redundancy!
9-9s guarantee
great performance
name your
throughput
DynamoDB.SQL
github.com/fsprojects/DynamoDb.SQL
GOAL
Disguise
complexity
GOAL
SELECT UserId, TopScore
FROM GameScore
WHERE GameTitle CONTAINS “Zelda”
ORDER DESC!
LIMIT !! 3
WITH (NoConsistentRead)
Query
AST
Execution
F#  FParsec*
*www.quanttec.com/fparsec
External DSL
via
SELECT * FROM GameScore
Abstract Syntax Tree (AST)
FParsec
select GameTitle, UserId, TopScore
from GameScores
where GameTitle = “Starship X”
and TopScore = 1000
order desc
limit 3
with (NoConsistentRead, Index(GameTitleIndex, true))
S3 Provider
github.com/fsprojects/S3Provider
F# type provider for Amazon S3
compile time validation
no code generation
Domain Modelling!
Infrastructure!
Game Logic!
Algorithms!
DSLs
Domain Modelling!
Infrastructure!
Game Logic!
Algorithms!
DSLs
why F#?
time to market
correctness
efficient

Contenu connexe

Tendances

Desarrollando aplicaciones web en minutos
Desarrollando aplicaciones web en minutosDesarrollando aplicaciones web en minutos
Desarrollando aplicaciones web en minutosEdgar Suarez
 
Ruby - Uma Introdução
Ruby - Uma IntroduçãoRuby - Uma Introdução
Ruby - Uma IntroduçãoÍgor Bonadio
 
Taking Perl to Eleven with Higher-Order Functions
Taking Perl to Eleven with Higher-Order FunctionsTaking Perl to Eleven with Higher-Order Functions
Taking Perl to Eleven with Higher-Order FunctionsDavid Golden
 
Rubyconf Bangladesh 2017 - Lets start coding in Ruby
Rubyconf Bangladesh 2017 - Lets start coding in RubyRubyconf Bangladesh 2017 - Lets start coding in Ruby
Rubyconf Bangladesh 2017 - Lets start coding in RubyRuby Bangladesh
 
Ruby is Awesome
Ruby is AwesomeRuby is Awesome
Ruby is AwesomeAstrails
 
Big Design Conference: CSS3
Big Design Conference: CSS3 Big Design Conference: CSS3
Big Design Conference: CSS3 Wynn Netherland
 

Tendances (6)

Desarrollando aplicaciones web en minutos
Desarrollando aplicaciones web en minutosDesarrollando aplicaciones web en minutos
Desarrollando aplicaciones web en minutos
 
Ruby - Uma Introdução
Ruby - Uma IntroduçãoRuby - Uma Introdução
Ruby - Uma Introdução
 
Taking Perl to Eleven with Higher-Order Functions
Taking Perl to Eleven with Higher-Order FunctionsTaking Perl to Eleven with Higher-Order Functions
Taking Perl to Eleven with Higher-Order Functions
 
Rubyconf Bangladesh 2017 - Lets start coding in Ruby
Rubyconf Bangladesh 2017 - Lets start coding in RubyRubyconf Bangladesh 2017 - Lets start coding in Ruby
Rubyconf Bangladesh 2017 - Lets start coding in Ruby
 
Ruby is Awesome
Ruby is AwesomeRuby is Awesome
Ruby is Awesome
 
Big Design Conference: CSS3
Big Design Conference: CSS3 Big Design Conference: CSS3
Big Design Conference: CSS3
 

En vedette

Tour of language landscape (code.talks)
Tour of language landscape (code.talks)Tour of language landscape (code.talks)
Tour of language landscape (code.talks)Yan Cui
 
Functional GUIs with F#
Functional GUIs with F#Functional GUIs with F#
Functional GUIs with F#Frank Krueger
 
Intuit QuickBooks Future of Small Business Report
Intuit QuickBooks Future of Small Business ReportIntuit QuickBooks Future of Small Business Report
Intuit QuickBooks Future of Small Business ReportIntuit Inc.
 
Gluecon Monitoring Microservices and Containers: A Challenge
Gluecon Monitoring Microservices and Containers: A ChallengeGluecon Monitoring Microservices and Containers: A Challenge
Gluecon Monitoring Microservices and Containers: A ChallengeAdrian Cockcroft
 
Domain Driven Design with the F# type System -- F#unctional Londoners 2014
Domain Driven Design with the F# type System -- F#unctional Londoners 2014Domain Driven Design with the F# type System -- F#unctional Londoners 2014
Domain Driven Design with the F# type System -- F#unctional Londoners 2014Scott Wlaschin
 
Mmac power point4-17-15 - copy
Mmac power point4-17-15 - copyMmac power point4-17-15 - copy
Mmac power point4-17-15 - copymmacusa2015
 
Gerusalemme terrena-educaz.crist
Gerusalemme terrena-educaz.cristGerusalemme terrena-educaz.crist
Gerusalemme terrena-educaz.cristUmberto Rosi
 
key to improving core competitive capacity 4 enterprise
key to improving core competitive capacity 4 enterprisekey to improving core competitive capacity 4 enterprise
key to improving core competitive capacity 4 enterpriseTrung Ngoc
 
Building A Social Network Waa 1 17 07 V2 Draft
Building A Social Network   Waa   1 17 07 V2 DraftBuilding A Social Network   Waa   1 17 07 V2 Draft
Building A Social Network Waa 1 17 07 V2 DraftMarshall Sponder
 
2006增刊目录
2006增刊目录2006增刊目录
2006增刊目录guest2bb2c
 
Sap Solman Instguide Dba Cockpit Setup
Sap Solman Instguide Dba Cockpit SetupSap Solman Instguide Dba Cockpit Setup
Sap Solman Instguide Dba Cockpit Setupwlacaze
 
Resumes: Remove the Irrelevant
Resumes: Remove the IrrelevantResumes: Remove the Irrelevant
Resumes: Remove the IrrelevantSteve Rogers
 
Sharing Global Voices Report
Sharing Global Voices ReportSharing Global Voices Report
Sharing Global Voices ReportUNV Philippines
 
Examples of successful simulation in the development cycly of Kolektor Etra
Examples of successful simulation in the development cycly of Kolektor EtraExamples of successful simulation in the development cycly of Kolektor Etra
Examples of successful simulation in the development cycly of Kolektor EtraSIMTEC Software and Services
 
Misawa Post Office Holiday Schedule
Misawa Post Office Holiday ScheduleMisawa Post Office Holiday Schedule
Misawa Post Office Holiday ScheduleNAF Misawa
 
8 habits of highly effective language learners
8 habits of highly effective language learners8 habits of highly effective language learners
8 habits of highly effective language learnersPhilip Seifi
 

En vedette (20)

Tour of language landscape (code.talks)
Tour of language landscape (code.talks)Tour of language landscape (code.talks)
Tour of language landscape (code.talks)
 
Functional GUIs with F#
Functional GUIs with F#Functional GUIs with F#
Functional GUIs with F#
 
Intuit QuickBooks Future of Small Business Report
Intuit QuickBooks Future of Small Business ReportIntuit QuickBooks Future of Small Business Report
Intuit QuickBooks Future of Small Business Report
 
Gluecon Monitoring Microservices and Containers: A Challenge
Gluecon Monitoring Microservices and Containers: A ChallengeGluecon Monitoring Microservices and Containers: A Challenge
Gluecon Monitoring Microservices and Containers: A Challenge
 
Domain Driven Design with the F# type System -- F#unctional Londoners 2014
Domain Driven Design with the F# type System -- F#unctional Londoners 2014Domain Driven Design with the F# type System -- F#unctional Londoners 2014
Domain Driven Design with the F# type System -- F#unctional Londoners 2014
 
Mmac power point4-17-15 - copy
Mmac power point4-17-15 - copyMmac power point4-17-15 - copy
Mmac power point4-17-15 - copy
 
Gerusalemme terrena-educaz.crist
Gerusalemme terrena-educaz.cristGerusalemme terrena-educaz.crist
Gerusalemme terrena-educaz.crist
 
Dapan
DapanDapan
Dapan
 
key to improving core competitive capacity 4 enterprise
key to improving core competitive capacity 4 enterprisekey to improving core competitive capacity 4 enterprise
key to improving core competitive capacity 4 enterprise
 
Building A Social Network Waa 1 17 07 V2 Draft
Building A Social Network   Waa   1 17 07 V2 DraftBuilding A Social Network   Waa   1 17 07 V2 Draft
Building A Social Network Waa 1 17 07 V2 Draft
 
2006增刊目录
2006增刊目录2006增刊目录
2006增刊目录
 
INGLES A1
INGLES A1INGLES A1
INGLES A1
 
Sap Solman Instguide Dba Cockpit Setup
Sap Solman Instguide Dba Cockpit SetupSap Solman Instguide Dba Cockpit Setup
Sap Solman Instguide Dba Cockpit Setup
 
Resumes: Remove the Irrelevant
Resumes: Remove the IrrelevantResumes: Remove the Irrelevant
Resumes: Remove the Irrelevant
 
Sharing Global Voices Report
Sharing Global Voices ReportSharing Global Voices Report
Sharing Global Voices Report
 
Megapolis i
Megapolis i Megapolis i
Megapolis i
 
Examples of successful simulation in the development cycly of Kolektor Etra
Examples of successful simulation in the development cycly of Kolektor EtraExamples of successful simulation in the development cycly of Kolektor Etra
Examples of successful simulation in the development cycly of Kolektor Etra
 
Misawa Post Office Holiday Schedule
Misawa Post Office Holiday ScheduleMisawa Post Office Holiday Schedule
Misawa Post Office Holiday Schedule
 
dgdgdgdgd
dgdgdgdgddgdgdgdgd
dgdgdgdgd
 
8 habits of highly effective language learners
8 habits of highly effective language learners8 habits of highly effective language learners
8 habits of highly effective language learners
 

Similaire à F# in the Real World (DDD EA)

F# in social gaming by Yan Cui at Codemotion Dubai
F# in social gaming by Yan Cui at Codemotion DubaiF# in social gaming by Yan Cui at Codemotion Dubai
F# in social gaming by Yan Cui at Codemotion DubaiCodemotion Dubai
 
F# in the real world (NDC)
F# in the real world (NDC)F# in the real world (NDC)
F# in the real world (NDC)Yan Cui
 
Playing with State Monad
Playing with State MonadPlaying with State Monad
Playing with State MonadDavid Galichet
 
DDDing Tools = Akka Persistence
DDDing Tools = Akka PersistenceDDDing Tools = Akka Persistence
DDDing Tools = Akka PersistenceKonrad Malawski
 
Akka persistence == event sourcing in 30 minutes
Akka persistence == event sourcing in 30 minutesAkka persistence == event sourcing in 30 minutes
Akka persistence == event sourcing in 30 minutesKonrad Malawski
 
ScotRuby - Dark side of ruby
ScotRuby - Dark side of rubyScotRuby - Dark side of ruby
ScotRuby - Dark side of rubyGautam Rege
 
Casting for not so strange actors
Casting for not so strange actorsCasting for not so strange actors
Casting for not so strange actorszucaritask
 
λ | Lenses
λ | Lensesλ | Lenses
λ | LensesOpen-IT
 
Turn Hours into Seconds - Concurrent event processing in Elixir using Flow
Turn Hours into Seconds - Concurrent event processing in Elixir using FlowTurn Hours into Seconds - Concurrent event processing in Elixir using Flow
Turn Hours into Seconds - Concurrent event processing in Elixir using FlowEmil Soman
 
RubyConf Portugal 2014 - Why ruby must go!
RubyConf Portugal 2014 - Why ruby must go!RubyConf Portugal 2014 - Why ruby must go!
RubyConf Portugal 2014 - Why ruby must go!Gautam Rege
 
ACI-Webinar-3-MinMaxAlphaBetaPruning-TicTacToe.pptx
ACI-Webinar-3-MinMaxAlphaBetaPruning-TicTacToe.pptxACI-Webinar-3-MinMaxAlphaBetaPruning-TicTacToe.pptx
ACI-Webinar-3-MinMaxAlphaBetaPruning-TicTacToe.pptxssuser1eba67
 
replacing `import` with `accio`
replacing `import` with `accio`replacing `import` with `accio`
replacing `import` with `accio`Amy Hanlon
 
Why TypeScript?
Why TypeScript?Why TypeScript?
Why TypeScript?FITC
 
Distributed Consensus A.K.A. "What do we eat for lunch?"
Distributed Consensus A.K.A. "What do we eat for lunch?"Distributed Consensus A.K.A. "What do we eat for lunch?"
Distributed Consensus A.K.A. "What do we eat for lunch?"Konrad Malawski
 
Investigating Python Wats
Investigating Python WatsInvestigating Python Wats
Investigating Python WatsAmy Hanlon
 
RedDot Ruby Conf 2014 - Dark side of ruby
RedDot Ruby Conf 2014 - Dark side of ruby RedDot Ruby Conf 2014 - Dark side of ruby
RedDot Ruby Conf 2014 - Dark side of ruby Gautam Rege
 
ViewController/State
ViewController/StateViewController/State
ViewController/Stategillygize
 
NUS iOS Swift Talk
NUS iOS Swift TalkNUS iOS Swift Talk
NUS iOS Swift TalkGabriel Lim
 

Similaire à F# in the Real World (DDD EA) (20)

F# in social gaming by Yan Cui at Codemotion Dubai
F# in social gaming by Yan Cui at Codemotion DubaiF# in social gaming by Yan Cui at Codemotion Dubai
F# in social gaming by Yan Cui at Codemotion Dubai
 
F# in the real world (NDC)
F# in the real world (NDC)F# in the real world (NDC)
F# in the real world (NDC)
 
Playing with State Monad
Playing with State MonadPlaying with State Monad
Playing with State Monad
 
DDDing Tools = Akka Persistence
DDDing Tools = Akka PersistenceDDDing Tools = Akka Persistence
DDDing Tools = Akka Persistence
 
Akka persistence == event sourcing in 30 minutes
Akka persistence == event sourcing in 30 minutesAkka persistence == event sourcing in 30 minutes
Akka persistence == event sourcing in 30 minutes
 
ScotRuby - Dark side of ruby
ScotRuby - Dark side of rubyScotRuby - Dark side of ruby
ScotRuby - Dark side of ruby
 
Casting for not so strange actors
Casting for not so strange actorsCasting for not so strange actors
Casting for not so strange actors
 
λ | Lenses
λ | Lensesλ | Lenses
λ | Lenses
 
Turn Hours into Seconds - Concurrent event processing in Elixir using Flow
Turn Hours into Seconds - Concurrent event processing in Elixir using FlowTurn Hours into Seconds - Concurrent event processing in Elixir using Flow
Turn Hours into Seconds - Concurrent event processing in Elixir using Flow
 
Combinator parsing
Combinator parsingCombinator parsing
Combinator parsing
 
RubyConf Portugal 2014 - Why ruby must go!
RubyConf Portugal 2014 - Why ruby must go!RubyConf Portugal 2014 - Why ruby must go!
RubyConf Portugal 2014 - Why ruby must go!
 
ACI-Webinar-3-MinMaxAlphaBetaPruning-TicTacToe.pptx
ACI-Webinar-3-MinMaxAlphaBetaPruning-TicTacToe.pptxACI-Webinar-3-MinMaxAlphaBetaPruning-TicTacToe.pptx
ACI-Webinar-3-MinMaxAlphaBetaPruning-TicTacToe.pptx
 
replacing `import` with `accio`
replacing `import` with `accio`replacing `import` with `accio`
replacing `import` with `accio`
 
Why TypeScript?
Why TypeScript?Why TypeScript?
Why TypeScript?
 
Distributed Consensus A.K.A. "What do we eat for lunch?"
Distributed Consensus A.K.A. "What do we eat for lunch?"Distributed Consensus A.K.A. "What do we eat for lunch?"
Distributed Consensus A.K.A. "What do we eat for lunch?"
 
Investigating Python Wats
Investigating Python WatsInvestigating Python Wats
Investigating Python Wats
 
Cassandra 2.2 & 3.0
Cassandra 2.2 & 3.0Cassandra 2.2 & 3.0
Cassandra 2.2 & 3.0
 
RedDot Ruby Conf 2014 - Dark side of ruby
RedDot Ruby Conf 2014 - Dark side of ruby RedDot Ruby Conf 2014 - Dark side of ruby
RedDot Ruby Conf 2014 - Dark side of ruby
 
ViewController/State
ViewController/StateViewController/State
ViewController/State
 
NUS iOS Swift Talk
NUS iOS Swift TalkNUS iOS Swift Talk
NUS iOS Swift Talk
 

Plus de Yan Cui

How to win the game of trade-offs
How to win the game of trade-offsHow to win the game of trade-offs
How to win the game of trade-offsYan Cui
 
How to choose the right messaging service
How to choose the right messaging serviceHow to choose the right messaging service
How to choose the right messaging serviceYan Cui
 
How to choose the right messaging service for your workload
How to choose the right messaging service for your workloadHow to choose the right messaging service for your workload
How to choose the right messaging service for your workloadYan Cui
 
Patterns and practices for building resilient serverless applications.pdf
Patterns and practices for building resilient serverless applications.pdfPatterns and practices for building resilient serverless applications.pdf
Patterns and practices for building resilient serverless applications.pdfYan Cui
 
Lambda and DynamoDB best practices
Lambda and DynamoDB best practicesLambda and DynamoDB best practices
Lambda and DynamoDB best practicesYan Cui
 
Lessons from running AppSync in prod
Lessons from running AppSync in prodLessons from running AppSync in prod
Lessons from running AppSync in prodYan Cui
 
Serverless observability - a hero's perspective
Serverless observability - a hero's perspectiveServerless observability - a hero's perspective
Serverless observability - a hero's perspectiveYan Cui
 
How to ship customer value faster with step functions
How to ship customer value faster with step functionsHow to ship customer value faster with step functions
How to ship customer value faster with step functionsYan Cui
 
How serverless changes the cost paradigm
How serverless changes the cost paradigmHow serverless changes the cost paradigm
How serverless changes the cost paradigmYan Cui
 
Why your next serverless project should use AWS AppSync
Why your next serverless project should use AWS AppSyncWhy your next serverless project should use AWS AppSync
Why your next serverless project should use AWS AppSyncYan Cui
 
Build social network in 4 weeks
Build social network in 4 weeksBuild social network in 4 weeks
Build social network in 4 weeksYan Cui
 
Patterns and practices for building resilient serverless applications
Patterns and practices for building resilient serverless applicationsPatterns and practices for building resilient serverless applications
Patterns and practices for building resilient serverless applicationsYan Cui
 
How to bring chaos engineering to serverless
How to bring chaos engineering to serverlessHow to bring chaos engineering to serverless
How to bring chaos engineering to serverlessYan Cui
 
Migrating existing monolith to serverless in 8 steps
Migrating existing monolith to serverless in 8 stepsMigrating existing monolith to serverless in 8 steps
Migrating existing monolith to serverless in 8 stepsYan Cui
 
Building a social network in under 4 weeks with Serverless and GraphQL
Building a social network in under 4 weeks with Serverless and GraphQLBuilding a social network in under 4 weeks with Serverless and GraphQL
Building a social network in under 4 weeks with Serverless and GraphQLYan Cui
 
FinDev as a business advantage in the post covid19 economy
FinDev as a business advantage in the post covid19 economyFinDev as a business advantage in the post covid19 economy
FinDev as a business advantage in the post covid19 economyYan Cui
 
How to improve lambda cold starts
How to improve lambda cold startsHow to improve lambda cold starts
How to improve lambda cold startsYan Cui
 
What can you do with lambda in 2020
What can you do with lambda in 2020What can you do with lambda in 2020
What can you do with lambda in 2020Yan Cui
 
A chaos experiment a day, keeping the outage away
A chaos experiment a day, keeping the outage awayA chaos experiment a day, keeping the outage away
A chaos experiment a day, keeping the outage awayYan Cui
 
How to debug slow lambda response times
How to debug slow lambda response timesHow to debug slow lambda response times
How to debug slow lambda response timesYan Cui
 

Plus de Yan Cui (20)

How to win the game of trade-offs
How to win the game of trade-offsHow to win the game of trade-offs
How to win the game of trade-offs
 
How to choose the right messaging service
How to choose the right messaging serviceHow to choose the right messaging service
How to choose the right messaging service
 
How to choose the right messaging service for your workload
How to choose the right messaging service for your workloadHow to choose the right messaging service for your workload
How to choose the right messaging service for your workload
 
Patterns and practices for building resilient serverless applications.pdf
Patterns and practices for building resilient serverless applications.pdfPatterns and practices for building resilient serverless applications.pdf
Patterns and practices for building resilient serverless applications.pdf
 
Lambda and DynamoDB best practices
Lambda and DynamoDB best practicesLambda and DynamoDB best practices
Lambda and DynamoDB best practices
 
Lessons from running AppSync in prod
Lessons from running AppSync in prodLessons from running AppSync in prod
Lessons from running AppSync in prod
 
Serverless observability - a hero's perspective
Serverless observability - a hero's perspectiveServerless observability - a hero's perspective
Serverless observability - a hero's perspective
 
How to ship customer value faster with step functions
How to ship customer value faster with step functionsHow to ship customer value faster with step functions
How to ship customer value faster with step functions
 
How serverless changes the cost paradigm
How serverless changes the cost paradigmHow serverless changes the cost paradigm
How serverless changes the cost paradigm
 
Why your next serverless project should use AWS AppSync
Why your next serverless project should use AWS AppSyncWhy your next serverless project should use AWS AppSync
Why your next serverless project should use AWS AppSync
 
Build social network in 4 weeks
Build social network in 4 weeksBuild social network in 4 weeks
Build social network in 4 weeks
 
Patterns and practices for building resilient serverless applications
Patterns and practices for building resilient serverless applicationsPatterns and practices for building resilient serverless applications
Patterns and practices for building resilient serverless applications
 
How to bring chaos engineering to serverless
How to bring chaos engineering to serverlessHow to bring chaos engineering to serverless
How to bring chaos engineering to serverless
 
Migrating existing monolith to serverless in 8 steps
Migrating existing monolith to serverless in 8 stepsMigrating existing monolith to serverless in 8 steps
Migrating existing monolith to serverless in 8 steps
 
Building a social network in under 4 weeks with Serverless and GraphQL
Building a social network in under 4 weeks with Serverless and GraphQLBuilding a social network in under 4 weeks with Serverless and GraphQL
Building a social network in under 4 weeks with Serverless and GraphQL
 
FinDev as a business advantage in the post covid19 economy
FinDev as a business advantage in the post covid19 economyFinDev as a business advantage in the post covid19 economy
FinDev as a business advantage in the post covid19 economy
 
How to improve lambda cold starts
How to improve lambda cold startsHow to improve lambda cold starts
How to improve lambda cold starts
 
What can you do with lambda in 2020
What can you do with lambda in 2020What can you do with lambda in 2020
What can you do with lambda in 2020
 
A chaos experiment a day, keeping the outage away
A chaos experiment a day, keeping the outage awayA chaos experiment a day, keeping the outage away
A chaos experiment a day, keeping the outage away
 
How to debug slow lambda response times
How to debug slow lambda response timesHow to debug slow lambda response times
How to debug slow lambda response times
 

Dernier

08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking MenDelhi Call girls
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)Gabriella Davis
 
Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Paola De la Torre
 
Pigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions
 
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 WorkerThousandEyes
 
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking MenDelhi Call girls
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonetsnaman860154
 
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024BookNet Canada
 
Enhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for PartnersEnhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for PartnersThousandEyes
 
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 AutomationSafe Software
 
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024BookNet Canada
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesSinan KOZAK
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slidespraypatel2
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreternaman860154
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxKatpro Technologies
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking MenDelhi Call girls
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationRidwan Fadjar
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptxHampshireHUG
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsMaria Levchenko
 

Dernier (20)

08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101
 
Pigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping Elbows
 
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
 
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
 
Enhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for PartnersEnhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for Partners
 
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
 
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen Frames
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slides
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreter
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 Presentation
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 

F# in the Real World (DDD EA)