Uncategorized


5
Jun 09

Ruby on Rails – Sexo, Drogas y Rock’n'roll

La última moda en programación Web se llama Ruby on Rails. No descubro nada a estas alturas, Ruby on Rails es un entorno perfecto para desarrollar proyectos web, como intentan copiar otros frameworks con mayor o menor éxito.

Me incita a escribir esta entrada (y de ahí el título del post) una comparativa que me viene a la cabeza con la época hippie de los años 60. La revolución sexual de aquellos años contrastaba con el régimen conservador y se reveló contra él, de la misma forma casi que Ruby se revela contra otros lenguajes más “estrictos”. La comparativa viene al caso porque al igual que los abusos de aquellos años de droga, sexo y rock’n'roll con Ruby también se pueden cometer excesos.

Ruby introduce no sólo un lenguaje de programación, sino toda una forma de hacer las cosas, “The Ruby Way” que llaman los entendidos. Esto es cierto, sin llegar a ser un cambio de paradigma, se tiene que pensar de forma diferente en Ruby. Todos los manuales existentes insisten en que el propio lenguaje te fuerza a hacer las cosas de forma diferente, pero continuamente veo que no es así.

Por ejemplo, continuamente veo código Ruby que mantiene los mismos patrones de programación de… pongamos PHP. Por ejemplo:

def temp_dirname
  chars = %w{a b c d e f g h i j k l m n o p q r s t u v w x y z}
  rand_max = chars.size
  ret = "" 
  16.times { ret << chars[rand(rand_max)] }
  ret
end

El método anterior devuelve una cadena aleatoria para ser usada como nombre en un fichero temporal. Evidentemente, desde la primera línea se ve que se ha programado con la intención de seguir un patrón no-ruby, creando una variable temporal “ret” como cadena para ir concatenando caracteres aleatoriamente de la tabla abecedario creada anteriormente. Lo único “Ruby-Way” del código anterior es el uso de 16.times, pero seguro que si Ruby tuviera un for(x;x<y;x++) se usaría.

Esto no se tiene que hacer así. Ruby da para más. El problema de lo anterior es que no queda “claro” desde un primer momento lo que hace el método. Si, seguro que gastando 5 minutos de tiempo se llega a la conclusión de lo que hace, y tienes que ser un programador medio avezado para ver instantáneamente lo que hace la operación chars[rand(rand_max)].

Lo anterior podría haberse escrito de esta forma:

require 'digest/md5'
 
def temp_dirname
  (Digest::MD5.hexdigest rand.to_s)[0..15]
end

De acuerdo, aquí hemos introducido la librería “digest/md5″ para crear una cadena hash a partir de un número aleatorio, y luego extraemos los 16 primeros carácteres. Pero aún así, es más fácil de entender que las 5 líneas anteriores.

Podemos evolucionar más y hacerlo aún más “Rubyist” usando varios conceptos exclusivos de Ruby. Vamos a eliminar la dependencia de la librería de MD5 y volvemos al array abecedario, pero vamos a hacerlo DRY (Don’t Repeat Yourself) y KISS (Kept It Simple, Stupid):

class Array
  def any
    self.[] rand(length) if length
  end
end
 
class String
  @@temptemp = %w{a b c d e f g h i j k l m n o p q r s t u w x y z}
  def tempname!
    16.times { self << @@temptemp.any }
    self
  end
end

OK, nos aprovechamos de poder “extender” los objetos nativos de Ruby para añadir dos métodos a las clases “Array” y “String”. En “Array”, añadimos el método “any” que nos devuelve, aleatoriamente cualquier elemento de un array. por ejemplo:

>> [1, 2, 3, 4].any
=> 1
>> [1, 2, 3, 4].any
=> 2
>> [1, 2, 3, 4].any
=> 4

Esto es DRY, hemos ampliado la clase Array para devolver cualquier elemento aleatorio de cualquier array. Por ejemplo:

