Si quieres suscribirte al feed RSS del blog, este es el canal por defecto: http://www.sirius06.es/feed/
Three Swedish switched witches watch three Swiss Swatch watch switches

EpicuroHoy ha sido uno de esos días que me da por leer una página aleatoria de la Wikipedia. Normalmente encuentro bastante morralla, historia de personajes que no me interesan, grupos de música que no los conoce ni el que los fundó y demás, pero basta con pulsar varias veces el link de random para encontrar algo interesante, algo como la vida del filósofo griego Epicuro (”Epi” para los amigos).

He investigado un poco más y me ha gustado su forma de pensar sobre todo por el siguiente texto, que viene a resumir más o menos mi posición en este tipo de debates:

  • Si Dios está dispuesto a eliminar el mal y no puede, no es omnipotente.
  • Si Dios puede eliminar el mal pero no quiere hacerlo, es malvado.
  • Si Dios quiere y puede acabar con el mal, es incoherente, lo que contradice su perfección.
  • Si Dios ni quiere ni puede eliminar el mal, ¿por qué le llamamos “Dios”?

Epicuro (Samos, 341 a. C. - Atenas, 270 a. C.).

CucumberVa, os dejo unos segundos para que os riáis a gusto… ¿ya? No, ¿que si me instalo el pepino dónde? xD :D
En serio, dejémonos de coñas (ahora viene el contenido de verdad):

Siempre he intentado no estancarme, renovar mis conocimientos cada poco tiempo y ampliarlos según las necesidades de los proyectos que hago. Eso y algunas -acertadísimas- decisiones estratégicas del departamento al que pertenezco me han llevado a dar un paso más en mis desarrollos con Rails: empezar con el BDD. Para ello, me he puesto manos a la obra con Cucumber, mejorando la experiencia al combinarlo con Mundo Pepino. Pero claro, no todo iba a ser de color de rosa, y es que es imposible instalar la gema si trabajamos bajo una distro basada en Debian (como Ubuntu, el cual es mi caso).

La solución a esto es hacernos con un par de paquetes de los que depende, así que ejecutamos el siguiente comando como superusuario:

  1. apt-get install libxslt1-dev libxml2-dev

Y ya está, con esta tontería nos acabamos de librar del error que escupe justo después de “Building native extensions“.

Se da el caso en que a veces, cuando utilizamos Paperclip, necesitamos que el path de un mismo adjunto sea diferente según su origen. Esto viene bien para guardar su información relacionada (MIME type, tamaño y nombre) en el mismo campo, pero flexibilizando al máximo su ubicación. Para ello, esta popular gema de Rails pone a nuestra disposición una característica muy útil: las interpolaciones.

Con ellas podemos mandar un parámetro extra (mediante un campo oculto, por ejemplo) al modelo para decirle dónde guardar el archivo, qué nombre darle o cualquier otra cosa. Ahora mismo nos centraremos en el primer ejemplo.

PaperlipsPrimero, creamos un “initializer” con el siguiente contenido:

  1. Paperclip::Interpolations[:folder] = proc do |attachment,style|
  2.   attachment.instance.folder
  3. end

De esta manera estamos habilitando el uso de la palabra reservada “:folder” en la instrucción “has_attached_file“, así:

  1. has_attached_file :att, :path => ":folder/:id.:extension"

Hace unos meses tenía entre manos una aplicación que consumía Web Services de una API que servía la información en varios formatos (XML, YAML, texto plano y PHP serializado -entre otros-). Para ello se ideó un proceso que con el tiempo se vio que era bastante chapucero, pues se basaba en varias peticiones HTTP y la escritura de su resultado en archivos temporales. Debido a ello, en ocasiones el rendimiento caía en picado, cosa que pasaba hasta que descubrí la forma correcta de manejar este flujo de datos:

Web Services

  1. def get_data(data_url)
  2.   begin
  3.     url = URI.parse(data_url)
  4.     res = Net::HTTP.get_response(url)
  5.     YAML.load(res.body)
  6.   rescue Exception => e
  7.     Rails.logger.error "ERROR: #{e}"
  8.     false
  9.   end
  10. end

Nueve sencillas líneas de código es lo único que necesitamos para lograr este objetivo. Primero, lo encapsulamos todo en un bloque que pueda capturar una posible excepción (”begin [...] rescue“). En la primera parte del mismo obtenemos el contenido y lo parseamos con la herramienta correspondiente al formato de salida que elijamos (YAML en este caso). En la segunda, guardamos en el log el nombre del problema ocurrido y devolvemos “false“.

Mighty MouseHace ya casi 2 años que renové gran parte de los componentes de mi PC, intentando comprarme, como casi siempre, lo mejor en relación calidad-precio. Lo conseguí con todas las piezas menos una: el ratón.

