Publicidad:
La Coctelera

Riding to NoWhere

2 Noviembre 2009

Durante las últimas semanas o mejor dicho, el último par de meses he estado trabajando con proyectos que presentan funcionalidades de búsqueda de texto en aplicaciones Rails, utilizando el plugin ultrasphinx.

En esta entrada no voy a contar que es ultrasphinx ni como utilizarlo en detalle, pero si intentaré explicar como solucione un problema que tuve al introducir una nueva asociación sobre la que la aplicación debía realizar búsquedas.

Un punto que conviene no olvidar cuando se utiliza la instrucción:

 class model < ActiveRecord::Base
   is_indexed
 end
 

Es que con esta instrucción y tras ejecutar las tareas que incorpora el plugin de ultrasphinx se generan los índices sobre los que se realizarán las consultas. Estos índices quedan definidos por una o varias queries que podemos consultar en los ficheros *.conf y que también generan las tareas de ultrasphinx. Llevarnos estas queries a nuestro query browser favorito y jugar con ellas nos permite comprobar porque los resultados que devuelve nuestra aplicación no son los que esperábamos, al menos en cierta medida.

Y ya vamos con el problema que me encontre. El problema radica en como generar el índice que permite realizar búsquedas a través de asociaciones has_many. Teniendo los siguientes modelos:

 class User < ActiveRecord::Base
   has_many :recipes
   has_many :ingredients, :through => :recipes
 end
 class Recipe < ActiveRecord::Base
   has_many :ingredients
 end
 

La búsqueda a implementar son búsquedas de usuarios por ingredientes, vale pues a configurar el índice con un poco de DSL:

 class User < ActiveRecord::Base
   ...
   is_indexed :fields => [{:field => 'email', :as => 'user_email'}],
              :include => [{
                 :association_name => "ingredient", 
                 :field => 'name',  
                 :association_sql => "LEFT OUTER JOIN recipies on recipes.user_id = users.id LEFT OUTER JOIN ingredients on ingredients.recipe_id = recipes.id"}]
   ...
 end
 

Pero esto no funciona, ya que el índice solo lo forman el primer ingrediente de cada receta. Hecho que puede llevar perfectamente a que la jodas. La pista me la dio la query que se genera en los ficheros .conf. Cogí esa query la coloque en el query browser y solo aparecieron los nombres de los primeros ingredientes, el resto de ingredientes no existían.

En la query se realiza una agrupación por users.id lo que lleva a que se pierdan el resto de ingredientes. La solución era sencilla crear un nuevo campo en la query en la que se guardarán en forma de lista los ingredientes asociados. ¿Pero eso como lo llevamos al DSL de ultrasphinx?

La solución la encontré en este hilo "How to set up a has_many :through association with Ultrasphinx"

Tenemos que indicarle a ultrasphinx que queremos concatenar los ingredientes, para que aparezcan todos y cada uno de los ingredientes asociados a la receta. Así que nos quedamos con esto:

 class User < ActiveRecord::Base
   ...
   is_indexed :fields => [{:field => 'email', :as => 'user_email'}],
              :concatenate => [{ 
                   :class_name => 'Ingredient', 
                   :field => 'name',
                   :association_sql => "LEFT OUTER JOIN recipies on recipes.user_id = users.id LEFT OUTER JOIN ingredients on ingredients.recipe_id = recipes.id", 
                   :as => "ingredient_list"
               }]
   ...
 end
 

Respondiendo al autor del hilo, gracias! me ha ahorrado bastante tiempo.

2 Octubre 2009

Durante las últimas tres semanas estuve leyendo el libro jQuery In Action de la editorial Manning durante esos maravillosos remansos de paz que son los trenes de cercanias. Aunque este libro esta basado en la versión 1.2 y actualmente jQuery se encuentra en su version 1.3.2 considero que es un muy buen punto de partida para empezar a trabajar con jQuery, ya que durante el libro se exponen multitud de ejemplos e incluso una introducción a JavaScript que también me ha enseñado multitud de cosas.

¿Por qué jQuery? Vale no es que yo tenga una gran experiencia con otros frameworks como pudiera ser Prototype, ni tampoco con el mismo lenguaje JavaScript; así esta atracción por jQuery se resume por lo que vi en los screencasts sobre paginación de Ryan Bates y también por el hecho de que un tal Yehuda Katz halla escrito este libro.

A partir de ahora siempre que me sea posible utilizare jQuery en las aplicaciones Rails que desarrolle, y sino pues a tirar de la siguiente estructura que evita que jQuery entre en conflicto con otras librerias que estemos usando:

 (function($){
     cualquier cotenido javascript cuyo scope queremos protejer
 })(jQuery);
 

