Entradas de la categoría Desarrollo

Rails 3.2.0 liberado

21 de enero de 2012 / Categoría: Desarrollo Leer comentarios

Hoy, 20 de enero de 2012, David Heinemeier Hansson anunciaba en el blog de Ruby on Rails la salida inmediata de Rails 3.2.0.

Al contrario que en el paso de la 3.0 a la 3.1, esta versión 3.2 es de verdad una versión "menor", con lo cual la migración de las aplicaciones que tuviéramos ya con 3.1 a 3.2 es prácticamente inmediata (de hecho ya he actualizado Rennaisance y esta misma web está con 3.2).

Entre las novedades que incluye esta versión podemos destacar:

  • Incremento de velocidad en el entorno del desarrollo. Esto se ha conseguido cambiando el comportamiento por defecto de cargar de nuevo todas las clases en cada petición a solo recargar las clases cuyos ficheros se hayan modificado desde la última petición o acción.
  • Rutas más rápidas gracias al nuevo motor Journey.
  • Nuevo método .explain que se puede utilizar con cualquier consulta SQL para obtener su EXPLAIN correspondiente en la consola. También se han añadido opciones para que este EXPLAIN se haga de forma automática si la consulta se demora más del tiempo configurado en el entorno (0.5 segundos en desarrollo, desactivado pero activable en producción).
  • Active Record Store, o lo que viene a ser poder transformar en métodos del modelo aquellos atributos que estemos utilizando en campos del tipo clave-valor serializados. Se ve mejor en el siguiente ejemplo de código.
class User < ActiveRecord::Base
  store :settings, accessors: [ :color, :homepage ]
end

u = User.new(color: 'black', homepage: '37signals.com')
u.color                          # Accessor stored attribute
u.settings[:country] = 'Denmark' # Any attribute, even if not specified with an accessor

Happy hacking! :)

Seguir leyendo

Cómo se hizo Rennaisance: Analytics

12 de diciembre de 2011 / Categoría: Desarrollo Leer comentarios Cómo se hizo Rennaisance: Analytics

Hacía tiempo que tenía dentro de la lista de gemas pendientes de probar Garb, un wrapper en Ruby de la API de Google Analytics. Así que cuando comenzó el desarrollo de la primera versión de Rennaisance tenía claro que aprovecharía para incluir una sección de estadísticas ;)

El funcionamiento de Garb es muy sencillo. En primer lugar tenemos que definir las clases que representan los informes que queremos obtener:

class LastWeekReport
  extend Garb::Model

  metrics :visits, :pageviews
  dimensions :date
end

class TopTenReport
  extend Garb::Model

  metrics :visits, :pageviews
  dimensions :page_path
end

Si queréis conocer más sobre las dimensiones y las métricas disponibles es bastante aconsejable que echéis un vistazo a este enlace.

Una vez definidas las clases de nuestros informes podemos hacer uso de ellas en algún controlador de la siguiente manera:

Garb::Session.login("tu-usuario", "tu-pass")
@profile = Garb::Management::Profile.all.detect {|p| p.web_property_id == "UA-1234"}

@last_week_results = LastWeekReport.results(@profile,
  start_date: (Date.today - 7),
  end_date: Date.today
)

@top_ten_results = TopTenReport.results(@profile,
  start_date: (Date.today - 30),
  end_date: Date.today, limit: 10,
  sort: :pageviews.desc
)

En mi caso las estadísticas son las visitas de los 7 últimos días y los 10 enlaces más visitados de la web. Creo que no hace falta explicar que "tu-usuario", "tu-pass" y el "UA-1234" no son valores reales, sino que hay que cambiarlos por los valores reales de vuestra aplicación ;)

Teniendo un poco de imaginación se pueden sacar informes todo lo complejos que necesitéis.

Seguir leyendo

Calendario para Ruby 2.0

24 de octubre de 2011 / Categoría: Desarrollo Leer comentarios Calendario para Ruby 2.0

Hoy en la lista ruby-core nos hemos encontrado con el mensaje de Yusuke Endoh anunciando que matz le había admitido como release manager de la versión 2.0 de Ruby. Dentro de ese mismo mensaje Yusuke ha aprovechado para comentar un calendario provisional de dicha versión.

