lunes, 15 de abril de 2013

Generando una pantallazo

Tenemos que resolver la siguiente feature en una aplicación Ruby on Rails 3.2: es necesario pintar una tabla HTML normalita y poder descargarla como imagen. La solución o tienen ningún misterio, pero sí puede ser conveniente revisar un par de trucos que nos facilitarán la vida.

Primero, preparamos el controller. Necesitamos la gema IMGKit y generar la el HTML que vamos a convertir en imagen a través de un layout semivacío.

require 'imgkit'
...

kit = IMGKit.new(render_to_string :index, formats: [:html], layout: 'html2img')
respond_to do |format|
  format.png { send_data(kit.to_img(:png), :type => "image/png", :disposition => 'attachment', filename: 'table.png') }
end


Esto por sí sólo es posible que funcione en un entorno previamente configurado, especialmente si es un Lynux. En windows, por lo general hacen falta dos cosillas:
  1. Instalar wkhtmltoimage, que viene con wkhtmltopdf. Lo podéis encontrar aquí.
  2. Configurar la ruta al ejecutable que hará la conversión, por ejemplo en /config/initializers/imgkit.rb

    config.wkhtmltoimage = 'C:\Program Files (x86)\wkhtmltopdf\wkhtmltoimage.exe'
Con esto tendremos una imagen. Pero... por desgracia el ejecutables no se va a enterar muy bien de dónde buscar las css. La solución más rápida es pasársela explícitamente en el controlador, ya sea leyendo un fichero o, si es poca cosa, mediante un string.

css = StringIO.new("html,body{height:100%; font-family :Arial ,sans-serif; font-size: 13px; line-height: 14px}...")
kit.stylesheets << css


Et voilà! Listo para descargar. ¡Salud y rocanrol!

Bola extra!
Si en la generación de la imagen os aparecen tres caracteres no-cristianos como ï»¿ , no os asustéis. Estos caracteres son el Byte Order Mark de la codificación en UTF-8 de algún fichero. Revisad los layouts y las vistas implicadas y salvad todos sin ese BOM.

Time out - let's get something clear
I speak - more truth than you want to hear
Scapegoat - to cover up your fear... you can't bring me
You ain't - never seen so much might
Fight for - what I know is right
What up - you got yourself a fight... you can't bring me
Stand up - we'll all sing along
Together - aint nothing as strong
Won't quit - we ain't in the wrong... you can't bring me

You - can't - bring - me - down!




viernes, 1 de febrero de 2013

Links simbólicos en windows

El descubrimiento del año, sin duda: en windows puedo hacer enlaces simbólicos.

Y, esto, ¿para qué sirve? Pues... cumple su función. Está ahí y se usa cuando se necesita.

Bueno, y ¿cómo se crean? Con el comando MKLINK. De la propia ayuda del comando:


MKLINK [[/D] | [/H] | [/J]] Vínculo Destino

/D Crea un vínculo simbólico a un directorio. El valor predeterminado es un vínculo simbólico a un archivo.
/H Crea un vínculo físico en lugar de un vínculo simbólico.
/J Crea una unión de directorios.
Vínculo Especifica el nombre del nuevo vínculo simbólico.
Destino Especifica la ruta (relativa o absoluta) a la que hace referencia el nuevo vínculo.


¡A disfrutarlo! Salud y rocanrol.


Puede que hoy llegue el final.
Puede que el día yo no vea acabar.
Mas si ese es mi destino,
no le haré esperar.

Ya se acabó, triste final.
Caigo en la tierra, con una herida mortal.
Mas si ese es mi destino,
no le haré esperar.

Siento llegar la oscuridad.
Muero tranquilo, he luchado hasta el final.
Por mi hogar doy la vida,
no puedo... dar más.


lunes, 9 de julio de 2012

Taller Node + Express + Sequelize para crear un API en SpainJS

Este fin de semana he asistido al SpainJS. Debo decir que en general me ha parecido un buen evento. Sólo me quejo de lo que nos cuesta, en general, a los españoles lanzarnos a hacer preguntas en inglés, y eso no es culpa de nadie en particular.

