SlideShare a Scribd company logo
1 of 156
Download to read offline
A Slice of
Scala
August 2013

Kevin O’Neill
CTO PlayUp
@kevinoneill

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
A little History

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Engage & Entertain
Around Live Sport

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Mobile Games

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
SMS Based

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Number of Runs

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Complex

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Carrier Integration

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Smart Phone Revolution

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Move from a Content
Creator to a Content
Enabler
Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Top 10 in Engagement

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Over 3 Million Likes

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
30% - 40% Active

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Manually Curated

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
We Know there's
an Opportunity

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
October 2011

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Technologist at Large

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Version 2

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Rebuild Based on
Hypermedia*

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Same Feature Set

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Different Skin

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
iOS

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Android

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Ruby

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Version 3

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Platform Extensions

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Tiles

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Third Party

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Ticketing

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Ruby

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
PHP

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Version 4

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Engagement Too Deep

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Streams

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Graph Storage

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Story

User
Region

Story
follows

about

about
about

follows

Team
Team

Story

Region
competes in

League

competes in

plays in

Team
follows

competes in

follows

about
about
about

Contest

League

User
Story
Story

follows

competes in

plays in

about

Story
Story

Team
about

Kevin O’Neill - CTO PlayUp - @kevinoneill

Story

Story

about

Melbourne Scala User Group - August 2013
Value is in the
Connections

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Ruby

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
50 Seconds

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Cypher Processing
too much Data

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Java plugin

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
5 Seconds

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
10 Times too Long*

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Aiming Around 200ms

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Time to Change

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
If you hear a voice
within you say 'you
cannot paint,' then by
all means paint, and
that voice will be
silenced.
– Vincent Van Gogh
Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Scala

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Just Couldn't Face
Java

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Some Experience with it
on a Large Project

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
The Stack

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Scala 2.10.x

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
akka 2.1.x*

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Spray M8+

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Play 2.1.x*

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Other Bits

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Neo4j 1.9.x

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Scalaz 7.0.x

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Blueprints 2.4.x

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Scala Test 2.0.x

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Scala Check 1.10.x

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
SBT 1.12.x*

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Systems

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Two akka Services*

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Graph Service

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Sports Connect

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Fanbase Connect*

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
One Spray Server

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Hypermedia API

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
One Play Application*

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
HTML Front End

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Admin Front End*

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
JSON Generation

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Problem : How do you
isolate environment

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Lambda: The Ultimate
Dependency Injection
Framework

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Did my Head in

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
So what if …

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Environment Readers
type	
  Settings	
  =	
  Set[EnvironmentSetting[_]]	
  
!

type	
  EnvironmentReader[+A]	
  =	
  scalaz.Reader[Settings,	
  A]	
  
	
  	
  
object	
  EnvironmentReader	
  {
	
  	
  def	
  apply[A](f:	
  Settings	
  =>	
  A):EnvironmentReader[A]	
  
	
  	
  	
  	
  =	
  scalaz.Reader(f)
}

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Writing an Identity
	
  	
  protected	
  def	
  writeResourcePointer(identity:	
  ResourceIdentity)
	
   :	
  EnvironmentReader[JObject]	
  =	
  for	
  {
!

	
  	
  	
  	
  	
  	
  href	
  <-­‐	
  urlForIdentity(identity)	
  
	
  	
  	
  	
  	
  	
  contentType	
  =	
  identity.documentType	
  
	
  	
  	
  	
  	
  	
  representations	
  <-­‐	
  writeRepresentations(identity)	
  
	
  	
  	
  	
  	
  	
  views	
  <-­‐	
  viewsForIdentity(identity)
!

	
  	
  	
  	
  }	
  yield	
  (":href"	
  -­‐>	
  href)	
  ~	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  (":type"	
  -­‐>	
  contentType)	
  ~
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  (":uri"	
  -­‐>	
  identity.uri)	
  ~
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  representations	
  ~
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  (":views"	
  -­‐>	
  views)	
  

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
urlForIdentity
protected	
  def	
  urlForIdentity(identity:ResourceIdentity)
	
  	
  :	
  EnvironmentReader[JValue]	
  =	
  for	
  {
!

	
  	
  r	
  <-­‐	
  URLResolverSetting.resolve(identity)	
  
	
  	
  href	
  <-­‐	
  mapOrJNothing(r)	
  {
	
  	
  	
  	
  ref	
  :	
  String	
  =>	
  pure(JString(ref))
	
  	
  }
!

}	
  yield	
  href	
  

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
URLResolverSetting
case	
  class	
  URLResolverSetting(value:	
  Resolver[String])
	
  	
  extends	
  EnvironmentSetting[Resolver[String]]	
  {	
  
	
  	
  
	
  	
  val	
  key	
  =	
  "url-­‐resolver"	
  
}	
  