Las fechas que en un principio maneja son las siguientes:

  • Agosto de 2012: Congelación de grandes cambios. Toda propuesta o especificación de grandes cambios que venga después de este mes será aplazada a futuras versiones de Ruby.
  • Octubre de 2012: Congelación general de cambios. A partir de este momento se entraría en fase intensiva de estabilización de la plataforma.
  • Febrero de 2013: Liberación de la versión 2.0. Este mes de febrero tendría además el simbolismo añadido de que es cuando se celebrará el 20 aniversario de la creación de Ruby.

En cuanto a los cambios que introducirá esta nueva versión, Ruby Inside publicó hace poco un artículo titulado "Ruby 2.0 Implementation Work Begins: What is Ruby 2.0 and What’s New?". Una lectura bastante recomendable :)

Seguir leyendo

Tips & tricks: Hacer que RVM y cron se lleven bien

09 de octubre de 2011 / Categoría: Desarrollo Leer comentarios Tips & tricks: Hacer que RVM y cron se lleven bien

Tanto por razones de comodidad como de simplificar las puestas en producción de las aplicaciones que desarrollo con Ruby utilizo RVM.

La gran mayoría de aplicaciones suelen conllevar tareas periódicas añadidas, y una de las maneras más sencillas de realizarlas es añadiendo dichas tareas en cron. No obstante, si usas RVM te habrás encontrado con que si pones el comando tal cual en el crontab, por ejemplo:

*/15 * * * * cd /tu_app && RAILS_ENV=production bundle exec rake tu_tarea

No obtienes los resultados esperados.

La manera más sencilla de solucionar este problema es cambiando tu tarea en el crontab por algo parecido a lo siguiente:

*/15 * * * * /bin/bash -l -c 'cd /tu_app && RAILS_ENV=production bundle exec rake tu_tarea'

Ejecutando bash de esta manera estamos haciendo lo siguiente:

  • Con la opción -l indicamos que se cargue en modo login shell, es decir, como si hubiésemos iniciado sesión. Por tanto, cargará todo lo que esté definido en /etc/profile, ~/.bash_profile, ~/.bash_login y ~/.profile. En consecuencia cargaremos todo lo que necesitamos para que RVM se ejecute en ese usuario con normalidad.
  • La opción -c indica que ejecute el comando que se especifica en la cadena que hay a continuación. Una vez ejecutado, finaliza la ejecución de bash.
Seguir leyendo

Cómo se hizo Rennaisance: El núcleo

05 de octubre de 2011 / Categoría: Desarrollo Leer comentarios Cómo se hizo Rennaisance: El núcleo

En esta primera entrega vamos a contar de qué está compuesto el núcleo del CMS que da vida a esta página.

  • Rails 3.1: El desarrollo comenzó a raíz de las primeras RC como campo de pruebas para ver qué tal funcionaba el nuevo sistema de asset pipelining.
  • Cells: Soy un fiel defensor del sistema de componentes para Rails. No en vano, he utilizado esta gema de Nick Sutterer en todos los proyectos Rails que he realizado hasta la fecha.
  • Memcached: Principalmente el uso que se le da a memcached en Rennaisance es para el cacheo de fragmentos o cells de la página. Ejemplos de fragmentos podría ser el módulo del pie con los últimos tweets o las últimas fotos destacadas en flickr. O incluso el propio texto de esta entrada.
  • Redis: Este sistema sirve como base para Resque. También lo estoy utilizando como sitio donde guardar las caché keys de los distintos objetos de la página, así como algún que otro dato global.
  • Resque: He escogido Resque frente a delayed_job como sistema de tareas en segundo plano por un lado porque desde un principio tenía pensado usar Redis. Por otro, no necesitaba poder serializar objetos complejos para pasar a las tareas. De paso, me venía genial el panel de monitorización de Resque para integrarlo en el panel de admin del CMS ;)

Probablemente hayas llegado a esta entrada a través del enlace publicado en Twitter o Facebook. En próximas entregas comentaré la integración con estas redes y Flickr presente en esta versión de Rennaisance.

Seguir leyendo