Sirviendo requests con clojure

Una request HTTP es muy parecido a hacer una llamada a una función: Tiene una entrada (request) y devuelve un resultado (response).

Podríamos imaginar la request como un map con los headers, la uri, etc, y la response como otro map con sus headers, status code, body, etc:

Ahora, supongamos que queremos agregar información para que esté disponible en nuestro handler, y/o en la respuesta. Podríamos crear una función que “wrappee” nuestro handler, modificando lo que este recibe y devuelve:

Con esto ya podemos simplemente pedirle a ring que sirva nuestro ejemplo:

El “proyecto completo” está disponible en github: https://github.com/grilix/ring-example

Leer más:

false Ruby === Ruby

Cuando trabajamos con lenguajes como PHP o Javascript, existe un operador que conocemos bastante bien: ===.

Este operador es sumamente útil en lenguajes que “creen” que "123" == 123 -> true o 0 == false -> true. Esto hace que errores como if (strpos( ... )) {, sean tan comunes que en la documentación de strpos, nos encontremos con:

strpos warning
Advertencia en documentación de strpos, PHP.

Entonces, la solución es usar ===, que además de comparar que las expresiones tengan el mismo valor, se asegura de que sean de el mismo tipo, así "123" == 123 -> true pero 0 === false -> false. Excelente.

Pero en Ruby, es otra historia. Para empezar, en Ruby "123" == 123 -> false, 0 == false -> false, etc. Ruby es un poquito más estricto en este tipo de cosas.

Una buena definición de este operador en Ruby, es “Si tengo un cajón con la etiqueta a, tiene sentido poner b en ese cajón?” (“If I have a drawer labelled a would it make sense to put b in that drawer?”, visto en Stack Overflow). Es decir, si tengo un cajón con la etiqueta String, puedo poner "hola" y "123", aunque no al revés: Si tengo un cajón con la etiqueta "123", puedo poner "123" pero no String.

String === "123" -> true
String === 123 -> false
"123" === "123" -> true
"123" === String -> false

Por otro lado, puedo tener un cajón con la etiqueta (1..10), y en ese cajón puedo poner números entre 1 y 10:

(1..10) === 4 -> true
(1..10) === 10 -> true
(1..10) === 15 -> false

Además, el resultado de este operador es el usado para el case, lo que le da una utilidad muy genial!

case edad
when 0 # -> 0 === edad
  puts "hum.."
when (1...18) # -> (1...18) === edad
  puts "menor"
else
  puts "mayor"
end

Espero sea de utilidad para alguien :)

RIP Steve

Bueno, ha pasado un largo tiempo desde que una noticia me golpeaba de esta forma: Apple ha confirmado la muerte de Steve Jobs. Noticia que realmente nos cae de sorpresa a muchos, y pincha unos cuantos globos de la felicidad de haber tenido la presentación del iPhone 4S justo ayer (A la cual Jobs no se hizo presente).

Por ahora solo me queda agradecer a Jobs por su trabajo, que sin duda, ha sido excelente.

Copio de www.stackoverflow.com, la siguiente cita:

“I’m convinced that the only thing that kept me going was that I loved what I did.” – Steve Jobs 1955-2011

gobolinux+rvm

Bueno, si te preguntabas si rvm funciona en gobolinux, claro que sí funciona, es muy simple y no varía de otras instalaciones, veamos..
Para empezar necesitas bash y curl (Compile bash, Compile curl respectivamente, si ya no lo tienes), luego:

gonzalo@gobo ~]bash < <( curl http://rvm.beginrescueend.com/releases/rvm-install-head )
# esto descargará un script y luego instalará rvm en tu home.
# Luego deberás agregar una linea a tu zshrc, de la siguiente manera...
gonzalo@gobo ~]echo '[[ -s "$HOME/.rvm/scripts/rvm" ]] && . "$HOME/.rvm/scripts/rvm"' >> .zshrc
# Listo!, antes de continuar, reinicia la consola
# para asegurarte de que todo funciona correctamente.
# ---
# Ahora, a instalar ruby (esto ya no tiene mucha ciencia ^^)
gonzalo@gobo ~]rvm install 1.9.2
gonzalo@gobo ~]rvm 1.9.2
gonzalo@gobo ~]ruby -v
ruby 1.9.2p136 (2010-12-25 revision 30365) [i686 linux]
gonzalo@gobo ~]

Ta-ran! eso era todo, a divertirse, un abrazo!

js magic warning

Bueno, mi primer post aqui será sobre mi querido javascript. Javascript es un lenguaje bastante divertido, con mucha magia, pero como dijo un heroe, “un gran poder significa una gran responsabilidad.”, y he aquí una historia que me sucedió hoy, supongamos que tenemos un inofensivo método, este método puede pasarse como callback, de modo que pasaremos la funcionalidad de un lado a otro. Veamos un ejemplo:

var log = function(a) { console.log(a); };
function myFunc() {
  log('paso 1');
  // ...
  log('paso 2');
  // ...
}

Bien, sí, esto funcionará como esperamos, y la salida sería:

paso 1
paso 2

Perfecto, pero que pasa si en lugar de definir: log = function(a) { console.log(a); }, definieramos: log = console.log ..? Bueno, la realidad es poco fiable, resulta que chrome nos dirá: TypeError: Illegal invocation al momento de invocar log('...');, pero por el contrario, node.js nos acepta el truco y hace justo lo que queremos. Pero esto no es todo, veamos el siguiente ejemplo: Continue reading