Translate

martes, 30 de octubre de 2018

IBM se compro a Red Hat por $34 Billones

IBM se compro a Red Hat por $34 Billones de pesos, eehh, de dolares...

Increíble las compras de estos últimos años, Microsoft Github y ahora IBM Red hat. A las claras se ve la importancia que le están dando las grandes empresas al software libre y al negocio del software libre.

El software libre puede ser y es un modo de ganar plata. No se gana el dinero vendiendo copias, sino de una forma más ética.

Nada más, solo festejar los pasos que esta dando el software libre.

Dejo link:  https://www.infoq.com/news/2018/10/ibm-red-hat-34-billion

sábado, 27 de octubre de 2018

Quien usa Apache HBase y por qué?

Hbase es una base de datos escalable de forma horizontal, distribuida, open source y Mapa ordenado. La cual corre sobre el sistema de archivos HDFS. Hbase es una base de datos noSql, libre de esquema.

Pero quien usa Hbase y por que?


  • Adobe : Tienen alrededor de 30 nodos que ejecutan HDFS, Hadoop y HBase en grupos que van de 5 a 14 nodos tanto en producción como en desarrollo.
  • Yahoo! : Tienen un grupo de unos pocos nodos que ejecutan HDFS, MapReduce, y HBase. La tabla contiene millones de filas; lo utiliza para consultar documentos duplicados con tráfico en tiempo real.
  • Apache : para su Wiki
  • Facebook : Facebook usa HBase para alimentar su infraestructura de mensajes.
  • Mozilla : movieron el proyecto Socorro a Hbase.
  • Mendeley : Mendeley está creando una plataforma para que los investigadores colaboren y compartan sus investigaciones en línea. HBase nos está ayudando a crear la colección de documentos de investigación más grande del mundo y se está utilizando para almacenar todos nuestros datos importados sin procesar.
  • Twitter : Twitter ejecuta HBase en todo su clúster de Hadoop. HBase proporciona una copia de seguridad distribuida de lectura / escritura de todas las tablas mysql en el backend de producción de Twitter, lo que permite a los ingenieros ejecutar trabajos de MapReduce sobre los datos mientras se mantiene la capacidad de aplicar actualizaciones periódicas de filas (algo que es más difícil de hacer con el HDFS de vainilla).


Dejo link: http://hbase.apache.org/poweredbyhbase.html

viernes, 26 de octubre de 2018

Kotlin for Java Developers


Quiero recomendarles este curso de cousera que es gratuito y a simple vista esta muy bueno.

La introducción al curso dice lo siguiente:

El lenguaje de programación Kotlin es un lenguaje moderno que le da más poder para sus tareas diarias. Kotlin es conciso, seguro, pragmático y se centra en la interoperabilidad con el código Java. Se puede usar en casi todos los lugares donde se usa Java hoy en día: para el desarrollo del lado del servidor, aplicaciones de Android y mucho más. Kotlin es 100% compatible con todos los marcos Java existentes y tiene un buen soporte de herramientas. Es un lenguaje pragmático con una curva de aprendizaje muy baja, y puede ser captado rápidamente por los desarrolladores de Java. El código Kotlin puede compilarse no solo para el código de bytes JVM sino también para JavaScript y código nativo, pero este curso se enfoca en Kotlin / JVM. Este curso tiene como objetivo compartir contigo el poder y la belleza de Kotlin. Tendremos una visión general básica del lenguaje, así como una discusión de muchos casos, especialmente en relación con la interoperabilidad de Java. El curso se basa en su experiencia Java; muestra las similitudes entre los dos idiomas y se centra en lo que será diferente. Tenga en cuenta que este curso no cubrirá los fundamentos de la programación. Discutiremos: sintaxis básica, nulabilidad, programación funcional con Kotlin, programación orientada a objetos con Kotlin, el poder de la biblioteca estándar de Kotlin e interoperabilidad de Java.

Dejo link:
https://www.coursera.org/learn/kotlin-for-java-developers/

jueves, 25 de octubre de 2018

The State of the Octoverse



Github publico el informe anual Octoverse, en el cual se pueden ver datos interesantes de los proyecto. El informe es grande y tiene muchos detalles.

En especial me intereso los lenguajes más utilizados:


No tengo mucho análisis para hacer javascript viene primero y es indiscutido. Y como lenguajes con mayor crecimiento podemos ver como impacto la decisión de Android de dar soporte a Kotlin :



Me llamo la atención no ver a Scala, pero bueno... dejen su opinión.

Dejo link: https://octoverse.github.com/

