Logo de La Coctelera

Apuntes prestados

En el parque somos mayoría

14 Diciembre 2007

Cuidadín con la opción :finder_sql del has_many de ActiveRecord...

... porque para que funcione correctamente tenemos que pasarle la consulta como una cadena entre apóstrofes (o comillas simples).

Así figura en su ejemplo dentro de la documentación de la API, pero cualquier despistado (como por ejemplo yo) podría poner la cadena entre comillas dobles. Si así lo hacemos y dentro hacemos uso de la clave principal del registro actual (con algo como "... WHERE post_id = #{id} ...") la consulta resultante tendrá en su lugar el identificador del objeto Ruby.

Por lo menos eso me ha pasado a mí esta tarde y me he vuelto loco hasta que he descubierto el origen del problema.

No me enrollo más que ya llego tarde a la super cañas-cena-party de los Cocktail Workers.

¡A disfrutar de la/s fiesta/s!

servido por Fernando 2 comentarios compártelo favorito

11 Diciembre 2007

EngineYard y la concentración (de talento)

En el recibidor principal de la Conferencia Rails de este año tuvimos la suerte de tener a Joshua presentándonos su nuevo equipo entre soniquetes de guitarra española. Hoy leo a Evan Phoenix en su último post :

In addition to getting all kinds of great code done, we’ve been filling out a lot of paperwork, because I’m proud to official announce that Ryan Davis and Eric Hodel are now officially EY employees, working on Rubinius!!!

Sin duda con fichajes de este nivel mi "dream team" va a poder muy pronto, si no ya, disfrutar de una pachanguita la mar de entretenida.

Tags: ruby, rubinius, vm

servido por Fernando 1 comentario compártelo favorito

22 Octubre 2007

David Chelimsky <david/>

Yo también pensaba que test/spec era la opción de BDD más "legacy-friendly", pero...

If you prefer test/spec’s style, that’s one thing, but I hate to see people making a choice based on inaccurate information.

... comentaba <david/> en “Be Dee Dee and Me” un mes después de que fuese publicado en Err The Blog, allá por mayo de este año.

Una de las cosas que más me emociona de dicho post es la generación de un esqueleto de especificación a partir de texto en lenguaje natural, casi puro y duro (en YAML ).

Es una simple tarea de rake pero si la utilizas, de repente te ves con tu página en blanco esperando a que simplemente expliques qué es lo que tienes que hacer. Sólo el ejercicio de definir el contexto es todo un desafío ya que, según me parece a mí, casi cada palabra del mismo debería formar parte del "glosario" de la aplicación.

Mi bautismo el pasado viernes en estos menesteres dio como resultado el siguiente texto en YAML :


La portada de un blog:
- deberia redirigir al indice del blog si tiene algun post publicado
- deberia redirigir al indice del fotolog si tiene algun fotopost publicado y ningun post
- deberia informar de que el blog no tiene contenidos si no tiene ningun post ni fotopost publicado

... y de éste a su definición formal, y de ésta a su implementación final. Toda una gozada, la verdad.

Por ese motivo cuando he pinchado en el enlace del autor del mencionado comentario me he llevado una agradable sorpresa. "Story Runner in Plain English", un post publicado hace media hora (¡calentito aún!) trata justamente de más de eso mismo.

Pero eso sí, en este caso con Rspec, la reina de la fiesta y actual protagonista de nuestras paellas en The Cocktail.

Con este material al menos debería poder cocinar un buen postre, ¿no?

http://blog.davidchelimsky.net/

servido por Fernando 1 comentario compártelo favorito

16 Agosto 2007

Recargando la definición de los campos de un modelo (por Richard Livsey)

Pues resulta que de un tiempo para acá venía sufriendo dolores en mi terminal al lanzar migraciones. Nada grave en realidad pero eso sí, bastante desagradables.

En particular con aquellas migraciones en las que tras la creación de una tabla le incorporamos algún campo nuevo que posteriormente utilizamos. Y era ahí justo, al utilizar ese nuevo campo, cuando sentía el pinchazo:


