jueves, 22 de septiembre de 2016

Introducción a Microservicios

Para construir aplicaciones orientadas a servicio, los más habitual es crear una aplicación monolítica, bajo la esquema clásico Model-View-Controller, con un único contenedor que incluye tanto la lógica de negocio como la interfaz de usuario.

Cuando estas aplicaciones crecen y abarcan un gran conjunto de diferentes componentes, módulos y pruebas previas al despliegue; aumentan en proporción al crecimiento de la aplicación (aumento en los tiempos de pruebas, conflictos y revisión de código) en detrimento del tiempo de producción para desplegar y actualizar nuevas versiones en producción. Como solución a estos problemas surgen nuevos patrones de arquitectura como el mencionado aquí.  Pero, ¿qué son las aplicaciones basadas en Microservicios?

Una arquitectura basada en microservices divide el front-end y el back-end, por lo que es más fácil de distribuir, basado en los principios Reactivos para la construcción de un servicio aislado escalable, resistente a fallos y que se combina con otros servicios para formar un todo.
Ejemplo arquitectura microservicios con JHipster
Ejemplo de aplicación en arquitectura de Microservicios con JHipster.
Los microservicios son, en definitiva, una extensión de la arquitectura orientada a servicios para contruír sistemas distribuidos de software. La idea nace de mano del Doctor Peter Rodgers en 2005 introduciendo el término Micro-Web-Services en la presentación de la conferencia Cloud Computing Expo. Más tarde, Adrian Cockcroft en Netflix los describiría como "Arquitecturas Orientadas a Servicio de grano fino" y; James Lewis y Martin Fowler terminan por nombrar a este término como Microservicios:
La "Arquitectura Microservicio" ha surgido en los últimos años para describir una forma particular de diseñar aplicaciones de software como suites de servicios con despliegue independiente.
Si bien no existe una definición precisa de este estilo arquitectónico, hay ciertas características comunes en torno a la capacidad de negocio, el despliegue automatizado, la inteligencia en los puntos de control y el control descentralizado del lenguaje de programación y los datos.
Una aplicación con microservicios se basa en que la versión monolítica debe ser separada en proyectos completamente independientes y que estos se comuniquen entre sí, a través de servicios web, donde cada uno realizará su propia lógica de negocio. Una aplicación a modo de pasarela orquesta estos microservicios para proveerlos al cliente a través de una interfaz de usuario o front-end. Cuando se requiera refactorizar código o actualizar la versión de uno de estos microservicios, al ser completamente independientes se pueden lanzar las pruebas y asegurar la calidad. En caso de éxito en las pruebas, puede resultar sencillo desplegar la nueva versión del microservicio en producción sin afectar al resto.

Ver Microservices at Netflix Scale: Principles, Tradeoffs & Lessons Learned por Ruslan Meshenberg en GOTO 2016:


Los microservicios contemplan las siguientes características y ventajas:
  • Facilitan el reemplazo de cada uno de los servicios, sin tener que eliminar todo el conjunto de la aplicación.
  • Los servicios se organizan por capacidades, por ejemplo interfaz de usuario, logística, facturación, etc.
  • Los servicios se pueden implementar con diferentes lenguajes de programación, bases de datos, hardware y entornos de software.
  • La arquitectura es simétrica y no jerárquica.
  • Se presta a un proceso de desarrollo de software de entrega continua. Un cambio de una pequeña parte de la aplicación sólo requiere uno o un número pequeño de servicios a ser reconstruidos y desplegados.
  • Obliga a crear una estructura modular.
Como desventajas destacan:
  • Los servicios constituyen barreras para la información. Se crearán varias fuentes de datos, que requieren comunicarse entre ellas y realizar varias copias, snapshots y recuperaciones.
  • La arquitectura introduce una complejidad adicional y nuevos problemas que resolver, como la latencia de la red, formatos de mensaje, equilibrio de carga y tolerancia a fallos.
  • Las pruebas y el despliegue son más complicados.
  • Entre las llamadas de los microservicios hay un mayor coste en términos de latencia de la red y el tiempo de procesamiento de los mensajes que en las llamadas en una aplicación monolítica.
  • Mover responsabilidades entre los microservicios es más difícil. Puede implicar la comunicación entre los diferentes equipos, refactorizar código de una funcionalidad en otro lenguaje o tener que hacerlo encajar en una infraestructura diferente.
Desde el 2015 el término microservices es bastante hype, ¿quién no desearía migrar su aplicación monolítica a microservicios? Si algún lector está pensando en hacerlo, recomiendo el leer el artículo de Arun Gupta Monolithic to Microservices Refactoring for Java EE Applications y ver el siguiente que presenta en la conferencia Devoxx de 2015 "Refactor your Java EE application using Microservices and Containers":




Fuentes:

jueves, 10 de septiembre de 2015

RevealJs, HTML5 ideal para presentaciones


Hace unos meses he estado leyendo acerca de los presentadores en MarkDown y HTML5. Entre los que más podrían destacar, aunque distintos, RevealJs, Impress y RemarkJs. RevalsJs tiene una versión online en Slides.com (gratuita para proyectos públicos). Impress está basado en el editor de presentaciones online Prezi.com. RemarkJs es un proyecto que destaca por su sencilled.

Esta tarde he subido una plantilla para RevealsJs mi cuenta de GitHub. Es una modificación del fork original el cual incluye soporte para AngularJs, carga de las pantallas a partir de datos en json y una barra de menús en la parte superior. Aún necesita una serie de mejoras pero como idea base funciona perfectamente.

Otra opción mucho más elegante, es crear los proyecto mediante generadores de código. Yeoman es un famoso ecosistema de autogeneradores para múltiples aplicaciones y frameworks, algunos muy interesantes como JHipster (Spring Boot + AngularJs), generadores de AngularJs, React, Backbone y para RevealJs.

Esto es lo que hace el autogenerador de Yeoman generator-reveal, creado por Sebastian Lara Menares, permitiendo crear una presentación en HTML5 en apenas unos minutos mediante línea de comando. Creando un proyecto mucho más limpio, simple y mejor organizado.

Para instalar Yeoman y el autogenerador de RevealJs, es tan simple como seguir los pasos que describo a continuación (debereis tener instalado NodeJs con la ruta del PATH hacia la ruta de ejecutables de Node para poder ejecutar "npm"):