Uno de los requisitos de mi nuevo ordenador era que tuviese un teclado que no se llenase de mierda, cosa que pasa muy a menudo. He tenido infinidad de ellos y entre las teclas de la mayoría podías encontrar restos de cosas que ni sabrías identificar. Estaba hasta los huevos de eso, así que fijé mi punto de mira en uno muy bonito: el Apple Keyboard. Entré en la tienda de esta conocida marca y vi que si te lo comprabas junto al ratón te hacían una rebajilla, así que caí en la tentación y lo pedí.

A decir verdad, el teclado es la polla. No hace ruido, no atrae la suciedad y es bastante cómodo. No pega mucho con mi Thermaltake Shark, pero bueno ≈cool≈ . Lo que sí ha sido una equivocación total ha sido el ratón, y la razón es bien sencilla: no es ergonómico. Para gente como yo, que lo usamos prácticamente todo el día, que nos vale para currar, echar una partida al Counter, hacer click en videos porno, navegar… no sirve.

Cuando llevas un rato con el parece que estás agarrando una patata de plástico. Y por si fuera poco, pasadas 3 semanas no puedes hacer scroll, pues la bola está tan sucia que se ha atascado. Hay algunas soluciones por Internet, como la de limpiarla con celo y mucha paciencia… pero al poco tiempo vuelve al mismo estado. ≈bff≈

Y lo peor no es eso, sino que se rumorea que van a sacar un nuevo modelo y el cambio más importante es eliminar la dichosa ruedita. Vale, un problema menos, pero mantienen el principal: el diseño.

No dudo que vuelva a ser un gadget superventas, pero yo paso de volver a caer en la misma trampa: vuelvo a Logitech. Hasta los ratones de 9€ me resultan más cómodos que el de la bonita -pero incómoda- manzana.

Amélie

04/10/2009

No os voy a hablar concretamente de esta genial película protagonizada por una guapísima Audrey Tautou, sino de su BSO (compuesta por Yann Tiersen). Se trata a todas luces de una de las mejores de la historia, mi preferida junto con la de Matrix, difícilmente comparable con cualquier otra.

Sus temas, la mayoría con notas de acordeón o piano como base, te hacen trasladarte mentalmente a la París de Montmartre, con el Sacré Cœur en el horizonte. Toda una experiencia para los oídos.

Que la disfrutéis:

Amélie

  • 1. J’y suis jamais allé.
  • 2. Les jours tristes (Instrumental).
  • 3. La valse d’Amélie (Original).
  • 4. Comptine d’un autre été: l’après-midi.
  • 5. La noyée.
  • 6. L’autre valse d’Amélie.
  • 7. Guilty.
  • 8. À quai.
  • 9. Le moulin.
  • 10. Pas si simple.
  • 11. La valse d’Amélie (Orquestal).
  • 12. La valse des vieux os.
  • 13. La dispute.
  • 14. Si tu n’étais pas là.
  • 15. Soir de fête.
  • 16. La redécouverte.
  • 17. Sur le fil.
  • 18. Le banquet.
  • 19. La valse d’Amélie (Piano).
  • 20. La valse des monstres.

¿Canon? No, graciasEsta vez no me quiero extender mucho, pues el objetivo de este post es simplemente dar a conocer algunas tiendas que venden consumibles sin cobrarte el dichoso canon. Pese a que en España todos los establecimientos están obligados a aplicarlo, en un mundo tan globalizado como este es imposible cerrarle la puerta a otros mercados. Gracias a ellos, en este caso compensa mucho comprar por Internet, incluso pagando los gastos de envío. Seguro que os vienen bien para ahorraros algunos eurillos ;) :

Phusion PassengerParece ser que una de las últimas versiones de Passenger (”mod_rails” para los amigos), la 2.2.4, tiene un bug bastante conocido pero sin solución aparente: la carpeta temporal se crea sin permisos de escritura.
Como en todos los lenguajes de servidor, a la hora de subir un archivo se copia el mismo a un directorio temporal, donde permanece hasta que la transferencia ha llegado al 100%. Como paso posterior a este, vendría el momento de moverlo a su ubicación definitiva, pero es mucho antes cuando ocurre el error que estamos tratando.

Si echamos un vistazo al log, veremos que el proceso falla porque dicho directorio no tiene permisos de escritura. Podríamos pensar en dárselos sin más, pero esto sería sólo una solución temporal, pues este path se renueva cada vez que reiniciamos el server. Para arreglar esto de forma definitiva, deberemos abrir el archivo “Utils.cpp” y buscar esta línea:

  1. makeDirTree(tmpDir + "/webserver_private", "u=wxs,g=,o=", workerUid, workerGid);

Una vez la hayamos encontrado, la sustituimos por esta y reiniciamos el proceso:

  1. makeDirTree(tmpDir + "/webserver_private", "u=wxs,g=wx,o=wx", workerUid, workerGid);

Fuente: Fermín, mi compañero de Jet. :D Yo estaba a su lado, pero en realidad el cerebrito de todo esto es él, ¡gracias tío! ;)

Página 1 de 6123456»