Grails tip: Importar direcciones de email de LaunchRock

Sigo trabajando en minchador, no al ritmo que hubiera querido (espero escribir sobre ello), pero sigo dándole.

Estoy ya preparando el lanzamiento de la beta cerrada arreglando detalles: mejorando textos, ajustando cositas de la UI, dándole vueltas al email de bienvenida, importando los mails de los que se han ido registrando en la landing hecha con LaunchRock...

Pues bien, para sacar las direcciones de LaunchRock dejan a tu disposición la posibilidad de descargar los datos en un fichero en formato CSV con la siguiente estructura:

"timestamp","email","domain","user_clicks","user_signups","referred_by","ref_url"

Entonces lo que hice fue prepararme un sencillo Service de grails para importar tan sólo las direcciones, el código es el siguiente:
 

class LaunchRockService {
def emails
    def getEmailsFromCSV(csv) {
     def emails = []
     def lines = csv.split('\n')
     lines.each{
     def email = it.split(',')[1]
     emails << email.replaceAll('"','')
     }
     return emails
    }
    def getEmailsFromFile(file){
     def lines = file.text.split('\n')
     def total = lines.size()-1
     lines = lines[1..total]
     emails = getEmailsFromCSV(lines.join('\n'))
    }
    def emailIsForBeta(email){
     return emails.contains(email)
    }
}

 

Lo que hago es pasarle una instancia de File del csv de LaunchRock a getEmailsFromFile y recuperar todas las direcciones de email. En mi caso ejecuto ese método en el BootStrap de grails para tenerlas cargadas en memoria y acceder a launchRockService.emails desde otras partes de mi aplicación.

Ya puestos dejo el código junto a los tests los hice con especificaciones de Spock en un gist, por si a alguien le interesa.

Grails tip: Manejar uploads múltiples con mismo nombre de parámetro.

Una cosilla que he tenido que volver a hacer últimamente es tener que implementar un upload múltiple sencillito. En esta ocasión, sin necesidad de utilizar flash-javascript de por medio, gracias a la capacidad de selección multiple que viene con Html5:

<input name="images" type="file" accept="image/*" multiple="multiple">

El problema es que así todos los archivos que queremos subir vienen con el mismo nombre de parámetro, y el código habitual no se puede más que recuperar los ficheros subidos con distinto nombre.

request.fileNames.each { fileName ->
   def file = request.getFile(fileName)
   //hacer cosas
}

Pues bien, tras un par de búsquedas encontré una de esas pequeñas cosas que (por desgracia) no eres capaz de encontrar fácilmente en la documentación de grails: getMultiFileMap, que viene implementado desde Spring 3.

En fin, su uso en un controller de grails es el siguiente, es un map que contiene la colección de elementos que representa a cada fichero. Colección que recorreremos normalmente, o trataremos para lo que queramos hacer.

request.multiFileMap.images.each { file ->
   //hacer cosas
}

Agile Manifesto. Camino del AOS

Ayer hubo un evento de introducción a las metodologías ágiles Camino del AOS, donde estuve explicando el manifiesto ágil y sus principios.

Os dejo la presentación:

La verdad que hubo una asistencia más que aceptable para un evento un lunes, además de ver un número de no-desarrolladores interesante :)

Y ya puestos, aprovecho a invitar a cualquier persona a que se venga este fin de semana al AOS 2012 para aprender o profundizar en temas relacionados con las metodologías ágiles. Seguro que nos lo pasamos bien :)

Como se hizo elDisparate.de, en BetaBeers Zaragoza

Este viernes estuvimos Mamen Pradel y yo hablando en el 2º BetaBeers Zaragoza. Presentamos como hicimos elDisparate.de durante el desafío AbreDatos 2011.

En la presentación explicamos rápidamente el proyecto, los principales retos y problemas que surgieron durante el fin de semana y dimos algunas pinceladas de como cada miembro del equipo ejecutó su trabajo.

Sólo teníamos 15 minutos, pero creo que fue suficiente para poder hacerse una idea de qué hicimos en márketing, diseño, video y programación; y las limitaciones del resultado no haber tenido datos abiertos.

En fin, os dejo aquí el clásico video:

Y un post del año pasado en el que expliqué un poco lo que fue la parte de obtención de datos y programación.

¿Cuánto vale una web?

De vez en cuando algún conocido-amigo que sabe que me dedico a algo que tiene que ver con esto del interné me hace esta temida pregunta... Está bien que gente de fuera del sector se empiece a interesar en introducirse e invertir parte de sus ahorros, pero algo mal hemos hecho como sector para que se crea que es barato montar algo en internet.

Tengamos en cuenta que, sobre todo para alguien que no conozca el sector, tendrá que contratar cosas relacionadas con: Diseño, programación, contenido y marketing. Y esperemos que conozca o, al menos, tenga contactos en el nicho al que se pretende dirigir.

Entonces, ¿Cuánto vale una web? Mi respuesta inicial, suele ser algo del estilo:

  • Ufff!!
  • Eeeeh...
  • Pfff!!
  • Mmmmm...

Y termino con algo como "A saber, si quieres algo en plan presencial y serio, desde 1000 y pico o 2000 euros. Si es más, hasta lo que tengas. Depende". A veces la gente se asusta.

Lo mismo me pasa recibiendo algunas peticiones de presupuesto por email, que se limitan a "quiero una web", "un ecommerce", "una red social"... Pareciendo esperar que les mandes una propuesta detallada, hasta el último euro.
O por otro lado a gente pidiendo que les hagas un clon de alguna killer application; usando wordpress, joomla, ruby on rails... sin tener ni idea de lo que supone, y por 3000 euros, por supuesto. Y lo preocupante es que a veces llegan ese tipo de peticiones de gente que, aparentemente, llevan un tiempo moviéndose en eventos relacionados con el sector.

Seamos serios, también en internet si quieres algo que se parezca a un negocio, te puede costar lo mismo que montar un bar. Y sí, como a los bares también les pasa, si no entra nadie a consumir, tendrás que cerrar.

- ¿Y cuanto cuesta montar un bar?
- Depende.

¿Cuánto vale una web?

En fin, que si tu intención NO es hacer algo serio donde pueda ayudarte programando y/o colaborando en la conceptualización del producto, ahorremos nuestro tiempo y nos vemos en los bares.