Translate

domingo, 18 de marzo de 2018

Ecosistema Spark



Como hemos dicho anteriormente un ecosistema big data cuenta normalmente con varios productos, los cuales proveen diferentes funcionalidades.

En el caso de spark, no es una excepción. Apache Spark incluye: 

Spark Streaming, Se utiliza para procesar información en tiempo real. Esto apoyados en un pequeño sistema micro-batch. A la vez esto usa Dstream que es una serie de RDDs que se procesan en tiempo real. Y para él que no sabe que es RDD (como yo) RDD es Resilient Distributed Dataset  (RDD), la abstracción básica en Spark. Representa una colección de elementos inmutables y divididos que se pueden operar en paralelo.

Spark SQL permite exponer datos de dataset de spark bajo una API Jdbs y permite ejecutar consultas SQL-like con datos de Spark. Tambie permite estraer datos en diferentes formatos.

Spark MLlib : es una librería de maching learning de spark. Esta consiste en los algoritmos comunes de maching learning y utilidades. 

Spark GraphX : Es la API de Grafos y procesamiento de grafos en paralelo. GraphX amplía a Spark RDD al introducir las propiedades de gráfos distribuidos resistente: un multi-grafo dirigido con propiedades asociadas a cada vértice y borde. Para admitir el cálculo de grafos, GraphX expone un conjunto de operadores fundamentales (por ejemplo, subgraph, joinVertices y aggregateMessages) y una variante optimizada de Pregel API. Además, GraphX incluye una creciente colección de algoritmos y constructores de grafos para simplificar el análisis de grafos.

Aparte de estas librerías, hay otros framework que se integran muy bien con Spark:

Alluxio (anteriormente conocido como Tachyon) es un sistema de archivos distribuidos centrado en memoria, que permite compartir archivos de forma segura en un cluster basado en Spark y mapReduce. Este framework cachea un conjunto de datos en memoria, evitando ir a disco a buscar los conjunto de datos frecuentes. Esto permite acelerar el trabajo con Spark.

BlinkDb: es un motor de consulta aproximada para ejecutar consultas SQL interactivas en grandes volúmenes de datos. Permite a los usuarios intercambiar la precisión de la consulta por el tiempo de respuesta. Funciona en grandes conjuntos de datos ejecutando consultas en muestras de datos y presentando resultados con un rango de error significativas. Las versiones posteriores de BlinkDB se mantienen bajo un nuevo proyecto llamado iOLAP.


viernes, 16 de marzo de 2018

Replicas en Oracle 10g con streams parte 2


Continuemos con la captura y replicación de flujos de datos.

En un entorno Streams podemos capturar los eventos de la siguiente manera: Proceso de captura o aplicación personalizada.

Los cambios de objetos de la base son escritos en el area de redologs, dado que ante un error oracle puede volver a una versión consistente y estable. Un proceso de captura es un proceso en segundo plano de Oracle que lee el registro de redolog de la base de datos para capturar los cambios de DML y DDL realizados a los objetos de la base de datos. La base de datos de origen es la base de datos donde se generó el cambio en el registro de redolog. Un proceso de captura formatea estos cambios en mensajes llamados LCR y los envía a una cola. Como un proceso de captura en ejecución captura automáticamente los cambios en función de sus reglas, la captura de cambios mediante un proceso de captura a veces se denomina captura implícita.

Hay dos tipos de LCR: una LCR de fila contiene información sobre un cambio en una fila de una tabla resultante de una operación de DML, y una LCR de DDL contiene información sobre un cambio de DDL en un objeto de base de datos. Se debe utiliza reglas para especificar qué cambios se capturan. Una sola operación DML puede cambiar más de una fila en una tabla. Por lo tanto, una sola operación DML puede generar más de una LCR de fila, y una sola transacción puede consistir en múltiples operaciones DML.

Los cambios son capturados por capture user o usuario de captura, el capture user captura todos los cambios que cumplan con el conjunto de reglas (DML o DDL)

Un proceso de captura de procesos, puede capturar cambios de una base local o de una base remota.

Downstream capture significa que un proceso de captura se ejecuta en una base de datos que no sea la base de datos de origen. Se pueden configurar de la siguiente manera :
  • Una configuración Downstream capture en tiempo real, significa que los servicios de transporte redolog utilizan el log writer process (LGWR) o proceso de escritura de redolog como origen para enviar datos desde el registro de redolog en línea a la base de datos downstream. En la base de datos downstream, un proceso de servidor de archivos remoto (RFS) recibe los datos de redolog y los almacena en el registro de redolog como en espera, y el archivador en la base de datos descendente archiva los datos de redolog en el registro de redolog en espera. El proceso Downstream en tiempo real captura los cambios desde el registro de redolog en espera siempre que sea posible y desde el registro de redolog archivado siempre que sea necesario.

  • Una configuración archived-log downstream capture, significa que los archivos de redolog archivados de la base de datos de origen se copian en la base de datos Downstream. Puede copiar los archivos de redolog archivados en la base de datos downstream utilizando los servicios de transporte de redolog, el paquete DBMS_FILE_TRANSFER, el protocolo de transferencia de archivos (FTP) o algún otro mecanismo.


Un proceso de captura Downstream en tiempo real lee el registro de redolog en espera siempre que sea posible y, de lo contrario, los redologs archivados

La otra manera de capturar datos es con una aplicación personalizada. Esta aplicacion puede capturar los datos desde los logs de transacciones, triggers o otros metodos. La aplicacion debe capturar el cambio y debe convertir este cambio a LCR y luego debe encolar este LCR en la cola de la base destino para hacer esto se pueden utilizar los paquetes DBMS_STREAMS_MESSAGING o DBMS_AQ. La aplicación debe commitiar despues de encolar los LCRs de cada transacción.

Una vez capturados los cambios debemos propagarlos.

En un entorno de replicación de Streams, los procesos de propagacion propagan los cambios capturados. Las propagaciones permiten propagar los LCR origen a las bases de datos destinos.