$ npm -g install yeoman generator-reveal bower grunt-cli
$ mkdir generator-reveal-presentation && cd $_
$ yo reveal
This includes the amazing Reveal.js Framework
and a Gruntfile for your presentation pleasure.

? What are you going to talk about? Title
? What version should we put in the package.json file? 0.0.0
? Do you want to use Sass to create a custom theme? Yes/No
? What Reveal.js theme would you like to use? simple
? Do you want to deploy your presentation to Github Pages? This requires an empty Github repository. Yes/No

$ yo reveal:slide "Introduction" [--markdown] [--attributes] [--notes]
$ yo reveal:slide "Targets" [--markdown] [--attributes] [--notes]
$ yo reveal:slide "Demo with video cats" [--markdown] [--attributes] [--notes]
$ yo reveal:slide "Greetings" [--markdown] [--attributes] [--notes]
# Markdow crea el slide como lenguaje de MarkDown
# attributes añade atributos opcionales para el slide: background, otros.
#note añade notas para mostar ayuda en la ventana del ponente.

# Editar primer slide
$ vi slides/index.md

### Is Evil Corp real?
##### Fsociety
>##### from: Mr. Robot
>##### by: Christian Bale

note:
From the terminal, pop in:

```yo reveal:slide "Slide Title"```

Available options:

```--markdown --attributes --notes```

# Editar último slide
$ vi slides/index.json
{
"filename": "greetings.md",
"attr": {
"data-background": "img/questions.jpg"
}
}

# Ejecutar gestor de tareas
$ grunt serve

A continuación se describen algunos consejos para la creación de presentación con generator-reveal.

Atributos en Diapositivas

Abrir Slides/list.json y añadir el atributo attr con la lista de los atributos que se quieran añadir a una diapositiva. Por ejemplo con la imagen de fondo y clase centrado:
    {
        "filename": "index.md",
        "attr": {
            "data-background": "resources/background.png",
            "data-background-size": "1024px",
            "class": "center"
        }
    },



Diapositivas Verticales

Para añadir diapositivas verticales a una diapositiva horizontal, tan solo es necesario sustituir el documento JSON por un array de documentos:
    [
        {
            "filename": "introduction.md"
        },
        {
            "filename": "introduction/introduction1.md",
            "attr": {
                "data-background": "resources/background.png",
                "data-background-size": "1024px",
                "data-transition": "none"
            }
        },
        {
            "filename": "introduction/introduction2.md",
            "attr": {
                "data-background": "resources/background.png",
                "data-background-size": "1024px",
                "data-transition": "none"
            }
        },
        {
            "filename": "introduction/introduction3.md",
            "attr": {
                "data-background": "resources/background.png",
                "data-background-size": "1024px",
                "data-transition": "none"
            }
        }
    ],

MarkDown

Las diapositivas pueden ser creadas en formato Markdown (extensión .md) facilitando bastante la creación de las presentaciones. Con el editor Atom de Github se puede ver una previsualización de los resultados de una página en Markdown pulsando la combinación de teclas Control, Shift y M o en el menú Packages -> Markdown Preview -> Toggle Preview.


Previsualización de MarkDown con editor Atom.


MarkDown con Fragments

Para ir mostrando líneas de texto poco a poco en una diapositiva se usa la clase fragments. La forma de añadirlo en Markdown se añade con el comentario de HTML .element.

Imágenes en MarkDown

Agregar imágenes con MarkDown es muy sencillo, con [!Nombre de imagen] se añade el texto para el atributo alt. RevealJs añade la imagen con un borde grueso de color negro. Se puede eliminar añadiendo el estilo "border:0px;". Por defecto, esto deja un marcado de sombreado para los bordes de la imagen. Esta sombra también se puede eliminar con "box-shadow: 0 0 0 rgba(0, 0, 0, 0);". La imagen se ajusta automáticamente al 95% del total del tamaño de la diapositiva. También se puede alinear junto con un texto con el atributo CSS "vertial-align", con opciones como baseline, bottom, top o middle. A continuación se muestra un ejemplo:
## ![Cassandra](resources/logo_cassandra.png )<!-- .element: style="border:0px; box-shadow: 0 0 0 rgba(0, 0, 0, 0); vertical-align: middle;" --> Apache Cassandra

Personalizando RevealJS

Para cambiar las propiedades de RevealJs se deben utilizar las plantillas dentro del directorio templates. No se debe modificar directamente index.html, porque en cuanto se ejecute grunt los cambios serán sobreescritos por el fichero de la plantilla.

