27/08/2010

Entrada rápida: viendo la página de la Comisión Nacional de Comunicaciones (CNC) con los proveedores de internet de Argentina, me causó mucha gracia notar lo siguiente: en el apartado “Localidad”, Córdoba figura tanto como “CORDOBA” como “CÓRDOBA”. Lo gracioso es que los listados para uno y otro son distintos (lo cual tiene sentido), o lo serían de no ser porque UOL Argentina figura por duplicado, una vez en cada uno. Anécdota: UOL es, desde hace unos 8 años, el proveedor de e-mail para mi cuenta de spam, o sea la que uso para darme de alta en sitios a los que no me interesa volver (notar que esto fue antes de los servicios de e-mail temporal, sobre los cuáles debería hablar alguna vez).

En fin, me fui por las ramas, como siempre. Lo que quería decir, en definitiva, es esto: si tienen una situación como esta, donde pueden encontrar “Córdoba”, “Cordoba”, “CORDOBA”, “cordoba” o incluso “Còrdoba”, hay dos alternativas:

  • Usar un combo que diga “Provincia”. Problema solucionado, y encima tenemos de regalo un código para nuestra base
  • Validar. Pero no validar después, sino en el preciso momento en el que el usario está escribiendo. Una vez alguien (no recuerdo quién, sorry) dijo algo que me llegó al alma, y fue algo como “si sabemos que un dato está mal, ¿para qué pedirle al usuario que lo vuelva a ingresar si podemos corregirlo directamente?”. Obvio, esta situación no se da muy seguido, pero el ejemplo típico sería, si yo pongo una regla (ej, no utilizar acentos ni números), en vez de saltar un pop-up que diga “no ingrese caracteres raros”, mejor un poco de Javascript que los elimine mientras los estamos escribiendo (tomando las debidas precauciones, por supuesto).

Tengo una hermosa maquinita de estados en código que hace lo segundo. Si se alinean los astros, escribiré algo al respecto la semana que viene.

19/08/2010

Como ya comenté un par de veces, el reciente incremento del spam nos obligó a implementar algún sistema un poco más elaborado para proteger nuestros comentarios. Este problema no es nuevo, y hay mucha literatura al respecto, pero en general siempre tienen algún inconveniente extra para los usuarios (a saber, las soluciones tienden a requerir registrarse para comentar, resolver un captcha o escribir comentarios sin enlaces), y nuestra filosofía es más cercana a la de permitir que cualquiera que tenga algo que decir lo diga sin problemas - para la estadística, al día de hoy solamente hemos perdido tres comentarios, uno por problemas de hosting y dos (descriptos aquí) por un problema ID-diez-T.

Teniendo esto en cuenta, decidimos hacer uso y abuso de una característica pura y exclusivamente nuestra: el hecho de que este blog es en castellano. Debido a que la mayoría de los desarrollos se hacen en los países del norte, no hay una movida seria de plugins para detectar el idioma de un texto, lo cual a los que vivimos de este lado del charco nos viene bárbaro, ya que el spam en castellano es muy poco. Con esto en mente, desarrollamos nuestro primer esquema: un mecanismo que detecta si un texto está en inglés. El algoritmo es una pavada: usando esta guía de las 100 palabras más comunes en el idioma inglés (mas un par extra, como “free”, “lesbian”, “teen” o “boob”), armamos una funcioncita que calcula, sobre el total de palabras en un comentario, cuántas de ellas están en la lista. Si el resultado excede un cierto umbral (un 20% aproximadamente, bastante conservador considerando que las primeras 100 palabras corresponden al 33% de todo el texto en inglés), el texto se clasifica como en otro idioma y va a parar al tacho. Esto, combinado con la política de que todo comentario con más de 2 links va a parar a moderación, hace un filtro super efectivo.

O casi. Como ya mencionamos anteriormente, nuestro problema actual es el spam en ruso - no hemos encontrado todavía una forma efectiva de detectar con PHP si un texto contiene o no caracteres cirílicos (nuestra última prueba daba positivo en todo texto que tuviera la letra “a”), así que todavía lo estamos afinando. De todas formas, por si les interesa, les pego aquí el código de la función (que es una pavada):

(seguir leyendo…)

17/10/2009

Para los que no estén familiarizados (todos, probablemente), Jeopardy (en inglés) es un juego de la TV norteamericana donde a los concursantes se les dice una frase (del tipo “Es el tipo que debería haber ganado el Martín Fierro de humor”) y deben responder en forma de pregunta (”¿Quién es Marley?”). Siguiendo este formato, voy a dejar el siguiente fragmento de código para los programadores de la audiencia:

return QIcon(QPixmap("C:/msn.bmp"));

Como pista, la categoría es “Programación en Qt“. Aquellos que quieran intentar adivinar cuál es la pregunta pueden dejar sus comentarios, o esperar a que publiquemos el tutorial correspondiente, en un par de semanas.