Las siguientes secciones describen la puesta en escena y la propagación en un entorno de replicación de Streams:
LCR Staging : Los LCR capturados se organizan en un área de preparación. En Streams, el área de preparación es una cola que puede almacenar LCR y DDL LCR, así como otros tipos de mensajes. Los LCR capturados se organizan en una cola, que es la System Global Area (SGA) asciada con una cola.

Los LCR pueden propagarse mediante una propagación o aplicarse mediante un proceso de aplicación, y un LCR Staging  determinado puede propagarse y aplicarse. Una propagación en ejecución propaga automáticamente las LCR basadas en las reglas de sus conjuntos de reglas, y un proceso de aplicación en ejecución aplica LCR automáticamente .

LCR Propagation:En un entorno de replicación de Streams, una propagación normalmente propaga LCR desde una cola en la base de datos local a una cola en una base de datos remota. La cola a partir de la cual se propagan los LCR se denomina cola de origen, y la cola que recibe los LCR se denomina cola de destino. Puede haber una relación de uno a muchos, muchos a uno o muchos a muchos entre las colas de origen y destino.

Incluso después de que un LCR se propaga por una propagación o se aplica mediante un proceso de solicitud, puede permanecer en la cola de origen si también ha configurado Flujos para propagar el LCR a una o más colas diferentes. Además, observe que una cola ANYDATA puede almacenar mensajes de usuario que no sean LCR. Normalmente, los mensajes de usuario que no son de LCR se utilizan para aplicaciones de mensajería, no para la replicación.

Puede configurar un entorno de replicación de Streams para propagar LCR a través de una o más bases de datos intermedias antes de llegar a una base de datos de destino. Tal entorno de propagación se llama red dirigida. Un LCR puede o no ser procesado por un proceso de solicitud en una base de datos intermedia. Las reglas determinan qué LCR se propagan a cada base de datos de destino y puede especificar la ruta que recorrerán los LCR en su camino hacia una base de datos destino.

La ventaja de usar una red dirigida es que una base de datos de origen no necesita tener una conexión de red física con la base de datos de destino. Entonces, si desea que los LCR se propaguen de una base de datos a otra, pero no hay conexión de red directa entre las computadoras que ejecutan estas bases de datos, puede propagar los LCR sin reconfigurar su red, siempre que una o más bases de datos intermedias conecten el base de datos de origen a la base de datos de destino. Si usa redes dirigidas, y un sitio intermedio se apaga durante un período de tiempo prolongado o si se elimina, entonces es posible que necesite reconfigurar la red y el entorno de Streams.

Dejo link: https://docs.oracle.com/cd/B19306_01/server.102/b14228/gen_rep.htm


martes, 13 de marzo de 2018

Características de Apache Spark


Spark mejora MapReduce con menos costos de procesamiento de datos.

Con capacidades como el almacenamiento de datos en memoria y el procesamiento casi en tiempo real, puede ejecutarse varias veces más rápido que otras tecnologías de big data.

Spark también soporta evaluación perezosa de consulta big-data, lo que ayuda a optimizar los pasos en los flujos de trabajo de procesamiento de datos. Proporciona una API de nivel superior para mejorar la productividad del desarrollador y una arquitectura coherente para soluciones de big-data.

Spark guarda los resultados intermedios en memoria en lugar de escribirlos en el disco, lo que es eficiente, especialmente cuando tenemos que trabajar en el mismo conjunto de datos varias veces. Está diseñado para ser un motor de ejecución que funciona tanto en la memoria como en el disco. Los operadores de Spark realizan operaciones externas cuando los datos no entran en la memoria. Spark se puede usar para procesar conjuntos de datos que exceden la memoria agregada en un cluster.

Spark intentará almacenar tantos datos en la memoria como sea posible y luego guardara en disco. Puede almacenar parte de un conjunto de datos en la memoria y los datos restantes en el disco. Con este almacenamiento de datos en memoria luego en disco, Spark consigue la ventaja de rendimiento.

Otras características incluyen:

  • Soporta más que las funciones map y reduce
  • La Api soporta Scala, Java y Python
  • La consola interactiva soporta Scala y Python.


Spark fue escrito en Scala por lo que corre en la JVM y actualmente soporta para el desarrollo:

  • Scala
  • Java
  • Python
  • R
  • Clojure y los lenguajes soportados por la Jvm


lunes, 12 de marzo de 2018

Replicas en Oracle 10g con streams


La replicación es el proceso de compartir objetos y datos de bases de datos en múltiples bases de datos. Los datos y los objetos de la base de datos se mantienen sincronizados en todas las bases de datos en el entorno de replicación. En un entorno de replicación de Streams, la base de datos donde se origina un cambio se denomina base de datos fuente, y una base de datos donde se comparte un cambio se denomina base de datos de destino.

Podemos replicar DDL y/o DML, para esto necesitamos hacer los siguientes pasos:

1.Capturar un cambio o un conjunto de cambios (logical change records o LCRs) y encolarlo en la cola dentro de la cola de cambios. Un LCR es mensaje con un formato determinado que especifica un cambio. EL LCR encapsula los cambios a realizar.
2.Propagar el LRC a otras colas, es decir a otras base de datos.
3.Aplicar el LRC a la base destino, esto se puede hacer desde la cola o de forma directa tambien.

Por lo tanto los pasos 1 y 3 son obligatorios y el 2 es opcional dado que se puede aplicar el LRC de forma directa.

A la vez tenemos reglas de replicación, una regla indica una acción cuando ocurre un evento y si se cumple una condición. Las reglas son evaluadas por el motor de reglas de oracle. Cada uno de los siguientes pasos son ejecutados por un motor de reglas:

  • Captura de proceso
  • Propagación
  • Aplicar proceso

Se puede tener control del comportamiento de los clientes Streams usando reglas. Un conjunto o set de reglas es una colección de reglas. En un entorno de replicación, un clinte hace una acción si el LCR sateface el conjunto de reglas.