>> String.methods.any
=> "display"
>> String.methods.any
=> "untaint"
>> String.methods.any
=> "private_class_method"

Después, hemos ampliado la clase String para añadir un método llamado “tempname” que nos añade, a cualquier string, una cadena aleatoria (basada en el Array#any anterior). Por ejemplo:

>> "".tempname!
=> "tyhbijuqhhjednmr"
>> "/tmp/".tempname!
=> "/tmp/nykfurjyunojqykj"
>> "/var/lib/temp/".tempname!
=> "/var/lib/temp/rdysjeymslkqwfar"

Lo de incluir una exclamación al final de tempname! es un consenso que usa Ruby de incluir una exclamación al final de los métodos que modifican de alguna forma el objeto sobre el que actua (vamos, que no devuelve nada, sino que modifica el propio objeto). Por otra parte, es como otro carácter y forma parte del nombre del método.

La conclusión de este post es que si te propones aprender Ruby, intentes mirar más allá de la sintaxis. “Code is Poetry”, como dirían algunos, y esto es mucho más verdad en Ruby.


5
Mar 09

A veces veo canciones prohibidas

Si, si, a veces veo… por que no puedo escucharlas. Jejeje. Decía en mi blog hace unos días, que Spotify fué obligada a limitar las escuchas de ciertos discos y canciones según el país de origen, incluso a borrar canciones completamente “a petición de las casas discográficas”.

Bueno, he visto un caso de canción borrada… :-)

lisa

Como podeis ver en la captura, la canción “It’s Oh So Quiet” de Lisa Ekdahl ha sido “borrada” a petición del artista o la discográfica. La verdad, no me quita el sueño que esa canción en concreto sea borrada, pero no deja de ser curioso ver la aplicación del “borrado” por ti mismo.

¿Tendrá que ver Anaïs Anaïs (Cacharel) con algo de esto? Podeis apostar lo que sea…

Actualización: ¡Acabo de ver más canciones prohibidas! En este caso si que me afecta más, hay un disco concreto de Herbie Hancock que tiene al menos 6 canciones prohibidas, entre ellas “Watermelon Man” y “Maiden Voyage”, dos grandes éxitos que curiosamente SI que se pueden escuchar en otras recopilaciones.

Por ejemplo, en la captura que pongo a continuación marco con una flecha roja las canciones que están prohibidas, y en verde las mismas pero en otros discos recopilatorios. Algunas al parecer son versiones diferentes, por la duración (una en concreto es un directo). En este caso es más difícil que en el caso de “It’s Oh So Quiet” saber por qué están prohibidas. Al menos yo no encuentro la explicación para bloquear una canción de un recopilatorio cuando la canción original está disponible (”Watermelon Man” es del disco “Head Hunters“).

herbie

¿Estarán las mismas restricciones activas en la versión “Premium”?


2
Mar 09

Si espameas… Hazlo bien!

Con todo el spam que entra en nuestras bandejas de entrada, los filtros se han vuelto cada vez más exigentes, así que de vez en cuando reviso la bandeja de Spam por si entra alguna “falsa alarma”.

La verdad es que estoy sorprendido de la efectividad de los filtros, casi el 100% del Spam lo capturamos. Eso si, cada mensaje tiene que pasar tres capas: Primero la del proveedor, segundo la del Antivirus (Sophos en nuestro caso) y por último la del propio Outlook.

Como decía, a veces reviso la carpeta de Spam y las risas que nos hemos echado al ver este “peaso” SPAM:

spam


11
Feb 09

First Tuesday, Madrid

Hoy he asistido al evento organizado por First Tuesday en Madrid, en colaboración con Panda Security.