La ventaja de lo anterior es que dentro de dicha declaración podemos seguir utilizando el caracter $, caracter que identifica al framework jQuery en este caso. Y ahora un primer ejemplito que nos sirve para hacer submit por ajax de los campos del formulario que no esten en blanco:

 (function($){
    $("form").submit(function(event){
        var FormValues = {};
        $("form input[value]").each(function(){
             FormValues[$(this).attr("name")] = $(this).val();
        });
        $.post($("form").attr("action"), FormValues);
    });
 })(jQuery);
 

Y con esto hasta mañana a las ocho

17 Agosto 2009

Bueno me ha tocado crear unos bullets circulares con número de orden para incrustar en una página web y he comprado lo realmente sencillo que es llevarlo acabo con css3 a través del siguiente artículo "How to Make Circles in CSS".

Mi impletación final fue con el siguiente código css:

 div.search-circle {
   float:left;
   height: 2em;
   width: 2em;
   -webkit-border-radius: 1em;
   -moz-border-radius: 1em;
   background-color: #FF7900; margin: auto; 
   margin-right:1em;
 }
 div.search-circle p{
 color:#FFF;
 text-align: center;
 margin-bottom: .1em;
 font-weight:bold;
 font-size:1.5em;
 }
 

Y el siguiente fragmento de HTML:

<div class="search-circle"><p>1</p></div>  

Moraleja al querer contentar a los usuarios de IE nos toca crear una imagen con GIMP (por ejemplo) del tamaño y color que necesitemos y utilizar el siguiente código css:

 div.search-ballon {
   float:left;
   background:url(/images/layout/ballon.gif) no-repeat;
   width:26px;
   height:26px;
   margin-right:1em;
 }
 div.search-ballon p{
   color:#FFF;
   text-align: center;
   margin-bottom: .1em;
   font-weight:bold;
   font-size:1.5em;
 }
 

Y el código html en este caso sería el siguiente:

Al final nos vemos obligados a aprender a utilizar un editor de imágenes, que seguro que mal no nos viene.

2 Abril 2009

Actualmente estoy repasando un nuevo libro sobre Git, el Git Community Book. De momento lo que he leído me parece bien planteado y ayuda mucho a introducirnos en el uso de git.

Yo llevo un tiempo utilizando Git, pero nunca había leído nada sobre git-stash y me parece que este comando tiene una gran utilidad. El workflow en el que he visto que es de gran utilidad este comando sería el siguiente:

Creamos una nueva rama para añadir nueva funcionalidad:

git checkout -b new_feature

Trabajamos en esta rama, añadiendo la nueva funcionalidad y en un momento dado nos damos cuenta de algo que debemos arreglar en la rama estable. Pero aún no queremos hacer un commit en la rama ni perder los cambios que llevamos hechos para la nueva funcionalidad. Aquí entra git-stash

git stash "trabajando en new_feature"

Esto almacenará los cambios realizados para la nueva funcionalidad y nos permitirá entrar en la rama estable, realizar los cambios que detectamos y aplicarlos. Para regresar al estado anterior de la rama anterior simplemente hacemos lo siguiente:

git stash apply

Y podemos seguir trabajando para completar nuestra nueva funcionalidad.

