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

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

Similar a Scala @ Real Life Codemotion 2014 (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)

PPTX
Notificacion e investigación de incidentes y accidentes de trabajo.pptx
PDF
Durabilidad del concreto en zonas costeras
PDF
SUBDIVISIÓN URBANA PUEDE ENFRENTAR SERVIDUMBRE DE PASO.pdf
DOCX
CONCEPTOS BASICOS DE LA PROGRAMACION STEP
PDF
Primera formulación de cargos de la SEC en contra del CEN
PDF
S15 Protección de redes electricas 2025-1_removed.pdf
PPTX
Cortinas-en-Presas-de-Gravedad-Vertedoras-y-No-Vertedoras.pptx
PPTX
Seminario de telecomunicaciones para ingeniería
PDF
SEC formula cargos al Consejo Directivo del Coordinador y a ocho eléctricas p...
PPT
357161027-seguridad-industrial-diapositivas-ppt.ppt
PPTX
MARITIMO Y LESGILACION DEL MACO TRANSPORTE
PPTX
Presentación - Taller interpretación iso 9001-Solutions consulting learning.pptx
PPTX
GEOLOGIA, principios , fundamentos y conceptos
PPTX
Manual ISO9001_2015_IATF_16949_2016.pptx
PPT
PRIMEROS AUXILIOS EN EL SECTOR EMPRESARIAL
PPT
tema DISEÑO ORGANIZACIONAL UNIDAD 1 A.ppt
PDF
manual-electricidad-automotriz-sistemas-electricos-bateria-alumbrado-iluminac...
PPTX
CAPACITACIÓN DE USO ADECUADO DE EPP.pptx
PDF
Estrategias de apoyo de tecnología 2do periodo pdf
PDF
CALIDAD SSOMA AMBIENTE PRL UNIVERSIDADDD
Notificacion e investigación de incidentes y accidentes de trabajo.pptx
Durabilidad del concreto en zonas costeras
SUBDIVISIÓN URBANA PUEDE ENFRENTAR SERVIDUMBRE DE PASO.pdf
CONCEPTOS BASICOS DE LA PROGRAMACION STEP
Primera formulación de cargos de la SEC en contra del CEN
S15 Protección de redes electricas 2025-1_removed.pdf
Cortinas-en-Presas-de-Gravedad-Vertedoras-y-No-Vertedoras.pptx
Seminario de telecomunicaciones para ingeniería
SEC formula cargos al Consejo Directivo del Coordinador y a ocho eléctricas p...
357161027-seguridad-industrial-diapositivas-ppt.ppt
MARITIMO Y LESGILACION DEL MACO TRANSPORTE
Presentación - Taller interpretación iso 9001-Solutions consulting learning.pptx
GEOLOGIA, principios , fundamentos y conceptos
Manual ISO9001_2015_IATF_16949_2016.pptx
PRIMEROS AUXILIOS EN EL SECTOR EMPRESARIAL
tema DISEÑO ORGANIZACIONAL UNIDAD 1 A.ppt
manual-electricidad-automotriz-sistemas-electricos-bateria-alumbrado-iluminac...
CAPACITACIÓN DE USO ADECUADO DE EPP.pptx
Estrategias de apoyo de tecnología 2do periodo pdf
CALIDAD SSOMA AMBIENTE PRL UNIVERSIDADDD
Publicidad

Scala @ Real Life Codemotion 2014

  • 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