rake aborted!
undefined method `mi_nuevo_campo=' for #<ModeloUserType:0x9a6d0e8>

Normalmente el dolor se me pasaba con sólo lanzarla de nuevo: al cargar el modelo con la nueva estructura la migración pasaba sin problemas.

Pero en otras ocasiones ocurría que la migración en la que me aparecía el dolor, justo antes del mismo se realizaban operaciones irrepetibles, es decir, operaciones que al relanzar la migración fallaban, produciéndome un dolor mucho más grande.

Por suerte, gracias a Richard Livsey , en particualar gracias al siguiente comentario que le hacía en su blog a otro paciente con dolores similares, los míos ya son historia:

August 04 2007 at 11:57 Richard Livsey says...
[...]
In cases where the models db structure changes during a migration, you can call Model.reset_column_information to reload it.

Con su receta tras la incorporación de nuevos campos o justo antes de utilizarlos ya no he vuelto a sufrir molestias.

¡Gracias doctor!

servido por Fernando sin comentarios compártelo favorito

13 Julio 2007

Maxim Krasnyansky <max />

Hace ya tiempo que vengo sintiendo que GNU/Linux es para mí, entre otras cosas, el productor de mis sudokus favoritos. Lo que para muchos serían dolores de cabeza para mi son nuevos retos que me hacen pasar unos ratos bastante entretenido.

Lo bueno de estos sudokus es que para resolverlos en lugar de utilizar un algoritmo fijo es necesario uno variable basado fundamentalmente en el buceo: bucear por la red, bucear por código, bucear por ficheros de configuración, bucear por logs, etc. Y con cada inmersión vas aprendiendo no pocas peliculillas de este género, el digital.

Gracias a Max he logrado resolver en tiempo récord mi último sudoku:

Utilizando el móvil para acceder a Internet la conexión se me colgaba pasados unos pocos minutos

Primera inmersión: destino /var/log/syslog

Observo en el log del sistema los siguientes mensajes sospechosos:


Jul 11 12:09:02 duende kernel: hci_acl_tx_to: hci0 ACL tx timeout
Jul 11 12:09:02 duende kernel: hci_acl_tx_to: hci0 killing stalled ACL connection 36:ED:F1:63:19:00

Segunda inmersión: destino San Google

Buscado "ACL tx timeout" llego hasta una hebra del mismo nombre en una lista de usuarios de bluez, la pila de Bluetooth para Linux.

En uno de sus mensajes leo la siguiente pista de Max:

Looks like USB problems to me. For some people it helps to switch from usb-uhci.o to uhci.o

Y entonces me pregunto yo: ¿qué modulo tendré cargado en la máquina, usb-uhci o uhci?

Tercera inmersión: destino lsmod

Un lsmod me saca de dudas rápidamente: lástima, tengo cargado uhci, justo el que Max propone utilizar.

Pero no me rindo, veamos que otras opciones tengo...

Cuarta inmersión: destino modconf

Aleteando por los distintos menús de mi viejo kernel que amablemente me muestra modconf, dentro de kernel/drivers/usb/host me encuentro con los siguientes módulos: uhci, usb-uhci y usb-ohci.

Saco el módulo de uhci meto el de usb-uhci y... ¡bingo! La conexión ya no se corta.

Sudoku finiquitado (y ya comienzo a tener el mono de otro).

Does that help ?

Max

Yes, a lot. Thanks Max!

servido por Fernando 1 comentario compártelo favorito

28 Mayo 2007

Koichi Sasada <ko1/>

Gracias a la serie de entrevistas sobre la máquna virtual de Ruby realizadas por James Edward Gray II a Matz
y Ko1 me agrada descubrir que el Ruby Core
Team tiene, al menos, un miembro más. Cuando le preguntan sobre sus labores en el proyecto no se corta:

My role in Ruby's development? To steal VM hacking pleasure from Matz?

Tengo la sensación de que tanto la máquina virtual de Ruby en particular (en sus distintas implementaciones) como las máquinas virtuales en general (tanto las de aplicación como las de sistema) tienen sus motores cada día más calentitos.

Suerte que al fin y al cabo hablamos de bits y nada malo puede pasar el día que les dé por explotar.

Tags: ruby, yarv, vm

servido por Fernando sin comentarios compártelo favorito

16 Mayo 2007

Localizando HTML mal formado con assert_select

Uno de los efectos secundarios que tiene utilizar assert_select en nuestros tests de Rails es que comprueba que todo el código HTML que pasa por sus manos está bien formado.

Amablemente (esto es, sin romper los tests) nos avisa de que estamos cerrando una etiqueta sin haber cerrado antes otra que contiene, acompañado cada afirmación de precisos números de línea que nos facilitarán localizar la malformación.

Dicha precisión contrasta notablemente con la ausencia total de información al respecto del test que ha generado dicho código HTML. De poco nos sirve conocer la calle y el número si no sabemos el pueblo (unitario) o ciudad (funcional) en la que se encuentra Wally.

Si el aviso nos aparece en el test que acabamos de crear, no problemo: la acción invocada genera el HTML en cuestión. Lo incómodo es localizarlo si aparece de repente, de forma inesperada en medio de esa infinita hilera de puntos generada por la ejecución de los tests.

Solución: el parámetro TESTOPTS="-v" de rake, que no hace otra cosa que activar su modo verboso.

De esta forma justo antes de la ejecución de cada test aparecerá indicado su nombre y junto con el dedo acusica del assert_select descubrir sin muchos problemas donde está Wally.

servido por Fernando 1 comentario compártelo favorito

7 Mayo 2007

DVD de vídeo con Debian Sarge a partir de fragmentos AVI

Índice

En particular de los fragmentos AVI generados por la Canon Ixus 65 de nuestra hija. Posiblemente para otros formatos el proceso sería el mismo o similar, que podría dividirse en cinco capítulos:

  • Capítulo I: Descargando la SD
  • Capítulo II: Pegando los AVIs
  • Capítulo III: Eligiendo un JPG (o PNG)
  • Capítulo IV: Creando el DVD
  • Capítulo V: Tostar y tostar

Capítulo I: Descargando la SD

Participación estelar: konqueror

Pasamos las fotos/vídeos del evento/momentos de la memoria SD de la cámara a una carpeta en el dísco duro de Nube01. Konqueror en su modalidad de navegación por el sistema de archivos local nos permite recorrer casi todo este capítulo a golpe de ratón necesitando el teclado sólo para dar el nombre a la carpeta en cuestión (normalmente la fecha y una frase o tags relacionados).

Capítulo II: Pegando los AVIs

Participaciones estelares: mencoder y ffmpeg

Este capítulo trata de concatenar todos los vídeos en formato AVI existentes en una carpeta dando como resultado uno con formato MPEG para DVD PAL.

Transcurre por entero en una terminal y aunque antaño era toda una aventura actualmente un sencillo escriptillo lo deja todo en un par de órdenes:


nando@nube01:~$ cd FOTOS
nando@nube01:~/FOTOS$ build_dvd_mpeg_from_dir_avis 20070328-CELEBRACIÓN

Es decir, nos cambiamos al directorio raiz en el que descargamos el material y ejecutamos el escripete pasándole como parámetro la carpeta de la que queremos que saque los AVIs. Esto nos dejará un archivo con el nombre de la carpeta y extensión mpg con el resultado de la concatenación. El código del escriptillo es el siguiente:


#!/bin/bash

TMPDIR=/mnt/hda6/tmp AVIS=`ls $1/*.avi`

CONCATFILE=$TMPDIR/building_dvd_mpeg_concatenated.avi echo concatenando AVIs en $CONCATFILE... cat $AVIS > $CONCATFILE

AVIFILE=$TMPDIR/building_dvd_mpeg_fixed.avi echo reparando el AVI resultante en $AVIFILE... mencoder -o $AVIFILE -noidx -oac copy -ovc copy $CONCATFILE

MPEGFILE=$1.mpg echo convirtiendo a MPEG en $MPEGFILE... ffmpeg -i $AVIFILE -y -target pal-dvd -sameq $MPEGFILE

echo eliminando temporales... rm -f $TMPDIR/building_dvd_mpeg_*

Los echos cuentan lo que hace cada uno de los cuatro pasos (concatenamos con cat, reparamos con mencoder, convertimos con ffmpeg y borramos los temporales).

Para instalar el mencoder es necesario añadir un repositorio no oficial en nuestro /etc/apt/sources.list:


deb http://www.dedale.eu.org/mirror/debian-multimedia/ stable main
deb-src http://www.dedale.eu.org/mirror/debian-multimedia/ stable main

Nube01 tiene instalado un ffmpeg compilado a partir de (la revisión 8535 de) su repositorio de subversion (svn://svn.mplayerhq.hu/ffmpeg/trunk) pero muy posiblemente el paquetizado en Sarge funcione perfectamente.

Capítulo III: Eligiendo un JPG (o PNG)

Participaciones estelares: gimp y xine

Sin mucho misterio. Elegimos una foto o un fotograma que representará al vídeo en alguno de los menús del DVD.

Hay que tener en cuenta que la imagen se verá con un tamaño muy reducido donde triunfan los primeros planos y fracasan estrepitosamente los paisajes.

Para utilizar un fotograma lo cazamos al vuelo con xine reproduciendo el vídeo a cámara superlenta (echo de menos la posibilidad quizá existente de desde una imagen ir a la siguiente o a la anterior).

Para utilizar una parte concreta de una foto (useasé, para recortarla) tiramos de, cómo no, el gimp.

Capítulo IV: Creando el DVD

Participaciones estelares: dvdstyler y mjpegtools

Repetimos los tres primeros capítulos hasta tener material para llenar un DVD. Entonces procedemos a la creación del DVD propiamente dicha para la cual, además de los vídeos y fotos ya preparadas, deberemos elegir las imágenes que queramos tener como fondo de los menús.

Gracias a mi compañero y sin embargo apreciado Jacobo descubrí DVDStyler, sencillito de manejar y justo con la funcionalidad que buscaba.

Cuando lo utilicé por primera vez todo iba de maravilla hasta que me dispuse a generar el DVD. Dicho proceso es bastante transparente ya que DVDStyler va informando de todo lo que va haciendo en cada momento. Sin embargo, llegado a un punto la aplicación petaba y no era capaz de identificar el problema porque desaparecían los mensajes de error antes de que se pudiese leerlos, dejándome una escueta Violación de segmento (o Segmentation fault) en la línea de comandos.

Gracias a aquello de que todo esto es código libre me baje su código y coloqué pausas a lo ancho y largo del proceso de generación tratando de descubrir donde se estrellaba y... ta-chan!

Error: mpeg2enc could not read YUV4MPEG2 header : Stream requires unsupported features

Y con esto a sanguguel y de ahí de vuelta al FAQ de la página oficial de DVDStyler donde estaba documentado el susodicho error:

There is a problem with mjpegtools >1.6.2 by menu generating. To fix it you need to add "-S 420mpeg2" to ppmtoy4m command in DVDStyler core settings or downgrade mjpegtools.

¡caramba! Por primera vez en mucho tiempo tenía problema por tener una versión demasiado moderna de algo. Añadiendo "-S 420mpeg2" al comando ppmtoy4m (parte de la configuración del DVDStyler) evite tener que hacer el daungreid de las mjpegtools que tenía instaladas ( mjpegtools-1.8.0.tar.gz ).

Capítulo V: Tostar y tostar

Participación estelar: k3b

El capítulo anterior nos deja una imagen ISO lista para ser tostada cuantas veces queramos con nuestra tostadora favorita, en nuestro caso, la k3b. Limpia, compacta, mínimo consumo y lo mejor, con todo su código a nuestra disposición. Toda una joya.

Agradecimientos

A Sebastian Trüg, Gernot Ziegler, Bernhard Praschinger, Andrew Stevens, Alex Thüring, Don Brett, Jürgen Braun, Fabrice Bellard y a sus colaboradores.

servido por Fernando sin comentarios compártelo favorito


Sobre mí

Avatar de Fernando

Apuntes prestados

España
ver perfil »
contacto »

Blog sólo más personal que experimental de Fernando García Samblas.

Algo hay en la belleza [*] que le impide pasar sin rozar.

Actualmente disfrutando:

[1] "La ruina del amo execrable. Crónicas de Thomas Covenant el Incrédulo." de Stephen R. Donaldson

Buscar

suscríbete

Selecciona el agregador que utilices para suscribirte a este blog (también puedes obtener la URL de los feeds):

¿Qué es esto?

Crea tu blog gratis en La Coctelera