En general, un cambio satisface los conjuntos de reglas para un cliente de Streams si ninguna regla en el conjunto de reglas negativas se evalúa como TRUE para el LCR, y al menos una regla en el conjunto de reglas positivas se evalúa como TRUE para el LCR. Si un cliente de Streams está asociado con un conjunto de reglas positivas y negativas, entonces el conjunto de reglas negativas siempre se ejecutara antes.

Específicamente, podemos controlar el flujo de información en un entorno de replicación de Streams de las siguientes maneras:

  • Especifique los cambios que se deben capturar desde el area de redolog. Si hay un cambio en el area de redolog que aplica el conjunto de reglas este sera capturado.
  • Especifique los LCR una propagación debe propagar.
  • Especifique las LCR se deben aplicar o descarta en una cola destino.


Debemos utilizar el paquete de pl/sql DBMS_STREAMS_ADM para crear reglas de replicación. Podemos crear reglas en los siguientes niveles:

  • Tabla: Contiene reglas para el cambio de una tabla en particular
  • Esquema: Contiene reglas para el cambio de un esquema en particular
  • Global: Se aplica a toda la base de datos.


A la vez, podemos discriminar las reglas en las que aplican DML o DDL pero no las 2 al mismo tiempo.

Streams replication soporta que se repliquen objetos que no tengan la misma estructura. Es decir en la base destino puede cambiar su estructura. Para esto es necesario utilizar una lregla de transformación, la cual lleve al cambio al formato destino.

Hay 2 tipos de reglas de transformación: declarativas o personalizadas. Las reglas declarativas de transformación o Declarative rule-based transformations (en ingles) permiten cambios en un conjunto de tablas o esquemas. Podemos cambiar el esquema o nombre de tabla o agregar una columna o eliminarla, etc.

En cambio las reglas personalizadas o custom, llaman a una función pl/sql que hace la transformación.

Streams también admite subconjuntos de datos de tablas mediante el uso de reglas de subconjuntos. Si una tabla compartida en una base de datos en un entorno de replicación de Streams contiene solo un subconjunto de datos, entonces puede configurar Flujos para administrar los cambios en una tabla, de modo que solo el subconjunto de datos apropiado se comparta con la tabla de subconjuntos. Por ejemplo, una base de datos particular puede mantener datos para los empleados en un departamento particular solamente. En este caso, puede usar reglas de subconjunto para compartir cambios en los datos para los empleados en ese departamento con la tabla de subconjuntos, pero no para los empleados de otros departamentos.

La subconjunto puede realizarse en cualquier punto del flujo de información de flujos. Es decir, un proceso de captura puede usar una regla de subconjunto para capturar un subconjunto de cambios en una tabla particular, una propagación puede usar una regla de subconjunto para propagar un subconjunto de cambios a una tabla particular y un proceso de aplicación puede usar una regla de subconjunto para aplicar solo un subconjunto de cambios a una tabla en particular.

Por ahora esta la idea general, en proximos post seguiremos en más detalle.

Dejo link: https://docs.oracle.com/cd/B19306_01/server.102/b14228/gen_rep.htm

domingo, 11 de marzo de 2018

Linux esta disponible en la Microsoft Store


Ya esta, lo he visto todo... Puedo morir en paz.

Si si, Linux esta disponible en la Microsoft Store. Es decir podemos instalar virtuales de linux desde el Microsoft Store. En realidad no son virtuales, son como virtuales. Internamente usa el sistema WSL (windows subsystem for Linux)

WSL proporciona una interfaz de kernel compatible con Linux desarrollada por Microsoft (que no contiene ningún código de kernel de Linux), que luego puede ejecutar un sistema operativo Linux.

Actualmente podemos instalar :

  • Ubuntu
  • Debian
  • SUSE Linux Enterprise Servers
  • OpenSUSE
  • Kali Linux


Igualmente es mejor instalar Linux y listo!!

jueves, 8 de marzo de 2018

Java EE se transforma en Jakarta EE


Me hago eco de esta noticia (medio tarde)

Dado que oracle quiere soltar Java EE pero no quiere soltar el nombre Java por lo tanto ahora se va a llamar Jakarta EE.

Y varios proyectos han cambiado nombres dado este cambio. Ahora que Java EE es Jakarta EE, Glassfish pasa a ser Eclipse Glassfish, Java Community Process (JCP) pasa a llamarse Eclipse EE.next Working Group (EE.next), y Oracle development management ahora es Eclipse Enterprise for Java (EE4J) y Project Management Committee (PMC).

Y eso es toda la noticia, bien no se como estirar más ...

Dejo link:


miércoles, 7 de marzo de 2018

Oracle Live sql

Dada la llegada de oracle 18 c. Oracle se le ocurrio liberar Oracle Live sql. Que es la mejor forma de aprender a escribir y correr sql.

Con esta aplicación podes aprender a escribir sql y a obtener información de esto. 

Antes teniamos unas bases de ejemplo que traia oracle pero ahora solo nos conectamos a la web y listo, a practicar.


Dejo link: https://livesql.oracle.com/apex/livesql/file/index.html

lunes, 5 de marzo de 2018

Apache Spark y Hadoop


Hadoop tiene alrededor de 10 años y ha demostrado ser una buena solución big data.

MapReduce es una gran solución para cálculos de un solo paso, pero no es eficiente para casos de uso que requieren cálculos y algoritmos de múltiples pasos.

Cada paso en el flujo de trabajo de procesamiento de datos tiene una fase de map y una fase de reduce y para usar esta tecnica tendremos que convertir cada paso en un patrón de MapReduce.

La salida del procesamiento de cada paso es guardado en discos distribuidos y luego esto es tomado como entrada para el siguiente paso. Como se puede ver no es una visión muy eficiente. También Hadoop generalmente se utiliza en cluster que son difíciles de configurar. A la vez Hadoop necesita otras herramientas para la integración como Apache storm para el manejo de streaming y Mahout para machine learning.

Si quisiéramos hacer algo complicado, tendríamos que encadenar una serie de trabajos de MapReduce y ejecutarlos en secuencia. Cada uno de esos trabajos tiene una alta latencia, y ninguno podría comenzar hasta que el trabajo anterior había terminado por completo.

