blog de rodrigo salado anaya

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

Convertir números a letras.

Este ejercicio estuvo de moda esta semana, y solo con el fin de que no se quede este humilde código en el baúl de los olvidos, lo dejo para la comunidad.

Soy nuevo en Groovy, y como siempre me gustan las recomendaciones y críticas sobre mi código.

Resumen del código: Convierte números enteros del 0 al 1000 en su forma escrita, letras en minúsculas y español.
Conforme se analicen números en la función ‘convierteNumeroAPalabras’ se irán agregando en el mapa ‘numerosEscritos’. Así que si se deseara llenar el mapa con la secuencia completa se usaría algo como:  (0..1000).each{convierteNumeroAPalabras(it) } , después solo se podrían recuperar la conversión con un método propio del mapa, por ejemplo: numerosEscritos.get(numero)

/*Mapa con las conversiones de los números*/
numerosEscritos = [
                0:"cero",  1:"uno",  2:"dos",   3:"tres", 4:"cuatro",
                5:"cinco", 6:"seis", 7:"siete", 8:"ocho", 9:"nueve",
               
                10:"diez",   11:"once",      12:"doce",       13:"trece",     14:"catorce",

Complejo del programador sobreprotector.

Últimamente he pensado que soy un programador sobreprotector, le impongo muchos límites a mi código (clases/métodos/funciones/…), le digo con que otros códigos juntarse y cómo comportarse ante las malas influencias. Un ejemplo es: http://www.javamexico.org/blogs/rodrigo_salado_anaya/ayuda_me_urge_ejemp...

Si algún medio le manda un String nulo a mi método, debería de generar una excepción. Eso lleva a que el código que lo implementa cuide ese detalle, así delegando esas obligaciones en el momento adecuado.

Y porque en el momento adecuado, bueno porque si el método que manda la ruta se da cuenta que es nula antes de mandarla, podría hacer otro intento para generar la correcta y no tener que esperar la excepción del validador para decir “a pus si cierto, te la mande nula verdad :S”
En estos tiempo no debería de existir null, con la cantidad de RAM que tenemos, el GC nos la pellizca (¡Claro es broma!)
Y bueno ya me decidí a no validar eso, pero aun así me quedo con la espinita y ¿Si yo no soy el que escribe el código de los dos métodos? ¿Si simplemente falla él envió de la ruta entre los dos medios? No puedo ser tan indulgente con esos detalles.

Ayuda me urge (ejemplo ε TDD)

Pretendo validar un directorio usando TDD. Les dejo las iteraciones y agradecería los comentarios y sugerencias acerca del tema, ya que uso algo similar a diario y aun que he leído un poco del tema estaría bien saber que buenas prácticas me recomiendan.

Paso 1:...
[test]

public class ValidadorTest {
}

[java]

public class Validador {
}

Paso 2:rojo
[test]

public class ValidadorTest {
    private Validador v = new Validador();
   
    @Test
    public void validaDirectorio(){
        assertFalse("Ruta null", v.directorioValido(null));
    }
}

[java]

public class Validador {
    public boolean directorioValido(String ruta){
        return true;
    }
}

Paso 3:verde
[test]

public class ValidadorTest {
    private Validador v = new Validador();
   
    @Test
    public void validaDirectorio(){
        assertFalse("Ruta null", v.directorioValido(null));
    }
}

[java]

public class Validador {
    public boolean directorioValido(String ruta){
        if(ruta == null){
Distribuir contenido