viernes, 27 de junio de 2008

Error 501 Syntactically invalid HELO argument(s) en envío de mails

Enviando una newsletter me he encontrado con que un servidor rechazaba los mails con el mensaje de error:

Error 501 Syntactically invalid HELO argument(s) en envío de mails

Investigando un poco parece ser que el problema es que el nombre de servidor que tenía definido en /etc/hosts tenía un _ y tal y como cuentan aquí no cumple el estandar RFC2821

To promote interoperability and consistent with long-standing
guidance about conservative use of the DNS in naming and applications
(e.g., see section 2.3.1 of the base DNS document, RFC1035 [22]),
characters outside the set of alphas, digits, and hyphen MUST NOT
appear in domain name labels for SMTP clients or servers. In
particular, the underscore character is not permitted. SMTP servers
that receive a command in which invalid character codes have been
employed, and for which there are no other reasons for rejection,
MUST reject that command with a 501 response.


Lo curioso es que practicamente ningún servidor hace esa comprobación, ya que sólo me ha pasado con un dominio.

Y para acabar una demostración del problema:

telnet mailin.blueyonder.co.uk 25
Trying 195.188.53.99...
Connected to mailin.blueyonder.co.uk.
Escape character is '^]'.
220 exim9.blueyonder.co.uk ESMTP Exim 4.68 Tue, 17 Jun 2008 07:54:52 +0100
helo prueba_1
501 Syntactically invalid HELO argument(s)
8 Tue, 17 Jun 2008 07:46:24 +0100
helo prueba
250 exim13.blueyonder.co.uk Hello prueba

domingo, 15 de junio de 2008

ImageScience y FreeImage en x86_64

Hace un tiempo tuve que hacer un pequeño tratamiento de imagenes, consistente en reescalar las imagenes subidas por los usuarios al servidor. Despues de leer sobre las alternativas disponibles, que son básicamente las que aparecen aquí (RMagick, Mini-magic y ImageScience), me decidí por ImageScience.

Un pre-requisito es instalar FreeImage, pero al instalar la versión 3.10 en Slicehost (Dual-Core AMD Opteron de 64 bits)

uname -a
Linux pre.beruby.com 2.6.18-xen #1 SMP Tue Feb 12 06:40:50 UTC 2008 x86_64 GNU/Linux

da un error de compilación

Source/FreeImage/PluginBMP.cpp: In function 'BOOL LoadPixelDataRLE4(FreeImageIO*, void*, int, int, FIBITMAP*)':
Source/FreeImage/PluginBMP.cpp:227: error: no matching function for call to 'MIN(int&, long int)'
Source/FreeImage/PluginBMP.cpp:282: error: no matching function for call to 'MIN(int&, long int)'
make[1]: *** [Source/FreeImage/PluginBMP.o] Error 1


Como siempre, googleando un poco encontré un parche con la solución que consiste simplemente en cambiar la definición de un par de variables desde DWORD y int a long.

Parece que en la última versión de CVS de FreeImage ya esta solucionado el error, pero bueno, esta solución tambien es valida :-)

lunes, 9 de junio de 2008

indice TIOBE de lenguajes de programación

Hace un tiempo que todos los meses miro el indice TIOBE. El método que utilizan puede ser discutible, pero es una forma de saber las nuevas tendencias y ver hacia donde se mueven los lenguajes de programación.

Una conclusión clara es que los lenguajes dinámicos poco a poco van ganando terreno, entre ellos Ruby (que me da de comer actualmente) y Python, al que le echaré un vistazo en cuanto tenga tiempo...

También mirando este índice te enteras de lenguajes como Lua, que está subiendo con fuerza, sobre todo en el mundo de los juegos

Y finalmente como curiosidad han quitado ColdFusion de la lista desde el mes de Mayo, ya que no lo consideran un lenguaje, sino un framework asociado al lenguaje CFML /CFScript y se están planteando lanzar una lista similar basada en frameworks de desarrollo (ASP.NET, ColdFusion, Ruby on Rails, Django, Groovy...). Estaremos atentos a ver que sorpresas nos da esta nueva lista.

martes, 3 de junio de 2008

Problemillas con simple-rss

Me he encontrado con un par de problemillas utilizando simple-rss. El primero es que no se lleva muy bien con los RSS que no están en UTF-8.

La solución es bastante simple y consiste en añadirle una llamada a Iconv en el método initialize

encoding = check_encoding(@source)
@source = Iconv.conv(UTF_8,encoding,@source) if encoding != UTF_8


Donde check_encoding es una copia del método check_encoding de REXML::Encoding. Este método lee el atributo 'encoding' de la cabecera del xml que estamos parseando.

En mi caso no he podido usar directamente una llamada a ese método porque en la versión de ruby que tengo en el servidor (ruby 1.8.6 (2007-03-13 patchlevel 0)) ese método no es correcto

TODO: Actualizar la versión de ruby del servidor...

El otro problema lo he tenido guardando en memcached un objeto SimpleRSS, que devuelve el error:

TypeError: singleton can't be dumped


El error es debido a que memcached hace una llamada a Marshal.dump para serializar, y en simple-rss tenemos esta línea, que extiende la clase Hash

def item.method_missing(name, *args) self[name] end


Haciendo que no sea serializable:

>> item = Hash.new
=> {}
>> Marshal.dump(item)
=> "\004\b{\000"
>> def item.method_missing(name, *args) self[name] end
=> nil
>> Marshal.dump(item)
TypeError: singleton can't be dumped
from (irb):4:in `dump'
from (irb):4
>> item.singleton_methods
=> ["method_missing"]

Así que he tenido que comentarla. El único efecto que tiene es que en lugar de acceder a los elementos usando item.title hay que utilizar item[:title].