Spark permite a los programadores desarrollar tuberías de datos complejas de varios pasos usando el patrón de gráfico acíclico dirigido (DAG). También es compatible con el uso compartido de datos en memoria en los DAG, por lo que diferentes trabajos pueden funcionar con los mismos datos sin tener que volver a calcular los datos para cada paso.

Spark se ejecuta sobre la infraestructura existente del sistema de archivos distribuidos Hadoop (HDFS) para proporcionar funcionalidad adicional. Proporciona soporte para implementar aplicaciones Spark en un clúster Hadoop v1 existente (con SIMR: Spark Inside MapReduce), Hadoop v2 YARN cluster, o incluso Apache Mesos.

Deberíamos considerar a Spark como una alternativa a Hadoop MapReduce para nuevas aplicaciones si ya estamos usando Hadoop en nuestra organización, en lugar de reemplazar completamente a Hadoop. Spark no pretende reemplazar a Hadoop, sino proporcionar una solución integral y unificada para administrar los diferentes requisitos de big data y casos de uso.

domingo, 4 de marzo de 2018

Que es Apache Spark?



Apache Spark es un framework de procesamiento de datos big data open source. Construido con las premisas de ser rápido y fácil de usar. Este Framework fue desarrollado en el 2009 en la universidad de Berkeley’s AMPLab y desde el 2010 fue liberado bajo la tutela de la organización Apache.

Es la competencia directa de Hadoop pero lejos de querer remplazarlo, se integra muy bien con el ecosistema Hadoop. Pero Apache Spark tiene varias ventajas comparado con otro framework Map-Reduce y big data.

Primero de todo, Apache Spark ofrece una forma coherente para procesar datos de diferentes naturalezas como video, texto, imágenes y de diferentes fuentes como red, online streaming, datos web online, etc.

A la vez, Spark permite correr aplicaciones en el clusters de Hadoop se ejecuten hasta 100 veces más rápido en memoria y 10 veces más rápido en disco.

Spark permite programar las aplicaciones en Python, Java o Scala. A la vez viene con un conjunto integrado de más de 80 operadores de alto nivel. Y podemos usarlo de forma interactiva para consultar datos dentro del shell.

Ademas las operaciones Map y Reduce, soportan consultas por sql, por streaming, maching learning y procesamiento por grafos. Los desarrolladores pueden usar estas capacidades solos o combinarlas para ejecutar en una sola información.

Dejo link: https://spark.apache.org/

Programando en Clojure en visual code



Como dije hace tiempo Clojure esta ganando cada vez más espacio, uno de los problemas que tenemos a la hora de empezar con este lenguaje es la falta de entornos de desarrollo.

A la vez, visual code es una ide liguera y que esta ganando muchos adeptos, más que nada por la facilidad de extensión y la cantidad de plugins que hay en el mercado.

Clojure no podía ser la excepción y hay un plugin para este lenguaje.

Esta extensión trae todo lo que necesitamos de una IDE: Intellisense, subraya cuando hay errores, un REPL interactivo, etc.

Esta muy completo e invito a que lo prueben.

Dejo link: https://marketplace.visualstudio.com/items?itemName=stiansivertsen.visualclojure#overview

miércoles, 28 de febrero de 2018

Un resumen de Scala for the Impatient, parte 38


Extractors con un argumento o ninguno.

Si un unapply método extrae un solo valor este debe retornar un Optional por ejemplo: 


object Number {
def unapply(input: String): Option[Int] =
try {
Some(input.trim.toInt)
} catch {
case ex: NumberFormatException => None
}
}

Con este extractor podemos extraer el numero de un string :

val Number(n) = "1729"

Un extractor puede chequear un valor en este caso debe retornar un booleano:

object IsCompound {
def unapply(input: String) = input.contains(" ")
}


Se puede utilizar un extractor para agregar un test en una expresión pattern matching:


author match {
    case Name(first, IsCompound()) => …
    case Name(first, last) => …

 }

El método unapplySeq

Si utilizamos el extract en una secuencia, estaremos llamando a unapplySeq que retorna Option[Seq[A]] , donde A es el valor extraído:

object Name {
def unapplySeq(input: String): Option[Seq[String]] =
if (input.trim == "") None else Some(input.trim.split("\\s+"))
}


Dado este método ahora podemos utilizar un conjunto de parámetros:

author match {
   case Name(first, last) => …
   case Name(first, middle, last) => …
   case Name(first, “van”, “der”, last) => ...
}

Ojo, no se puede tener un método unapply y un unapplySeq con similar parámetros. 

Invocación dinámica

Scala es un lenguaje de tipado estático y fuertemente tipado.  Es decir que informa los errores de tipo en momento de compilación.

Si un tipo extiende de el trait scala.Dynamic, entonces el método llamadas, getters y setters se reescriben como llamadas a métodos especiales que pueden inspeccionar el nombre de la llamada original y los parámetros, y luego tomar acciones arbitrarias.

Veamos algunos ejemplos. Supongamos que la persona es una instancia de un tipo que se extiende
de Dynamic. Una declaración:

person.lastName = "Doe"

se puede remplazar:

person.updateDynamic ("lastName") ("Doe")

La clase Person debe tener dicho método:

clase Persona {
    ...
    def updateDynamic (campo: String) (newValue: String) {...}
}

Depende de nosotros si implementamos el método updateDynamic.

Otro ejemplo:

val name = person.lastName

puede ser remplazado por:

val name = name.selectDynamic("lastName")

El metodo selectDynamic debe retornar un valor simple. 

En scala existe DynamicProps que extiende a Dynamic y sobre escribe sus métodos:

class DynamicProps(val props: java.util.Properties) extends Dynamic {
    def updateDynamic(name: String)(value: String) {
        props.setProperty(name.replaceAll("_", "."), value)
    }

    def selectDynamic(name: String) =
        props.getProperty(name.replaceAll("_", "."))
    }
}

domingo, 25 de febrero de 2018

Que es machine learning?


