SlideShare una empresa de Scribd logo
Scala Programming @ Madrid 
MADRID · NOV 21-22 · 2014 
Scala @ Real Life 
Javier Santos y David Vallejo
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
Scala Programming @ Madrid 
MADRID · NOV 21-22 · 2014
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
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, …).
Scala Programming @ Madrid 
MADRID · NOV 21-22 · 2014
Scala Programming @ Madrid 
MADRID · NOV 21-22 · 2014
Scala Programming @ Madrid 
MADRID · NOV 21-22 · 2014
Scala Programming @ Madrid 
MADRID · NOV 21-22 · 2014
Scala Programming @ Madrid 
MADRID · NOV 21-22 · 2014
Scala Programming @ Madrid 
MADRID · NOV 21-22 · 2014
Scala Programming @ Madrid 
MADRID · NOV 21-22 · 2014
Scala Programming @ Madrid 
MADRID · NOV 21-22 · 2014 
Proyecto Antulus
Scala Programming @ Madrid 
Aprender Scala en 5 minutos 
MADRID · NOV 21-22 · 2014
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
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
Scala Programming @ Madrid 
MADRID · NOV 21-22 · 2014
Scala Programming @ Madrid 
MADRID · NOV 21-22 · 2014 
: Traits 
class Fox extends Cat with Dog 
val fox = new Fox() 
println(fox.sound) //Returns Guau
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)
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 _ => ... 
}
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)
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) 
}
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) 
}
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
Scala Programming @ Madrid 
MADRID · NOV 21-22 · 2014 
¡Al turrón!
Scala Programming @ Madrid 
MADRID · NOV 21-22 · 2014 
Core -
Scala Programming @ Madrid 
MADRID · NOV 21-22 · 2014 
Core - 
❑ CQRS/ES 
❑ Akka-Persistence 
❑ Clustering 
❑ Cluster sharding
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
Scala Programming @ Madrid 
MADRID · NOV 21-22 · 2014 
Core –
Scala Programming @ Madrid 
MADRID · NOV 21-22 · 2014 
Core – 
❑ Akka-Persistence 
❑ Journal === Event Storage 
❑ Martin Krasser 
❑ Experimental 
❑ Command 
❑ Persistent Actor 
❑ PersistenceId 
❑ def onCommand: Receive 
def persist(event:Any)(callback: Any => Unit) 
❑ def onRecover: Receive 
❑ Query 
❑ : ( Alternativas : InMemoryDataGrids, RDB, NoSQLDB) 
❑ Distintos journals (LevelDB, InMemory, Cassandra).
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)
Scala Programming @ Madrid 
MADRID · NOV 21-22 · 2014 
Core –
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»)
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.
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.
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)
Scala Programming @ Madrid 
MADRID · NOV 21-22 · 2014 
Core –
Scala Programming @ Madrid 
MADRID · NOV 21-22 · 2014 
Unidad de cálculo – /
Scala Programming @ Madrid 
MADRID · NOV 21-22 · 2014 
Unidad de cálculo – 
❑ Herramienta orientada al Big Data 
❑ Distribución de datos 
❑ Analytics 
❑ ¿Sustituto de ?
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
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")
Scala Programming @ Madrid 
MADRID · NOV 21-22 · 2014 
Datos maestros -
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
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)
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
Scala Programming @ Madrid 
MADRID · NOV 21-22 · 2014 
API Rest -
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
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." 
} 
} 
}
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) 
}
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.") 
} 
}
Scala Programming @ Madrid 
MADRID · NOV 21-22 · 2014 
Interfaz web -
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
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 
} 
} 
}
Scala Programming @ Madrid 
MADRID · NOV 21-22 · 2014 
¿Se puede vivir de esto?
Scala Programming @ Madrid 
Uso de Scala - Datos Meetup 
MADRID · NOV 21-22 · 2014
Scala Programming @ Madrid 
MADRID · NOV 21-22 · 2014 
Uso de Scala - Empresas
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
Scala Programming @ Madrid 
MADRID · NOV 21-22 · 2014 
Conclusiones
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.
Scala Programming @ Madrid 
MADRID · NOV 21-22 · 2014 
Conclusiones 
❑ Tecnologías nuevas 
❑ Poca documentación 
❑ Comunidad escasa 
❑ Escalables, distribuidas y clusterizables
Scala Programming @ Madrid 
MADRID · NOV 21-22 · 2014
Scala Programming @ Madrid 
MADRID · NOV 21-22 · 2014 
Scala @ Real Life 
Javier Santos y David Vallejo

Más contenido relacionado

