SlideShare una empresa de Scribd logo
1 de 62
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

Similar a Codemotion 2014 Scala @real life

ASP.NET vNext... Desarrollo cross platform
ASP.NET vNext... Desarrollo cross platformASP.NET vNext... Desarrollo cross platform
ASP.NET vNext... Desarrollo cross platformEduard Tomàs
 
Desarrollo de pruebas en entornos Java EE
Desarrollo de pruebas en entornos Java EEDesarrollo de pruebas en entornos Java EE
Desarrollo de pruebas en entornos Java EEJosé Manuel López
 
Primeros pasos con Apache Spark - Madrid Meetup
Primeros pasos con Apache Spark - Madrid MeetupPrimeros pasos con Apache Spark - Madrid Meetup
Primeros pasos con Apache Spark - Madrid Meetupdhiguero
 
Primeros pasos con Spark - Spark Meetup Madrid 30-09-2014
Primeros pasos con Spark - Spark Meetup Madrid 30-09-2014Primeros pasos con Spark - Spark Meetup Madrid 30-09-2014
Primeros pasos con Spark - Spark Meetup Madrid 30-09-2014Stratio
 
Aplicaciones escalables en la nube: mentiras y verdades
Aplicaciones escalables en la nube: mentiras y verdadesAplicaciones escalables en la nube: mentiras y verdades
Aplicaciones escalables en la nube: mentiras y verdadesEnrique Catala Bañuls
 
Análisis de datos con Apache Spark
Análisis de datos con Apache SparkAnálisis de datos con Apache Spark
Análisis de datos con Apache SparkEduardo Castro
 
Update Big Data 2014
Update Big Data 2014Update Big Data 2014
Update Big Data 2014Stratebi
 
Creación de Builders y DSL's con Groovy
Creación de Builders y DSL's con GroovyCreación de Builders y DSL's con Groovy
Creación de Builders y DSL's con GroovyJose Juan R. Zuñiga
 
Carrera de fondo - La continuada lucha de AngularJS - CodeMotion 2015
Carrera de fondo - La continuada lucha de AngularJS - CodeMotion 2015Carrera de fondo - La continuada lucha de AngularJS - CodeMotion 2015
Carrera de fondo - La continuada lucha de AngularJS - CodeMotion 2015José Manuel García García
 
Capas de acceso a datos .NET escalables de verdad: el batido perfecto para el...
Capas de acceso a datos .NET escalables de verdad: el batido perfecto para el...Capas de acceso a datos .NET escalables de verdad: el batido perfecto para el...
Capas de acceso a datos .NET escalables de verdad: el batido perfecto para el...Enrique Catala Bañuls
 
Meetup Spark y la Combinación de sus Distintos Módulos
Meetup Spark y la Combinación de sus Distintos MódulosMeetup Spark y la Combinación de sus Distintos Módulos
Meetup Spark y la Combinación de sus Distintos MódulosJorge Lopez-Malla
 

Similar a Codemotion 2014 Scala @real life (20)

ASP.NET vNext... Desarrollo cross platform
ASP.NET vNext... Desarrollo cross platformASP.NET vNext... Desarrollo cross platform
ASP.NET vNext... Desarrollo cross platform
 
Desarrollo de pruebas en entornos Java EE
Desarrollo de pruebas en entornos Java EEDesarrollo de pruebas en entornos Java EE
Desarrollo de pruebas en entornos Java EE
 
Spark Hands-on
Spark Hands-onSpark Hands-on
Spark Hands-on
 
Primeros pasos con Apache Spark - Madrid Meetup
Primeros pasos con Apache Spark - Madrid MeetupPrimeros pasos con Apache Spark - Madrid Meetup
Primeros pasos con Apache Spark - Madrid Meetup
 
Primeros pasos con Spark - Spark Meetup Madrid 30-09-2014
Primeros pasos con Spark - Spark Meetup Madrid 30-09-2014Primeros pasos con Spark - Spark Meetup Madrid 30-09-2014
Primeros pasos con Spark - Spark Meetup Madrid 30-09-2014
 
Aplicaciones escalables en la nube: mentiras y verdades
Aplicaciones escalables en la nube: mentiras y verdadesAplicaciones escalables en la nube: mentiras y verdades
Aplicaciones escalables en la nube: mentiras y verdades
 