La verdad es que era la primera vez que asistía a un evento de este tipo dado que mi estatus de emprendedor es reciente. :-) La verdad es que ha sido una experiencia de lo más gratificante, en este caso concreto, conocer de primera mano a Mikel Urizarbarrena, fundador de Panda y a Juan Santana, actual CEO. En el caso de Mikel, por su cercanía a los emprendedores / empresarios, contando anécdotas de la creación de la empresa, qué están haciendo actualmente y hacia donde se dirige Panda con una visión de futuro.

En mi caso concreto, conozco Panda desde hace bastante tiempo. Yo creo que cualquier informático conoce a esta empresa por ser pionera en un sector tan técnico como el de los antivirus y ser española, así que es de agredecer por lo menos ver una “resurrección” de Panda, porque hace algún tiempo parecía que perdía fuerza con los competidores (Kaspersky, Symantec, etc).


14
Oct 08

iPhone y la programación con ObjectiveC

Hacía muchos años que no veía ObjectiveC. Cuando digo muchos, digo muuuchos. :-) No me equivocaría si dijera que aún estaba en venta el NeXT…

Ahora he vuelto a verlo por el iPhone. La verdad es que es la primera vez que me acerco en serio a la programación para OSX. No me acordaba desde mis tiempos de universidad, y de eso ha llovido un poco. Lo más que me acuerdo es que era en C y con un Classic… cuando era actual, jajaja.

Odio la programación en ObjectiveC. Puedo comprender las razones de Apple por elegir un lenguaje así en su época, pero no para mantenerlo. Es cierto que usar C/C++ para programación de entornos de usuario hay malos ejemplos, aunque se puede hacer bien, o hacer muy bien. También podía haber hecho su propio lenguaje, o ampliar uno ya existente. Ya puestos, por qué no usar directamente SmallTalk.

Dejemoslo claro, esto es una opinión personal. Si alguien lee esto que es defensor a ultranza de ObjectiveC le daré la razón. Simplemente quiero decir que no se piense que es una opinión de “Newbe”, llevo programando en entornos de usuario desde que me compré el número 1 del MSJ (Microsoft System Journal).

De hecho, lo malo no es el entorno de desarrollo, el Xcode lo considero fenomenal, un entorno de desarrollo que ya quisiera en Windows. No. Lo malo es con el lenguaje.

En cuanto a la sintaxis es lo de menos, al final te acostumbras aunque duramente por tantos años llamando a las funciones.con().parentesis(). Lo malo de la sintaxis de ObjectiveC es justamente lo lioso de leer y de entender para los no iniciados. Te [puedes [perder facilmente:@"en la" [maraña init]]]

Para mi lo peor es que es un lenguaje orientado a objetos sobre uno que no lo es, como C. Aunque en ObjectiveC++ se pueden mezclar clases de C++ con ObjectiveC, esto no arregla el problema. Esta diferencia de conceptos ha llevado a un lenguaje que no tiene constructores y destructores, no tiene sobrecarga de operadores ni polimorfismo, entre otras cosas.

Ahora que hay más movimiento en la programación ObjectiveC por el iPhone, se oyen voces de programadores contra el sistema, y se necesitan posts como este simplemente para decir cómo se tiene que construir un puto objeto en cocoa! Simplemente esto no me parece serio, y voy a dar una razón que creo de peso: no es de recibo que un lenguaje orientado a objetos, por mucho recolector de basura que tenga, sea tan propenso a equivocaciones.

El ejemplo de los constructores. En ObjectiveC no hay constructores ni destructores. Punto. Los objetos se inicializan si el programador se acuerda de hacerlo. Todo esto sin contar que toda la jerarquía de objetos que estás construyendo depende de que tu llames a [objeto init]. Me suena a tremendo WTF!. Si hablamos de destructores, la cosa se complica. Es el programador el que tiene que llamar a “dealloc” para destruir un objeto. No, espera, ¿o mejor llamar a “release”? Mmhh… Depende. Es a estas cosas a las que me refiero, el lenguaje no permite una construcción robusta de librerías. No basta con poner en negrita en rojo con fondo fosforito en la documentación: “Llama al puto release cuando quieras liberarme”, es la clase la que debería asegurarse de liberar sus recursos.