!

object	
  URLResolverSetting	
  extends	
  ResolverSetting	
  ({	
  
	
  	
  case	
  setting:	
  URLResolverSetting	
  =>	
  setting.value	
  
})	
  

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
ResolverSetting
class	
  ResolverSetting[T](
	
   finder	
  :	
  PartialFunction[
	
   	
  	
  EnvironmentSetting[_],
	
  	
  	
  	
  	
  Resolver[T]])	
  {
!

	
  	
  def	
  resolve(identity	
  :	
  ResourceIdentity)	
  :
	
  	
  	
  	
  EnvironmentReader[Option[T]]	
  =	
  EnvironmentReader
	
  	
  {	
  settings	
  =>	
  
	
  	
  	
  	
  for	
  {	
  
	
  	
  	
  	
  	
  	
  resolver	
  <-­‐	
  settings.collectFirst(finder)	
  
	
  	
  	
  	
  	
  	
  result	
  <-­‐	
  resolver.resolve(identity)	
  
	
  	
  	
  	
  }	
  yield	
  result	
  
	
  	
  }	
  
}	
  

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Wooh …
That's far more
complex than my …
blah blah in blah
Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Yup

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Nope

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Remember I
mentioned Runars talk
did my head in.*
Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
It's actually really
easy to work with

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Each components is
responsible for one
thing

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Combining
components is trivial

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
You spend most of
your time doing
simple, safe,
composition
Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Spray

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Elephants all the way
down

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
The Language
val	
  route	
  =	
  {	
  
	
  	
  	
  	
  language	
  {	
  lang	
  =>	
  
	
  	
  	
  	
  	
  	
  	
  	
  implicit	
  val	
  env	
  =	
  RequestEnvironmentProvider(
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  EnvironmentConfig(language	
  =	
  Some(lang))
	
  	
  	
  	
  	
  	
  	
  	
  )
…
!

}

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
The Directive*
def	
  language:	
  Directive1[Lang]	
  =	
  {	
  
	
  	
  headerValue	
  {
!

	
  	
  	
  	
  case	
  HttpHeader("accept-­‐language",	
  langString)	
  =>
	
  	
  	
  	
  	
  	
  langString.split(',').headOption.flatMap(firstLanguage	
  =>
	
  	
  	
  	
  	
  	
  	
  	
  Lang.get(firstLanguage))
!

	
  	
  	
  	
  case	
  _	
  =>	
  None
!

	
  	
  }	
  |	
  provide(Lang.defaultLang)	
  
}	
  

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Creating a Response
def	
  getStream(implicit	
  env:	
  RequestEnvironmentProvider):
	
  Route	
  =	
  {	
  
	
  	
  path("stream"	
  /	
  StreamPath)	
  {	
  case	
  (stream,	
  afterStory)	
  =>	
  
	
  	
  	
  read(FetchStream(stream,	
  afterStory))	
  {	
  stream	
  =>
	
  	
  	
  	
  val	
  streamEnv	
  =	
  environmentForStreamWithTopics(
	
  	
  	
  	
  	
  env,	
  stream.identity.references
	
  	
  	
  	
  )	
  
	
  	
  	
  	
  respondWithHeaders(	
  
	
  	
  	
  	
  	
  `Cache-­‐Control`(`public`,	
  `max-­‐age`(60)))	
  {	
  
	
  	
  	
  	
  	
  	
  complete	
  {	
  
	
  	
  	
  	
  	
  	
  	
  implicit	
  val	
  criteriaMarshaller:	
  Marshaller[StoryStream]
	
  	
  	
  	
  	
  	
  	
  	
  =	
  resourceMarshaller(streamEnv)	
  
	
  	
  	
  	
  	
  	
  	
  	
  stream	
  
	
  	
  	
  }	
  
	
  	
  }	
  
	
  }	
  
}	
  
	
  	
  }	
  

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
A Little akka Helper

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Reading the Graph
def	
  read[T](message	
  :	
  GraphRequest[T])(f	
  :	
  T	
  =>	
  Route):Route	
  =
{	
  ctx	
  =>	
  
	
  	
  val	
  response:	
  Future[T]	
  =
	
  	
  	
  	
  Graph.reader.ask(message).asInstanceOf[Future[T]]	
  
	
  	
  	
  	
  
	
  	
  	
  	
  response.map	
  {	
  
	
  	
  	
  	
  	
  	
  case	
  Error(messages)	
  =>	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  ctx.complete(
	
  	
  	
  	
  	
  	
  	
  	
  	
  InternalServerError,	
  messages.mkString("n")
	
  	
  	
  	
  	
  	
  	
  	
  )	
  
	
  	
  	
  	
  	
  	
  }	
  
	
  	
  	
  	
  	
  	
  case	
  result	
  =>	
  f(result)(ctx)	
  
	
  	
  	
  	
  }	
  
}

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
akka

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Topic Management

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Topic Actor
private	
  class	
  TopicActor	
  (system	
  :	
  GraphSystem,
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  topic	
  :	
  StreamComponentIdentity)
	
  	
  extends	
  GraphWorker(system)	
  with	
  Stash	
  {	
  
!

	
  	
  override	
  def	
  preStart()	
  {	
  
	
  	
  	
  	
  available(topic)	
  onAvailable	
  {	
  
	
  	
  	
  	
  	
  	
  become(active)	
  
	
  	
  	
  	
  }	
  onMissing	
  {	
  
	
  	
  	
  	
  	
  	
  topicManager	
  !	
  UpdateTopic(topic)	
  
	
  	
  	
  	
  	
  	
  become(pending)	
  
	
  	
  	
  	
  }	
  
	
  	
  }	
  
!

…
}
Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Receive