Por otro lado, he conocido a varias personas bastante interesantes: TheJare, amischol y ggalmazor.

Bueno, a lo que voy. Resulta que me dieron la oportunidad de compartir mis recientemente adquiridos conocimientos sobre desarrollo en NodeJs. En concreto, cómo desarrollar un API que siga el estándar REST. Para ello hemos utilizado Express, Express-resource y Sequelize.

El contenido del taller y los ejemplos utilizados están en http://danimata.com/spainjs.

Como siempre, salud y rocanrol.


Nena, te voy a dejar, aunque me muera de pena.
Nena, te voy a dejar, aunque la sangre se pare en mis venas.
Te voy a dejar y cumpliré mi condena
donde no pueda soñar, dentro de mi oscura carcel de arena.

Y en el fondo del arcón
junto a mi suerte negra
¿Sabes qué voy a guardar?
Con tus recuerdos, mi pena.

Nena, te voy a dejar. Mientras la música suena
no dejes de pensar que a tu lado se queda mi estrella.
Te voy a dejar. Me marcharé de esta tierra.
Así en paz quedarás dentro de tu triste jaula de seda.

Y ya ves que la razón
de acabar de esta manera,
es: "Sólo te puedo dejar
el día en que yo me muera".

lunes, 4 de junio de 2012

Mi charla sobre jQuery Mobile en Codemotion 2012

A finales de Marzo de 2012 participé en el evento Codemotion. Intenté hablar acerca de jQuery Mobile y de cómo aprovecharlo para hacer de manera sencilla un interfaz móvil para tus páginas.

Teniendo en cuenta que mi última charla técnica fue antes de que Noé comenzase a construir su arca y que de lo último que había hablado en público había sido de esferificar chocolate, pues no se me dio mal. Claro que la calidad del proyector tampoco ayudó mucho.

Aquí se pueden ver mis slides y los ejemplos que preparé como apoyo.

¡Salud y rocanrol!


Te pilla la tarde en tu cuarto otra vez,
no suena el teléfono y tú sabes porqué.
Cervezas vacías en tu habitación,
el cenicero lleno humea en un rincón.
Seguro que sola está ella también
tirada en la cama sin saber qué hacer.
No sé cómo comenzó la discusión
ni a quién le toca ahora pedir perdón.
Y creo que muero
si no siento el roce de tu cuerpo junto a mí.
Recuerdo tus labios
y esos ojos que al mirar casi hacen daño.

miércoles, 2 de noviembre de 2011

Rmagick en windows

Qué gusto da trabajar en Ruby sobre Windows desde que existen Pik y DevKit. Aún así, todavía se me resisten algunas gemas y utilidades, como el puñetero SystemTimer, que sinceramente, me da lo mismo.

Ayer instalé la última versión de Rmagick y tuvo tela. Primero instalé la versión 2.12.0 de Rmagick que viene con Imagemagick 6.5.6. Antes esto era lo más seguro pero con bundler no funciona. Después de dar mil vueltas encontré la solución en uno de mis sites favoritos: stackoverflow. En la primera respuesta a esta pregunta está la solución, que además te ayuda a dejar la última versión de Rmagick e Imagemagick instalada.

Por el camino, encontré que para indicarle a bundler que la version que necesitas de una gema es windowsera, se especifica con el parámetro...

:platform => :mswin

Mucha más información aquí.

Y nada más. ¡Salud y rock'n'roll!

Now I've been hanging out with my rebel son Mr Rock,
and I don't really like the stuff they call hip-hop.
But he's sure been good to me, and I'm bound to make him see,
that in Country Music you just can't say the 'F' word.

My son Shelton says he's been having a hard time.
Yeah he does great shows but he's just gotta speak his own mind.
Now, Hank, I wonder where that came from, you know that he's a real son of a gun.
Take the old man's advice, be nice and lose the 'F' word.

Oh no, in country music you just can't say the 'F' word.
We've come a long way but it's best if that one's not heard,
Oh we've had some hell's and damm's, we don't say 'bitch' we say 'why, yes ma'am'.
In country music you just can't say the 'F' word!