Algunos enlaces sobre git-stash:

  • sin comentarios compártelo
  • Archivado en: git Tags: git, stash, scm, vcm
  • 22 Marzo 2009

    Siguiendo con mi adaptación completa a Ubuntu y con la búsqueda de las herramientas útiles para el desarrollo en Rails, me he encontrado con los dos siguientes post:

    En el primero de ellos se habla de la instalación de Mumbles, herramienta de envio de notificaciones al escritorio similar a Growl y que se puede descargar aquí. Orientado al uso del sistema de notificaciones con Autotest. Esto permite que mientras desarrollamos, los test se ejecuten de forma automática y así se nos notificará si hemos roto algo o todo los tests siguen pasando.

    En el segundo post se comenta el sistema de notificaciones para utilizarlo en Ubuntu para tareas comunes.

    PD: Comenzando a utilizar Vim más seriamente

    18 Marzo 2009

    Han pasado ya bastantes días y no había contado algo que no será de utilidad a nadie, pero espero que puede ser de interes a alguna persona.

    Hace un par de semanas recibí mi nuevo portátil, concretamente un Dell Studio 15" con Blue Ray. Estuve barajando alguna otra opción un Mac Book Pro 15" pero su coste echa para atrás, prácticamente el doble de lo que me ha costado el Dell Studio, aunque realmente chulo. No opté por un Mac Book de 13" bastante más asequible de precio, porque quería un portátil lo suficientemente grande para trabajar con el a diario con Rails y no necesitaba transportarlo conmigo diariamente. Bueno de momento no a salido de mi casa desde que llegó de Polonia.

    ¿Por qué Dell en lugar de otras marcas como HP, Sony, Samsung, Toshiba?, principalmente por el hecho de que mi antiguo PC un Dell Dimension 8600, no me ha causado ningún problema relevante y puedo asegurar que le he dado mucho uso durante prácticamente 7 años. Tuve problemas con el lector de DVD y la grabadora de DVD, pero al estar en garantía no hubo problemas para el cambio de cada dispositivo por otro nuevo. El servicio técnico fue a mi casa a recoger el dispositivo estropeado y a llevarme el nuevo dispositivo. Supongo que habrá gente que reproche el hecho de que un producto falle en el período de garantía, pero no volvieron a fallar.

    Después de las tan sabidas malas opiniones sobre Windows Vista, tenía claro que trabajaría con Ubuntu. Mantengo Vista y Media Direct y la partición del Recovery de Vista por si me hacen falta, en 85 GB del total de 320 GB del portátil. El resto esta dividido en una partición de intercambio (swap), la instalación de ubuntu, y una partición para la home y por último aproximadamente 100 GB en una partición de Datos, fundamentalmente para el contenido multimedia en NTFS y que será accesible también desde Ubuntu. Creo que espacio de sobra, sino para eso están los discos duros externos.

    Cómo a partir de ahora dejaré de trabajar con una máquina virtual Ubuntu sobre un Windows XP para desarrollar en Rails, para pasar a trabajar directamente sobre Ubuntu he decidido añadir en Ubuntu el software equivalente o el mismo en algunos casos de los que venía utilizando en Windows XP, como Picassa, VLC, Songbird, etc... y estoy seguro que descubriré nuevo software que será de mucha utilizada. En Vista solo realizare las instalaciones necesarias o que no tengan su equivalente en Ubuntu, que no creo que sean muchas, aunque siempre podré utilizar Wine. También espero que el rendimiento mejore, ya que mi antiguo PC andaba algo justo al ejecutar una máquina virtual.

    En cuanto al rendimiento del portátil por ahora estoy completamente satisfecho, sobre todo con el rendimiento de Ubuntu. Como nota decir que la instalación original de Vista empleaba 1:28 segundos en arrancar hasta que mostraba la pantalla de logon, por solo 28 segundos para el caso de Ubuntu.

    Ahora para mejorar mi productividad con Rails, me queda pasarme a utilizar Vim y dejar de lado el ratón y mi buen amigo NetBeans con el que empece mi andadura con Rails.

    Adios a mi antiguo PC

    Hola a mi nuevo portátil

    PD: hay que hacerle unas fotillos al cacharrito y explicar los remolinos rubiriscentes

    He aquí los remolinos rubiriscentes

    Comparte tu escritorio en http://www.deskography.org

    6 Marzo 2009

    Durante los últimos meses he estado desarrollando lo que pretende ser una red social para bikers, muy al estilo de la web moterus.

    Esta red social la estoy desarrollando con Rails, valiendome de Tog. Tog es una plataforma open source que permite añadir características de las redes sociales mediante diferentes módulos (plugins) a una aplicación Rails.

    Sin embargo, dado el gran interés que ha surgido en mi interior hacia una metodología BDD, he decido empezar de cero el desarrollo. Mi interes comercial es prácticamente nulo, más sabiendo el poco tiempo que puedo dedicar al desarrollo orientandome hacia un interés puramente didáctico y disfrutar durante el mismo.

    Para resumir, los conocimientos que pretendo adquirir con este desarrollo son:

    • Metodología BDD. Fundamentada en la utilización de Rspec con un mixin de Shoulda (framework que venía utilizando ligeramente) para los test de modelos y de controladores. Y por otro lado la utilización de Cucumber+Webrat+(Selenium)? para los tests de aceptación que pretendo que guien el desarrollo. En lo que se describe como un Outside-In y con Red-Green-Refactor iterativo. Utilización de mocks y stubs (rspec) y Factory_girl como sustitución de las fixtures.
    • Utilización de jQuery o Prototype. La integración con GoogleMaps que tenía desarrollada se fundamentaba en Prototype, daré una oportunidad a la convivencia de ambos frameworks para orientarme espero que con fortuna a jQuery.

    El comenzar el desarrollo de nuevo me sirve sobre todo para definir unos requisitos de aceptación (stories, features) que he descubierto con el anterior desarrollo y que me permitan la creación de una aplicación orientada solo y exclusivamente a lo que quiero de ella, orientando todos mis esfuerzos a causas bien definidas y que me ahorren quebraderos de cabeza.

    1 Marzo 2009

    Bueno parece mentira pero las pequeñas cosas siempre ayudan. GMail ha incorporado una barra de progreso para los ficheros adjuntos. Ahora ya dejamos de ver el still working para tener más información del progresso a la hora de adjuntar ficheros.

    NOTA: De nuevo en otro monólogo vuelvo a salir al escenario, cosa que ya se va convirtiendo en algo habitual. Ayer con el "Cómico Suicida", dentro de poco contaré más detalles

    Sobre Riding to NoWhere

    www.flickr.com
    Éste es un módulo Flickr que muestra fotos o videos públicos de Paco Guzman - Tikhon. Crea tu propio módulo aquí.

    Categorías