def	
  receive	
  =	
  PartialFunction.empty

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Pending
def	
  pending	
  :	
  Actor.Receive	
  =	
  {	
  
	
  	
  case	
  message	
  @	
  LinkStory(story,	
  identity)
	
  	
  	
  	
  if	
  identity	
  ==	
  topic	
  =>	
  {	
  
	
  	
  	
  	
  	
  	
  stash()	
  
	
  	
  	
  	
  }	
  
!

	
  	
  case	
  identity	
  if	
  identity	
  ==	
  topic	
  =>	
  {	
  
	
  	
  	
  	
  unstashAll()	
  
	
  	
  	
  	
  become(active)	
  
	
  	
  }	
  
}

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Active
	
  	
  def	
  active	
  :	
  Actor.Receive	
  =	
  {	
  
	
  	
  	
  	
  case	
  LinkStory(story,	
  identity)	
  if	
  identity	
  ==	
  topic	
  =>	
  {	
  
	
  	
  	
  	
  	
  	
  gs.write(associateWithSubject(story,	
  topic))	
  
	
  	
  	
  	
  }	
  
	
  	
  }	
  

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Baby Steps

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Challenges

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
As the Carpenters
said …

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
We've Only Just Begun

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Data Load

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Sparsity

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Propagation

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Friends

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
500 Topics

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
10,000,000 Nodes

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
1,000,000 Topics

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
10,000,000,000 Nodes

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Time Series Data

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Distribution

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Need to change the
way you think about
services

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Actors are not Queues

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Monitoring is Hard

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
"Real Time"

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Balancing
Load vs Caching

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Two Hard Problems

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Naming

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Cache Invalidation

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Off by One Errors

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Caching Stuff is Easy

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Invalidation is Hard

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Limited Use

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Just be Fast

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Payments

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Ticketing

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
À la carte

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Cross Platform

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Come Join Us

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Disrupting

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Looking for the 'X'
factor

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Hiring Selectively

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Talk to Me or Andrea

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
You miss 100 percent
of the the shots you
don't take
– Wayne Gretzky
Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013
Questions?
Kevin O’Neill
CTO - PlayUp
@kevinoneill
kevin@playup.com