sábado, 8 de octubre de 2011

SaSS sí. CoffeeScript no.

Después de asistir al FOWA y ver al propio Hampton Catlin hablar de su SaSS, creo que me voy a convertir a SaSSero en breve.

SaSS es simplemente una forma de escribir CSS de manera más elegante y sencilla, eliminando muuuuuuucho contenido que no tiene sentido repetir. Sin saber CSS no se puede codificar SaSS.

Sin embargo, no puedo decir lo mismo de CoffeeScript. Escribir algo parecido a Ruby para generar javascript me parece de vagos. Y más después de escuchar la conferencia de Sam Stephenson. Me parece que con JQuery tengo más que suficiente y no tengo ninguna necesidad de reaprender algo que ya sé (un poco). No me parece que cueste tanto escribir javascript como para que merezca la pena hacer el esfuerzo de aprender este CoffeeScript.

Del mismo modo que no creo que merezca la pena aprender a escribir Haml cuando lo suyo es ecribir HTML limpio y estructurado.

Pero esta es sólo mi opinión. ¡Salud y Rocanrol!

Son ya las ocho, el ruido en mi calle es infernal.
Perforan la acera por cuarta vez o por quinta ya.
Son como hormigas que buscan comida sin parar.
La rompen, la cierran, mañana otra vez vuelta a empezar.

Comienza un nuevo día en mi ciudad.
Tendré que levantarme sin descansar.
El autobús no llega, estoy fatal.
El metro viene lleno, tendré que andar.

¿Cuándo los gobernantes funcionarán de un modo racional?
Ellos que se pasaron media vida en la universidad.

Cuándo el gobierno te manda una carta, has de temblar.
Señor ciudadano tiene que pagar un poco más.
Mañana pagará por su aparcamiento.
Pasado pagará por cualquier invento.
No te perdonan ni una, viene la grúa.
La fórmula para ellos siempre es multar.

¿Cuándo recibiremos alguna buena nueva del poder?
¿Cuándo? Creo que nunca, pues desde siempre nos tocó perder.

Y si protestas te acusarán de antisocial.
Joven melenudo acate usted la autoridad.
Pues de lo contrario, ya sabe muy bien a donde irá.

viernes, 8 de julio de 2011

¿Oculto suena? (Aprendiendo de los errores III)


¡Atención, pregunta! Si en una div oculto embebo (y cigala) un vídeo de Youtube... ¿sonará y no se verá? ¿se quedará sin voz hasta mostrarlo? ¿hará otra cosa totalmente distinta?

La respuesta es la de siempre: depende del navegador. Según mis pruebas, en Firefox, Safari e Internet Explorer 7 no suena y no se ve, mientras que en Chrome e Intenet Exlorer 8 suena y no se ve. Seguro que hay una respuesta en el modo en que se renderizan los elementos ocultos de una página, pero no me he molestado en buscarla la verdad.

Claro que os preguntaréis (o no) qué narices haré yo ocultando un vídeo de Youtube. Pues eso, que está bien hacerse preguntas :o)

Y este fin de semana, los Maiden en Madrid. Así que, más que nunca... ¡Salud y rocanrol!

Tell me why I had to be a Powerslave
I don't wanna die, I'm a God.
Why can't I live on?
When the Life Giver dies,
All around is laid waste.
And in my last hour, I'm a Slave to the Power of Death.

domingo, 3 de julio de 2011

¡Qué gracia tiene!

¡Qué arte! ¡Qué duende! ¡Qué tronío tiene Internet Explorer! Pero no sólo el 6, ¡todos! Y yo sin enterarme... de nuevo me caigo del guindo.

Resulta que si capturas el evento resize del objeto window del navegador, todo va bien mientras no se te ocurra recolocar y/o cambiar de tamaño cualquier elemento de la página. Es entonces cuando Internet Explorer decide que lo vuelve a lanzar y lanzar y relanzar... y termina su gran actuación con el mítico chiste Out of memory.