16/09/2009

Leído de un libro acerca de programación en Visual Basic 2008:

Además de aplicaciones Windows, puedes usar Visual Studio 2008 para construir aplicaciones que corran en una línea de comandos. La ventana de línea de comandos no es realmente una aplicación DOS, a pesar de que luzca como una. Es una ventana de texto, y la única forma de interactuar con una aplicación es ingresar líneas de texto y leer la salida generada por la aplicación, la cual se muestra en esta ventana de texto, una línea por vez. Este tipo de aplicación se llama aplicación de consola, y voy a demostrar las aplicaciones de consola con un único ejemplo. No vamos a volver a ver este tipo de aplicaciones en el libro porque no es lo que se supone que haga un desarrollador de Windows.

Esa sola línea me hizo dedicar 15 minutos de mi tiempo a buscar información sobre el autor, Evangelos Petroutsos, quien aparentemente ha escrito libros sobre Visual Basic desde la versión 4 (libro escrito en 1994). Es una lástima que el libro no tenga una sección de “Acerca del Autor”, o mejor aún, una sección honesta acerca del autor. A falta de ello, dejo aquí mi pequeña contribución a lo que podría decir esta hipotética sección:

El autor, egresado de bla bla bla en el año xxxx es un experto en programación en Visual Basic, área a la cual se dedica desde hace casi 20 años, unos 5 años antes de la aparición del lenguaje. A pesar de haber iniciado su carrera programando en línea de comandos, sufre un raro desorden psicológico que lo imposibilita de reconocer que, en ocasiones, una interfaz textual puede ser la solución indicada para un cierto problema. Traidor a sus orígenes en DOS y fanático de Windows, cada ventana de su casa posee cuatro paneles de colores distintos (rojo, verde, amarillo y azul), tiene una colección de 50 remeras con el logo de la empresa, y es el orgulloso poseedor de una copia original de las fotos de Bill Gates en Teen Beat Magazine, ubicadas sobre su chimenea.
Recientemente, se ha visto involucrado en un escándalo de mínima repercusión por escribir “Linux? Querrán decir GAYnux!!” en un foro de discusión online.
Actualmente, dedica su tiempo a decirle a otros programadores lo que deben o no hacer, acompañado generalmente de un bastón que utiliza para golpear a quienes no están de acuerdo con él.

Que mal me hace leer propaganda… y lo peor es que todavía tengo que leer unas mil página más :P

10/09/2009

El artículo Dirty Coding Tricks (en inglés, sorry) relata diversas historias de gente que, enfrentándose a un problema de difícil solución, hizo lo que todos haríamos: escribir una solución horrible que solucione el problema a como de lugar, y sin importar cuántos caigan en el camino. El artículo es una lectura muy interesante (donde “interesante” asume que una considera el código como algo divertido), pero creo que la solución más interesante no se encuentra en el artículo, sino en los comentarios:

En Wing Commander 1 teníamos una excepción en nuestro manejador de memoria EMM386 al salir del juego. Una vez que limpiábamos la pantalla, se imprimía una única línea de error, algo como “EMM386 Memory manager error. Blah blah blah”. Teníamos que terminar lo antes posible, así que con un editor hexadecimal cambié el texto del error en el manejador de memoria para que dijera “Gracias por jugar Wing Commander.”

No sólo es una solución brillante, sino que tiene un adicional: al día de hoy, todavía hay ejércitos de fanáticos que recuerdan con cariño el mensaje…

Si les gustó esta anécdota, no dejen de leer el artículo completo, que no está malo (aunque tal vez peca de ser demasiado técnico). En especial, se los pido, se los ruego: por nada del mundo se pierdan la última, The Programming Antihero, probablemente el código más inteligente que jamás haya visto.

01/09/2009

(English version available here)

Si sos usuario de Debian y fan de Avant Window Navigator, o si simplemente sos un fan de Mac buscando un dock que luzca bien, es posible que te hayas encontrado con este problema: querés usar AWN como tu dock, pero el Lanzador y el Administrador de Tareas son el mismo applet, y si bien esto cambió hace bastante, Debian todavía tiene la versión vieja. Peor aún, tal vez leíste acerca de un applet llamado “Simple Launcher”, el cual puede que lo hayas descargado o no (no es una tarea fácil, a menos que sepas exactamente qué hacer), sólo para descubrir que no funciona con la versión de Debian de AWN.

¡Pero a no preocuparse! Aquí pueden descargar, 100% gratis y completamente documentado, un applet escrito en Python que hace una única cosa: muestra un ícono a elección, el cual lanza al hacer click tu aplicación preferida. En una ráfaga de inspiración, decidí llamarlo Python Launcher, y aquí está:

Download Python-launcher (12k)

Instalación