Kevin O’Neill - CTO PlayUp - @kevinoneill

Melbourne Scala User Group - August 2013

More Related Content

What's hot

What's hot (6)

Part of the pipeline-why continuous testing is essential - velocity conf
Part of the pipeline-why continuous testing is essential - velocity confPart of the pipeline-why continuous testing is essential - velocity conf
Part of the pipeline-why continuous testing is essential - velocity conf
 
TuleapCon2017-Mattermost-integration
TuleapCon2017-Mattermost-integrationTuleapCon2017-Mattermost-integration
TuleapCon2017-Mattermost-integration
 
Gartner starting and scaling dev ops
Gartner starting and scaling dev opsGartner starting and scaling dev ops
Gartner starting and scaling dev ops
 
Seamless integration with Magnolia's REST API
Seamless integration with Magnolia's REST APISeamless integration with Magnolia's REST API
Seamless integration with Magnolia's REST API
 
Shiny Updates, A Feature Plugin in Two Acts
Shiny Updates, A Feature Plugin in Two ActsShiny Updates, A Feature Plugin in Two Acts
Shiny Updates, A Feature Plugin in Two Acts
 
Agile North East Agile + DevOps by Craig Pearson of CAP Project Services
Agile North East Agile + DevOps by Craig Pearson of CAP Project ServicesAgile North East Agile + DevOps by Craig Pearson of CAP Project Services
Agile North East Agile + DevOps by Craig Pearson of CAP Project Services
 

Viewers also liked

Viewers also liked (6)

Deploying the Graph
Deploying the GraphDeploying the Graph
Deploying the Graph
 
Hypermedia for the iOS developer - Swipe 2012
Hypermedia for the iOS developer - Swipe  2012Hypermedia for the iOS developer - Swipe  2012
Hypermedia for the iOS developer - Swipe 2012
 
Building Hypermedia API's - YOW! Night - March 2013
Building Hypermedia API's - YOW! Night - March 2013Building Hypermedia API's - YOW! Night - March 2013
Building Hypermedia API's - YOW! Night - March 2013
 
Swipe 2011 - iOS Gems
Swipe 2011 - iOS GemsSwipe 2011 - iOS Gems
Swipe 2011 - iOS Gems
 
YOW Mobile Night 2011 - The realestate.com.au mobile story
YOW Mobile Night 2011 - The realestate.com.au mobile storyYOW Mobile Night 2011 - The realestate.com.au mobile story
YOW Mobile Night 2011 - The realestate.com.au mobile story
 
Simpler Web Architectures Now! (At The Frontend 2016)
Simpler Web Architectures Now! (At The Frontend 2016)Simpler Web Architectures Now! (At The Frontend 2016)
Simpler Web Architectures Now! (At The Frontend 2016)
 

Recently uploaded

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
 

Recently uploaded (20)

Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
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
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation 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, ...
 
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...
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor Presentation
 
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)
 
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...
 
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
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?
 
A Beginners Guide to Building a RAG App Using Open Source Milvus
A Beginners Guide to Building a RAG App Using Open Source MilvusA Beginners Guide to Building a RAG App Using Open Source Milvus
A Beginners Guide to Building a RAG App Using Open Source Milvus
 
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ..."I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
 
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
 
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
 
AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024
 
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
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 