Resilient Distributed Dataset - Analisis paper
Resilient  Distributed Dataset - Analisis paper Resilient  Distributed Dataset - Analisis paper
Resilient Distributed Dataset - Analisis paper
 
Spark
SparkSpark
Spark
 
Meetup Fun[ctional] spark with scala
Meetup Fun[ctional] spark with scalaMeetup Fun[ctional] spark with scala
Meetup Fun[ctional] spark with scala
 
Fun[ctional] spark with scala
Fun[ctional] spark with scalaFun[ctional] spark with scala
Fun[ctional] spark with scala
 
Primeros pasos con aurelia
Primeros pasos con aureliaPrimeros pasos con aurelia
Primeros pasos con aurelia
 
Scala @ Real life
Scala @ Real lifeScala @ Real life
Scala @ Real life
 
Ruby para Java Developers
Ruby para Java DevelopersRuby para Java Developers
Ruby para Java Developers
 
Análisis de datos con Apache Spark
Análisis de datos con Apache SparkAnálisis de datos con Apache Spark
Análisis de datos con Apache Spark
 
Del infierno al cielo
Del infierno al cieloDel infierno al cielo
Del infierno al cielo
 
Update Big Data 2014
Update Big Data 2014Update Big Data 2014
Update Big Data 2014
 
Creación de Builders y DSL's con Groovy
Creación de Builders y DSL's con GroovyCreación de Builders y DSL's con Groovy
Creación de Builders y DSL's con Groovy
 
Carrera de fondo - La continuada lucha de AngularJS - CodeMotion 2015
Carrera de fondo - La continuada lucha de AngularJS - CodeMotion 2015Carrera de fondo - La continuada lucha de AngularJS - CodeMotion 2015
Carrera de fondo - La continuada lucha de AngularJS - CodeMotion 2015
 
Capas de acceso a datos .NET escalables de verdad: el batido perfecto para el...
Capas de acceso a datos .NET escalables de verdad: el batido perfecto para el...Capas de acceso a datos .NET escalables de verdad: el batido perfecto para el...
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
Meetup Spark y la Combinación de sus Distintos MódulosMeetup Spark y la Combinación de sus Distintos Módulos
Meetup Spark y la Combinación de sus Distintos Módulos
 

Último

FICHA PROYECTO COIL- GLOBAL CLASSROOM.docx.pdf
FICHA PROYECTO COIL- GLOBAL CLASSROOM.docx.pdfFICHA PROYECTO COIL- GLOBAL CLASSROOM.docx.pdf
FICHA PROYECTO COIL- GLOBAL CLASSROOM.docx.pdfRaulGomez822561
 
La Sostenibilidad Corporativa. Administración Ambiental
La Sostenibilidad Corporativa. Administración AmbientalLa Sostenibilidad Corporativa. Administración Ambiental
La Sostenibilidad Corporativa. Administración AmbientalJonathanCovena1
 
AEC 2. Aventura en el Antiguo Egipto.pptx
AEC 2. Aventura en el Antiguo Egipto.pptxAEC 2. Aventura en el Antiguo Egipto.pptx
AEC 2. Aventura en el Antiguo Egipto.pptxhenarfdez
 
Actividades para el 11 de Mayo día del himno.docx
Actividades para el 11 de Mayo día del himno.docxActividades para el 11 de Mayo día del himno.docx
Actividades para el 11 de Mayo día del himno.docxpaogar2178
 
PINTURA DEL RENACIMIENTO EN ESPAÑA (SIGLO XVI).ppt
PINTURA DEL RENACIMIENTO EN ESPAÑA (SIGLO XVI).pptPINTURA DEL RENACIMIENTO EN ESPAÑA (SIGLO XVI).ppt
PINTURA DEL RENACIMIENTO EN ESPAÑA (SIGLO XVI).pptAlberto Rubio
 
Revista Apuntes de Historia. Mayo 2024.pdf
Revista Apuntes de Historia. Mayo 2024.pdfRevista Apuntes de Historia. Mayo 2024.pdf
Revista Apuntes de Historia. Mayo 2024.pdfapunteshistoriamarmo
 
Biografía de Charles Coulomb física .pdf
Biografía de Charles Coulomb física .pdfBiografía de Charles Coulomb física .pdf
Biografía de Charles Coulomb física .pdfGruberACaraballo
 