Encontre un post de la gente de codecademy que esta muy bueno. Este post trata de explicar ¿qué es el aprendizaje automático, quién debe aprenderlo y cuándo puedo visitar Westworld?

El aprendizaje automático evolucionó a partir del reconocimiento de patrones y la aplicación de algoritmos que pueden aprender de los datos y luego hacer predicciones, y está estrechamente relacionado con las estadísticas computacionales. Esto nos indica el post.

Sin más que aconsejarlos que lo lean dejo el link:
http://news.codecademy.com/what-is-machine-learning/?utm_source=customer.io&utm_medium=email&utm_campaign=fortnightly_2-22-18&utm_content=whatismachinelearning

miércoles, 21 de febrero de 2018

Libros Gratuitos!!!

Quiero compartir un mail que me llego de java code geeks con unos libros gratuitos:

Download Dev Guides!

 
Moving your application to the cloud isn’t as simple as porting over your code and configurations to someone else’s infrastructure – nor should it be. Cloud computing represents a paradigm shift in the world of application architecture from vertical scalability to horizontal scalability. This new paradigm has much to offer organizations that want to build highly scalable and dynamic applications, but it has its dangers, too – if you’re not careful and purposeful in how you prepare for the cloud, your application could suffer. In this white paper, we’ll discuss how to reap the performance benefits of the cloud and avoid the common pitfalls.
 
 
Cloud computing has been gaining momentum for years. As the technology leaves the early adopter phase and becomes mainstream, many organizations find themselves scrambling to overcome the challenges that come with a more distributed infrastructure. One of those difficulties is getting through a major cloud migration. It is one thing to roll out a few applications and cloud pilot projects, it is an entirely different challenge to start using the cloud across multiple lines of business at massive scale. That is the point that organizations are beginning to reach, and the time has come to take a serious look at cloud migration best practices. Read this eBook to meet the cloud world and its importance for businesses moving to the cloud.
 
 
Mockito is an open source testing framework for Java released under the MIT License. The framework allows the creation of test double objects (mock objects) in automated unit tests for the purpose of Test-driven Development (TDD) or Behavior Driven Development (BDD). In software development there is an opportunity of ensuring that objects perform the behaviors that are expected of them. One approach is to create a test automation framework that actually exercises each of those behaviors and verifies that it performs as expected, even after it is changed. Developers have created mock testing frameworks. These effectively fake some external dependencies so that the object being tested has a consistent interaction with its outside dependencies. 
 
 
JUnit is a unit testing framework to write repeatable tests. JUnit has been important in the development of test-driven development, and is one of a family of unit testing frameworks which is collectively known as xUnit that originated with SUnit. A research survey performed in 2013 across 10,000 Java projects hosted on GitHub found that JUnit, (in a tie with slf4j-api), was the most commonly included external library. (Source) In this ebook, we provide a compilation of JUnit tutorials that will help you kick-start your own programming projects. We cover a wide range of topics, from basic usage and configuration, to multithreaded tests and integration with other testing frameworks. With our straightforward tutorials, you will be able to get your own projects up and running in minimum time.
 

martes, 20 de febrero de 2018

Un resumen de Scala for the Impatient, parte 37


Los métodos apply y update

En scala podemos extender la sintaxis de llamada de funciones :

f(n1, n2, n3, …)

Si f es una función o un método, se ejecuta. De lo contrario, se llama al método apply por lo tanto es equivalente a llamar a

f.apply(n1, n2, n3, …)

De la misma manera si se utiliza la notación de función con asignación se llama al método update :

f(n1, n2, n3, …) = value

Es similar a llamar a :

f.update(n1, n2, n3, …, value)

Este mecanismo es utilizado en arrays y maps :

val scores = new scala.collection.mutable.HashMap[String, Int]
scores("Bob") = 100 // es como llamar a scores.update("Bob", 100)
val bobsScore = scores("Bob") // es como llamar a scores.apply("Bob")

El método apply también es usado para retornar instancias de objetos, sin tener que llamar al constructor con el new :

class Fraction(n: Int, d: Int) {

}

object Fraction {
def apply(n: Int, d: Int) = new Fraction(n, d)
}

De esta manera podemos hacer lo siguiente:

val result = Fraction(3, 4) * Fraction(2, 5)

Extractors

Un extractor es un objeto que puede desaplicar un método. Se puede pensar esto como el método contrario a el apply. Por ejemplo si el apply agrega un elemento a una lista el extractor debería quitar este elemento.

Por ejemplo el objeto Fraction tiene un método apply que retorna una Fraction a partir de un numerador y un denominador. El extractor debería retornar un numerador y un denominador a partir de una Fraction.

object Fraction {
def unapply(input: Fraction) =
if (input.den == 0) None else Some((input.num, input.den))
}

Por lo general el método unapply retorna un Option dado que puede haber un error cuando queremos desaplicar un método. En el ejemplo si el denominador es 0 retorna None.

val Fraction(a, b) = f;
val tupleOption = Fraction.unapply(f)
if (tupleOption == None) throw new MatchError
// tupleOption is Some((t1 , t2))

En el ejemplo el método apply y unapply son inversos pero esto no es obligatorio.

Graylog, guarda y consulta tus logs de forma centralizada.


Graylog es un producto que permite consultar y almacenar registros de aplicaciones de forma centralizada y eficiente. Para esto utiliza MongoDB para almacenar los log y Elasticsearch para la búsqueda e indexación.

Con Graylog se puede guardar los registros de forma centralizada, detectar problemas de manera temprana y de esta manera resolverlos más rápidamente.

A la vez Graylog provee un sistema de administración de registros con el cual se puede consultar registros de forma interactiva y rápida y permite almacenar registros de diferentes servidores, dispositivos de red y aplicaciones.

De esta forma este producto permitirá auditar la aplicación de forma económica y eficiente. Permitiendo a los auditores ganar tiempo y centralizarse en su trabajo en vez de envolverlos en problemas técnicos. 

Y algo sumamente importante es que es Open source.

Dejo link: https://www.graylog.org/

lunes, 19 de febrero de 2018