Dentro del archivo encontrarás:

  • Un archivo llamado python-launcher.desktop. Este archivo debe ubicarse en tu directorio de AWN (típicamente /usr/share/avant-window-navigator/applets).
  • Una carpeta llamada python-launcher. Esta carpeta (toda la carpeta, y no solamente los archivos que contiene) debe ser ubicada en el mismo directorio.

Hecho esto, simplemente (re)iniciar AWN y el applet está listo para funcionar.

Modo de uso

El applet debe agregarse como cualquier otro, desde el menú de Preferencias, un applet por cada aplicación que quieran lanzar. Notarán una cruz roja en su dock, hacemos click derecho y elegimos Preferencias. Verán tres cuadros de texto:

  • Comando: el comando que quieran lanzar, usualmente algo como “/usr/bin/programa
  • Ícono: el ícono que queremos mostrar en nuestro dock. Debido a que probablemente eres un usuario de Debia, sería bueno que revises el directorio “/usr/share/pixmaps“.
  • Descripción: El título de la aplicación, el que se muestra al posicionar el mouse arriba del lanzador. Aquí pueden tipear lo que quieran.

¡Y eso es todo! Hasta ahora, ha sido probado en AWN 0.3 sin problemas, pero siéntanse libres de enviar comentarios por cualquier bug.

Copyright

Siéntete libre de hacer lo que quieras con este script. Está lanzado bajo una licencia BSD, lo cual significa exactamente lo que acabo de decir. Último, más no por ello menos importante, el ícono de la llavecita que pueden ver fue tomado de la colección Basic Set de PixelMixer.

19/06/2009

Hay cosas en el mundo de la informática que se dan por sentadas: que las computadoras duplican su densidad de transistores cada dos años, que dos monitores son mejores que uno, que los algoritmos son más importantes que la tecnología, y que no se debe validar del lado del cliente. A veces ocurre, sin embargo, que de pronto aparece alguien y te dice algo como “¿cómo van a ser mejor dos monitores que uno solo?“, o peor aún, que valida sus páginas con Javascript y se conforma con ello.

Para aquellos diseñadores que no tengan muuucha experiencia en el tema, o peor aún, que están leyendo este artículo porque ya validan así sus datos y están esperando una frase salvadora (no va a pasar), les explico: Javascript, a diferencia de lo que pongamos en nuestro código en el servidor, se ejecuta en la máquina del usuario, y como a ningún usuario se le puede decir qué correr y qué no, deshabilitarlo es tan fácil como hacer dos click.

Por supuesto, acá siempre hemos preferido los ejemplos concretos a la teoría, así que vamos allá. Tomemos como ejemplo el sitio web de la tira cómica Foxtrot. Abajo tenemos una captura de pantalla del sitio en un día común y corriente:

Foxtrot - ultima tira

Supongamos ahora que queremos ver la tira de la semana anterior. Hacemos click en Atrás y…

Foxtrot - tira de ayer prohibida

…ups, no podemos, tenemos que registrarnos. Ahora, hay una cuestión interesante: si prestan atención, en el área negra de fondo se puede apreciar la tira que queremos ver, así que debe existir alguna manera de verla…

Pensemos: la imagen se pone encima usando CSS, seguro, al igual que el estilo del resto de la página. ¿Qué pasaría si lo desactivamos? Veamos qué pasa si le sacamos el estilo (en Opera, Ver -> Estilo -> Modo de usuario):

Foxtrot sin CSS

Aquellos que no entiendan lo que están viendo, notarán que hay símbolos por todos lados, palabras sueltas (presten especial atención al texto del cartel que antes nos prohibía apreciar al fondo de la captura de pantalla), en definitiva un horror. Lo que ocurre aquí es que todo lo que usualmente se ve bonito (con colores, imágenes de fondo, etc) aquí se ve sin adornos. Y como el fondo negro semitransparente es un adorno, adiós restricción y hola tira de Foxtrot de la semana pasada.

Este ejemplo particular es una pavada, pero piensen en aquellos sitios que utilizan Javascript para asegurarse que la dirección de mail sea válida, o que en un campo únicamente se ingresen números, y la cosa pasa a ser preocupante.

