Puertas lógicas con un dominó
Publicado por blaxter - 19 Jul 2008 a las 16:05Muy ingenioso, en este vídeo podemos ver cómo implementar puertas lógicas usando un dominó. La verdad que después de ver la primera puerta, el OR, no sabía como narices iba a "implementar" el AND. La última mejor que la veas...
Rails <2.1 con ruby 1.8.7, broken!
Publicado por blaxter - 18 Jul 2008 a las 21:08Es muy peligroso, de locos más bien (o aventureros), usar últimas versiones (aka debian testing/unstable) únicamente de ciertas "cosas" (llámese cosas a librerías, paquetes, lenguajes, etc...).
Me he encontrado con un problema curioso debido al uso del interprete de ruby en una de sus últimas versiones estables (1.8.7) con el framework rails en una versión que no es la última (2.0.2).
Habría que mencionar que rails 2.0.2 salió en diciembre del año pasado, mientras que ruby 1.8.7 es de apenas mes y medio por lo que es comprensible el fallo.
El problema está en que en ruby 1.8.7 se han añadido muchas cosas nuevas, como, por ejemplo, el método chars a la clase String:
ruby 1.8.7 (2008-05-31 patchlevel 0) [i486-linux]
$ irb
>> foo = "I love popcorns".chars
=> #<Enumerable::Enumerator:0xb7c0206c>
>> foo.first.class
=> String
Método inspirado en el activesupport de rails:
ruby 1.8.6 (2007-09-24 patchlevel 111) [i486-linux]
$ irb
>> "Hello world?".chars
NoMethodError: undefined method 'chars' for "Hello world?":String
$ cd /some/rails/project/ && script/console
Loading development environment (Rails 2.0.2)
>> "Hola hola".chars
=> #<ActiveSupport::Multibyte::Chars:0xb74d0050 @string="Hola hola">
Es decir, en rails se definía un método que devolvía un ActiveSupport::Multibyte::Chars, pero si ejecutamos en un interprete 1.8.7 nos encontraremos que al ejecutar el método chars de una String, nos devolverá un Enumerator por lo que ahí ya puede pasar de todo (mayormente porque son cosas diferentes y así mal asunto).
La solución, si queremos seguir usando rails 2.0.2, es realmente simple. Si no queremos pensar, podemos ver cómo lo han solucionado en el HEAD de rails. Y simplemente añadimos esta solución en algún initializer (por ejemplo en config/initializers/fixes.rb):
String.class_eval { remove_method :chars }
rescue NameError
# all Ok
end
De esta forma, nos eliminará el método chars de String y podemos usar el definido en ActiveSupport en la metaclase de String. Es decir, como si aquí no hubiera pasado nada.
Por cierto, hay otros temas similares en cuanto a compatibilidad con ruby 1.8.7, relacionados con String#start_with?/end_with? y Enumarable#group_by pero mucho más simples y no tan "graves".
Imágenes png transparentes en IE
Publicado por blaxter - 17 Jul 2008 a las 23:24El "amado" Internet Explorer, ese navegador que tantas horas de diversión nos ha dado, no soporta imágenes png transparentes en sus versiones inferiores a la 7 (¿me lo dices o me lo cuentas?). Y aunque algunos traten de ignorar ya a IE6, sigue siendo un porcentaje inmenso que no se puede ignorar (aunque le quedan par de años como mucho), al menos para aplicaciones y páginas Web públicas.
Este problema se puede resolver fácilmente con los behavior de IE, que básicamente es una forma de ejecutar código (javascript) asociado al selector css en cuestión.
Mediante el uso del filtro AlphaImageLoader podemos mostrar imágenes que tengan zonas transparentes. La forma para resolver el problema consiste en sobreescribir todas las imágenes png con una imagen gif transparente (los cuales si son soportados) y aplicarle este filtro con la imagen real que queríamos mostrar. Esto sería algo así como:
progid:DXImageTransform.Microsoft.AlphaImageLoader(src='image.png')" />
Todo esto lo podemos realizar únicamente añadiendo un behavior el cual hará todo de forma automática. El uso sería algo así como:
behavior: url("iepngfix.htc");
}
Podemos poner esto en un css específico para IE, usar unos condicionales y nos queda ya hasta elegante:
Por lo que, en resumen, necesitaremos lo siguiente:
- ie.css
- iepngfix.htc
- gif transparente
- Añadir el ie.css de la forma indicada anteriormente
La imagen transparente gif podemos ponerla en cualquier lado de la aplicación si editamos el htc (o si definimos en javascript una variable tal que var blankSrc = "/foo/bar/trans.gif";, pero mejor la otra opción).
Por cierto, otro hack, para IE, similar y realmente útil es este con el cual podemos usar la pseudo clase :hover en más elementos aparte de <a>.
The masturbating monkeys
Publicado por blaxter - 16 Jul 2008 a las 18:33I think the OpenBSD crowd is a bunch of masturbating monkeys
Maybe this quote is out of context, but you can check out the whole text here.
As always, Linus making friends.
Carolina Liar
Publicado por blaxter - 21 Jun 2008 a las 17:00Carolina Liar es un grupo recientemente formado de rock (según tags de last.fm indie rock) compuesto íntegramente por suecos.
La formación de la banda es el típico argumento de película Hollywoodiense donde su cantante y compositor, Chad Wolf, protagoniza la típica idílica historia de un cantautor que se muda a Los Angeles para intentar triunfar y finalmente consigue formar un grupo y éxito. Lo curioso es que esta historia no es una película y está pasando de verdad.
Una de las cosas que más me gusta es que las canciones son bastante diferentes entre si (obviamente no cambia radicalmente, pero no es el típico grupo donde todas suenan igual) y las letras enganchan (hasta me sé alguna y todo, yo que no me aprendo nunca ninguna).
Hace un mes, 20 mayo, se publicó su primer disco: Coming to Terms y han publicado su primer single I'm not over, si te gusta cualquier subgénero del Rock (¿a quien no? decir rock es casi como decir, "música") tienes que darle una oportunidad a este grupo de suecos que se han ganado su prominente carrera a pulso y espero que consigan el lugar que les corresponde.
ps: ¡gracias Josepul por recomendármelo!
Diferencias entre rebase y merge en git
Publicado por blaxter - 15 Jun 2008 a las 18:56A la hora de integrar los cambios realizados en una rama de desarrollo, se puede optar por diferentes formas. Una de ellas, la más tradicional, sería aplicando un parche que previamente hemos recibido por algún medio. Otras formas más lógicas si son cambios propios sería mergear o hacer un rebase de dicha rama hacia la principal. En svn (y cvs) no existe el concepto de rebase, por lo que al moverse a sistemas como git al principio puede ser algo confuso.
No hay mejor forma de visualizarlo que con unas imágenes de los resultados que podríamos obtener. Partimos de esta situación inicial (imágenes sacadas usando gitk):

Y ahora vayamos a las posibles acciones que podríamos realizar para incorporar los cambios de la rama perrea a master:
- git merge perrea

- git rebase perrea

- git merge --squash perrea (&& git commit)

En un merge squash lo que hacemos sería el equivalente a aplicar un parche. Es decir, simplemente se aplican los cambios de dicha rama pero no se asocia con ésta (ni se realiza un commit automáticamente). Esto puede venir bien cuando tengamos muchos commits "sucios" (quien dice sucios, dice poco elegantes, chapuceros, embarazosos, etc...) o que queramos ocultar. Posiblemente útil al integrar cambios a una rama pública en un grupo de trabajo grande.
Entonces, ¿qué es mejor usar?. Que yo sepa, no hay una respuesta absoluta (como en casi todo). Posiblemente sea cuestión de gustos personales. De cara al historial, un rebase hace que luego sea más fácil seguir la evolución, pues un grafo sin ramificaciones es obviamente mucho más simple que uno que las tiene y si podemos simplificar las cosas, ¿para qué complicarnos la vida?.
Esta obra está bajo una
licencia de Creative Commons.
Este blog funciona gracias a WordPress
con el theme GimpStyle
diseñado por Horacio Bella y adaptado por un servidor.
Feed entradas