En _index.html está la configuración de RevealJs. Para añadir otras opciones como mostar paginación o añadir movimiento con la rueda del ratón:
Reveal.initialize({
            controls: true,
            progress: true,
            history: true,
            center: false,
            slideNumber : true,
            fragments: true,
            mouseWheel: true,
            hideAddressBar: true,
            transition: 'slide', // none/fade/slide/convex/concave/zoom

Código en MarkDown

RevealJs incluye sintaxis de código con highlighting y es posible crear elementos de código para cada lenguaje.
Para incluir código en MarkDown tan solo es necesario añadir 3 comillas simples invertidas ```, al inicio y al final. También se puede indicar en qué lenguaje está escrito el código.

Dos columnas por Diapositiva

A veces resulta interesante poder dividir la diapositiva en 3 o más columnas. Las columnas se pueden añidir con nuevas propiedades CSS: moz-column-count y -webkit-column-count para navegadores Mozilla y Webkit respectivamente. En template/_index.html añadir:
         <style>
          .multicolumn > ul, .multicolumn > ol {
              -moz-column-count: 2;
              -moz-column-gap: 50%;
              -webkit-column-count: 2;
              -webkit-column-gap: 50%;
              column-count: 3;
              column-gap: 50%;
          }
         </style>


e indicar en la configuración de la diapositiva, en Slides/list.json, el nombre de la clase multicolumn.


Resultado diapositiva con doble columna

Notas para presentaciones

Se pueden añadir notas de ponente en cada diapositiva para ayudar en las presentaciones. Para ello, en cada diapositiva se añade la etiqueta aside con la clase notes. Para diapositivas en MarkDown es mucho más simple, basta con añadir note: al final:

Pulsando la tecla s, RevealJs abre una nueva ventana del navegador, un temporizador de tiempo (reiniciable pulsando sobre él) y las notas añadidas.

Conversión a pdf

La presentación de RevealJs se puede convertir a pdf. Lo único que hay que hacer es añadir el parámetro "?print-pdf" a la url.

Cuidado con los cambios en la hoja de estilos. Por ejemplo, el estilo de doble columna no estará optimizado para impresiones en pdf.

Desplegar en Github

Con Generator-Reveal, se puede configurar fácilmente para que despliegue una página de presentación usando github. Lo que se realiza de forma automática es subir crear la complilación de archivos en dist, crear la rama gh-pages en dist para subir posteriormente el contenido al repositorio del usuario de Github. Esto crea finalmente una página con la presentación desplegada en https://[usaario].github.io/[nombre-repositorio].
Primero, es necesario crear el repositorio en Github y a continuación ejecutar los comandos de linea:
$ grunt dist
$ git init
$ git add .
$ git commit -m 'First commit'
$ git remote add origin remote repository URL
$ grunt deploy


Para desplegar, debe estar configurado en Reveal la cuenta y el repositorio del usuario (seleccionado durante la creación del código con Yeoman). Sin embargo, los datos del repositorio puden ser reconfigurados posteriormente en los ficheros .yo-rc.json y Gruntfile.coffee:
$ vim .yo-rc.json
    "deployToGithubPages": true,
    "githubUsername": "user-github",
    "githubRepository": "repository-name"
  }
}

$ vim Gruntfile.coffee
        buildcontrol:

            options:
                dir: 'dist'
                commit: true
                push: true
                message: 'Built from %sourceCommit% on branch %sourceBranch%'
            pages:
                options:
                    remote: 'git@github.com:user-github/repository-name'
                    branch: 'gh-pages'
...
    grunt.registerTask 'deploy',
        'Deploy to Github Pages', [
            'dist'
            'buildcontrol'
        ]


Finalmente, en este enlace se muestra el código y resultado de una presentación creada con RevealJs y Generator-Reveal.

sábado, 8 de noviembre de 2014

OSHWDem 2014 evento de hardware libre en A Coruña

Hoy se ha celebrado en A Coruña la tercera edición de la feria tecnológica OSHWDem organizado por Bricolabs junto con la ayuda de varios colaboradores.

Este año el evento se realizó en las instalación del museo del hombre Domus. Durante el día de ayer los chicos de Bricolabs y de forma totalmente gratuíta se dedicaron a dar una serie talleres para la Impresión 3D o creación de robots siguelíneas, incluso regalando el material con el que te fabricabas el robot.



Hoy, desde la 10:00 hasta media tarde se organizó este genial evento Maker Movement para promover el hardware libre y la creación de todo tipo de hardware y software como las impresoras 3D o drones.

Como siempre, no podían faltar los regalos a los más madrugadores, sorteos y concursos como el siguelíneas y la competición de sumo entre robots.

Con visitas de gurús de la impresión 3D en España como es @Obijuan_cube o @TCRobotics, uno de los organizadores, con la presentación de su Wheelie.
Wheelie creado por @TCRobotics
El dron incluye una señal GPS, indicando la ruta desde google maps a través de una aplicación Android es posible dirigir el vehículo por zonas de difícil acceso. Además, tiene dos cámaras, frontal y trasera, junto con unas gafas con pantalla (parte izquierda de la imagen) para seguir la exploración. Pero lo más interesante es el radar láser que incluye Wheelie basado en Open Lidar, un proyecto que aprovecha el componente de la aspiradora inteligente de Neato Robotics.

Daniel, otro de los organizadores, nos enseñaba algunos de los drones realizados en BricoLabs y otros productos comerciales.
Quadcóptero con señal GPS
Otros de los productos que BricoLabs nos presentaba era una mano mecánica hecha con impresión 3D y sensores atmosféricos con Arduino.


Mano mecánica con microArduino e impresión 3D.


Entre otros stands teníamos además de drones e impresoras 3D varios aparatos hardware y muchas ideas innovadoras con desarrollo hardware y software libre tanto de organizadores del propio evento o nuevas empresas relacionadas con open hardware como un grupo de gente que presentaba sus trabajos y proyectos personales.




@Jerberrypi esta vez nos tenía preparado un comedero domótico para tortugas mediante el cual solo tenímos que twittear cualquier mensaje con el contenido "comed tortugas" para darles de comer. Además, no podía faltar la webcam para monitorizarlas desde cualquier sitio con conexión. Todo gestionado a través de una RaspberryPi.

Alex y sus amigos de instituto nos presentaba un invernadero con un Arduino y varios sensores para gestionar el autoregado, luminosidad y temperatura mediante el uso de ventiladores y un secador. Además de varios de los robots que usarían para los concursos. Uno de ellos era una Roomba tuneada con sensores de proximidad.

Invernadero domótico.
@escornabot es un robot basado a partir de un proyecto comercial creado para que fuese hardware libre y culquiera pudiera imprimirlo y montarlo en casa. Teneis los diseños publicados en el github de Xoan, uno de los chicos de Bricolabs que estuvo en los talleres de impresión 3D.

Mateo nos presenta sus cubos para crear música electrónica o chipmusic a partir de componentes hardware que podemos encontrar en cualquier tienda de electrónica. El proyecto está disponible en thehypercubes.com

Make Your Own Music en thehypercubes.com
Cada uno de los cubos tiene unos imanes anti-dummies preparados para conectar varios cubos y poder crear música. Dentro del cubo y entre sus componentes están unos leds de colores que identifican la función principal del cubo, desde el verde para orquestar la sintonía con todos los cubos al azul y rojo para controlar el volumen y crear distorsión. Incluso, algunos cubos carecen de potenciómetro e incluyen un sensor para modificar el sonido colocando nuestros dedos. El material de los cubos y la protoboard pueden ser creados con impresión 3D y en un futuro se busca poder reducir el tamaño de los cubos a más de la mitad.

Enxine nos presentan un prototipo que integra varias placas de hardware libre para poder realizar mediciones en tiempo real del consumo de nuestros aparados de casa. Incluyendo comunicación RFC con distintos aparatos como Ninjablocks para el Internet de las Cosas o IoT.

La empresa Flinq para la innovación tecnológica y eficiencia energética nos presenta un gestor de medición de consumos mediante el uso de hardwarea y software libre. Entre las aplicaciones que utilizan se encuentran emonTx de OpenEnergyMonitor para conectar a cualquier aparato electrico y medir a través de una RaspberryPi el consumo para la búsqueda de tarifas más óptimas en una empresa y otras soluciones de gestión de recursos de las empresas con el openERP Odoo que nada tiene que envidiar a productos comerciales el cual incluye características como gesticón de clientes al estilo kanban, facturación, gráficos de Gantt, una API para conectar tus aplicaciones a medida e incluso algunas características de análisis de datos para Inteligencia de Negocio o BI.

BricoGeek, uno de los colaboradores del evento, nos trajo diverso material de hardware libre e incluso un mandos arcade con el juego de Street fighter II para echar unas partidas.


Entre otros de los asistentes estaban la tienda de impresión 3D GaliPrint3D,
Codemonsters para la enseñanza de programación a niños de cualquier edad mediante lenguajes como Scratch , Duinobox, Ecogarden y la creación de biodiesel reciclando aceites a través de filtros de Luigui Pirelli.

Creación de biodiesel por Luigui Pirelli
Varios modelos de impresoras 3D

Impresora 3D Dragon

Modelo plegable FoldaRap
Varias piezas impresas

Luchador de Sumo Turrabot creado por el niño ganador del consurso siguelíneas del año anterior
Aquí teneis algunos vídeos del evento:

Podeis ver más información y fotografías del evento desde su twitter oficial.

miércoles, 13 de agosto de 2014

El protocolo de Bitcoin, mercado, minado y otras criptomonedas

El Bitcoin es una moneda virtual descentralizada y un protocolo basado en los principios de la criptografía asimétrica. Funciona en una red punto a punto que es mantenida por todos sus usuarios y su implementación está publicada bajo licencia de software libre con el código fuente disponible para todo el mundo.

Ejemplo de cifrado de mensaje con cifrado asimétrico. Fuente Wikipedia.


Desde la página oficial se puede obtener información para empezar a usar el Bitcoin y crear un monedero virtual con el que recibir y enviar dinero transacciones.

El proyecto comenzó en 2008 cuando un usuario bajo el pseudónimo de Satoshi Nakamoto publicó en una revista lista de correo de criptografía de metzdowd.com el paper como un sistema descentralizado P2P de dinero electrónico. El 11 de Febrero de 2009 publicaría la primera versión del cliente de Bitcoin en el foro de p2pfundation.

Actualización (15/08/2014): Desde metzdowd se puede acceder a la primera publicación en 2008 del paper y a la publicación de la primera versión del cliente de Bitcoin en 2009. Fuente: coindesk.com.

El cliente de Bitcoin o cartera se sincroniza con la red descargando todas las transacciones registradas. Es decir, que todos los pagos en Bitcoin son públicos. En sitios como blockchain.info se pueden consultar todas las transacciones que se están realizando en tiempo real.

Funcionamiento básico

Todas las transacción de bitcoins son públicas y se transmiten a través de una red descentralizada P2P donde los clientes actúan a la vez de servidores o nodos.

Cuando un cliente envía bitcoins a otro, la transacción se añade a un bloque que se propaga por la red. Toda transacción se confirma cuando es incluida en un bloque y a partir de ese bloque se sigue confirmando con los siguientes bloques. Cuantas más confirmaciones tenga una transacción se reduce la posibilidad de que ésta sea revertida. Por este motivo se suele solicitar al menos 3 confirmaciones o más para dar como válida una transacción.

En el White Paper oficial se explica el funcionamiento técnico con mayor detalle.

Generación de bloques

Un bloque se genera cada 10 minutos y tiene una estructura y una cabecera establecidas donde se indica:
  • Magic no: El valor de "número mágico" 0xD9B4BEF9, valor poco probable de que se produzca en la tabla ASCII en los datos normales con el siguiente bloque.
  • Blocksize: Tamaño de bloque.
  • Cabecera de bloque:
    • Version: versión del bloque
    • hashPrevBlock: El hash del bloque previo (SHA256)
    • hashMerkleRoot: El hash inicial raíz basado en todas las transacciones del bloque, cambia cuando se añade una nueva transacción.
    • Time: timestamp en 4 bytes.
    • Bits: indica la dificultad del bloque
    • Nonce: comienza en 0 y se incrementa en cada hash hasta que se desborda. Cuando lo hace, varía el valor de hash Merkle Root y asegura que sea casi imposible que dos personas generen el mismo valor de hash del bloque.
  • Contador de transacciones
  • Lista de las transacciones incluidas en el bloque.

Para generar un bloque se realiza una prueba de trabajo Proof of Work o PoW. Un sistema de prueba de trabajo PoW es una medida para disuadir ataques de denegación de servicio o correo no deseado en una red que requiere un trabajo del solicitante del servicio (normalmente tiempo de procesamiento con un ordenador).

Existen varios algoritmos de PoW. Bitcoin utiliza el algoritmo HashCash, creado por Adam Back en 1997.
 
Un Hashcash constituye un trabajo de prueba o PoW del que se tiene una cantidad parametrizable de trabajo para calcular y enviar. El receptor, o cualquiera ya que el trabajo enviado es público, pueden verificar el hashcash recibido de manera eficiente.


Este algoritmo está siendo utilizado por sistemas de seguridad como Spamassassin para evitar el envío de correo no deseado en agentes de correo electrónico o MTAs. 


En el White paper de hashcash se pueden leer con profundidad los detalles técnicos.

Minería

El cálculo de la cadena de bloques se llama minería. Un minero recibe una compensación en monedas cada vez que encuentra un bloque. Esta recompensa disminuye cada cierto número de bloques. Solo hay 21 millones de bitscoins, pero los bloques se siguen generando indefinidamente siempre que haya transacciones. Cada transacción emitida tiene un porcentaje muy pequeño de comisión que es repartido entre todos los mineros de la red.

Esquema protocolo de Bitcoin. Fuente
libro Mastering Bitcoin de Andreas M. Antonopoulos, editorial O'Reilly
Atlas.


En un principio se podía realizar minería con el monedero oficial en lo que se denomina Solo Mining. Pero cuantos más mineros haya y mayor su potencia de minado o hashrate, más aumenta la dificultad para que un minero encuentre un bloque válido. Esta dificultad se actualiza cada 2016 bloques (sobre dos semanas).

A día de hoy la única forma viable de minar bitcoins es en agrupación o Mining Pool y utilizando hardware ASIC.

Actualización (15/08/2014): En coindesk se puede leer con mejor detalle como se genera un bloque y como los mineros aseguran la confianza de la cadena de bloques.

Cartera

Para enviar y recibir bitcoins se utiliza una cartera electrónica de bitcoins. Una cartera tiene dos elementos principales:
  • Clave pública: La dirección del receptor cuyo emisor debe conocer para poder enviarle monedas.
  • Clave privada: Solo conocida por el dueño de la cartera para poder enviar sus monedas a otras direcciones. La clave privada se almacena en un fichero. Normalmente una aplicación cartera nos da la opción de cifrar el fichero que contiene la clave privada con una contraseña.
El código fuente de la cartera oficial está disponible en github. Desde la página oficial oficial se pueden descargar varias carteras no oficial, la versión core u oficial se instala en el equipo local y requiere la descarga sincronización de la cadena de bloques.

Hay otras carteras que no necesitan descargar toda la cadena de bloques e incluso hay carteras para dispositivos móviles como en Android.

Bitcoin Wallet para Android.

En Blockchain.info además de poder consultar en tiempo real todas las transacciones tiene disponible una cartera online que se puede crear con un simple registro. Hace unos meses publicaron una versión para Android.

Coinbase también ofrece un servicio de cartera online.

Se recomienda siempre cifrar el monedero (la clave privada contenida en un fichero de la cartera) con una contraseña.

Exchanges

La forma más fácil de adquirir bitcoins es comprarlos. Existen multitud de sitios web para el intercambio de bitcoins. En Europa están Bitstamp, en Rusia BTC-e, en China existen muchos sitios de intercabmio donde Okcoin tiene el mayor volumen de intercambio de bitcoins del mundo.

Principales Exchanges por volumen de bitcoins. Fuente The Story of Bitcoin.
Funcionan como un mercado de valores donde los usuarios realizan órdenes de compra y venta dando al Bitcoin un valor en función de la oferta y la demanda.

Estos sitios suelen ofrecen una API a través de un servicio web REST que automatizan los intercambios. En github tenéis disponible un script de ejemplo para realizar el intercambio de Bitcoin por otras monedas virtuales a través de 3 sitios web.

Otros sitios web como Localbitcoins permite realizar compras o ventas directas a través de intermediarios.

Cajeros automáticos

Una alternativa cada vez más presente son los cajeros automáticos de bitcoin. Hay varios modelos y se usan para facilitar los pagos con bitcoins en tiendas cercanas. Su uso es muy sencillo a través de códigos QR y dispositivos móviles.

Canadá es el país con más cajeros de Bitcoin en el mundo y en España ya hay varios cajeros instalados. En coindesk hay una sección para localizar cajeros y fabricantes de ATMs para Bitcoin en un mapa de Google Maps.

Mercado

El Bitcoin ofrece muchas posibilidades como forma de pago. Desde que la pizzería Papa Johns vendió la primera pizza en Bitcoins por 10 mil bitcoins, en el valor de 2010, actualmente multitud de comercios aceptan Bitcoin como medio de pago. La razón es la posibilidad de realizar transacciones, y microtransancciones, de forma directa e instantánea además de la baja comisión frente a otros sistemas de pago electrónicos como la tarjeta de crédito o Paypal.

Una solución ágil y simple para el comercio electrónico es Bitpay, conocido como el Paypal de Bitcoin. Permite aceptar el Bitcoin en tu comercio como medio de pago y recibir los ingresos en euros. Tal es el éxito de esta plataforma que ya está siendo utilizado en muchos sitios web y ha llegado a procesar un millón de dólares al día.

La plataforma de intercambio o exchange de bitcoins Coinbase ofrece una cartera de bitcoins online y un sistema de pago a través de su plataforma que puede ser incluida en cualquier comercio. Los packs de videojuegos de Humblebundle pueden ser adquiridos en bitcoins a través de esta plataforma y Overstock, una cadena de venta online de productos en stock de Estados Unidos, acepta Bitcoin como medio de pago aumentando consigo el número de ventas en más de un millón de dólares en dos meses.

Virgin también acepta el pago en esta criptomoneda para sus vuelos espaciales y Dell ya acepta bitcoins como forma de pago para la compra de sus productos hardware.

Los hermanos Winklevoss adquieren billetes de Virgin con Bitcoins. Fuente Coindesk.

Otras criptomonedas

Con el Bitcoin le siguen otros proyectos de monedas virtuales. Litecoin fue lanzada en 2011 por Charles Lee, ex-empleado de Google y actualmente trabajando en Coinbase. Dogecoin es una moneda basada en el meme de Doge que empezó a finales de 2013 parodiando al Bitcoin por el aumento de interés mediático tras romper la barrera de los 1,000$.

En menos de un mes Dogecoin superó en número de transacciones al Bitcoin. Obtuvo mucha fama en redes sociales como Reddit donde muchos usuarios empezaron a conocer el funcionamiento de las criptomonedas y a minar varias monedas al día con ordenadores sencillos (cuando la recompensa inicial era de 500 mil doges/bloque). A partir de aquí se financiaron varios proyectos solidarios como doge4water y doge4kids o eventos deportivos como la Nascar (piloto Josh Wise) o el equipo de bobsleigh Jamaicano.

Dogecoin ha financiado múltiples proyectos solidarios y eventos deportivos como la Nascar. Fuente Reddit.

Existen infinidad de monedas virtuales y cada día surgen nuevas altcoins, cada una con implementaciones diferentes y nuevas ideas como SpainCoin con el 50% preminado para repartir entre los ciudadanos españoles que lo soliciten. Otras implementaciones incluyen nuevos algoritmos de cálculo de bloque como Scrtypt-N de Vertcoin (y con posibilidad de envío anónimo) o X11 de Darkcoin (completamente anónimo), implementaciones AuxPoW para compartir el hashrate con otras monedas, cálculos de dificultad variables, transacciones anónimas o stealth address e incluso chats descentralizados como en Talkcoin.

En el foro de bitcointalk se publican cada día nuevas altcoins y en coindesk se puede leer un artículo interesante comparando las altcoins con los inicios de los ordenadores para casa y los microcomputadores.

Mientras Dogecoin acaba de anunciar su fork a AuxPoW para poder minar junto con Litecoin, cada vez hay más desarrollo e innovación entre algunas de las criptomonedas. Aunque esto no signifique una alta demanda actual de monedas (con aumento de su valor) podría significar una buena inversión de cara al futuro.

Minar Bitcoin o monedas Scrypt

Para minar Bitcoin es necesario utilizar el hardware ASIC más potente, donde cada día hay más competencia y el hardware queda rápidamente obsoleto e inútil. Teniendo en cuenta la estimación de subida de dificultad para Septiembre, esto implica importantes inversiones. Cuidado con el dudoso ROI de los servicios CloudMining y los retrasos de entregas de hardware, aduanas, instalación, etc. Podría decirse que el principal beneficiario en la minería de bitcoins hoy en día son los fabricantes de ASICs.

Hace poco se publicó en el blog the Thecoinsman la curiosa visita a un centro de minado de Bitcoins en China con más de 500 TH/s, unos 14 BTC/día con la dificultad actual. Mientras, en Europa el fabricantes sueco de ASICs KnCMiner tiene su propio centro de datos profesional.

Centro de datos de minado de KnCMiner. Fuente foro bitcointalk.

También sale rentable minar otras monedas con algoritmos diferentes. Hasta el primer cuarto de 2014 era posible minar con tarjetas gráficas monedas con el algoritmo Scrypt como Litecoin o Dogecoin (que superó los 200 satoshis en Enero). Pero con la llegada de ASICs para Scrypt es necesario plantearse la opción de adquirir un minero ASIC Scrypt si queremos minarlas y obtener beneficios.

En rigwarz hay una lista de mineros y sus fabricantes tanto para SHA-256 (bitcoin) como Scrypt.

En BitcoinWisdom se puede calcular el retorno de inversión indicando el precio del hardware, consumo eléctrico y previsión del aumento de dificultad. En muchos casos resulta más económico comprar monedas directamente antes que minar.

Minar monedas alternativas

Aún es rentable minar usando tarjetas gráficas monedas con algoritmos por ahora resistentes a hardware ASIC como Scrypt-N, Quark, X11, Keccak, NIST5, o X13.

Si eres algo mañoso puedes montarte tu propio rig con varias gráficas para minar altcoins. Aunque la entrada es algo antigua, en CryptoBadger hay un buen tutorial de como montar y configurar un rig minero.

Algo no muy complicado y muy recomendable es hacer undervolt en las tarjetas gráficas para reducir el consumo eléctrico (en Windows se puede hacer con los drivers).

Rig con 3 gráficas ATI 7950 y fuente de 850w.
También se aconseja separar las gráficas del resto de circuitos utilizando extensores de PCIe, utilizar fuentes eficientes con certificados 80plus y montarlo en estructuras abiertas y aisladas para una buena la ventilación. En tiendas como pcgal se pueden adquirir extensores PCIe y otros materiales de minería desde España y sin tener que esperar semanas a que lleguen desde China o Hong Kong.

Los algoritmos como el X11, X13 o NIST5 tienen la ventaja de que las gráficas consumen bastante menos, entorno a un 40% menos frente a Scrypt y Scrypt-N, generando menos calor.

Software minero

Para minar una criptomoneda es necesario utilizar el software que calcule los posibles bloques en el algoritmo específico de la moneda. Además, el software debe estar adaptado al hardware que se va a utilizar.

Para las tarjetas gráficas ATI están todas las versiones basadas en el Cgminer de Con Kolivas como Sgminer (Scrypt), Vertminer (Scrypt-N), Sph-sgminer y todas las mejoras de optimización para diferentes algoritmos como el Sph-Sgminer_x11mod (X11, X13, Nist5 entre otros).

Para tarjetas gráficas Nvidia están disponibles CudaMiner y ccMiner.

Aunque Nvidia obtiene un rendimiento menor en los algoritmos Scrypt y Scrypt-N, las versiones de múltiples algoritmos como X11 o X13 tienen un rendimiento similar al obtenido con gráficas ATI.

La forma más sencilla para la instalación del software minero es recurrir a  distribuciones de GNU/Linux, autoarrancables desde USB y con todo lo necesario para minar.

El usuario Bee adaptó el original BAMT (versión basada en Debian x86) creando Litecoin BAMT. Incluye los últimos drivers de ATI, Sgminer y diferentes versiones para varios algoritmos, acceso de escritorio remoto y un sistema de monitorización a través de un panel web.

Panel de monitorización de Bamt 1.6, minando x11 con 3 gráficas.

Otra distribución que incluye soporte para 64 bits con versiones para ATI, Nvidia e incluso RaspberryPi (para utilizar con hardware ASIC a través de USB) es PiMP.

jueves, 24 de julio de 2014

Realidad Virtual de cartón con tu smartphone (Parte II)


Hace unas semanas publiqué la entrada Realidad Virtual de cartón con tu smartphone sobre el Google Cardboard, una prueba de concepto de headset de realidad virtual para construir uno mismo con una caja de cartón, un par de lentes, dos imanes y otros componentes.

Tan pronto como fue publicado algunas empresas empezaron a fabricar y vender kits con todos los componentes necesarios. Dodocase fue la primera en anunciar un kit y actualmente está disponible para envíos a España en unas 4 o 6 semanas.

El pasado fin de semana compré un kit disponible en Amazon por unos 20€ (sin pegatina NFC) el cual recibí ayer por la tarde. Aunque no deja de ser un simple cartón, tiene mejor acabado al ser cortado por láser y con los pliegues preparados para un montaje rápido y sencillo. Además, incluye el componente más importante, el par de lentes biconvexas con las medidas necesarias.

Kit Cardboard Google sin NFC.
El montaje del Kit es muy sencillo.


La visión con las lentes del kit es relativamente buena. La imagen se ve muy bien en la parte central, sin embargo alrededor se nota algo difuminado, en especial se notan los textos. Otra aspecto a destacar es que en función de la resolución del móvil se notarán en mayor o menor medida los píxeles.

Las letras en el menú de la demo Cardboard que aparecen en la parte inferior no se ven con claridad. Me imagino que se debe a la calidad de la lente o bien a que la posición del móvil está algo más baja de lo normal.

Menú de la demo Cardboard.
La función de la goma elástica es sujetar el móvil para que no se deslice fuera de las ranuras, pero al inclinar la pantalla para salir al menú el móvil se ha salido en algún momento.

El mejor resultado de sensación en 3D que he visto ha sido con la demo de Windy Day, un corto animado de Spotlight Stories.

Windy Day de Spotlight Stories.


En Google Earth podemos viajar través del globo terráqueo dando la sensación de volar sobre montañas o rascacielos.

Desde el menú de Cardboard también se puede acceder a las fotografías del móvil realizadas con la función de la cámara Photo Sphere.

Foto de la Torre de Hércules con la cámara Photo Sphere de Nexus.
Una demostración similar es la visita guiada al palacio de Versalles, con varias imágenes en 360 grados con el audio de un guía que nos presenta cada una de las salas del palacio.

Chrome Experiments

Desde el navegador de Chrome instalado en el dispositivo móvil se puede acceder a Chrome Experiments, una demostración para visualizar aplicaciones en HTML5. Al acceder a la url en el móvil nos pide aumentar el volumen y girar la pantalla para activar el móvil de visualización para la Cardboard.

Acceso a la url de chrome extensions desde el navegador del dispositivo.
Una vez habilitado aparece un menú con varias opciones que se escogen pulsando con el imán.

Menú de Chrome Experimentes.
Una de las opciones es la demo realizada con Tree.js vista en el vídeo de Google I/O Cardboard. La demo de la montaña rusa virtual me ha gustado bastante, dando la mayor sensación tridimensional completa con movimiento y sonido que varía en función de la proximidad a otros objetos del escenario.

Demo de montaña rusa.
Otras de las opciones del menú son vídeos en 360 grados por Airpano. Se puede ver cualquier parte del vídeo girando la cabeza.

Vídeo de osos en Kamchatka de Airpano.


Demo Treasure Hunt

Para probar la demo de Treasure Hunt con la nueva versión SDK para Android que ya incluye la API Level 20, es necesario cambiar la configuración de Gradle, en CardboardSample/build.gradle, para que no dé un error de compilación
  • Modificar la versión de buildToolsVersion por la última versión de la API Level 19 instalada en el SDK, en mi caso es la 19.1.0:
    buildToolsVersion '19.1.0'

  • Cambiar la última versión disponible para la librería support-v4, indicada con el símbolo más, por la versión 19.1.0:
    compile 'com.android.support:support-v4:19.1.0'
Tras compilar y ejecutar la demo vemos un escenario 3D donde el usuario tiene que buscar un cubo de colores y pulsar el imán cuando lo encuentre para que cambie de posición.

Captura de Treasure Hunt.

lunes, 7 de julio de 2014

Realidad Virtual de cartón con tu smartphone

Mientras se espera la llegada del headset de realidad virtual Oculus Rift en 2015, Google presentó a finales de Junio el Cardboard, una prueba de concepto de realidad virtual para smartphones Android hechas con cartón.

En el sitio web se puede encontrar un ejemplo del resultado del headset de RV junto con un manual de como construirlo en casa a partir de una plantilla en pdf y con la lista de materiales necesarios.

Cardboad de Google


Además, está disponible para Android una demo con aplicaciones diferentes para usar con el Cardboard como ver las fotografías realizadas en photo sphere, ver los canales de youtube, realizar la visita a un museo o ver las calles con street channel en formato estereoscópico.

Funcionamiento

Cardboard utiliza 3 componentes: Un par de lentes ópticas biconvexas, dos imanes y una etiqueta NFC, esta última opcional.

Efecto de la las lentes en el Cardboard. Fuente Google I/O 2014 - Cardboard: VR for Android


Para poder tener una visión inmersa en RV es necesario utilizar lentes ópticas. Google recomienda que sean de 45mm de distancia focal (F/L) biconvexas y de 25mm de diámetro.

Las lentes hacen que nuestra visión se centre en cada una de las mitades de la pantalla, haciendo que nuestro cerebro interprete de forma estereoscópica. Las aplicaciones se encargan de renderizar las dos imágenes ajustadas para la distorsión recibida por la lente.

Los imanes realizan la función de un botón de acción. Ya que la pantalla queda inaccesible, el movimiento de uno de los imanes ejerce un campo magnético que activa el sensor del magnetómetro, incluido en la mayoría de smartphones actuales.

La etiqueta de NFC, con la url cardboard://v.1.0.0, sirve para que cuando se coloque el smartphone cerca, en el Cardboard, le indique a la aplicaciones que se muestren en modo de RV.


Finalmente, el smartphone facilita el hardware y los sensores como el acelerómetro y el giroscopio.

Montaje

Para crear el Cardboard se puede imprimir el pdf de la plantilla. Hay que imprimirla en formato vertical o apaisado y activar en las propiedades de impresión el auto centrado de la imagen, ya que la plantilla ocupa casi toda la página de A4 y podría no salir alguna línea cercana a los bordes.

Plantilla de Cardboard recortada.

Luego pegar la plantilla impresa sobre un cartón, uniendo las partes 1 y 2 con fondo blanco sobre las partes 1 y 2 con fondo negro.

Para recortar utilicé un cúter y una regla con algo debajo para no marcar la mesa. Hay algunas partes centrales que resulta algo complicado recortar, pero que con paciencia se puede hacer usando el cúter a modo de punzón.

El cartón debe ser fino para que resulte cómodo de recortar.

Una vez recortadas todas las partes hay que ensamblarlas. El proceso es muy simple, incluso hay vídeos en youtube que explican los pasos necesarios.

Cardboard hecho a partir de la plantilla en pdf con una caja de zapatos.

Una vez montado todavía faltaría añadir el velcro para la sujeción del smarthphone en la parte delantera, la etiqueta NFC, los imanes y las lentes. Pero es un ejemplo de como podría ser y lo fácil que es hacerse un headset de RV en casa.

Con un acabado más profesional, hecho con una cortadora láser, en Dodocase se puede obtener el kit completo por unos 25$, ó 20$ sin etiqueta NFC, disponible para envíos a España.

Desarrollo

En el vídeo de la conferencia de Google I/O 2014 - Cardboard: VR for Android se puede ver la explicación en detalle del funcionamiento del Cardboard así como el desarrollo de aplicaciones tanto para Android como Html5 con frameworks webGL como Three.js.

En la página de desarrollo de google hay un tutorial de desarrollo para la Cardboard con la demostración del juego Treasure Hunt disponible en GitHub.

Durovis Dive

En mayo de 2013 Stefan Welker presentó la Durovis OpenDive, un headset de realidad virtual creado desde una impresora 3D para acoplarle un smarthphone. Adaptó el juego de Quake 2 a partir del port para Android para que detectase de los movimientos de la cabeza del jugador utilizando los sensores del smarthphone.

Actualmente se puede adquirir una versión comercial, el headset de RV Durovis Dive por unos 60€ en la página oficial de la compañía. También tiene disponible un plugin para Unity3D compatible con Android y iOS, además del código fuente del port de Quake 2 adaptado y los drivers para jugar con un mando por Bluetooth. También han publicado una lista de smarthphones compatibles, Android y iOS, una lista de juegos con soporte para el headset de RV y la sala de juegos Dive Launcher para Android.

Actualización (19/07/2014): El proyecto de ejemplo para el cardboard, Treasure Hunter, es un proyecto de Gradle. Para compilarlo se puede utilizar Android Studio, adaptando el proyecto a Eclipse con el plugin Grandle IDE.

Desde un terminal se puede compilar ejecutando desde el directorio del proyecto Cardboard el script ./gradlew.

Requiere tener configurada la variable de entorno ANDROID_HOME apuntando a la ruta donde está el SDK, requiere la librería support-v4.jar la cual ya está en el SDK incluído en Android Studio en la ruta sdk/extras/android/m2repository.

Con ./grandlew se compila el proyecto.

Ejecutando ./grandlew desde una terminal GNU/Linux.
El proyecto está configurado para compilar en la versión SDK Android 19.0.3. Será necesarios instalarlo desde el Android SDK Manager en sdk/tools/android. En la sección de paquetes seleccionar e instalar Android SDK Build-tools 19.0.3.

Para indicar que utiliza support-v4 19, editar el fichero de configuración de Gradle CardboardSample/build.gradle y cambiar la línea de dependencias compile 'com.android.support:support-v4:+' por compile 'com.android.support:support-v4:19.0.1'.

Con ./gradlew assembleRelease se empaqueta el apk.

Compilando con ./gradlew assembleRelease desde terminal de GNU/Linux.
 El apk se encuentra en la ruta cardboar/CardboardSample/build/apk/CardboardSample-release-unsigned.apk.

En el blog de Alexander Lin hay un tutorial de como integrar el proyecto y ejecutarlo con Android Studio.

jueves, 26 de junio de 2014

Grails "Groovy on Rails" para un desarrollo web fácil en Java

Grails es un framework para desarrollo fácil de aplicaciones web en Java desarrollado sobre el lenguaje Groovy. Fue adquirido por Spring en 2008 y  es conocido como "Groovy on Rails" ya que incluye un sistema creación de proyectos con scaffolding o andamiaje siguiendo la idea del framework Ruby on Rails en el que muchos otros frameworks han seguido su ejemplo como Symfony, Yii, CakePHP o Code Igniter.

En este caso, Grails permite la creación de un proyecto inicial con un andamiaje predefinido y de forma muy rápida usando tecnología POJO con Hibernate y Spring. Otra funcionalidad destacable es el potencial de métodos dinámicos para búsquedas en entindades persistentes. Incluye también el framework de Javascript jQuery para la creación de los elementos de la vista.

Instalación

Para la instalación es necesario descargar Grails y crear las variables de entorno de JAVA_HOME, GRAILS_HOME y añadirlas a la variable PATH. También es posible realizar la instalación de forma automática con herramientas como Gvmtool.

Incluir la variable de entorno JAVA_HOME.

~$ export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64
~$ export PATH="$PATH:$JAVA_HOME/bin"

No olvidar añadir en el .bashrc del usuario las dos líneas para que quede persistente.

Descargar y descomprimir la última versión de Grails.

~$ wget http://dist.springframework.org.s3.amazonaws.com/release/GRAILS/grails-2.4.2.zip
~$ unzip grails-2.4.2.zip 

Incluir la variable de entorno GRAILS_HOME con la ruta completa a la ubicación de Grails.

~$ export GRAILS_HOME=/home/user/grails-2.4.2
~$ export PATH="$PATH:$GRAILS_HOME/bin" 

Comprobar que Grails funciona en línea de comandos

 ~$ grails -version 

Creación de un proyecto

~$ grails create-app MyFirstProject 
Acceder al shell de Grails del proyecto creado

~$ cd MyFirstProject
~$ grails grails> help 



El shell de Grails incluye funcionalidades de tabulación para autocompletado.

Crear un ejemplo de hola mundo

Desde el proyecto se puede acceder a los datos del mismo y crear los elementos MVC fácilmente con el script de Grails.

grails> create-controller hello 


Esto creará el fichero grails-app/controllers/myfirstproject/HelloController.groovy

Ejecutar la aplicación

Para ejecutar la aplicación el comando run-app lanza por defecto la aplicación en el puerto 8080.

grails> run-app 



Con el parámetro -Dserver.port se puede indicar otro puerto.

grails> run-app -Dserver.port=9090 

Para parar la aplicación se ejecuta el comando stop-app en el shell de Grails.

grails> stop-app 

Testing

Los comandos que empiezan con create-* en Grails crean automáticamente pruebas unitarias y de integridad en las ubicaciones test/unit y test/integration.

Para ejecutar las pruebas ejecutar el siguiente comando.

 grails> test-app

Generar una aplicación

Grails permite crear aplicaciones base rápidamente con la característica de scaffolding o andamiaje, generando el controlador y vistas CRUD a partir de un esqueleto predefinido.

Para ello está el comando generate-all generando un controlador y las vistas asociadas.

Primero es necesario crear una entidad llamada Artifact en Grails.

 grails> create-domain-class user


El comando crea automáticamente la clase en grails-app/domain/myfirstproject/User.groovy. Se debe editar para indicar los atributos de la entidad, por ejemplo nombre y fecha de nacimiento.

package myfirstproject

class User {
  static constraints = {}
  String name
  Date birthDate
}


Con el comando generate-all User se crea automáticamente el controlador, las pruebas de unidad y la vista de la entidad User.

~$ grails generate-all User
| Finished generation for domain class myfirstproject.User 


Por último se ejecuta la aplicación con el comando grails run-app desde la línea de comandos.

~$ grails run-app

En la url http://localhost:8080/MyFirstProject/user/ se accede a la lista de la entidad User con las vistas CRUD, i18n y el estilo por defecto de Grails.

Vista Create de User.

Vista listado con el usuario creado.