¿La solución? Ya sea que usemos PHP o ASP, es en ese código donde deben estar los chequeos de validación (del tipo “if (password1 == password2) then” y cosas así. Pueden decir “ah, pero eso es mucho trabajo!“, a lo cual responderé que sí es mucho trabajo, pero no tanto como tener que levantar un sistema que fue comprometido, o lisa y llanamente borrado.

01/06/2009

Hay palabras y frases en este mundo que no deben ser pronunciadas jamás, males de este mundo tan horribles que su sola mención condena para siempre a quien los pronuncia. En el pasado estas palabras podían ser encontradas en forma de prosa, o verso. Hoy, en cambio, se han adaptado al ritmo moderno y podemos encontrarlas bajo la forma inocente de código fuente. Es sabido, eso sí, que los dioses oscuros de la informática gustan de utilizar las viejas formas, por lo que no sorprenderá a nadie saber que lo que estoy a punto de revelarles es código C. Pero, ¡ojo! ¡No es un código cualquiera! Publicado en el ensayo “Cómo escribir código inmantenible” (en inglés), el código que están a punto de leer es la esencia misma de la maldad, escrita en el lenguaje de los antiguos:

#ifndef DONE
#ifdef TWICE
void g(char* str);
#define DONE
#else
#ifdef ONCE
void g(void* str);
#define TWICE
#else
void g(std::string str);
#define ONCE
#endif
#endif
#endif

Como el código anterior es casi imposible de interpretar, veamos la versión indentada y comentada con propiedad. No hace que el código sea menos malvado, pero al menos evita un descenso a la locura (aunque les recomiendo primero ver la versión anterior y tratar de entender qué hace):

(seguir leyendo…)

29/04/2009

Así es, estimado público: el mejor navegador del mundo, el que inventó la navegación por pestañas, el primero en guardar tu sesión si se clavaba el sistema y la retomaba donde habías quedado, el que siempre está entre los primeros lugares en los tests ACID, hoy cumple 15 años.

Cartel de 15 años de Opera
Opera: Ya éramos rápidos antes de que nuestros competidores hubieran nacido

Yo uso Opera desde la versión 5 (cuando todavía venía la barra con anuncios… toda una vida…), y nunca me defraudó. Nos hicimos inseparables en las épocas en las que Firefox te liquidaba una PC con su famoso memory leak, y al día de hoy navegar sin los gestos del mouse me parece leeeeeeeeeeeeento.

¡Feliz Cumple, Opera, y vamos a por los 30!

14/04/2009

Ya hmos hablado aquí anteriormente de Joel Spolsky, co-fundador del sitio Stack Oveflow (sitio que se define como “igual a Experts Exchange, pero sin la maldad”) y autor del blog Joel on Software. Es en este último sitio donde encontramos el Test de Joel, un test diseñado para evaluar el estado de todo proyecto de software. El test es extremadamente sencillo, se hace en no mas de 2 minutos y da una buena imagen del estado de todo proyecto

Todo lo que hay que hacer es responder a cada una de las siguientes preguntas con “sí” o “no”:

  • ¿Usan un sistema de control de versiones?
  • ¿Puedes construir el proyecto en un solo paso?
  • ¿Compilan el proyecto todos los días?
  • ¿Tienen una base de datos de bugs?
  • ¿Arreglan los bugs antes de escribir código nuevo?
  • ¿Tienes un calendario actualizado?
  • ¿Tienes una especificación?
  • ¿Los programadores trabajan en un ambiente silencioso?
  • ¿Usas las mejores herramientas que el dinero puede comprar?
  • ¿Tienen testers (es decir, gente probando el software)?
  • ¿Los nuevos candidatos escriben código durante las entrevistas?
  • ¿Hacen pruebas de usabilidad de pasillo (es decir, llamar al primero que pasa y decirle “hacé esto”)?

Como ven, el test no es nada complicado y da una buena idea del estado de tu proyecto de software. Aquellos que trabajen con Trac notarán que la sola instalación del sistema posibilita sumar 4 puntos (mas otro punto si es un proyecto sobre un lenguaje interpretado, como puede ser PHP). Según nos cuenta Joel,

Lo bueno del Test de Joel es que es fácil obtener un sí o no para cada pregunta. No tienes que adivinar líneas-de-código-por-día o bugs-promedio-por-punto-de-inflexión. Dale a tu equipo un punto por cada “sí”. Lo malo del Test de Joel es que realmente no deberías usarlo para asegurarte de que tu software para plantas nucleares es seguro.
Un puntaje de 12 es perfecto, 11 es tolerable, pero 10 o menos y tienes serios problemas. La verdad es que la mayoría de las organizaciones de software operan con un puntaje de 2 o 3, y necesitan ayuda urgente, porque empresas como Microsoft operan a 12 todo el tiempo.

El artículo original (en inglés) se explaya en la importancia de cada punto, y no es una mala lectura. De hecho, todo el sitio en general es una buena lectura, así que no tiene desperdicio. En mi experiencia personal, pasar de un 3 a un 7 es toda la diferencia del mundo, y lo mejor es que pudo lograrse sin gastar un centavo (ventaja de trabajar en Linux: las “mejores herramientas que el dinero puede comprar” son gratis) y no requiere aprobación de la mesa directiva y tonterías similares (nadie dice que uno no puede instalar su propio servidor SVN, o directamente un Trac, en su PC).

¿Cuántos puntos tiene tu empresa en el Test de Joel?

Posts anteriores »