MongoDB 4.0 incluye transacciones de múltiples documentos

MongoDB 4.0 incluye transacciones de múltiples documentos. Eso es todo. Toda la info...

Pero si no sabes:

El soporte para transacciones de documentos múltiples, es una técnica para el aislamiento de instantáneas a menudo asociada con las bases de datos relacionales PostgreSQL y Oracle. Y es la piedra angular ACID

MongoDB 4.0 ofrecerá la capacidad de realizar una lectura consistente. Es decir, devolverá solo los datos como se conocía en el momento en que comenzó la operación de lectura. Las versiones anteriores de MongoDB podían arrojar resultados que no necesariamente eran consistentes con ningún punto en el tiempo. Incluso podría omitir documentos o devolver varias versiones del mismo documento en una sola consulta. Pero esto ahora cambio.

Dejo link:
http://www.zdnet.com/article/mongodb-cto-how-our-new-wiredtiger-storage-engine-will-earn-its-stripes/

jueves, 15 de febrero de 2018

Top de lenguajes que tenes que aprender en el 2018



Me encontre un post sobre los lenguajes que debes aprender este 2018, si no lo sabes. Y en resumen los lenguajes son los siguientes :

  1. JavaScript
  2. TypeScript (si bien no es un lenguaje, es un framework que suma características a un lenguaje, por lo tanto es valido)
  3. Python
  4. Java
  5. Kotlin
  6. C & C++
  7. PHP
  8. Swift
  9. Scala
Lindo ranking veo algunos lenguajes viejos, pero salvo algunos puntos, estoy de acuerdo. 



martes, 13 de febrero de 2018

Un Post sobre el blog!


Tarde o temprano le tenía que tocas al blog hablar de el mismo. Por lo tanto te paso unos datos recopados del blog que no te van a servir de nada. Tal vez podes tirar estos datos en una reunión familiar, pero no se, velo...

  • El blog nace en julio del 2009 y los primeros post eran publicaciones de tp de la facultad.
  • El año que viene cumplimos 10 años. Me acabo de dar cuenta
  • Tenemos publicados 1815 post, con este 1816.


Los temas son variados pero por lo general Java, Linux, Scala, es decir lenguajes de programación y software libre. 


Les paso un gráfico:




Si no lo ven muy bien hagan click y se agranda (eso le digo a las chicas) , se los prometo.


Si clasificamos a el blog por tag tendremos el siguiente top ten (quitando a otros)

  1. Java
  2. Linux
  3. Scala
  4. Python
  5. javascript
  6. Ruby
  7. Apache
  8. php
  9. C++
  10. Haskell


Y eso es todo amigos...

Si tienen preguntas, en los comentarios.

Ah, y notaron que hay un botón para donar dinero? 

Programación Orientada a Objetos en Python, parte 4