Me recuerdo ahora un post que leí en un blog, no recuerdo el nombre si no lo pondría, que venía a decir algo así con respecto a los destructores:

“En ObjectiveC no hace falta destruir un objeto, normalmente es más sencillo y mejor que el sistema operativo libere la memoria cuando sale del programa, excepto si el objeto tiene recursos ocupados como ficheros abiertos.”.

En resumiendo venía a decir algo así. Para mi mente tan Stroustruptiana, simplemente no cabe en la cabeza que algún programador (quizás yo mismo) me deje recursos sin liberar. Llamalo memoria, en tal caso viene la basura y me la recoje, pero llámalo fichero abierto, llámalo socket conectado o peor aún, llámalo semáforo activo y verás el problema.

Este es uno de los posts que iré poniendo conforme vaya descubriendo ObjectiveC, quizá los siguientes sean más compasivos, pero mientras tanto, y si vas a escribir un comentario negativo, resuelve esta cuestión:

¿Cual es la forma más correcta de inicializar un objeto?

Forma número 1:

1
2
3
4
5
6
- (id)init {
    if ((self = [super init])) {
        // inicializar el objeto.
    }
    return self;
}

Forma número 2:

1
2
3
4
5
- (id)init {
    if (![self init]) return nil;
 
    // Inicializar el objeto
}

13
Oct 08

He puesto AdSense

Bueno, he puesto AdSense en el blog. Tranquis que no es por afán recaudatorio, ya que no creo que lleguen algunos céntimos, jajaja.


11
Oct 08

Los nuevos móviles

Con la entrada del iPhone en la escena móvil, podemos esperar una revolución en toda regla. No sólo RIM, a mi parecer el más directo competidor, sino otros jugadores entran en escena. Google con su Android quizá sea la jugada maestra, pero me gustaría hacer notar aquí a alguien a quien en el segmento de “SmartPhones” se está olvidando últimamente: Nokia.

Quizá pasó desapercibido para la mayoría de analistas que recientemente Nokia compró Trolltech, la compañía detrás de Qt, quizá la más conocida librería de desarrollo de interfaces multiplataforma. No quiero pensar que soy el único en ver que detrás de esta compra quizá se encuentra una sorpresa de Nokia que podríamos ver muy pronto, quizás el próximo año.


10
Oct 08

From C++ to ObjectiveC

Hoy estoy que me salgo, dos posts en el mismo día. :-) A este ritmo si que cumplo la promesa de un post al día. (No, si un día publico dos posts no quiere decir que pueda dejar un día sin postear).

Os dejo un fichero PDF súmamente interesante si estás iniciándote en la programación del iPhone, o en la programación en OSX en general, mediante ObjectiveC. Si es la primera vez que programas en ObjectiveC sin referencias de C/C++ igual te sirve la documentación de Apple, pero si como yo eres un die hard de C++, estarás más perdido que un pulpo en un garaje (”¿!!Donde están los putos constructores!!?”).

Descarga: From C++ to Objective-C (706Kb más o menos).

Supongo que también lo dejaré en una futura sección de descargas, si algún día me pongo. (Que haga un post al día no supone que tenga que estar programando el WordPress)…

Se me olvidaba… Los créditos están en el PDF.


5
Ago 08

Me decido a postear una vez al día…

Hoy he tomado una solución salomónica, la de postear al menos una vez al día. Ya está bien de pensar en tener un blog durante años. Al menos durante los últimos 5 años tengo un blog instalado y que yo recuerde, sólo 3 ó 4 post que se pueden considerar como tal.

Me lo quiero tomar tanto como reto como para tener algo diferente que hacer durante estos meses en los que mi trabajo me toma el 99,99% del tiempo (esto es, que si los días tuvieran 28 horas las ocuparía casi todas) :-)