Software Guru Conference & Expo 2014

blog de rodrigo salado anaya

Harvesting verticles, parte 2.

> ¿Qué es un verticle?

Antes de comenzar debes tener instalado Vert.x. Si tienes dificultades para instalarlo crea un nuevo hilo en el foro y verifica que la pregunta no exista aun.

Vert.x usa eventos para producir acciones y las consecuencias de esas acciones pueden generar otros eventos, así sucesivamente. La forma en que los eventos trasmiten información es mediante mensajes.

Los verticles son una unidad muy pequeña de código; scripts en su mayoría, y se encargan de contener la lógica de los eventos, están pensados para ser muy pequeños y la máxima es que no estorben a los demás verticles. Sí un verticle se muere no dejara colgado a los demás. Pero si un Verticle contiene más verticles, todos los que dependan del original mueren y eso esta bien porque estamos seguros de no dejar verticles huérfanos.

Déjenme poner uno ejemplos para entender este concepto.

Harvesting verticles parte 1.

> ¿Qué es Vert.x?

Es una plataforma orientada a crear aplicaciones web, empresariales, móviles, que es poliglota, simple, escalable, concurrente, o por lo menos es lo que dice la portada de la pagina del proyecto, también puedes ver lo que dice wikipedia al respecto y dentro de la documentación comentan también este teman. Y la versión resumida

Ejemplo de j8583 con Groovy

Hola hoy vengo con un pequeño ejemplo de como usar la API j8583, estoy usando la versión 1.7.0 y el ejemplo esta desarrollado con Groovy (Version: 2.0.5 JVM: 1.7.0_09 Vendor: Oracle Corporation OS: Mac OS X).

En este ejemplo vamos a ver como formar una trama y luego como parsearla, soló para la petición de abono (0200) ya que es lo mismo para los otros movimientos.

La teoría esta en la pagina del proyecto o es más tenemos al autor en la comunidad para preguntas mas especificas ezamudio.

A continuación todo el código del ejemplo y la salida producida.

Configuración: conf/confJ8583.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE j8583-config PUBLIC "-//J8583//DTD CONFIG 1.0//EN"
  3.         "http://j8583.sourceforge.net/j8583.dtd">
  4. <j8583-config>
  5. <template type="0200">
  6.         <field num="3" type="NUMERIC" length="6">650000</field>
  7.         <field num="32" type="LLVAR">456</field>
  8.         <field num="35" type="LLVAR">4591700012340000=</field>

Una perspectiva del uso de tuplas en Groovy!

El uso de Tuplas en Groovy me parecía algo innecesario, ya que el lenguaje cuenta con listas muy agradables y un método que permite hacerlas inmutables.

def lista1 = ["Rodrigo", 30]
lista1.collect{ it }

def lista2 = ["Rodrigo", 30].asImmutable()
println(lista2.getClass())
lista2[0] = 'Rambo!'

/**
class java.util.Collections$UnmodifiableRandomAccessList
...
java.lang.UnsupportedOperationException
        at java.util.Collections$UnmodifiableList.set(Collections...
*/

Y porque hacer algo como lo anterior si Groovy cuenta con tuplas (groovy.lang.Tuple).

def tuple = new Tuple("Rodrigo", 30)
println(tuple)
java.util.Collections.reverse(tuple)

/**
[Rodrigo, 30]
...
java.lang.UnsupportedOperationException
        at java.util.AbstractList.set(AbstractList
*/

No se si sea mejor usar listas inmutables en lugar de tuplas, pero una queja es que no se puede hacer una tupla como lo haría con una lista ([...]), como lo siguiente.

def tuple = (“Rodrigo”, 30)

/** expecting ')', found ',' at ... */

KataWordWrap

Como parte de mi pomodoro y recomendación de mi estimado amigo Alfred (@alfredochv) me di un poco de tiempo para hacer la kata WordWrap. Les comparto mi solución, se me ocurrió otra manera de hacerlo, pero por falta de tiempo no la he concretado, tal vez la haga otro día.

/*
Ejemplo con 4 columnas

You write a class called Wrapper
....|
You
writ
e a
clas
s
call
ed
Wrap
per
*/