miércoles, 24 de octubre de 2018

Instalar un master y un nodo con spark.


La idea es instalar un cluster de spark, solo un nodo y un master. 

Primero los dos 2 servers deben verse por medio de ssh para esto sigan este post :  

Luego descargamos spark desde internet: 
wget https://www.apache.org/dyn/closer.lua/spark/spark-2.3.2/spark-2.3.2-bin-hadoop2.7.tgz

Luego desempaquetamos: 

tar -xzvf spark.tar.gz

Luego vamos a conf y copiamos a el template de spark-env pero sin ".template"

cp spark-env.sh.template spark-env.sh

Luego editamos spark-env y agregamos el java home y el ip del master : 

export JAVA_HOME=/path/java-openjdk

export SPARK_MASTER_HOST='xx.xx.xx.xx'

En SPARK_MASTER_HOST va la ip del master (esto hay que hacerlo en los dos servers)

Por ultimo levantamos todos los servicios :

$ ./start-all.sh 

Y listo! Podemos chequear su funcionamiento en el puerto 8080 del master : 


Correr una tarea en un cluster de spark.


Hemos hecho un proyecto con Spark  el cual cuenta palabras pero este utiliza spark como "local" es decir no utiliza un cluster spark.

Pero la potencia de Spark esta en utilizar esto en un Cluster para lo que tenemos que modificar nuestro Context para que permita ejecutar esto en el cluster.

Un cluster Spark tiene un master el cual tiene una ip por ejemplo x.x.x.x con dicha ip vamos a modificar el Context de Spark:

package com.myCompania.app

import org.apache.spark.{SparkConf, SparkContext}

object SparkContext {

  //Create a SparkContext to initialize Spark
  val conf = new SparkConf()
 
  conf.setMaster("spark://x.x.x.x:7077")
  conf.setJars(Seq("path/nombreDelJar.jar"))

  conf.setAppName("Hexacta")
  val sc = new SparkContext(conf)

   def getSc = {
      sc
   }
}

En el puerto 7077 spark publica su servicio, por dicha razon escribimos esta linea:

conf.setMaster("spark://x.x.x.x:7077")

Luego tenemos que agregar el jar de nuestra aplicación porque spark no conoce las clases que utilizamos, y esto lo hacemos con :

conf.setJars(Seq("path/nombreDelJar.jar"))

Y listo!!

domingo, 21 de octubre de 2018

Jugando con Lisp y Racket

Hace rato que no juego con lisp, por lo tanto vamos a hacer una pequeña función para contar elementos de una lista:

(defun contar(lista)
  (cond
     ((null lista) 0)
     (T (+ 1 (contar (rest lista))))
  )
)

Si probamos esto:

CL-USER 1 > (contar '(1 2 3 4 5))
5

Veamos el mismo programa en Racket: 

(define (contar lista)
  (cond
     [(empty? lista) 0]
     [else (+ 1 (contar (rest lista)))] 
  )
)

> (contar (list 1 2 3))
3

Como se puede ver Racket es un hijo o nietos de lisp, por ende tienen la misma sintasis.  

¿Que letra del abecedario no se utilizo en un nombre de un lenguaje de programación?

Leyendo la lista de lenguajes de programación de wikipedia me percate de que había una letra que faltaba.

Esa letra en nuestra querida Ñ. Lo cual indica la falta de latinos en el diseño de nuevos lenguajes de programación.

No quiero ponerme critico de nuestra condición de hispano hablantes y nuestra educación. Ya que hay muchos sectores de las ciencias de la programación que esta copadas por latinos. Pero claramente faltan empresas o emprendedores que se identifiquen con nuestra cultura.

Vamos por un ñ++ !!

Dejo el link: https://en.wikipedia.org/wiki/List_of_programming_languages

miércoles, 17 de octubre de 2018

Cstar, una herramienta de orquestación de clusters Apache Cassandra


Spotify libero Cstar que es una herramienta de código abierto, basada en linea de comandos para la orquestación de clusters Apache Cassandra.

Trabajar con Cassandra no siempre es una tarea fácil. Tiene una gran cantidad de parametros que afectan el rendimiento, la seguridad, la consistencia de los datos, etc. Muy a menudo necesita ejecutar un conjunto específico de comandos de shell en cada nodo de un clúster, generalmente en cierta coordinación para evitar que el clúster se desactive. Esto se puede hacer manualmente para grupos pequeños, pero puede ser complicado y llevar mucho tiempo para grupos grandes.

Durante 2017, Spotify alcanzó 3000 nodos de Cassandra, por lo que era cada vez más urgente contar con una solución segura y eficiente para tareas de mantenimiento.

Por lo tanto Spotify desarrollo Cstar. Cstar es una herramienta de línea de consola que ejecuta una secuencia de comandos arbitraria en todos los hosts en un clúster de Cassandra en "forma topológica". Se basa en paramiko, la misma implementación ssh/scp que utiliza Fabric.

Cstar soporta los siguientes mecanismos de ejecución:

  • ONE: El script se ejecuta exactamente en un nodo por centro de datos en ese momento.
  • TOPOLOGY: Tantos nodos al mismo tiempo como lo permita la topología de Cassandra. Es decir, no se ejecutará en dos nodos en el mismo centro de datos si una réplica puede estar en ambos nodos. Si tiene N centros de datos con M nodos cada uno y un factor de replicación de X, esto ejecutará efectivamente el script en los nodos M / X * N en ese momento.
  • All: El script se ejecuta en todos los nodos al mismo tiempo, independientemente de la topología.


Dejo links: https://github.com/spotify/cstar
https://labs.spotify.com/2018/09/04/introducing-cstar-the-spotify-cassandra-orchestration-tool-now-open-source/

lunes, 15 de octubre de 2018

Corriendo Python en el browser con Brython


Brython está diseñado para reemplazar Javascript como el lenguaje de scripting para la Web. Como tal, es una implementación de Python 3 adaptada al entorno HTML5, es decir, con una interfaz para los objetos y eventos DOM.

El objetivo de Brython es reemplazar Javascript con Python, como el lenguaje de scripting para los navegadores web.

Veamos un ejemplo:

<html>
<head>
<script src="/brython.js"></script>
</head>
<body onload="brython()">
<script type="text/python">
from browser import document, alert

# bind event 'click' on button to function echo

def echo(ev):
    alert(document["zone"].value)

document["mybutton"].bind("click", echo)
</script>
<input id="zone">
<button id="mybutton">click !</button>
</body>
</html>

Dicha pagina imprime con un alert el texto que se encuentra en el input cuando hacemos click.

Para que el script de Python sea procesado, es necesario incluir brython.js y ejecutar la función brython () al cargar la página (usando el atributo onload de la etiqueta <BODY>).

Si el programa de Python es grande, otra opción es escribirlo en un archivo separado y cargarlo usando el atributo src de la etiqueta de script:

<html>

<head>
<script src="/brython.js"></script>
</head>

<body onload="brython()">
<script type="text/python" src="test.py"></script>
<input id="zone" autocomplete="off">
<button id="mybutton">click!</button>
</body>

</html>


Dejo link: https://brython.info

domingo, 14 de octubre de 2018

Helidon un framework para microservicios



Oracle ha introducido un nuevo framework de código abierto, Project Helidon, una colección de bibliotecas Java diseñadas para crear aplicaciones basadas en microservicios.

Originalmente llamado J4C (Java para la nube), Helidon fue diseñado para ser simple y rápido, y se compone de dos versiones: Helidon SE y Helidon MP. Helidon SE presenta tres API básicas para crear un microservicio (un servidor web, configuración y seguridad) para crear aplicaciones basadas en microservicios. No se requiere un servidor de aplicaciones. Helidon MP admite la especificación MicroProfile 1.1 para crear aplicaciones basadas en microservicios.

Inspirado por NodeJS y otros frameworks de Java, el servidor web de Helidon es una API asíncrona y reactiva que se ejecuta sobre Netty. La interfaz del servidor web incluye soporte para configuración, enrutamiento, manejo de errores y creación de métricas.

Vamos un ejemplo:

// starts the server on a random available port
public void startWebServerUsingRandomPort() throws Exception {
    WebServer webServer = WebServer
           .create(Routing.builder()
                   .any((req,res) -> res.send("It works!" + "\n"))
                   .build())
           .start()
           .toCompletableFuture()
           .get(10,TimeUnit.SECONDS);
    System.out.println("Server started at: http://localhost:" + webServer.port() + "\n");
    webServer.shutdown().toCompletableFuture();
    }

Config, carga y procesa las propiedades de configuración en formato clave/valor. De forma predeterminada, las propiedades de configuración se leerán desde un archivo application.properties o application.yaml definido ubicado en el directorio /src/main/resources.

// application.yaml
server:
 port: 8080
 host: 0.0.0.0

// starts the server on a port defined in application.yaml
public void startWebServerUsingDefinedPort() throws Exception {
    Config config = Config.create();
    ServerConfiguration serverConfig = ServerConfiguration.fromConfig(config.get("server"));
    WebServer webServer = WebServer
           .create(serverConfig,Routing.builder()
                   .any((req,res) -> res.send("It works!" + "\n"))
                   .build())
           .start()
           .toCompletableFuture()
           .get(10,TimeUnit.SECONDS);
    System.out.println("Server started at: http://localhost:" + webServer.port() + "\n");
    webServer.shutdown().toCompletableFuture();
    }

La verdad es que esta muy bueno y le da un aire nuevo a Java

Dejo link:
https://helidon.io/#/

jueves, 11 de octubre de 2018

Apache Jena

Si estas interesado sobre la web semantica o ontologías. Te tiene que sonar Apache Jena. Jena esta hecho en Java es de código abierto y gratuito y permite crear aplicaciones de Web Semántica y Linked Data.

Para consultar ontologías RDF utiliza SPARQL que es un acrónimo recursivo del inglés SPARQL Protocol and RDF Query Language. SPARQL se trata de un lenguaje estandarizado para la consulta de grafos RDF, normalizado por el RDF Data Access Working Group (DAWG) del World Wide Web Consortium (W3C). Es una tecnología clave en el desarrollo de la web semántica.

Si instalamos Apache Jena cuenta con varias herramientas una interesante es Fuseki el cual es un servidor de SPARQL y vamos a tener una aplicación web que permite hacer consultas SPARQL en una ontología RDF que debemos importar como modelo.

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

martes, 9 de octubre de 2018

Nitrux y Nomad Desktop, linux con sabor a Mac


Existen muchas distros de linux que emulan la estética mac como Pear Os o Elementary Os. Siguiendo la misma estética se encuentra Nitrux, cuyo desarrollo continúa y cada vez se acerca más a lograr su primera versión estable.

Sin más les comparto un video :




Dejo link:
https://nxos.org/

domingo, 7 de octubre de 2018

Los 5 cursos gratuitos de programación en R


Si queremos aprender una tecnología nueva lo mejor es empezar por un libro o un curso y luego ir a tutoriales de internet. Saltar de tutorial en tutorial, nos da el conocimiento pero nos falta el orden. Con un curso o un libro aprendemos ordenadamente, como debe ser.

Por lo tanto dejo 5 cursos gratuitos de R :

Insertar datos en Apache HBase con Scala y Scalatra


Vamos hacer un ejemplo de una API Rest con scalatra que inserte datos en HBase.

Primero hacemos un proyecto en scalatra como ya hemos explicado:
https://emanuelpeg.blogspot.com/2018/08/haciendo-un-proyecto-con-scalatra.html

Luego agregamos las dependencias de hbase, en el archivo build.sbt agregando :

libraryDependencies ++= Seq(
  "org.apache.hbase" % "hbase-common" % "2.1.0" ,
  "org.apache.hbase" % "hbase-client" % "2.1.0"
)

Luego en la clase de ejemplo generamos el método get que inserta datos en la base hbase :

 get(s"/guardar/:rowKey/:str") {

    val conf : Configuration = HBaseConfiguration.create()
    // Se debe agregar en el archivo host el nombre de la base
    conf.set("hbase.zookeeper.quorum", "mybase")
    conf.set("hbase.zookeeper.property.clientPort", "2181")

    // seteamos los puertos de hbase.
    conf.set("hbase.master.port", "60000")
    conf.set("hbase.master.info.port", "60010")
    conf.set("hbase.regionserver.info.port", "60030")
    conf.set("hbase.regionserver.port", "60020")
    // cree la tabla
    // create 'TableTest', 'info'
    // put 'TableTest', 'rowkey1', 'info:test', 'ejemplo'
    val connection = ConnectionFactory.createConnection(conf)
    val table = connection.getTable(TableName.valueOf( "TableTest" ) )

    // Put example
    val put = new Put(Bytes.toBytes(params("rowKey")))
    put.addColumn(Bytes.toBytes("info"), Bytes.toBytes("test"), Bytes.toBytes(params("str")))

    table.put(put)

    Ok("ok")
  }

}

El método inserta los datos pasados por parámetro en la URL. Donde pasamos una key y un dato. De esta manera insertamos datos en una tabla TableTest.

Algo importante que se puede ver es que seteo los puestos dado que en las ultimas versiones cambiaron de  600X0 a 160X0. Depende de la versión de Hbase, hay que usar uno u otro, yo estoy usando HBase de la maquina virtual de cloudera.

Y Listo!!