martes, 31 de marzo de 2009

Memoria en Linux

Últimamente, el aumento de tráfico en una aplicación nos ha llevado a migrar de servidores para poder escalar con más facilidad.

Ayer por la tarde, mirando el estado de los nuevos servidores me encontré con esto en un free

$ free -m
total used free shared buffers cached
Mem: 2048 1996 51 0 599 364
-/+ buffers/cache: 1032 1015
Swap: 0 0 0

Y entré en modo semi-pánico porque tenía menos de un 5% de memoría libre y estos servidores virtualizados no tienen swap... pero investigando un poco y con la ayuda de Jacobo, encontré que la máquina está perfectamente, no estaba interpretando bien los datos.

buffers es la cantidad de memoria usada por el kernel para cachear I/O de disco y cached indica la memoría usada recientemente, pero que actualmente no está en uso y que está cacheada.

Así que la cantidad de memoría disponible en el servidor para aplicaciones es la suma de free + buffers + cached (la cantidad que pone en la columna free en la segunda fila), en el ejemplo 1.015 MBytes, casi el 50% de la RAM total.

Por último un enlace a un HowTo sobre la memoría en Linux, tiene sus añitos, pero es perfectamente válido

viernes, 23 de enero de 2009

Is Everyone Better Than You? Good!

Hace tiempo que tenía ganas de leer algún libro técnico 'filosófico', que hablará más sobre la forma de trabajar y buenas prácticas que sobre programación sin más.

En la Conferencia Rails, Sergio Gil en su charla recomendó un par de libros, y finalmente me he comprado Practices of an Agile Developer. Supongo que tarde o temprano tambien me acabaré leyendo el otro (The Pragmatic Programmer)

No habla de nada revolucionario ni reinventa la rueda, pero te explica todo eso que ya sabes y que no siempre aplicas. Y después de leerlo dan ganas de intentar hacer las cosas un poco mejor, que era mi objetivo al leerlo

El libro tiene una frase que me ha gustado mucho y que he puesto de título en esta entrada

Is Everyone Better Than You? Good!

Ya que me he sentido muy identificado tanto con esa frase como con el parrafo que viene despues en el libro. Viniendo de la tierra de los ciegos donde el tuerto era el rey, cuando empecé a trabajar en ASPgems, una de las cosas que más me gusto fue ese sentimiento de 'soy el más torpe de todos, cuanto por aprender!!!'

Y el día que ya no me pase... pues me tendré que plantear cambiar de trabajo :)

lunes, 29 de diciembre de 2008

Código duplicado en Ruby

En mi anterior trabajo, las raras veces que entre reunión y documento y reunión me dejaban trabajar un rato, una de las herramientas imprescindibles para mi en Netbeans era PMD, tanto para detectar errores como para intentar hacer mejor código.

Netbeans da algunas sugerencias de código en Ruby, subraya las variables no usadas, pone en negrita las variables/métodos no definidos,... pero todavía le falta para llegar al nivel de PMD en Java.

He estado buscando a ver si hay algo parecido para Ruby y dentro de PMD he encontrado que tiene un módulo para detectar código duplicado: Copy paste detector que se puede ejecutar desde linea de comando o usando Java Web Start.

Dependiendo del tamaño del bloque repetido a buscar a veces da un

java.lang.ArrayIndexOutOfBoundsException: -1
at java.util.ArrayList.get(Unknown Source)
at net.sourceforge.pmd.cpd.SourceCode.getSlice(SourceCode.java:133)
at net.sourceforge.pmd.cpd.MatchAlgorithm.findMatches(MatchAlgorithm.java:84)


Pero jugando un poco con el tamaño funciona y he encontrado unos cuantos trozos de código a refactorizar :-)

Y como ejemplo, la salida que da al ejecutarlo sobre el directorio rails. Con un tamaño de chunk menor de 60 da la excepción anterior, pero con un tamaño mayor funciona bien, y sólo encuentra duplicados en los test y en ficheros de zonas horarias, así que parece que por lo que respecta a código duplicado, rails está bien hecho :-)


jueves, 11 de diciembre de 2008

Curioso comportamiento de nil.id

En un trozo de código similar a este:

user_id = User.find_by_email(email).id rescue nil
if user_id.nil?
....


Me he vuelto a encontrar otra vez con un curioso comportamiento. En desarrollo funciona bien, pero en producción devuelve un user_id incorrecto en lugar de un nulo cuando el usuario no existe.

Es debido la forma de acceder del objeto nil a su atributo id. En modo desarrollo devuelve una excepción, pero en cambio en modo producción, sólo da un warning

$ ruby script/console
Loading development environment (Rails 2.1.2)
>> nil.id
RuntimeError: Called id for nil, which would mistakenly be 4 -- if you really wanted the id of nil, use object_id
from (irb):1
>> exit
$ ruby script/console production
Loading production environment (Rails 2.1.2)
>> nil.id
(irb):1: warning: Object#id will be deprecated; use Object#object_id
=> 4


La solución es muy simple, o acceder al objeto a traves de []

user_id = User.find_by_email(email)[:id] rescue nil
if user_id.nil?
....


o acceder al id despues de comprobar el nil

user = User.find_by_email(email)
if user.nil?

Es algo trivial, pero a ver si escribiéndolo no me vuelve a pasar... :-p

jueves, 20 de noviembre de 2008

Conferencia Rails 2008 - Impresiones

Este año he salido de la conferencia con la impresión de que ha sido un poco más floja que el año pasado, aunque puede ser algo subjetivo, ya que el año pasado fue la primera a la que iba y muchos de los conceptos eran nuevos para mi

Bueno, en mi opinión las charlas dignas de mención son:


Son dignas de mención más que por su contenido, ya que al final hay cosas que ya habia oido y leido varias veces, por tener ponentes competentes, con capacidad de mantener la atención, que se saben explicar, que se han preparado el contenido, que saben contestar a las preguntas... vamos, los requisitos minimos que debería tener una presentación para ser aceptada

El resto, o no fui o no merecen la pena ser comentadas....