A Slice of Scala

1,535 views
1,413 views

Published on

A presentation given to the Melbourne Scala User Group in August 2013 talking about how PlayUp is using scala, akka, spray and neo4j to drive it's next generation of mobile sports applications.

Published in: Technology, Business
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,535
On SlideShare
0
From Embeds
0
Number of Embeds
36
Actions
Shares
0
Downloads
6
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

A Slice of Scala

  1. 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. 2. Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  3. 3. Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  4. 4. Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  5. 5. Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  6. 6. A little History Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  7. 7. Engage & Entertain Around Live Sport Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  8. 8. Mobile Games Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  9. 9. SMS Based Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  10. 10. Number of Runs Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  11. 11. Complex Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  12. 12. Carrier Integration Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  13. 13. Smart Phone Revolution Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  14. 14. Move from a Content Creator to a Content Enabler Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  15. 15. Top 10 in Engagement Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  16. 16. Over 3 Million Likes Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  17. 17. 30% - 40% Active Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  18. 18. Manually Curated Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  19. 19. We Know there's an Opportunity Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  20. 20. October 2011 Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  21. 21. Technologist at Large Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  22. 22. Version 2 Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  23. 23. Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  24. 24. Rebuild Based on Hypermedia* Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  25. 25. Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  26. 26. Same Feature Set Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  27. 27. Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  28. 28. Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  29. 29. Different Skin Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  30. 30. Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  31. 31. iOS Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  32. 32. Android Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  33. 33. Ruby Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  34. 34. Version 3 Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  35. 35. Platform Extensions Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  36. 36. Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  37. 37. Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  38. 38. Tiles Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  39. 39. Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  40. 40. Third Party Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  41. 41. Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  42. 42. Ticketing Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  43. 43. Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  44. 44. Ruby Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  45. 45. PHP Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  46. 46. Version 4 Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  47. 47. Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  48. 48. Engagement Too Deep Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  49. 49. Streams Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  50. 50. Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  51. 51. Graph Storage Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  52. 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. 53. Value is in the Connections Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  54. 54. Ruby Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  55. 55. 50 Seconds Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  56. 56. Cypher Processing too much Data Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  57. 57. Java plugin Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  58. 58. 5 Seconds Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  59. 59. 10 Times too Long* Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  60. 60. Aiming Around 200ms Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  61. 61. Time to Change Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  62. 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. 63. Scala Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  64. 64. Just Couldn't Face Java Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  65. 65. Some Experience with it on a Large Project Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  66. 66. The Stack Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  67. 67. Scala 2.10.x Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  68. 68. akka 2.1.x* Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  69. 69. Spray M8+ Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  70. 70. Play 2.1.x* Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  71. 71. Other Bits Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  72. 72. Neo4j 1.9.x Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  73. 73. Scalaz 7.0.x Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  74. 74. Blueprints 2.4.x Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  75. 75. Scala Test 2.0.x Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  76. 76. Scala Check 1.10.x Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  77. 77. SBT 1.12.x* Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  78. 78. Systems Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  79. 79. Two akka Services* Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  80. 80. Graph Service Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  81. 81. Sports Connect Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  82. 82. Fanbase Connect* Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  83. 83. One Spray Server Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  84. 84. Hypermedia API Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  85. 85. One Play Application* Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  86. 86. HTML Front End Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  87. 87. Admin Front End* Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  88. 88. JSON Generation Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  89. 89. Problem : How do you isolate environment Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  90. 90. Lambda: The Ultimate Dependency Injection Framework Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  91. 91. Did my Head in Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  92. 92. So what if … Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  93. 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. 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. 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. 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. 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. 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. 99. Yup Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  100. 100. Nope Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  101. 101. Remember I mentioned Runars talk did my head in.* Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  102. 102. It's actually really easy to work with Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  103. 103. Each components is responsible for one thing Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  104. 104. Combining components is trivial Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  105. 105. You spend most of your time doing simple, safe, composition Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  106. 106. Spray Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  107. 107. Elephants all the way down Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  108. 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. 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. 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. 111. A Little akka Helper Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  112. 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. 113. akka Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  114. 114. Topic Management Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  115. 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. 116. Receive def  receive  =  PartialFunction.empty Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  117. 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. 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. 119. Baby Steps Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  120. 120. Challenges Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  121. 121. As the Carpenters said … Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  122. 122. We've Only Just Begun Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  123. 123. Data Load Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  124. 124. Sparsity Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  125. 125. Propagation Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  126. 126. Friends Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  127. 127. 500 Topics Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  128. 128. 10,000,000 Nodes Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  129. 129. 1,000,000 Topics Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  130. 130. 10,000,000,000 Nodes Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  131. 131. Time Series Data Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  132. 132. Distribution Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  133. 133. Need to change the way you think about services Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  134. 134. Actors are not Queues Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  135. 135. Monitoring is Hard Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  136. 136. "Real Time" Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  137. 137. Balancing Load vs Caching Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  138. 138. Two Hard Problems Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  139. 139. Naming Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  140. 140. Cache Invalidation Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  141. 141. Off by One Errors Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  142. 142. Caching Stuff is Easy Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  143. 143. Invalidation is Hard Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  144. 144. Limited Use Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  145. 145. Just be Fast Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  146. 146. Payments Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  147. 147. Ticketing Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  148. 148. À la carte Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  149. 149. Cross Platform Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  150. 150. Come Join Us Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  151. 151. Disrupting Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  152. 152. Looking for the 'X' factor Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  153. 153. Hiring Selectively Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  154. 154. Talk to Me or Andrea Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013
  155. 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. 156. Questions? Kevin O’Neill CTO - PlayUp @kevinoneill kevin@playup.com Kevin O’Neill - CTO PlayUp - @kevinoneill Melbourne Scala User Group - August 2013

×