Concepto y definición de tipos de Datos Abstractos en c++.pptx
Concepto y definición de tipos de Datos Abstractos en c++.pptxConcepto y definición de tipos de Datos Abstractos en c++.pptx
Concepto y definición de tipos de Datos Abstractos en c++.pptxFernando Solis
 
ACRÓNIMO DE PARÍS PARA SU OLIMPIADA 2024. Por JAVIER SOLIS NOYOLA
ACRÓNIMO DE PARÍS PARA SU OLIMPIADA 2024. Por JAVIER SOLIS NOYOLAACRÓNIMO DE PARÍS PARA SU OLIMPIADA 2024. Por JAVIER SOLIS NOYOLA
ACRÓNIMO DE PARÍS PARA SU OLIMPIADA 2024. Por JAVIER SOLIS NOYOLAJAVIER SOLIS NOYOLA
 
Louis Jean François Lagrenée. Erotismo y sensualidad. El erotismo en la Hist...
Louis Jean François Lagrenée.  Erotismo y sensualidad. El erotismo en la Hist...Louis Jean François Lagrenée.  Erotismo y sensualidad. El erotismo en la Hist...
Louis Jean François Lagrenée. Erotismo y sensualidad. El erotismo en la Hist...Ars Erótica
 
La Evaluacion Formativa SM6 Ccesa007.pdf
La Evaluacion Formativa SM6  Ccesa007.pdfLa Evaluacion Formativa SM6  Ccesa007.pdf
La Evaluacion Formativa SM6 Ccesa007.pdfDemetrio Ccesa Rayme
 
Plan-de-la-Patria-2019-2025- TERCER PLAN SOCIALISTA DE LA NACIÓN.pdf
Plan-de-la-Patria-2019-2025- TERCER PLAN SOCIALISTA DE LA NACIÓN.pdfPlan-de-la-Patria-2019-2025- TERCER PLAN SOCIALISTA DE LA NACIÓN.pdf
Plan-de-la-Patria-2019-2025- TERCER PLAN SOCIALISTA DE LA NACIÓN.pdfcarolinamartinezsev
 
6°_GRADO_-_MAYO_06 para sexto grado de primaria
6°_GRADO_-_MAYO_06 para sexto grado de primaria6°_GRADO_-_MAYO_06 para sexto grado de primaria
6°_GRADO_-_MAYO_06 para sexto grado de primariaWilian24
 
Posición astronómica y geográfica de Europa.pptx
Posición astronómica y geográfica de Europa.pptxPosición astronómica y geográfica de Europa.pptx
Posición astronómica y geográfica de Europa.pptxBeatrizQuijano2
 
CONCURSO NACIONAL JOSE MARIA ARGUEDAS.pptx
CONCURSO NACIONAL JOSE MARIA ARGUEDAS.pptxCONCURSO NACIONAL JOSE MARIA ARGUEDAS.pptx
CONCURSO NACIONAL JOSE MARIA ARGUEDAS.pptxroberthirigoinvasque
 

Último (20)

FICHA PROYECTO COIL- GLOBAL CLASSROOM.docx.pdf
FICHA PROYECTO COIL- GLOBAL CLASSROOM.docx.pdfFICHA PROYECTO COIL- GLOBAL CLASSROOM.docx.pdf
FICHA PROYECTO COIL- GLOBAL CLASSROOM.docx.pdf
 
Los dos testigos. Testifican de la Verdad
Los dos testigos. Testifican de la VerdadLos dos testigos. Testifican de la Verdad
Los dos testigos. Testifican de la Verdad
 
La Sostenibilidad Corporativa. Administración Ambiental
La Sostenibilidad Corporativa. Administración AmbientalLa Sostenibilidad Corporativa. Administración Ambiental
La Sostenibilidad Corporativa. Administración Ambiental
 
AEC 2. Aventura en el Antiguo Egipto.pptx
AEC 2. Aventura en el Antiguo Egipto.pptxAEC 2. Aventura en el Antiguo Egipto.pptx
AEC 2. Aventura en el Antiguo Egipto.pptx
 
Actividades para el 11 de Mayo día del himno.docx
Actividades para el 11 de Mayo día del himno.docxActividades para el 11 de Mayo día del himno.docx
Actividades para el 11 de Mayo día del himno.docx
 
