Scala @RealLife es una presentación ofrecida durante el Codemotion 2014 en Madrid que habla acerca de la realidad de Scala y el ecosistema de Typesafe en la actualidad.
Caja de herramientas de inteligencia artificial para la academia y la investi...
Codemotion 2014 Scala @real life
1. Scala Programming @ Madrid
MADRID · NOV 21-22 · 2014
Scala @ Real Life
Javier Santos y David Vallejo
2. Scala Programming @ Madrid
MADRID · NOV 21-22 · 2014
¿Quienes somos?
David Vallejo @dvnavarro
«Una expresión regular es una
expresión que no es del todo buena,
pero tampoco del todo mala.»
@borjamonserrano
Javier Santos @jpaniego
«Hay dos formas de programar sin
errores; solo la tercera funciona»
Alan J Perlis
4. Scala Programming @ Madrid
MADRID · NOV 21-22 · 2014
Índice
❑ Proyecto Antulus
❑ Introducción a Scala
❑ Features
❑ Herramientas
❑ Core – Akka
❑ Datos maestros – Slick
❑ Big data – Spark
❑ API – Spray
❑ Web – Play
❑ Realidad actual
❑ Conclusiones
5. Scala Programming @ Madrid
MADRID · NOV 21-22 · 2014
Proyecto Antulus
❑ Objetivo
❑ Ejemplo: SETI@Home
❑ Calculadora distribuida colaborativa
❑ P2P unidades de cálculo
❑ Motivación
❑ Ley Moore -> Multicore
❑ Gran cantidad de datos (Big data)
❑ Aplicaciones
❑ Analytics tendencias mercado
❑ Proyectos investigación genética
❑ Previsión meteorológica
❑ Grafos de afinidad (donantes compatibles, parejas, …).
14. Scala Programming @ Madrid
Aprender Scala en 5 minutos
MADRID · NOV 21-22 · 2014
15. Scala Programming @ Madrid
MADRID · NOV 21-22 · 2014
¿Qué es ?
❑ Lenguaje de propósito general que corre en la JVM
❑ Martin Odersky. EPFL. Carencias de otros lenguajes.
❑ Typesafe (2011)
❑ Características principales
❑ Herencia múltiple
❑ Tipado estático
❑ Inferencia de tipos
❑ Multiparadigma:
❑ Funcional
❑ Orientado a objetos
❑ Aplicaciones de banca, DSLs, …
❑ REPL
16. Scala Programming @ Madrid
MADRID · NOV 21-22 · 2014
: Traits
trait Animal {
def sound: String
}
trait Cat extends Animal {
override def sound = "Miau"
}
trait Dog extends Animal {
override def sound = "Guau"
}
class Fox extends Cat with Dog
18. Scala Programming @ Madrid
MADRID · NOV 21-22 · 2014
: Traits
class Fox extends Cat with Dog
val fox = new Fox()
println(fox.sound) //Returns Guau
19. Scala Programming @ Madrid
MADRID · NOV 21-22 · 2014
: Case classes
case class Point(x: Int, y: Int)
val point1 = Point(1, 1)
point.x
point.y
val point2 = point1.copy(y = 2)
20. Scala Programming @ Madrid
MADRID · NOV 21-22 · 2014
: Pattern Matching
line.getMiddlePoint match {
case Point(1, 2) => …
case Point(x, y) => ...
case Point(x, _) if x > 0 => ...
case point @ Point(x, y) => ...
case _ => ...
}
21. Scala Programming @ Madrid
MADRID · NOV 21-22 · 2014
: Implicits
case class Point(x: Int, y: Int)
implicit def tupleToPoint(tuple: (Int, Int)) =
Point(tuple._1, tuple._2)
def sumPoints(p1: Point, p2: Point) =
Point(p1.x + p2.x, p1.y + p2.y)
val p1: Point = Point(1, 2)
val p2: (Int, Int) = (3, 4)
sumPoints(p1, p2)
22. Scala Programming @ Madrid
: Higher order functions
MADRID · NOV 21-22 · 2014
object Calculator {
type Term = Int
type Result = Int
type Operation = (Term, Term) => Result
val add: Operation = (n1, n2) => n1 + n2
val sub: Operation = (n1, n2) => n1 - n2
val mul: Operation = (n1, n2) => n1 * n2
def calculate(n1: Term, n2: Term)(f: Operation): Result =
f(n1, n2)
}
23. Scala Programming @ Madrid
: Higher order functions
MADRID · NOV 21-22 · 2014
object MyCalculus {
import Calculator._
val simpleAdd = calculate(2, 5)(add)
val customCalculus = calculate(1, 6)((n1, n2) => n1 * n2 + 10)
}
24. Scala Programming @ Madrid
: …movidas varias.
MADRID · NOV 21-22 · 2014
❑ Renombrado de tipos
import com.antulus.{Calculator => CalculatorAux}
❑ Notación infija, métodos como funciones.
names.foreach(name => println(name))
names foreach println
❑ Inferencia de punto y comas
27. Scala Programming @ Madrid
MADRID · NOV 21-22 · 2014
Core -
❑ CQRS/ES
❑ Akka-Persistence
❑ Clustering
❑ Cluster sharding
28. Scala Programming @ Madrid
MADRID · NOV 21-22 · 2014
Core –
CQRS/ES
«CQRS stands for Command Query Responsibility Segregation.
It's a pattern that I first heard described by Greg Young. At its heart
is a simple notion that you can use a different model to update
information than the model you use to read information” – Martin
Fowler
“Event Sourcing ensures that all changes to application state are
stored as a sequence of events. Not just can we query these
events, we can also use the event log to reconstruct past
states[...].” – Martin Fowler
31. Scala Programming @ Madrid
MADRID · NOV 21-22 · 2014
Core –
❑ Clustering
❑ En application.conf
❑ Actor Provider:
akka.cluster.ClusterActorRefProvider
❑ Lista de nodos del clúster:
akka.contrib.pattern.ClusterClient
❑ En el snippet de Scala
❑ Habilitar la «recepcionista»
ClusterReceptionistExtension(system)
.registerService(clusterListener)
33. Scala Programming @ Madrid
MADRID · NOV 21-22 · 2014
Core –
❑ Clustering – semántica de envíos
❑ Send: El mensaje se envía a un único actor del cluster que
coincida con el path. Si hay varios que coinciden, se
entrega a uno de ellos aleatoriamente.
clusterClient ! Send(«/user/handler», «hello»,
localAffinity = true)
❑ SendToAll: El mensaje se envía a todos los actores que
encajen con el path.
clusterClient ! SendToAll(«/user/handler», «hi»)
❑ Publish: El mensaje se envía a todos los actores suscritos
al topic en el que se publica
clusterClient ! Publish(«myTopic», «hello»)
34. Scala Programming @ Madrid
MADRID · NOV 21-22 · 2014
Core –
❑ Cluster sharding
❑ Garantiza dos cosas
❑ Balanceo de carga: En caso de que se añada un
nuevo nodo o que se caiga otro, el número total de
actores se "balancea" entre el resto de nodos.
❑ Identificación de manera inequívoca de un actor, de
manera que los mensajes dirigidos al mismo actor
siempre serán redirigidos al nodo que maneja dicho
actor; o dicho de otra forma, no se podrá dar el caso en
el que dos nodos procesen un mensaje dirigido al
mismo actor.
35. Scala Programming @ Madrid
MADRID · NOV 21-22 · 2014
Core –
❑ Cluster sharding – Semántica
❑ Entry: Representa una entidad identificada de manera
inequívoca y de estado persistente (Agregado).
❑ Shard: Agrupación de entries. Recomendación:
NºShards = 10 x NºMaxNodos
❑ ShardRegion: Agrupación de shards del mismo Entry.
36. Scala Programming @ Madrid
MADRID · NOV 21-22 · 2014
Core –
❑ Cluster sharding – Requisitos de implementación
❑ Arrancar extensión de Sharding
ClusterSharding(myAkkaSystem)
❑ Arrancar los ShardRegion para los tipos de entries que
manejemos
sharding.start(
typeName = «MyAggregate»,
entryProps = Some(Props[MyAggregate]),
idExtractor = MyAggregate.idExtractor,
shardResolver = MyAggregate.shardResolver)
39. Scala Programming @ Madrid
MADRID · NOV 21-22 · 2014
Unidad de cálculo –
❑ Herramienta orientada al Big Data
❑ Distribución de datos
❑ Analytics
❑ ¿Sustituto de ?
40. Scala Programming @ Madrid
MADRID · NOV 21-22 · 2014
Unidad de cálculo –
class Job()(implicit context: SparkContext){
val myRdd: RDD[Int] = context.parallelize(1 to 10
toList)
def mutateMyRDD(rdd: RDD[Int]): Int =
rdd.map(_*2).reduce(_+_)
def mutateThis(rdd: RDD[Int]):RDD[(String,Int)] =
rdd.map(n => n.toString -> n*3)
}
val job = new Job()
println(job.mutateMyRDD(job.myRdd)) //110
41. Scala Programming @ Madrid
MADRID · NOV 21-22 · 2014
Unidad de cálculo -
val conf =
new SparkConf().set("cassandra.connection.host", "localhost")
implicit val context =
new SparkContext(conf)
val myTable = context.cassandraTable[(String, Int)](
"myKeyspace",
"myTable")
// Same declaration of Job class
val job = new Job()
job. mutateThis(job.myRdd).saveToCassandra("myKeyspace",
"myTable")
43. Scala Programming @ Madrid
Datos maestros -
❑ Librería de acceso y consulta a bases de datos para Scala
MADRID · NOV 21-22 · 2014
❑ Soporte para múltiples drivers:
❑ DB2,Microsoft Access, Microsoft SQL, PostgreSQL, SQLite,
…
❑ Query API’s:
❑ Lifted embedding: Standard. No utiliza tipos Scala
directamente
❑ Direct embedding: Experimental. Macros
❑ Permite utilizar SQL embebido (RawSql)
❑ Se trabaja continuamente con colecciones Scala
44. Scala Programming @ Madrid
MADRID · NOV 21-22 · 2014
Datos maestros -
❑ Lifted embedding
class Users(tag: Tag) extends Table[(String, Int)](tag,
"USERS") {
def name = column[String]("USER_NAME", O.PrimaryKey)
def age = column[Int]("AGE")
def * = (name, age)
}
val users = TableQuery[Users]
❑ Direct embedding
@table(name = "USERS")
case class User(
@column(name = "NAME") name: String,
@column(name = "AGE") age: Int)
45. Scala Programming @ Madrid
MADRID · NOV 21-22 · 2014
Datos maestros -
❑ Querying…
val q1 = users.filter(_.name === "User1")
// compiles to SQL (simplified):
// select "NAME", "AGE"
// from "USERS"
// where "NAME" = "User1"
val q2 = users.drop(10).take(5)
// compiles to SQL (simplified):
// select "NAME", "AGE"
// from "USERS"
// limit 5 offset 10
val q3 = users.sortBy(_.name.desc.nullsFirst)
// compiles to SQL (simplified):
// select "NAME", "AGE"
// from "USERS"
// order by "NAME" desc nulls first
47. Scala Programming @ Madrid
MADRID · NOV 21-22 · 2014
API Rest -
❑ Creación de API’s REST
❑ Arquitectura basada en actores
❑ Futuro Akka-HTTP
❑ Permite peticiones asíncronas.
❑ Incluye DSL para testing
48. Scala Programming @ Madrid
MADRID · NOV 21-22 · 2014
API Rest -
❑ Creando rutas
val route: Route =
path("job" / HexIntNumber) { id =>
get {
complete {
s"Getting Calculus job status for $id."
}
} ~
put {
complete {
s"Updated Calculus job with id $id."
}
}
}
49. Scala Programming @ Madrid
MADRID · NOV 21-22 · 2014
API Rest -
❑ Serializadores
case class Job(
id: Int,
description: String,
tags: List[String]
)
object MyJsonProtocol extends DefaultJsonProtocol {
implicit val jobFormat = jsonFormat3(Job)
}
50. Scala Programming @ Madrid
MADRID · NOV 21-22 · 2014
API Rest -
❑ Testing
"return a job" in {
Get("/job/1") ~> route ~> check {
responseAs[String] must contain(
"Getting Calculus job status for 1.")
}
}
52. Scala Programming @ Madrid
MADRID · NOV 21-22 · 2014
Interfaz web -
❑ Framework para construir aplicaciones web
❑ Construido sobre Akka
❑ Modelo vista-controlador
❑ Disponible también para Java
53. Scala Programming @ Madrid
MADRID · NOV 21-22 · 2014
Interfaz web -
object MyCalculator extends Controller {
def calculate(op: Operation) = Action {
doOperation(op) match {
case Success(result) =>
Ok("Result: " + result)
case Failure(t) =>
InternalServerError
}
}
}
54. Scala Programming @ Madrid
MADRID · NOV 21-22 · 2014
¿Se puede vivir de esto?
55. Scala Programming @ Madrid
Uso de Scala - Datos Meetup
MADRID · NOV 21-22 · 2014
56. Scala Programming @ Madrid
MADRID · NOV 21-22 · 2014
Uso de Scala - Empresas
57. Scala Programming @ Madrid
MADRID · NOV 21-22 · 2014
Ámbito laboral
❑ Para la empresa:
❑ Desarrolladores escasos
❑ Dificultad para formar a otros desarrolladores
❑ Miedo al cambio
❑ Para los programadores:
❑ Poca oferta nacional
59. Scala Programming @ Madrid
MADRID · NOV 21-22 · 2014
Conclusiones
❑ Dos enfoques
❑ Principiantes: sin experiencia extensa en lenguajes como C++ o
Java. ¿Mayor facilidad para cambiar al «chip» funcional?
❑ Gente del mundo Java: facilidad de adaptarse progresivamente
(Uso de var’s, bucles while, …).
❑ En cualquier caso: «A escribir se aprende leyendo»
❑ Jugar y consultar la REPL siempre en caso de duda.
60. Scala Programming @ Madrid
MADRID · NOV 21-22 · 2014
Conclusiones
❑ Tecnologías nuevas
❑ Poca documentación
❑ Comunidad escasa
❑ Escalables, distribuidas y clusterizables