El bug está documentado por todas partes para IE6 e IE7 pero yo también lo he visto en plena acción en IE8. De las soluciones que he encontrado, las dos más utilizadas son: utilizar un timeout que rompa la cadena de recoloco-capturo_evento-recoloco-capturo_evento y eliminar el manejador del evento en el momento que se empiezan a recolocar elementos y reponerlo al terminar.

Yo he optado por una mezcla. Con JQuery...

function manageResize(){
 $(window).unbind('resize');

 ...haz lo que tengas que hacer...

 setTimeout('$(window).resize(function(e){manageResize();})', 25);
}

Es decir, elimino el manejador y, al terminar, lo recupero con un timeout de unos pocos milisegundos para darle tiempo a que los eventos que genera la recolocación de elementos se pierdan en el infierno de los bytes.

Y nada más. ¡Salud y rocanrol!

All aboard!

Crazy, but that's how it goes
Millions of people living as foes
Maybe it's not too late
To learn how to love
And forget how to hate

Mental wounds not healing
Life's a bitter shame
I'm going off the rails on a crazy train!

I've listened to preachers
I've listened to fools
I've watched all the dropouts
Who make their own rules
One person conditioned to rule and control
The media sells it and you live the role

Mental wounds still screaming
Driving me insane
I'm going off the rails on a crazy train!

I know that things are going wrong for me
You gotta listen to my words
Yeah!

Heirs of a cold war
That's what we've become
Inheriting troubles I'm mentally numb
Crazy, I just can not bare
I'm living with something
that just isn't fair

Mental wounds not healing
Who and what's to blame
I'm going off the rails on a crazy train!

jueves, 23 de junio de 2011

Un par de librerías javascript interesantes

Jopelines, qué poco tiempo tengo para escribir! Bueno, sólo voy a apuntar un par de librerías javascript que me han resultado útiles recientemente.

JQuery Rotate sirve para rotar imágenes. Me ha resultado muy útil para hacer una especie de potenciómetro, como una rueda de búsqueda de emisoras en las radios antiguas. En breve estará en vivo para que podáis ver cómo funciona.

JQuery Masonry sirve para dinamizar el layout de una página eliminando los espacios en blanco que se quedan con los habituales floats.

Y nada más. Salud y rocanrol!

Darling you gotta let me know
Should I stay or should I go?
If you say that you are mine
I'll be here til' the end of time
So you got to let know
Should I stay or should I go?

Always tease tease tease (siempre coqueteando y engañando)
You're happy when I'm on my knees (me arrodilla y estas feliz)
One day is fine, next is black (un día bien el otro negro)
So if you want me off your back (alrededor en tu espalda)
Well come on and let me know (me tienes que decir)
Should I stay or should I go? (me debo ir o quedarme)

Should I stay or should I go now?
Should I stay or should I go now?
If I go there will be trouble
And if I stay it will be double
So come on and let me know

This indecision's bugging me (esta indecisión me molesta)
If you don't want me, set me free (si no me quieres, librame)
Exactly whom I'm supposed to be (digame que tengo ser)
Don't you know which clothes even fit me? (saves que robas me querida?)
Come on and let me know (me tienes que decir)
Should I cool it or should I blow?

Should I stay or should I go now?
Should I stay or should I go now?
If I go there will be trouble
And if I stay it will be double
So come on and let me know
Should I stay or should I go?

miércoles, 30 de marzo de 2011

El arte de medir

Este es un post especial. No va de rails, ni de html, ni de javascript... ni si quiera es técnico. ¡Mi chica ha escrito un libro! Pero no un libro cualquiera... Ha escrito el mejor libro de analítica web en castellano (al menos a mí me lo parece).

Comparte autoría con Tristán Elósegui, experto en marketing online.

El nombre del libro es El Arte de Medir y tiene página web. Si os apetece, echad un ojo.

¡Salud y rocanrol!

Cierro mis ojos y creo ver
tus labios rojos junto a mi piel.
Sueño contigo y tengo sed.
Cuando despierto pierdo la fe.
Pero un día alcanzaré
besarte siempre que desee.
Aunque no puedas comprender,
quiero besarte otra vez ¡Mua!.