PINTURA DEL RENACIMIENTO EN ESPAÑA (SIGLO XVI).ppt
PINTURA DEL RENACIMIENTO EN ESPAÑA (SIGLO XVI).pptPINTURA DEL RENACIMIENTO EN ESPAÑA (SIGLO XVI).ppt
PINTURA DEL RENACIMIENTO EN ESPAÑA (SIGLO XVI).ppt
 
Revista Apuntes de Historia. Mayo 2024.pdf
Revista Apuntes de Historia. Mayo 2024.pdfRevista Apuntes de Historia. Mayo 2024.pdf
Revista Apuntes de Historia. Mayo 2024.pdf
 
Tema 11. Dinámica de la hidrosfera 2024
Tema 11.  Dinámica de la hidrosfera 2024Tema 11.  Dinámica de la hidrosfera 2024
Tema 11. Dinámica de la hidrosfera 2024
 
Biografía de Charles Coulomb física .pdf
Biografía de Charles Coulomb física .pdfBiografía de Charles Coulomb física .pdf
Biografía de Charles Coulomb física .pdf
 
Concepto y definición de tipos de Datos Abstractos en c++.pptx
Concepto y definición de tipos de Datos Abstractos en c++.pptxConcepto y definición de tipos de Datos Abstractos en c++.pptx
Concepto y definición de tipos de Datos Abstractos en c++.pptx
 
ACRÓNIMO DE PARÍS PARA SU OLIMPIADA 2024. Por JAVIER SOLIS NOYOLA
ACRÓNIMO DE PARÍS PARA SU OLIMPIADA 2024. Por JAVIER SOLIS NOYOLAACRÓNIMO DE PARÍS PARA SU OLIMPIADA 2024. Por JAVIER SOLIS NOYOLA
ACRÓNIMO DE PARÍS PARA SU OLIMPIADA 2024. Por JAVIER SOLIS NOYOLA
 
Novena de Pentecostés con textos de san Juan Eudes
Novena de Pentecostés con textos de san Juan EudesNovena de Pentecostés con textos de san Juan Eudes
Novena de Pentecostés con textos de san Juan Eudes
 
Louis Jean François Lagrenée. Erotismo y sensualidad. El erotismo en la Hist...
Louis Jean François Lagrenée.  Erotismo y sensualidad. El erotismo en la Hist...Louis Jean François Lagrenée.  Erotismo y sensualidad. El erotismo en la Hist...
Louis Jean François Lagrenée. Erotismo y sensualidad. El erotismo en la Hist...
 
La Evaluacion Formativa SM6 Ccesa007.pdf
La Evaluacion Formativa SM6  Ccesa007.pdfLa Evaluacion Formativa SM6  Ccesa007.pdf
La Evaluacion Formativa SM6 Ccesa007.pdf
 
Supuestos_prácticos_funciones.docx
Supuestos_prácticos_funciones.docxSupuestos_prácticos_funciones.docx
Supuestos_prácticos_funciones.docx
 
Plan-de-la-Patria-2019-2025- TERCER PLAN SOCIALISTA DE LA NACIÓN.pdf
Plan-de-la-Patria-2019-2025- TERCER PLAN SOCIALISTA DE LA NACIÓN.pdfPlan-de-la-Patria-2019-2025- TERCER PLAN SOCIALISTA DE LA NACIÓN.pdf
Plan-de-la-Patria-2019-2025- TERCER PLAN SOCIALISTA DE LA NACIÓN.pdf
 
6°_GRADO_-_MAYO_06 para sexto grado de primaria
6°_GRADO_-_MAYO_06 para sexto grado de primaria6°_GRADO_-_MAYO_06 para sexto grado de primaria
6°_GRADO_-_MAYO_06 para sexto grado de primaria
 
Posición astronómica y geográfica de Europa.pptx
Posición astronómica y geográfica de Europa.pptxPosición astronómica y geográfica de Europa.pptx
Posición astronómica y geográfica de Europa.pptx
 
Interpretación de cortes geológicos 2024
Interpretación de cortes geológicos 2024Interpretación de cortes geológicos 2024
Interpretación de cortes geológicos 2024
 
CONCURSO NACIONAL JOSE MARIA ARGUEDAS.pptx
CONCURSO NACIONAL JOSE MARIA ARGUEDAS.pptxCONCURSO NACIONAL JOSE MARIA ARGUEDAS.pptx
CONCURSO NACIONAL JOSE MARIA ARGUEDAS.pptx
 

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