PPTX
Introducción a akka
PDF
Codemotion 2015 - Akka voló sobre el nido del future
PPTX
Scala @ Real Life Codemotion 2014
PPTX
Scala@real life
PDF
Scala for dummies
PDF
Introduction to Asynchronous scala
PDF
Introducing Akka
PDF
10 cosas de rails que deberías saber
Introducción a akka
Codemotion 2015 - Akka voló sobre el nido del future
Scala @ Real Life Codemotion 2014
Scala@real life
Scala for dummies
Introduction to Asynchronous scala
Introducing Akka
10 cosas de rails que deberías saber

Similar a Codemotion 2014 Scala @real life (20)

PPTX
ASP.NET vNext... Desarrollo cross platform
PDF
Desarrollo de pruebas en entornos Java EE
PDF
Spark Hands-on
PDF
Primeros pasos con Apache Spark - Madrid Meetup
PDF
Primeros pasos con Spark - Spark Meetup Madrid 30-09-2014
PDF
Aplicaciones escalables en la nube: mentiras y verdades
PPTX
Resilient Distributed Dataset - Analisis paper
PPTX
PPTX
Meetup Fun[ctional] spark with scala
PDF
Fun[ctional] spark with scala
PPTX
Primeros pasos con aurelia
PPTX
Scala @ Real life
PDF
Ruby para Java Developers
PDF
Análisis de datos con Apache Spark
PPTX
Del infierno al cielo
PPTX
Update Big Data 2014
KEY
Creación de Builders y DSL's con Groovy
PDF
Carrera de fondo - La continuada lucha de AngularJS - CodeMotion 2015
PDF
Capas de acceso a datos .NET escalables de verdad: el batido perfecto para el...
PDF
Meetup Spark y la Combinación de sus Distintos Módulos
ASP.NET vNext... Desarrollo cross platform
Desarrollo de pruebas en entornos Java EE
Spark Hands-on
Primeros pasos con Apache Spark - Madrid Meetup
Primeros pasos con Spark - Spark Meetup Madrid 30-09-2014
Aplicaciones escalables en la nube: mentiras y verdades
Resilient Distributed Dataset - Analisis paper
Meetup Fun[ctional] spark with scala
Fun[ctional] spark with scala
Primeros pasos con aurelia
Scala @ Real life
Ruby para Java Developers
Análisis de datos con Apache Spark
Del infierno al cielo
Update Big Data 2014
Creación de Builders y DSL's con Groovy
Carrera de fondo - La continuada lucha de AngularJS - CodeMotion 2015
Capas de acceso a datos .NET escalables de verdad: el batido perfecto para el...
Meetup Spark y la Combinación de sus Distintos Módulos
Publicidad

Último (20)

