Scala @RealLife es una presentación ofrecida durante el Codemotion 2014 en Madrid que habla acerca de la realidad de Scala y el ecosistema de Typesafe en la actualidad.
Introduction to Akka 2. Explains what Akka's actors are all about and how to utilize them to write scalable and fault-tolerant systems.
Talk given at JavaZone 2012.
Te has preguntado alguna vez ¿Existe vida después de ActiveRecord::Base? si es así, en esta charla vamos descubrir que Rails es algo más que un simple MVC, es un framework repleto de herramientas cuyo conocimiento nos va a facilitar enormemente la vida.
Con estas herramientas vas a poder extender Rails de una forma que no habías imaginado hasta ahora: crearas tus propios validadores, responders y renderers; serás capaz de enviar datos por streaming, de interceptar mails o añadir un nuevo middleware a tu stack.
Queremos mostrar 10 de estas herramientas junto con ejemplos de uso de cada una de ellas, para que las puedas incorporar poco a poco en tu día a día y descubras el mundo de posibilidades que realmente tienes en tus manos.
El conjunto de herramientas que vamos a mostrar es:
ActiveModel::Model
ActiveModel::Validator
ActiveSupport::Concern
ActionSupport::Notifications
ActionController::Renderers
ActionController::Responder
ActionController::Live
ActionView::Resolvers
ActionMailer Interceptors
Rack Middleware
Introduction to Akka 2. Explains what Akka's actors are all about and how to utilize them to write scalable and fault-tolerant systems.
Talk given at JavaZone 2012.
Te has preguntado alguna vez ¿Existe vida después de ActiveRecord::Base? si es así, en esta charla vamos descubrir que Rails es algo más que un simple MVC, es un framework repleto de herramientas cuyo conocimiento nos va a facilitar enormemente la vida.
Con estas herramientas vas a poder extender Rails de una forma que no habías imaginado hasta ahora: crearas tus propios validadores, responders y renderers; serás capaz de enviar datos por streaming, de interceptar mails o añadir un nuevo middleware a tu stack.
Queremos mostrar 10 de estas herramientas junto con ejemplos de uso de cada una de ellas, para que las puedas incorporar poco a poco en tu día a día y descubras el mundo de posibilidades que realmente tienes en tus manos.
El conjunto de herramientas que vamos a mostrar es:
ActiveModel::Model
ActiveModel::Validator
ActiveSupport::Concern
ActionSupport::Notifications
ActionController::Renderers
ActionController::Responder
ActionController::Live
ActionView::Resolvers
ActionMailer Interceptors
Rack Middleware
Con el uso de CDI, para la inyección de dependencias, y la consolidación de la plataforma Arquillian, ya no hay excusas en la plataforma Java EE para el desarrollo de pruebas.
Primeros pasos con Apache Spark - Madrid Meetupdhiguero
Primeros pasos con Spark dentro del Apache Spark Meetup group de Madrid (http://www.meetup.com/Madrid-Apache-Spark-meetup/events/198362002/)
Contenido:
- Introdución
- Conceptos básicos
- Ecosistema Spark
- Instalación del entorno
- Errores comunes
Desarrollar para la nube no es tan transparente como creemos. Conocer correctamente este nuevo entorno, así como sus limitaciones nos ayudarán a evitar problemas de escalabilidad. En esta sesión veremos cómo desarrollar correctamente soluciones para la nube de Microsoft que sean escalables. Veremos ejemplos de lo que no es escalable y también veremos cómo podemos solucionarlo y evitarlo. Hablaremos de patrones de arquitectura, Unity, Entity Framework, capas de acceso a datos, worker roles, web roles,… escalabilidad!
Slides de la charla "Carrera de fondo: la continuada lucha de AngularJS" realizada en el CodeMotion 2015 (Madrid). En ella se hace una introducción al desarrollo frontend, librerías más utilizadas y panorama actual.
Después de una breve introducción al funcionamiento de Backbone se realiza el desarrollo y la exposición de los conceptos del framework a nivel básico y medio.
Los ejemplos desarrollados para esta charla están alojados en github: https://github.com/semagarcia/angularjs-codemotion-2015
Con el uso de CDI, para la inyección de dependencias, y la consolidación de la plataforma Arquillian, ya no hay excusas en la plataforma Java EE para el desarrollo de pruebas.
Primeros pasos con Apache Spark - Madrid Meetupdhiguero
Primeros pasos con Spark dentro del Apache Spark Meetup group de Madrid (http://www.meetup.com/Madrid-Apache-Spark-meetup/events/198362002/)
Contenido:
- Introdución
- Conceptos básicos
- Ecosistema Spark
- Instalación del entorno
- Errores comunes
Desarrollar para la nube no es tan transparente como creemos. Conocer correctamente este nuevo entorno, así como sus limitaciones nos ayudarán a evitar problemas de escalabilidad. En esta sesión veremos cómo desarrollar correctamente soluciones para la nube de Microsoft que sean escalables. Veremos ejemplos de lo que no es escalable y también veremos cómo podemos solucionarlo y evitarlo. Hablaremos de patrones de arquitectura, Unity, Entity Framework, capas de acceso a datos, worker roles, web roles,… escalabilidad!
Slides de la charla "Carrera de fondo: la continuada lucha de AngularJS" realizada en el CodeMotion 2015 (Madrid). En ella se hace una introducción al desarrollo frontend, librerías más utilizadas y panorama actual.
Después de una breve introducción al funcionamiento de Backbone se realiza el desarrollo y la exposición de los conceptos del framework a nivel básico y medio.
Los ejemplos desarrollados para esta charla están alojados en github: https://github.com/semagarcia/angularjs-codemotion-2015
La Unidad Eudista de Espiritualidad se complace en poner a su disposición el siguiente Triduo Eudista, que tiene como propósito ofrecer tres breves meditaciones sobre Jesucristo Sumo y Eterno Sacerdote, el Sagrado Corazón de Jesús y el Inmaculado Corazón de María. En cada día encuentran una oración inicial, una meditación y una oración final.
SEMIOLOGIA DE HEMORRAGIAS DIGESTIVAS.pptxOsiris Urbano
Evaluación de principales hallazgos de la Historia Clínica utiles en la orientación diagnóstica de Hemorragia Digestiva en el abordaje inicial del paciente.
Presentación de la conferencia sobre la basílica de San Pedro en el Vaticano realizada en el Ateneo Cultural y Mercantil de Onda el jueves 2 de mayo de 2024.
1. Scala Programming @ Madrid
MADRID · NOV 21-22 · 2014
Scala @ Real Life
Javier Santos y David Vallejo
2. Scala Programming @ Madrid
MADRID · NOV 21-22 · 2014
¿Quienes somos?
David Vallejo @dvnavarro
«Una expresión regular es una
expresión que no es del todo buena,
pero tampoco del todo mala.»
@borjamonserrano
Javier Santos @jpaniego
«Hay dos formas de programar sin
errores; solo la tercera funciona»
Alan J Perlis
4. Scala Programming @ Madrid
MADRID · NOV 21-22 · 2014
Índice
❑ Proyecto Antulus
❑ Introducción a Scala
❑ Features
❑ Herramientas
❑ Core – Akka
❑ Datos maestros – Slick
❑ Big data – Spark
❑ API – Spray
❑ Web – Play
❑ Realidad actual
❑ Conclusiones
5. Scala Programming @ Madrid
MADRID · NOV 21-22 · 2014
Proyecto Antulus
❑ Objetivo
❑ Ejemplo: SETI@Home
❑ Calculadora distribuida colaborativa
❑ P2P unidades de cálculo
❑ Motivación
❑ Ley Moore -> Multicore
❑ Gran cantidad de datos (Big data)
❑ Aplicaciones
❑ Analytics tendencias mercado
❑ Proyectos investigación genética
❑ Previsión meteorológica
❑ Grafos de afinidad (donantes compatibles, parejas, …).
14. Scala Programming @ Madrid
Aprender Scala en 5 minutos
MADRID · NOV 21-22 · 2014
15. Scala Programming @ Madrid
MADRID · NOV 21-22 · 2014
¿Qué es ?
❑ Lenguaje de propósito general que corre en la JVM
❑ Martin Odersky. EPFL. Carencias de otros lenguajes.
❑ Typesafe (2011)
❑ Características principales
❑ Herencia múltiple
❑ Tipado estático
❑ Inferencia de tipos
❑ Multiparadigma:
❑ Funcional
❑ Orientado a objetos
❑ Aplicaciones de banca, DSLs, …
❑ REPL
16. Scala Programming @ Madrid
MADRID · NOV 21-22 · 2014
: Traits
trait Animal {
def sound: String
}
trait Cat extends Animal {
override def sound = "Miau"
}
trait Dog extends Animal {
override def sound = "Guau"
}
class Fox extends Cat with Dog
18. Scala Programming @ Madrid
MADRID · NOV 21-22 · 2014
: Traits
class Fox extends Cat with Dog
val fox = new Fox()
println(fox.sound) //Returns Guau
19. Scala Programming @ Madrid
MADRID · NOV 21-22 · 2014
: Case classes
case class Point(x: Int, y: Int)
val point1 = Point(1, 1)
point.x
point.y
val point2 = point1.copy(y = 2)
20. Scala Programming @ Madrid
MADRID · NOV 21-22 · 2014
: Pattern Matching
line.getMiddlePoint match {
case Point(1, 2) => …
case Point(x, y) => ...
case Point(x, _) if x > 0 => ...
case point @ Point(x, y) => ...
case _ => ...
}
21. Scala Programming @ Madrid
MADRID · NOV 21-22 · 2014
: Implicits
case class Point(x: Int, y: Int)
implicit def tupleToPoint(tuple: (Int, Int)) =
Point(tuple._1, tuple._2)
def sumPoints(p1: Point, p2: Point) =
Point(p1.x + p2.x, p1.y + p2.y)
val p1: Point = Point(1, 2)
val p2: (Int, Int) = (3, 4)
sumPoints(p1, p2)
22. Scala Programming @ Madrid
: Higher order functions
MADRID · NOV 21-22 · 2014
object Calculator {
type Term = Int
type Result = Int
type Operation = (Term, Term) => Result
val add: Operation = (n1, n2) => n1 + n2
val sub: Operation = (n1, n2) => n1 - n2
val mul: Operation = (n1, n2) => n1 * n2
def calculate(n1: Term, n2: Term)(f: Operation): Result =
f(n1, n2)
}
23. Scala Programming @ Madrid
: Higher order functions
MADRID · NOV 21-22 · 2014
object MyCalculus {
import Calculator._
val simpleAdd = calculate(2, 5)(add)
val customCalculus = calculate(1, 6)((n1, n2) => n1 * n2 + 10)
}
24. Scala Programming @ Madrid
: …movidas varias.
MADRID · NOV 21-22 · 2014
❑ Renombrado de tipos
import com.antulus.{Calculator => CalculatorAux}
❑ Notación infija, métodos como funciones.
names.foreach(name => println(name))
names foreach println
❑ Inferencia de punto y comas
27. Scala Programming @ Madrid
MADRID · NOV 21-22 · 2014
Core -
❑ CQRS/ES
❑ Akka-Persistence
❑ Clustering
❑ Cluster sharding
28. Scala Programming @ Madrid
MADRID · NOV 21-22 · 2014
Core –
CQRS/ES
«CQRS stands for Command Query Responsibility Segregation.
It's a pattern that I first heard described by Greg Young. At its heart
is a simple notion that you can use a different model to update
information than the model you use to read information” – Martin
Fowler
“Event Sourcing ensures that all changes to application state are
stored as a sequence of events. Not just can we query these
events, we can also use the event log to reconstruct past
states[...].” – Martin Fowler
31. Scala Programming @ Madrid
MADRID · NOV 21-22 · 2014
Core –
❑ Clustering
❑ En application.conf
❑ Actor Provider:
akka.cluster.ClusterActorRefProvider
❑ Lista de nodos del clúster:
akka.contrib.pattern.ClusterClient
❑ En el snippet de Scala
❑ Habilitar la «recepcionista»
ClusterReceptionistExtension(system)
.registerService(clusterListener)
33. Scala Programming @ Madrid
MADRID · NOV 21-22 · 2014
Core –
❑ Clustering – semántica de envíos
❑ Send: El mensaje se envía a un único actor del cluster que
coincida con el path. Si hay varios que coinciden, se
entrega a uno de ellos aleatoriamente.
clusterClient ! Send(«/user/handler», «hello»,
localAffinity = true)
❑ SendToAll: El mensaje se envía a todos los actores que
encajen con el path.
clusterClient ! SendToAll(«/user/handler», «hi»)
❑ Publish: El mensaje se envía a todos los actores suscritos
al topic en el que se publica
clusterClient ! Publish(«myTopic», «hello»)
34. Scala Programming @ Madrid
MADRID · NOV 21-22 · 2014
Core –
❑ Cluster sharding
❑ Garantiza dos cosas
❑ Balanceo de carga: En caso de que se añada un
nuevo nodo o que se caiga otro, el número total de
actores se "balancea" entre el resto de nodos.
❑ Identificación de manera inequívoca de un actor, de
manera que los mensajes dirigidos al mismo actor
siempre serán redirigidos al nodo que maneja dicho
actor; o dicho de otra forma, no se podrá dar el caso en
el que dos nodos procesen un mensaje dirigido al
mismo actor.
35. Scala Programming @ Madrid
MADRID · NOV 21-22 · 2014
Core –
❑ Cluster sharding – Semántica
❑ Entry: Representa una entidad identificada de manera
inequívoca y de estado persistente (Agregado).
❑ Shard: Agrupación de entries. Recomendación:
NºShards = 10 x NºMaxNodos
❑ ShardRegion: Agrupación de shards del mismo Entry.
36. Scala Programming @ Madrid
MADRID · NOV 21-22 · 2014
Core –
❑ Cluster sharding – Requisitos de implementación
❑ Arrancar extensión de Sharding
ClusterSharding(myAkkaSystem)
❑ Arrancar los ShardRegion para los tipos de entries que
manejemos
sharding.start(
typeName = «MyAggregate»,
entryProps = Some(Props[MyAggregate]),
idExtractor = MyAggregate.idExtractor,
shardResolver = MyAggregate.shardResolver)
39. Scala Programming @ Madrid
MADRID · NOV 21-22 · 2014
Unidad de cálculo –
❑ Herramienta orientada al Big Data
❑ Distribución de datos
❑ Analytics
❑ ¿Sustituto de ?
40. Scala Programming @ Madrid
MADRID · NOV 21-22 · 2014
Unidad de cálculo –
class Job()(implicit context: SparkContext){
val myRdd: RDD[Int] = context.parallelize(1 to 10
toList)
def mutateMyRDD(rdd: RDD[Int]): Int =
rdd.map(_*2).reduce(_+_)
def mutateThis(rdd: RDD[Int]):RDD[(String,Int)] =
rdd.map(n => n.toString -> n*3)
}
val job = new Job()
println(job.mutateMyRDD(job.myRdd)) //110
41. Scala Programming @ Madrid
MADRID · NOV 21-22 · 2014
Unidad de cálculo -
val conf =
new SparkConf().set("cassandra.connection.host", "localhost")
implicit val context =
new SparkContext(conf)
val myTable = context.cassandraTable[(String, Int)](
"myKeyspace",
"myTable")
// Same declaration of Job class
val job = new Job()
job. mutateThis(job.myRdd).saveToCassandra("myKeyspace",
"myTable")
43. Scala Programming @ Madrid
Datos maestros -
❑ Librería de acceso y consulta a bases de datos para Scala
MADRID · NOV 21-22 · 2014
❑ Soporte para múltiples drivers:
❑ DB2,Microsoft Access, Microsoft SQL, PostgreSQL, SQLite,
…
❑ Query API’s:
❑ Lifted embedding: Standard. No utiliza tipos Scala
directamente
❑ Direct embedding: Experimental. Macros
❑ Permite utilizar SQL embebido (RawSql)
❑ Se trabaja continuamente con colecciones Scala
44. Scala Programming @ Madrid
MADRID · NOV 21-22 · 2014
Datos maestros -
❑ Lifted embedding
class Users(tag: Tag) extends Table[(String, Int)](tag,
"USERS") {
def name = column[String]("USER_NAME", O.PrimaryKey)
def age = column[Int]("AGE")
def * = (name, age)
}
val users = TableQuery[Users]
❑ Direct embedding
@table(name = "USERS")
case class User(
@column(name = "NAME") name: String,
@column(name = "AGE") age: Int)
45. Scala Programming @ Madrid
MADRID · NOV 21-22 · 2014
Datos maestros -
❑ Querying…
val q1 = users.filter(_.name === "User1")
// compiles to SQL (simplified):
// select "NAME", "AGE"
// from "USERS"
// where "NAME" = "User1"
val q2 = users.drop(10).take(5)
// compiles to SQL (simplified):
// select "NAME", "AGE"
// from "USERS"
// limit 5 offset 10
val q3 = users.sortBy(_.name.desc.nullsFirst)
// compiles to SQL (simplified):
// select "NAME", "AGE"
// from "USERS"
// order by "NAME" desc nulls first
47. Scala Programming @ Madrid
MADRID · NOV 21-22 · 2014
API Rest -
❑ Creación de API’s REST
❑ Arquitectura basada en actores
❑ Futuro Akka-HTTP
❑ Permite peticiones asíncronas.
❑ Incluye DSL para testing
48. Scala Programming @ Madrid
MADRID · NOV 21-22 · 2014
API Rest -
❑ Creando rutas
val route: Route =
path("job" / HexIntNumber) { id =>
get {
complete {
s"Getting Calculus job status for $id."
}
} ~
put {
complete {
s"Updated Calculus job with id $id."
}
}
}
49. Scala Programming @ Madrid
MADRID · NOV 21-22 · 2014
API Rest -
❑ Serializadores
case class Job(
id: Int,
description: String,
tags: List[String]
)
object MyJsonProtocol extends DefaultJsonProtocol {
implicit val jobFormat = jsonFormat3(Job)
}
50. Scala Programming @ Madrid
MADRID · NOV 21-22 · 2014
API Rest -
❑ Testing
"return a job" in {
Get("/job/1") ~> route ~> check {
responseAs[String] must contain(
"Getting Calculus job status for 1.")
}
}
52. Scala Programming @ Madrid
MADRID · NOV 21-22 · 2014
Interfaz web -
❑ Framework para construir aplicaciones web
❑ Construido sobre Akka
❑ Modelo vista-controlador
❑ Disponible también para Java
53. Scala Programming @ Madrid
MADRID · NOV 21-22 · 2014
Interfaz web -
object MyCalculator extends Controller {
def calculate(op: Operation) = Action {
doOperation(op) match {
case Success(result) =>
Ok("Result: " + result)
case Failure(t) =>
InternalServerError
}
}
}
54. Scala Programming @ Madrid
MADRID · NOV 21-22 · 2014
¿Se puede vivir de esto?
55. Scala Programming @ Madrid
Uso de Scala - Datos Meetup
MADRID · NOV 21-22 · 2014
56. Scala Programming @ Madrid
MADRID · NOV 21-22 · 2014
Uso de Scala - Empresas
57. Scala Programming @ Madrid
MADRID · NOV 21-22 · 2014
Ámbito laboral
❑ Para la empresa:
❑ Desarrolladores escasos
❑ Dificultad para formar a otros desarrolladores
❑ Miedo al cambio
❑ Para los programadores:
❑ Poca oferta nacional
59. Scala Programming @ Madrid
MADRID · NOV 21-22 · 2014
Conclusiones
❑ Dos enfoques
❑ Principiantes: sin experiencia extensa en lenguajes como C++ o
Java. ¿Mayor facilidad para cambiar al «chip» funcional?
❑ Gente del mundo Java: facilidad de adaptarse progresivamente
(Uso de var’s, bucles while, …).
❑ En cualquier caso: «A escribir se aprende leyendo»
❑ Jugar y consultar la REPL siempre en caso de duda.
60. Scala Programming @ Madrid
MADRID · NOV 21-22 · 2014
Conclusiones
❑ Tecnologías nuevas
❑ Poca documentación
❑ Comunidad escasa
❑ Escalables, distribuidas y clusterizables