class Wrapper{
    static wrap = { inputStr, colNum ->
        if(colNum <= 0 || inputStr.length() <= colNum){
            return inputStr
        }

        def outputString = ""
        def tempStr = inputStr[0..colNum-1]
        def inputStrLength = inputStr.length()-1
        def finPosTmp = 0
        def iniPosInputStr = 0
        def lastWhiteSpace = tempStr.lastIndexOf(' ')
       
        if(tempStr.endsWith(' ')){
            finPosTmp = tempStr.length() -1
            iniPosInputStr = colNum-1
        }else if(lastWhiteSpace > 0){
            finPosTmp = lastWhiteSpace
            iniPosInputStr = lastWhiteSpace + 1
        }else{
            finPosTmp = colNum-1

MorpheeCanvas.

Hola chic@s pues aquí de nuevo.

Hoy les quiero compartir mis primeros pininos con canvas de JavaScript. Ya en alguna ocasión pregunte si era o no prudente poner contenido como este aquí, en fin.

Como estoy tomando el curso HTML5 Game Development en udacity, me dieron ganas de experimentar un poco y pues total que aun no están todos los módulos disponibles, así que busque algo con que adelantar y me encontré con un fantástico tutorial de canvas de los chicos del MDN, pero me doy de topes al querer hacer mis propias figuras; no soy bueno calculando coordenadas. Así que decidí que para aprender no hay como hacer mi propia herramienta de diseño, para que al final me del el código de la figura y el resultado es este:

String Calculator en Groovy

Hola, como parte de la tarea de un curso que estoy tomando, nos dejaron resolver String Calculator y aquí comparto mi solución, la termine en poco tiempo, pero no en menos de 30 minutos la parte de probar las exceptions se me dificulto, se que con shouldFail de GroovyTestCase eso se pudo resolver, pero quise experimentar un poquito. Ya me dio flojera hacer que los delimitadores fueran mas complejos como por ejemplo [****].

String.metaClass.sum = { ->
        if(delegate.trim()){
                def delimiters = '[,'

                if(delegate.startsWith("//")){
                        def limitPosition = delegate.indexOf("\n");
                        delimiters += delegate[2..limitPosition]
                }

                def negatives = []
               
                def result = delegate.split(delimiters + ']').collect{ num ->
                        num = num.isNumber() ? num as int : 0
                        num >= 0 ?: (negatives << num)
                        num < 1001? num : 0
                }.sum()
                if(negatives){
                        throw new RuntimeException(
                                "Negatives not allowed $negatives"
                        )
                }
                result
        } else {
                0
        }
}

assert 0 == "".sum()
assert 0 == " ".sum()
assert 1 == "1".sum()
assert 1 == " 1".sum()
assert 1 == " 1 ".sum()

Como hacer pruebas a un script Groovy

Como probar un script Groovy.

Hola, te voy a platicar unas formas en las que vas a poder alardear que tus ‘scripts’ en Groovy tienen todas las pruebas unitarias necesarias y que el día de la instalación a producción te lo pueden dar libre, porque no tiene caso que pierdas tu tiempo viendo como los demás se sorprenden de lo bien que esta jalando tu ‘script’; aunque seguramente un sysadmin sea tu usuario. :)

¡Obvio, lo anterior es broma!

Assert es tu amigo.

Quisiera platicar de assert, aunque la información sobre esta herramienta en Groovy es muy extensa en Internet.

Los assert dentro del código son muy útiles cuando muestras a tus amigos los bocetos de las ideas que tuviste en la noche. Por ejemplo:

def saludos   = ['no':false, 'si': true, 'claro': true, 'no lo se': false]
def respuesta = 'si'

assert respuesta in saludos

println saludos."$respuesta"

En este caso es importante que el assert haga su trabajo, de lo contrario ocurrirá una groovy.lang.MissingPropertyException.

Game of Life (GoL)

Hola chicos, hoy vengo a compartir con ustedes mi implementación del juego de la vida o game of life (GoL).

video: http://youtu.be/TNhex7-0vXU

Me anime a hacerlo despues de haber asistido al Code Retreat que se organizo el pasado sábado 25 de Agosto (Méx. DF.), donde una parte de la dinámica consistía en borrar nuestro código en cada iteración para volverlo a escribir, pero como no escribí ni una línea; porque alguien se atasco con el teclado, pues me di ala tarea de echarmelo por puritito gusto :).

Hacer este ejercicio fue muy rico por lo que me dejó la práctica y por el montón de patrones que aparecen a cada rato en la codificación, es muy interesante ver que el código va creciendo solito, hasta las pruebas unitarias tenían un toque especial; jojojo ya me emocione no!!.

Lo comparto con la esperanza de poder aprender más de la comunidad, como por ejemplo si alguien me pudiera dar un consejo de como deshacerme de esos infernales 8 ‘ifs’ en la clase ‘Board.java’.

Instrucciones de uso:
1. Bajate & instala git.
2. (opcional/recomendable) Crea una cuenta en github.

Coding Dojo #2

El día de ayer tuve la fortuna de asistir al Coding Dojo de manos de los chicos de ViveCodigo, en verdad fue una experiencia enriquecedora y educativa.
Como no tuve una participación muy activa en esta edición me tome la tares de realizar un par de mejoras y terminar los ejercicios.
Ejercicio 1: By listing the first six prime numbers: 2, 3, 5, 7, 11, and 13, we can see that the 6th prime is 13. What is the 10 001st prime number?
Le hice una modificación mínima y da el resultado como en 3 segundos, cosa que antes hacia en 3 minutos.

/*
    @rodrigo_salado
*/

def getSolution(n){
    index = 0
    while(n!=0){
        if(isPrime(++index)){
            n--
        }
    }
    index
}

def isPrime(n){
    if(n <= 1) { return false }
    if(n <= 3) { return true  }
    lim = (long) Math.sqrt(n)
    !(2..lim).find{
        n%it == 0
    }
}

assert getSolution(1) == 2
assert getSolution(2) == 3
assert getSolution(3) == 5
assert getSolution(6) == 13
assert getSolution(10001) == 104743

assert isPrime(-1) == false
assert isPrime(0) == false
assert isPrime(1) == false
assert isPrime(2) == true
assert isPrime(3) == true

Distribuir contenido