PDF
IDH_Guatemala_2.pdfnjjjkeioooe ,l dkdldp ekooe
DOCX
III Ciclo _ Plan Anual 2025.docx PARA ESTUDIANTES DE PRIMARIA
PDF
Salcedo, J. et al. - Recomendaciones para la utilización del lenguaje inclusi...
PDF
Gasista de unidades unifuncionales - pagina 23 en adelante.pdf
DOCX
PROYECTO DE APRENDIZAJE para la semana de fiestas patrias
DOCX
V UNIDAD - PRIMER GRADO. del mes de agosto
PDF
Crear o Morir - Andres Oppenheimer Ccesa007.pdf
PDF
Fundamentos_Educacion_a_Distancia_ABC.pdf
PDF
COMPLETO__PROYECTO_VIVAN LOS NIÑOS Y SUS DERECHOS_EDUCADORASSOS.pdf
PDF
Unidad de Aprendizaje 5 de Matematica 1ro Secundaria Ccesa007.pdf
PDF
Salvese Quien Pueda - Andres Oppenheimer Ccesa007.pdf
PDF
SESION 12 INMUNIZACIONES - CADENA DE FRÍO- SALUD FAMILIAR - PUEBLOS INDIGENAS...
PDF
Unidad de Aprendizaje 5 de Educacion para el Trabajo EPT Ccesa007.pdf
PDF
Escuela de Negocios - Robert kiyosaki Ccesa007.pdf
PDF
CONFERENCIA-Deep Research en el aula universitaria-UPeU-EduTech360.pdf
PDF
ciencias-1.pdf libro cuarto basico niños
PPTX
AGENTES PATÓGENOS Y LAS PRINCIPAL ENFERMEAD.pptx
PDF
Romper el Circulo de la Creatividad - Colleen Hoover Ccesa007.pdf
PDF
ACERTIJO Súper Círculo y la clave contra el Malvado Señor de las Formas. Por ...
PDF
TRAUMA_Y_RECUPERACION consecuencias de la violencia JUDITH HERMAN
IDH_Guatemala_2.pdfnjjjkeioooe ,l dkdldp ekooe
III Ciclo _ Plan Anual 2025.docx PARA ESTUDIANTES DE PRIMARIA
Salcedo, J. et al. - Recomendaciones para la utilización del lenguaje inclusi...
Gasista de unidades unifuncionales - pagina 23 en adelante.pdf
PROYECTO DE APRENDIZAJE para la semana de fiestas patrias
V UNIDAD - PRIMER GRADO. del mes de agosto
Crear o Morir - Andres Oppenheimer Ccesa007.pdf
Fundamentos_Educacion_a_Distancia_ABC.pdf
COMPLETO__PROYECTO_VIVAN LOS NIÑOS Y SUS DERECHOS_EDUCADORASSOS.pdf
Unidad de Aprendizaje 5 de Matematica 1ro Secundaria Ccesa007.pdf
Salvese Quien Pueda - Andres Oppenheimer Ccesa007.pdf
SESION 12 INMUNIZACIONES - CADENA DE FRÍO- SALUD FAMILIAR - PUEBLOS INDIGENAS...
Unidad de Aprendizaje 5 de Educacion para el Trabajo EPT Ccesa007.pdf
Escuela de Negocios - Robert kiyosaki Ccesa007.pdf
CONFERENCIA-Deep Research en el aula universitaria-UPeU-EduTech360.pdf
ciencias-1.pdf libro cuarto basico niños
AGENTES PATÓGENOS Y LAS PRINCIPAL ENFERMEAD.pptx
Romper el Circulo de la Creatividad - Colleen Hoover Ccesa007.pdf
ACERTIJO Súper Círculo y la clave contra el Malvado Señor de las Formas. Por ...
TRAUMA_Y_RECUPERACION consecuencias de la violencia JUDITH HERMAN
Publicidad

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
  • 3. Scala Programming @ Madrid MADRID · NOV 21-22 · 2014
  • 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, …).
  • 6. Scala Programming @ Madrid MADRID · NOV 21-22 · 2014
  • 7. Scala Programming @ Madrid MADRID · NOV 21-22 · 2014
  • 8. Scala Programming @ Madrid MADRID · NOV 21-22 · 2014
  • 9. Scala Programming @ Madrid MADRID · NOV 21-22 · 2014
  • 10. Scala Programming @ Madrid MADRID · NOV 21-22 · 2014
  • 11. Scala Programming @ Madrid MADRID · NOV 21-22 · 2014
  • 12. Scala Programming @ Madrid MADRID · NOV 21-22 · 2014
  • 13. Scala Programming @ Madrid MADRID · NOV 21-22 · 2014 Proyecto Antulus
  • 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
  • 17. Scala Programming @ Madrid MADRID · NOV 21-22 · 2014
  • 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
  • 25. Scala Programming @ Madrid MADRID · NOV 21-22 · 2014 ¡Al turrón!
  • 26. Scala Programming @ Madrid MADRID · NOV 21-22 · 2014 Core -
  • 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
  • 29. Scala Programming @ Madrid MADRID · NOV 21-22 · 2014 Core –
  • 30. Scala Programming @ Madrid MADRID · NOV 21-22 · 2014 Core – ❑ Akka-Persistence ❑ Journal === Event Storage ❑ Martin Krasser ❑ Experimental ❑ Command ❑ Persistent Actor ❑ PersistenceId ❑ def onCommand: Receive def persist(event:Any)(callback: Any => Unit) ❑ def onRecover: Receive ❑ Query ❑ : ( Alternativas : InMemoryDataGrids, RDB, NoSQLDB) ❑ Distintos journals (LevelDB, InMemory, Cassandra).
  • 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)
  • 32. Scala Programming @ Madrid MADRID · NOV 21-22 · 2014 Core –
  • 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)
  • 37. Scala Programming @ Madrid MADRID · NOV 21-22 · 2014 Core –
  • 38. Scala Programming @ Madrid MADRID · NOV 21-22 · 2014 Unidad de cálculo – /
  • 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")
  • 42. Scala Programming @ Madrid MADRID · NOV 21-22 · 2014 Datos maestros -
  • 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
  • 46. Scala Programming @ Madrid MADRID · NOV 21-22 · 2014 API Rest -
  • 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.") } }
  • 51. Scala Programming @ Madrid MADRID · NOV 21-22 · 2014 Interfaz web -
  • 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
  • 58. Scala Programming @ Madrid MADRID · NOV 21-22 · 2014 Conclusiones
  • 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
  • 61. Scala Programming @ Madrid MADRID · NOV 21-22 · 2014
  • 62. Scala Programming @ Madrid MADRID · NOV 21-22 · 2014 Scala @ Real Life Javier Santos y David Vallejo