Las propiedades “privadas”, no existen en Python :(

Sin embargo, hay una convención que se sigue en la mayoría del código Python: un nombre prefijado con un guión bajo (por ejemplo, _spam) debería tratarse como una propiedad privada

Cualquier identificador con la forma __spam (al menos dos guiones bajos al principio, como mucho un guión bajo al final) es textualmente reemplazado por _nombredeclase__spam, donde nombredeclase es el nombre de clase actual al que se le sacan guiones bajos del comienzo (si los tuviera). Se modifica el nombre del identificador sin importar su posición sintáctica, siempre y cuando ocurra dentro de la definición de una clase.

La modificación de nombres es útil para dejar que las subclases sobreescriban los métodos sin romper las llamadas a los métodos desde la misma clase. Por ejemplo:

class Mapeo:
    def __init__(self, iterable):
        self.lista_de_items = []
        self.__actualizar(iterable)

    def actualizar(self, iterable):
        for item in iterable:
            self.lista_de_items.append(item)

    __actualizar = actualizar   # copia privada del actualizar() original

class SubClaseMapeo(Mapeo):

    def actualizar(self, keys, values):
        # provee una nueva signatura para actualizar()
        # pero no rompe __init__()
        for item in zip(keys, values):
            self.lista_de_items.append(item)

Hay que aclarar que las reglas de modificación de nombres están diseñadas principalmente para evitar colisiones de nombres; es posible acceder o modificar una variable que es considerada como privada. Esto hasta puede resultar útil en circunstancias especiales, tales como en el depurador.

Note que el código pasado a exec o eval() no considera que la clase que invoca sea la clase actual; esto es similar al efecto de la sentencia global, efecto que es de similar manera restringido a código que es compilado en conjunto. La misma restricción aplica a getattr(), setattr() y delattr(), así como cuando se referencia a __dict__ directamente.

A veces es útil tener un tipo de datos similar al “registro” de Pascal o la “estructura” de C, que sirva para juntar algunos pocos ítems con nombre. Una definición de clase vacía funcionará perfecto:

class Empleado:
    pass

juan = Empleado()  # Crear un registro de empleado vacío

# Llenar los campos del registro
juan.nombre = 'Juan Pistola'
juan.depto = 'laboratorio de computación'
juan.salario = 1000

Algún código Python que espera un tipo abstracto de datos, en particular puede frecuentemente recibir. En cambio una clase que emula los métodos de aquel tipo de datos. Por ejemplo, si tenés una función que formatea algunos datos a partir de un objeto archivo, podés definir una clase con métodos read() y readline() que obtengan los datos de alguna cadena en memoria intermedia, y pasarlo como argumento.

Los objetos método de instancia tienen atributos también: m.__self__ es el objeto instancia con el método m(), y m.__func__ es el objeto función correspondiente al método.

lunes, 12 de febrero de 2018

Programación Orientada a Objetos en Python, parte 3


Python soporta la herencia y la herencia múltiple. Una definición de clase con múltiples clases base se ve así:

class ClaseDerivada(Base1, Base2, Base3):
    <declaración-1>
    .
    .
    .
    <declaración-N>

Si un atributo no se encuentra en ClaseDerivada, se busca en Base1, luego (recursivamente) en las clases base de Base1, y sólo si no se encuentra allí se lo busca en Base2, y así sucesivamente.

El orden de resolución de métodos cambia dinámicamente para soportar las llamadas cooperativas a super(). Este enfoque es conocido en otros lenguajes con herencia múltiple como “llámese al siguiente método” y es más poderoso que la llamada al superior que se encuentra en lenguajes con sólo herencia simple.

No nos olvidemos del problema del diamante, Por ejemplo, todas las clases heredan de object, por lo tanto cualquier caso de herencia múltiple provee más de un camino para llegar a object. Para que las clases base no sean accedidas más de una vez, el algoritmo dinámico hace lineal el orden de búsqueda de manera que se preserve el orden de izquierda a derecha especificado en cada clase, que se llame a cada clase base sólo una vez, y que sea monótona (lo cual significa que una clase puede tener clases derivadas sin afectar el orden de precedencia de sus clases bases). En conjunto, estas propiedades hacen posible diseñar clases confiables y extensibles con herencia múltiple.


Programación Orientada a Objetos en Python, parte 2

Bueno, ya vimos clases y herencia en python. Esta segunda parte vamos a seguir hablando de la construcción de objetos.

La operación de instanciación crea un objeto vacío. En muchas ocasiones necesitamos crear objetos en un estado inicial particular. Por lo tanto se puede definir un método especial llamado __init__(), de esta forma:

def __init__(self):
    self.datos = []

Cuando definimos un método __init__(), la instanciación de la clase automáticamente invoca a __init__(). Entonces, en este ejemplo, una instancia nueva e inicializada se puede obtener haciendo:

x = MiClase()

Por supuesto, el método __init__() puede tener argumentos para mayor flexibilidad. En ese caso, los argumentos que se pasen al operador de instanciación de la clase van a parar al método __init__(). Por ejemplo,

>>> class Complejo:
...     def __init__(self, partereal, parteimaginaria):
...         self.r = partereal
...         self.i = parteimaginaria
...
>>> x = Complejo(3.0, -4.5)
>>> x.r, x.i
(3.0, -4.5)

Python permite las variables de instancia son para datos únicos de cada instancia y las variables de clase son para atributos y métodos compartidos por todas las instancias de la clase:

class Perro:

    tipo = 'canino'                 # variable de clase compartida por todas las instancias

    def __init__(self, nombre):
        self.nombre = nombre        # variable de instancia única para la instancia

  >>> d = Perro('Fido')
  >>> e = Perro('Buddy')
  >>> d.tipo                    # compartido por todos los perros
  'canino'
  >>> e.tipo                    # compartido por todos los perros
  'canino'
  >>> d.nombre                  # único para d
  'Fido'
  >>> e.nombre                  # único para e
  'Buddy'

Todo valor es un objeto, y por lo tanto un objeto conoce su clase (también llamado su tipo). Ésta se almacena como objeto.__class__ y es un objeto.




domingo, 11 de febrero de 2018

Programación Orientada a Objetos en Python


Como les dije anteriormente estoy estudiando nuevamente python para unas cosas que tengo que hacer. Más allá de esto, vamos a repasar los conceptos de poo en python.

Primero y principal python implementa la poo con clases, como lo hacen la mayoría de los lenguajes. Las clases son una abstracción de un conjunto de objetos, esto luego define el tipo de nuestros objetos. Veamos las clases en python:

class Objeto:
    pass

class Antena:
    pass

class Pelo:
    pass

class Ojo:
    pass

Como se puede ver se usa la convención CamelCase para el nombre de las clases, y por supuesto las clases pueden tener atributos y métodos:

class Objeto():
    color = "verde"
    tamanio = "grande"
    aspecto = "feo"
    antenas = Antena()
    ojos = Ojo()
    pelos = Pelo()

    def flotar(self):
        print 12

Por alguna razón que desconozco el primer parámetro de los métodos debe ser self (en este punto alguien me puede ayudar?). Y tambien se utiliza la misma convención.

Todo muy lindo pero donde están los objetos? veamos como instanciar objetos :

et = Objeto()
print et.color
print et.tamanio
print et.aspecto
et.color = "rosa"
print et.color

Una característica de poo es la herencia que esta implementada en python tambien, se agrega la clase padre entre paréntesis luego del nombre de la clase :


class NuevoObjeto(Objeto):
    pie = Pie()

    def saltar(self):
        pass

Podemos heredar de la clase object que es la clase principal de Python:

class Antena(object):
    color = ""
    longitud = ""

class Pelo(object):
    color = ""
    textura = ""

Luego seguimos con el miniresumen.

sábado, 10 de febrero de 2018

Que trae de nuevo Java 9 ?


Voy a hacer un minipost de las características nuevas que trae Java 9, luego desarrollo cada una de forma individual.

JShell: REPL: Porfin!!! un repl en java. Para los que no saben que es un repl, la wikipedia dice lo siguiente : Un bucle Lectura-Evaluación-Impresión ("REPL" o "Read-Eval-Print-Loop"), también conocido como alto nivel interactivo o consola de lenguaje, es un entorno de programación computacional simple e interactivo que toma las entradas individuales del usuario, las evalúa y devuelve el resultado al usuario; un programa escrito en un entorno REPL es ejecutado parte por parte.

Métodos privados en las interfaces: Java 8 nos proporcionó la implementación de métodos predeterminado y estático en Interfaces; sin embargo, no podemos crear métodos privados en las interfaces. Si nos encontramos en una situación en la que tenemos múltiples métodos predeterminados en una interfaz que contiene la misma funcionalidad. En este escenario, normalmente refactorizaríamos estos métodos predeterminados para llamar a un método privado que contenga la funcionalidad compartida y ahora podemos hacer esto en java 9 :

public interface MyInterface {

    default void interfaceDefaultMethod() { init(); }

    default void interfaceSecondDefaultMethod() { init(); }

    // This is the declaration of the Private Method in Interface

    private void init() { ... }

}

Java 9 Module System: Claramente esto necesita un post en si. Pero para resumir podemos decir: Hasta la versión de Java 8 estábamos usando los contenedores monolíticos para diseñar nuestras aplicaciones basadas en Java. Hay dos problemas principales fundamentales con este diseño: Código difícil de encapsular y no hay ninguna noción de dependencias explícitas entre las diferentes partes de un sistema. Para evitar estos problemas fundamentales, Java 9 introdujo el sistema de módulos. Estos son algunos de los principales beneficios que obtenemos del Sistema de Módulos.

Los JDK, JRE, JAR actuales, etc. ahora están divididos en módulos más pequeños, por lo que solo podemos usar los módulos que deseamos. Esto ayuda a reducir la aplicación para dispositivos más pequeños.

Fuerte soporte para encapsulación. Las API internas no críticas están ocultas ahora, ya que los módulos ocultan detalles internos y no deseados de forma muy segura. Esto mejora la seguridad de la aplicación.

Mejoras en Javadoc: Java 9 ahora admite la búsqueda de documentación API internamente dentro de Javadoc.

HTTP/2 Client: Se ha lanzado una nueva API cliente HTTP/2 para soportar el protocolo HTTP/2 y las características de websockets. Este es un reemplazo del antiguo "HttpUrlConnection".

Nuevo esquema de cadena de versiones: Proporciona un formato de cadena de versión simplificado que ayuda a distinguir claramente las versiones principales, secundarias, de seguridad y actualización de parches.

El nuevo formato de cadena de versión se alinea con las prácticas actuales de la industria, en particular las versiones semánticas (servidor). El formato es el siguiente:

$ MAJOR. $ MENOR. $ SEGURIDAD. $ PATCH

Archivos JAR múltiple releases: Extiende el formato de archivo JAR para permitir que múltiples versiones de archivos de clase específicos de versiones de Java coexistan en un solo archivo.

Un JAR de múltiples releases (MRJAR) contiene directorios adicionales versionados para clases y recursos específicos para versiones de plataforma Java particulares. 

Mejoras en Stream API: La mejora en Stream API permite filtrar flujos entrantes de datos de serialización de objetos para mejorar la seguridad y la solidez.

Los clientes de serialización de objetos pueden validar su entrada más fácilmente, y los objetos exportados de Invocación de Método Remoto (RMI) también pueden validar los argumentos de invocación más fácilmente.

Los clientes de serialización implementan una interfaz de filtro que está configurada en un ObjectInputStream. Para RMI, el objeto se exporta a través de RemoteServerRef que establece el filtro en MarshalInputStream para validar los argumentos de invocación ya que no están agrupados.



Mailrelay, una de las mejores plataformas de email marketing que existen en el mercado


MailRelay es una herramienta de envío de emails. No! No es un cliente de correo, es una plataforma de email marketing avanzado con características de gran alcance. Te permite crear, enviar y gestionar tus boletines enviados vía emails con estadísticas completas, a la vez podes analizar el comportamiento del suscriptor.

Mailing marketing ??  Si, tambien se lo conoce como ciberbuzoneo  o en inglés: e-mailing es un método de marketing directo que utiliza el correo electrónico como medio de comunicación comercial para enviar mensajes a una audiencia. De esta forma podes tener al tanto a tus clientes de las novedades de tu empresa, nuevos productos, ofertas, etc...

Cuando se trata de correos masivos y envío masivo, no hay ninguna diferencia real entre los dos términos. Ambos significan envío masivo de email promocional para sus clientes y contactos. A veces, las personas confunden con correos masivos de spam. Sin embargo, la diferencia entre ambos es que el spam es no solicitado, mientras que el correo masivo es basado en permisos. Email marketing masivo tiene algunas ventajas muy profundas sobre todas las demás formas de marketing.

Con MailRelay podemos crear boletines y enviárselas a un grupo de suscriptores, a la vez la herramienta analiza el comportamiento del subscriptor, de esta forma podemos saber cual es el articulo más visitado, y que suscriptores vieron que articulo pudiendo analizar las necesidades de los clientes según esta información.

MailRelay no solo permite crear campañas de email marketing sino que tambien darle un correcto seguimiento y tener un contacto real con los clientes. Y es muy importante este seguimiento tanto para fidelizar al cliente como para estimular las ventas.

Entre otras ventajas podemos nombrar:

  • Un seguimiento inteligente de los clientes: con esta herramienta podes saber que necesita cada suscriptor y podemos hacer un seguimiento de los clientes y sus necesidades. 
  • No vamos a ser catalogados como spam:  Mailrelay cumple con todas las normas de correo electrónico anti-spam, haciendo que la puntuación antispam sea menos posible.
  • Templates para nuestros boletines:  Mailrelay cuenta con una completa biblioteca de templates gratuitos que podemos utilizar. 
  • SMTP de alto rendimiento:  Mailrelay nos ofrece un servicio smtp que se distingue por su alto rendimiento. 
  • Facilidad de uso: No es necesario que contrates a un programador o un diseñador gráfico, cualquier persona puede utilizar este servicio. 
  • Atención personalizada: Recibe atención personalizada y respuesta inmediata a tus dudas.



Y además de estas características cuenta con muchas promociones y descuentos. Por ejemplo Mailrelay es el único software de email marketing que permite enviar gratis 75.000 emails al mes a 15.000 suscriptores con autorespondedores incluidos.

Hoy día son muchas las empresas que buscan vender más, conseguir más visibilidad, fidelizar a sus clientes y destacar sobre su competencia. Objetivos todos dirigidos a garantizar la viabilidad de la empresa o proyecto. Objetivos que no son nada fáciles de conseguir y mantener.

Mailrelay tiene más de 15 años de experiencia en e-mail marketing, tanto desarrollando una herramienta de email marketing efectiva, como es Mailrelay, como ayudando a los clientes a mejorar sus resultados, llegar a la bandeja de entrada, solucionar sus problemas de spam, etc.

Como conclusión les aconsejo que vean con buenos ojos a Mailrelay dado su excelente soporte y sus ofertas. Y además es un excelente producto. Mailrelay te permite gestionar tu e-mail marketing de forma fácil y efectiva

Dejo link:
https://mailrelay.com/es