A Slice of Scala

  • 1. A Slice of Scala August 2013 Kevin O’Neill CTO PlayUp @kevinoneill Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 2. Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 3. Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 4. Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 5. Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 6. A little History Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 7. Engage & Entertain Around Live Sport Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 8. Mobile Games Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 9. SMS Based Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 10. Number of Runs Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 11. Complex Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 12. Carrier Integration Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 13. Smart Phone Revolution Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 14. Move from a Content Creator to a Content Enabler Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 15. Top 10 in Engagement Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 16. Over 3 Million Likes Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 17. 30% - 40% Active Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 18. Manually Curated Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 19. We Know there's an Opportunity Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 20. October 2011 Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 21. Technologist at Large Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 22. Version 2 Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 23. Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 24. Rebuild Based on Hypermedia* Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 25. Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 26. Same Feature Set Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 27. Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 28. Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 29. Different Skin Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 30. Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 31. iOS Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 32. Android Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 33. Ruby Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 34. Version 3 Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 35. Platform Extensions Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 36. Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 37. Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 38. Tiles Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 39. Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 40. Third Party Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 41. Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 42. Ticketing Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 43. Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 44. Ruby Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 45. PHP Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 46. Version 4 Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 47. Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 48. Engagement Too Deep Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 49. Streams Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 50. Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 51. Graph Storage Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 52. Story User Region Story follows about about about follows Team Team Story Region competes in League competes in plays in Team follows competes in follows about about about Contest League User Story Story follows competes in plays in about Story Story Team about Kevin O’Neill - CTO PlayUp - @kevinoneill Story Story about Melbourne Scala User Group - August 2013
  • 53. Value is in the Connections Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 54. Ruby Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 55. 50 Seconds Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 56. Cypher Processing too much Data Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 57. Java plugin Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 58. 5 Seconds Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 59. 10 Times too Long* Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 60. Aiming Around 200ms Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 61. Time to Change Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 62. If you hear a voice within you say 'you cannot paint,' then by all means paint, and that voice will be silenced. – Vincent Van Gogh Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 63. Scala Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 64. Just Couldn't Face Java Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 65. Some Experience with it on a Large Project Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 66. The Stack Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 67. Scala 2.10.x Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 68. akka 2.1.x* Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 69. Spray M8+ Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 70. Play 2.1.x* Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 71. Other Bits Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 72. Neo4j 1.9.x Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 73. Scalaz 7.0.x Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 74. Blueprints 2.4.x Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 75. Scala Test 2.0.x Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 76. Scala Check 1.10.x Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 77. SBT 1.12.x* Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 78. Systems Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 79. Two akka Services* Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 80. Graph Service Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 81. Sports Connect Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 82. Fanbase Connect* Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 83. One Spray Server Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 84. Hypermedia API Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 85. One Play Application* Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 86. HTML Front End Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 87. Admin Front End* Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 88. JSON Generation Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 89. Problem : How do you isolate environment Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 90. Lambda: The Ultimate Dependency Injection Framework Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 91. Did my Head in Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 92. So what if … Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 93. Environment Readers type  Settings  =  Set[EnvironmentSetting[_]]   ! type  EnvironmentReader[+A]  =  scalaz.Reader[Settings,  A]       object  EnvironmentReader  {    def  apply[A](f:  Settings  =>  A):EnvironmentReader[A]          =  scalaz.Reader(f) } Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 94. Writing an Identity    protected  def  writeResourcePointer(identity:  ResourceIdentity)   :  EnvironmentReader[JObject]  =  for  { !            href  <-­‐  urlForIdentity(identity)              contentType  =  identity.documentType              representations  <-­‐  writeRepresentations(identity)              views  <-­‐  viewsForIdentity(identity) !        }  yield  (":href"  -­‐>  href)  ~                          (":type"  -­‐>  contentType)  ~                        (":uri"  -­‐>  identity.uri)  ~                        representations  ~                        (":views"  -­‐>  views)   Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 95. urlForIdentity protected  def  urlForIdentity(identity:ResourceIdentity)    :  EnvironmentReader[JValue]  =  for  { !    r  <-­‐  URLResolverSetting.resolve(identity)      href  <-­‐  mapOrJNothing(r)  {        ref  :  String  =>  pure(JString(ref))    } ! }  yield  href   Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 96. URLResolverSetting case  class  URLResolverSetting(value:  Resolver[String])    extends  EnvironmentSetting[Resolver[String]]  {          val  key  =  "url-­‐resolver"   }   ! object  URLResolverSetting  extends  ResolverSetting  ({      case  setting:  URLResolverSetting  =>  setting.value   })   Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 97. ResolverSetting class  ResolverSetting[T](   finder  :  PartialFunction[      EnvironmentSetting[_],          Resolver[T]])  { !    def  resolve(identity  :  ResourceIdentity)  :        EnvironmentReader[Option[T]]  =  EnvironmentReader    {  settings  =>          for  {              resolver  <-­‐  settings.collectFirst(finder)              result  <-­‐  resolver.resolve(identity)          }  yield  result      }   }   Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 98. Wooh … That's far more complex than my … blah blah in blah Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 99. Yup Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 100. Nope Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 101. Remember I mentioned Runars talk did my head in.* Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 102. It's actually really easy to work with Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 103. Each components is responsible for one thing Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 104. Combining components is trivial Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 105. You spend most of your time doing simple, safe, composition Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 106. Spray Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 107. Elephants all the way down Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 108. The Language val  route  =  {          language  {  lang  =>                  implicit  val  env  =  RequestEnvironmentProvider(                    EnvironmentConfig(language  =  Some(lang))                ) … ! } Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 109. The Directive* def  language:  Directive1[Lang]  =  {      headerValue  { !        case  HttpHeader("accept-­‐language",  langString)  =>            langString.split(',').headOption.flatMap(firstLanguage  =>                Lang.get(firstLanguage)) !        case  _  =>  None !    }  |  provide(Lang.defaultLang)   }   Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 110. Creating a Response def  getStream(implicit  env:  RequestEnvironmentProvider):  Route  =  {      path("stream"  /  StreamPath)  {  case  (stream,  afterStory)  =>        read(FetchStream(stream,  afterStory))  {  stream  =>        val  streamEnv  =  environmentForStreamWithTopics(          env,  stream.identity.references        )          respondWithHeaders(            `Cache-­‐Control`(`public`,  `max-­‐age`(60)))  {              complete  {                implicit  val  criteriaMarshaller:  Marshaller[StoryStream]                =  resourceMarshaller(streamEnv)                  stream        }      }    }   }      }   Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 111. A Little akka Helper Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 112. Reading the Graph def  read[T](message  :  GraphRequest[T])(f  :  T  =>  Route):Route  = {  ctx  =>      val  response:  Future[T]  =        Graph.reader.ask(message).asInstanceOf[Future[T]]                  response.map  {              case  Error(messages)  =>  {                  ctx.complete(                  InternalServerError,  messages.mkString("n")                )              }              case  result  =>  f(result)(ctx)          }   } Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 113. akka Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 114. Topic Management Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 115. Topic Actor private  class  TopicActor  (system  :  GraphSystem,                                                    topic  :  StreamComponentIdentity)    extends  GraphWorker(system)  with  Stash  {   !    override  def  preStart()  {          available(topic)  onAvailable  {              become(active)          }  onMissing  {              topicManager  !  UpdateTopic(topic)              become(pending)          }      }   ! … } Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 116. Receive def  receive  =  PartialFunction.empty Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 117. Pending def  pending  :  Actor.Receive  =  {      case  message  @  LinkStory(story,  identity)        if  identity  ==  topic  =>  {              stash()          }   !    case  identity  if  identity  ==  topic  =>  {          unstashAll()          become(active)      }   } Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 118. Active    def  active  :  Actor.Receive  =  {          case  LinkStory(story,  identity)  if  identity  ==  topic  =>  {              gs.write(associateWithSubject(story,  topic))          }      }   Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 119. Baby Steps Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 120. Challenges Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 121. As the Carpenters said … Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 122. We've Only Just Begun Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 123. Data Load Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 124. Sparsity Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 125. Propagation Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 126. Friends Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 127. 500 Topics Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 128. 10,000,000 Nodes Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 129. 1,000,000 Topics Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 130. 10,000,000,000 Nodes Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 131. Time Series Data Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 132. Distribution Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 133. Need to change the way you think about services Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 134. Actors are not Queues Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 135. Monitoring is Hard Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 136. "Real Time" Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 137. Balancing Load vs Caching Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 138. Two Hard Problems Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 139. Naming Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 140. Cache Invalidation Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 141. Off by One Errors Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 142. Caching Stuff is Easy Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 143. Invalidation is Hard Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 144. Limited Use Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 145. Just be Fast Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 146. Payments Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 147. Ticketing Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 148. À la carte Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 149. Cross Platform Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 150. Come Join Us Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 151. Disrupting Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 152. Looking for the 'X' factor Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 153. Hiring Selectively Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 154. Talk to Me or Andrea Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 155. You miss 100 percent of the the shots you don't take – Wayne Gretzky Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  • 156. Questions? Kevin O’Neill CTO - PlayUp @kevinoneill kevin@playup.com Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013