2007/07/15

Mi cm3plus400 ha muerto

Con la Euskal a las puertas, menudo momento ha escogido el disco de marras para ir a petar.

Estaba tranquilamente viendo los episodios de Futurama que tenía grabados en el mismo disco, cuando aparentemente se ha apagado.

Por el pequeño ruido que ha hecho al apagarse y por el ligero olor a chamusquina, juraría que es cosa de los circuitos de alimentación que tiene por dentro de la carcasa (no de la fuente de alimentación externa): algún condensador o componente similar petado. No creo que haga falta pedirle el tester a mi hermano para ver si la F.A. externa da corriente o no.

De todos modos mañana buscaré la factura y me acercaré el lunes a la F.N.A.C. a ver si tengo garantía o qué, que ni siquiera han pasado 5 meses.

Y menos mal que hace unas semanas escribí en un papelito (tecnología punta... de la punta del boli) lo que había grabado, ya tengo una lista de cosas para copiar durante la euskal... al menos el primer día XD.

2007/07/12

hacen falta 30000 informáticos

Situación: en un centro formativo concertado por el INEM/Servef

Profesor (señalando un recorte de periodico con la noticia): Mirad, hacen falta 30000 informáticos en la provincia de alicante.

Alumna: Lo siento chicos, no quería desilusionarles, pero en cuanto acabemos el curso serán todos para mí.

Pensamiento mio: Pues teniendo en cuenta lo que cobra un informático de media (estadística psicologica sin fundamento alguno, basada en comentarios aleatorios en barrapunto, menéame, y otros antros virtuales de perversión) sí que le van a hacer falta los 30000 trabajos a ella sóla como tenga que pagar una hipoteca.

2007/07/06

SDI, MDI y la madre que los parió

SDI (interfaz de documento único) y MDI (interfaz de múltiples documentos) son 2 formas de organizar el aspecto de un programa que normalmente determinan como va a trabajar el usuario final con él. A continuación pongo una lista no exhaustiva de lo que me he ido encontrando en mis "viajes informáticos":

  1. Windows SDI: Windows Explorer (el navegador de archivos no el de internet)

    Hay una instancia de la aplicación abierta para cada objeto (vista de carpeta en explorer). Cada instancia de ventana del explorer aparece individualmente en la barra de tareas y en la lista de tareas al hacer alt+tab y cualquiera de estos 2 métodos sólo primerplanea la instancia a la que representa.

  2. Windows MDI: Word 7

    Sólo hay una instancia de la aplicación abierta que aparece como tal en la barra de tareas y en la lista de alt+tab conteniendo todos los objetos (documentos word en este caso) abiertos por la aplicación. Al primerplanear la aplicación por cualquier método, todos los objetos contenidos se primerplanean.

  3. Windows Hibrido: Excel 2003

    Es más SDI que MDI: hay una ventana de la aplicación para cada objeto (documento de excel), y al primerplanear sólo obtienes el objeto en cuestión. Pero la primera instancia abierta recibe un tratamiento especial según el contexto. Ver este wtf, que ha sido el principal motivador de este artículo.

  4. OSX MDI: Finder

    Sólo hay una instancia de la aplicación abierta que aparece en el dock y en la lista de tareas fruta+tab, conteniendo todos los objetos (vistas de carpetas en finder) abiertos por la aplicación. Al primerplanear de cualqueira de estas 2 maneras, todos los objetos de la aplicación se primerplanean. Pero usando exposé puedes primerplanear objetos individuales.

  5. OSX SDI: gVim

    Sí, sé que gVim no es una aplicación nativa, pero es la única que me he encontrado que trabaja puramente SDI y no necesita X11. Cada instancia de la aplicación que aparece en el dock o en la lista de fruta+tab representa un objeto (documento de texto). Primerplanear sólo actua sobre ese objeto.

  6. GNU/Linux.

    Principalmente no he usado ningun GNU/Linux tanto como para fijarme en el comportamiento de las ventanas (aunque GNOME y KDE tienen un comportamiento básico bastante similar al de windows). Y en última instancia (y tirando de tópicos, no me mateis por ello), seguro que hay demasiadas variantes como para enumerarlas por aquí.

Otras variantes:

  1. GIMP. Cada ventana de la aplicación obtiene una entrada en la lista de tareas de alt+tab y de la barra de tareas (x ventanas de herramientas obtienen x iconos en la brara de tareas, y además cada objeto abierto [archivo de imágen] obtiene un icono propio).

  2. X11 en OSX. En el dock y en fruta+tab aparece el icono de X11 y el icono del objeto (aplicacíon X11), pero este último sólo está como figurante: para primerplanar hay que elegir el icono de X11.

  3. Firefox. Cualquier interfaz de pestañas es claramente MDI. En windows/linux además, puedes tener varios iconos en las listas de la barra de tareas y de alt+tab, pero básicamente son pestañas separadas. En OSX por más ventanas que abras sólo hay un icono en el dock y en fruta+tab.

  4. Aplicaciones de instancia única (¿SIA?). iTunes (¿Amarok?). Suelen ser aplicaciones que dependen de una BBDD, por lo que tener varios objetos abiertos no tiene mucho sentido. Unicamente hay una instancia de la aplicación abierta.

  5. Iconos agrupados. Por defecto Windows XP agrupa en un sólo botón de la barra de tareas los iconos de los objetos que pertenecen a la misma aplicación. Al pulsar el botón se despliega una lista con los iconos para elegir el deseado. En la lista de alt+tab no se agrupan. En OSX, pulsando con el botón derecho (ctrl+click, o click prolongado) en el dock aparece una lista similar.

Si conoceis aplicaciones que tengan otros comportamientos, ponedlas en los comentarios.

PD: Sí, "primerplanear" me la he inventado para acortar la expresión "lleva al primer plano". A mi me vale como neologismo.

2007/07/02

Cinco años

Casi 5 años aprendiendo, enseñando y olvidando, conociendo gente y despidiéndome de ellos (y ellas), asombrándome y resignándome...

Susi, Cindy, Ruth, Carmen, Miguel... unos cuantos más a lo largo de estos 5 años (por un motivo u otro). Ahora yo; probablemente en unos días alguno más.

Toca seguir adelante, y para celebrarlo, nada mejor que una canción que David Bowie escribió en 1972 sobre una tierra condenada a la destrucción en 5 años y sobre lo que sucedió tras esta premonición (fuente, wikipedia en inglés). Y para que no sea tan lúgubre el asunto, en este video, Bowie se acompaña de uno de los grupos revelación de la temporada: Arcade Fire.

2007/06/20

Programación de orientación abyecta

Esto es una traducción sin autorizar del artículo "Abject-Oriented Programming".

La programación de orientación abyecta es un conjunto de prácticas para promover la reutilización de código y asegurarse que los programadores producen código que se pueda usar en producción durante mucho tiempo. El número de líneas de código en la aplicación es una medida común de la importancia de la aplicación, y el número de lineas que un programador puede producir al día, a la semana o en un mes, es una métrica útil para la planificación de proyectos y la reserva de recursos. La programación de orientación abyecta es una de las mejores formas de conseguir el mayor número de lineas de código en el menor tiempo posible.

abyecto: desesperanzado, miserable, humillante o penoso: pobreza abyecta

Herencia

La herencia es una forma de mantener características del código antiguo en código más nuevo. El programador deriva de una función que ya existe o de un bloque de código haciendo una copia del código, y modificándola posteriormente.

La copia derivada a menudo se especializa añadiendo características no implementadas en el original. De esta forma el código antiguo se mantiene, pero el nuevo código hereda de él.
Los programas que usan herencia se caracterizan por bloques similares de código de los que surgen pequeñas diferencias a lo largo de los fuentes. Otra señal de herencia son los miembros estáticos: código y variables que no se usan ni referencian directamente, pero que sirven para mantener un enlace al código progenitor o base.

Un ejemplo de herencia en pseudo-código:

function getNombreClnt(IDclnt)
{
    regClnt = readFromDB("cliente", IDclnt);
    nombrecompleto = regClnt[1] + ' ' + regClnt[2];
    return nombrecompleto;
}

function getEmailClnt(IDclnt)
{
    regClnt = readFromDB("cliente", IDclnt);
    nombrecompleto = regClnt[1] + ' ' + regClnt[2];
    /***************
    * 4/15/96 git : dirección email está en
    * el segundo campo del fax
    ***************/
    return regClnt[17];
}

La función getEmailClnt fue heredada de getNombreClnt cuando se introdujeron direcciones de correo a la aplicación. Heredar código de esta forma potencia código que funciona con menor riesgo de introducir errores.

El subtyping es una forma de herencia donde los tipos de las variables se cambian al heredar del código original.

Modularidad

Un programa modular es aquel que está dividido en archivos separados que comparten un bloque de comentarios común en la cabecera. Un módulo normalmente está compuesto por:

  • Nota de copyright
  • Descargos legales
  • De tres a cinco líneas de asteriscos
  • Un historial de cambios
  • Una descripción de lo que se supone que hacía el código originalmente
  • Otras tres o cinco líneas de asteriscos
  • Un gran bloque de espacio en blanco delimitado por asteriscos, u otro carácter, donde aparece el nombre de cada función o subrutina, el nombre o iniciales del autor, y la fecha de escritura original
  • El código

Los módulos normalmente se mantienen de un tamaño razonable para reducir dependencias y mejorar la resistencia del módulo. Si un módulo alcanza un tamaño excesivo se divide en partes más pequeñas, copiando la nota de copyright, descargos legales, etc... del original. Es seguro heredar comentarios de un módulo a otro, así que lo más seguro es copiar todos los comentarios del original.

Componentes y bibliotecas

La programación de orientación abyecta se presta a usar componentes conectables (plug-in) (fragmentos de código encontrados en libros o en la red). Usando un buscador, un programador inteligente puede ahorrar tiempo al encontrar componentes prefabricados capaces de hacer casi cualquier cosa. Los mejores componentes son las cajas negras: el programador ni sabe ni le importa como funciona el componente. Muchas aplicaciones grandes están construidas con una combinación de herencia de otros componentes y aplicaciones encontrados en la red.

Encapsulación

La idea tras la encapsulación es mantener los datos separados del código. Esto se llama ocultación de datos en algunas ocasiones, pero los datos no están realmente ocultos, sólo protegidos dentro de otra capa de código. Por ejemplo, no es una práctica recomendable esparcir consultas a la base de datos por todas partes. Una práctica abyecta sería envolver u ocultar todas las funciones relativas a la base de datos en funciones o subrutinas, encapsulando así la base de datos. En la función getNombreClnt de antes, no se consulta la base de datos directamente -- se llama a una función para leer el registro de la base de datos. Lo único que getNombreClnt y getEmailClnt (y otras muchas funciones parecidas) "saben" es donde encontrar los pocos datos que necesitan en el registro del cliente. La forma de leer el registro del cliente está encapsulado en algún otro módulo.

Algunos lenguajes de programación hacen que el programador declare las variables como protegidas, públicas o privadas. Pero esta no es una práctica abyecta. No hay forma de que el autor de un módulo sepa que variables internas del módulo van a hacer falta para implementar nuevas características en el futuro. Los programadores deben hacer todas las variables públicas (o globales), y deben dejar que el resto del código decida qué debe y qué no debe ser privado.

Polimorfismo

Al aprender técnicas de orientación abyecta, los programadores frecuentemente se atascan en el polimorfismo. Suena complicado pero la idea es sencilla y fácil de implementar. El código es polimórfico cuando produce distintos resultados para distintos tipos de datos de entrada.

Para poner un ejemplo, las funciones de arriba se pueden reescribir como una única función polimórfica heredando el código que ya funciona y encapsulándolo en una nueva función:

function getDatosClnt(Idclnt, que)
{
    if (que == 'nombre') {
        regClnt = readFromDB("cliente", Idclnt);
        nombrecompleto = regClnt[1] + ' ' + regClnt[2];
        return nombrecompleto;

    } else if (que == 'email') {
        regClnt = readFromDB("cliente", Idclnt);
        nombrecompleto = regClnt[1] + ' ' + regClnt[2];
        /***************
        * 4/15/96 git : dirección email está en
        * el segundo campo del fax
        ***************/
        return regClnt[17];
    }

    /* ... etc. */
}

El polimorfismo está relacionado con la idea de no-determinismo y las máquinas de estados finitos de Turing, que deberías recordar de tus clases de Informática.

Ser frente a Tener

Esta es una sutileza de buen diseño de orientación abyecta. Al principio de aprender los principios abyectos, los programadores tienden a hacerlo todo con herencia (modelo ser). Con más experiencia los programadores se dan cuenta que la relación tener es a menudo más apropiada. En el código de ejemplo de arriba, cada cliente tiene un mombre, pero regClnt es un registro de la base de datos.

Clases virtuales y funciones

Una función o clase virtual es código que la aplicación necesitará tarde o temprano, pero que no está escrito todavía. Esto se consigue normalmente mediante una clase base en la que se basará el código final:

function calcImpuestoVentas(precio, esDevengable, provincia)
{
    /****************************************
    *
    * TO DO:
    *
    * obtener porcentaje de impuestos de la
    * provincia del cliente
    * en algun momento de alguna tabla
    *
    ****************************************/

    /** 02/07/99 git -- usamos impuestos de M de momento **/
    return precio * (7.25 / 100.0);
}

Una clase base frágil es un módulo o clase que lleva en la aplicación mucho tiempo y hace que la aplicación falle cada vez que se modifica de cualquier manera.

Sobrecarga

La sobrecarga es cuando un módulo o pedazo de código hace más de una cosa. Un ejemplo sería una subrutina que devuelve el nombre del cliente, la dirección postal, la dirección electrónica y la tasas de impuesto estatal. Usar funciones sobrecargadas reduce el method dispatching (reparto de métodos), que es una de las razones por las que otros estilos de programación pueden resultar en código lento.

Documentación

Se dice que el código debe escribirse para que sea leído por gente, por lo tanto se deduce que la documentación se escribe para que nadie la lea. La documentación debe escribirse en cada módulo nuevo y mantenerse conforme los cambios se entreguen a producción o, al menos, la próxima vez que haya un hueco en el trabajo.

Un buen momento para escribir documentación es cuando alguien del departamento entrega el pre-aviso de dos semanas: aprovecha ese tiempo para asegurarte que el miembro del equipo que se marcha documenta todo su código.

Ensuciar el código con montones de comentarios explicando qué es lo que intenta hacer el código distrae y ralentiza al compilador. Por eso cualquier empresa que siga las "practicas recomendadas" mantiene la documentación en un sistema de gestión de documentación donde los programadores no pueden borrar nada accidentalmente.

Control de versiones

No es realmente una práctica de programación per se, pero las empresas abyectas suelen seguir prácticas similares de control de versiones. Mantener cerca versiones previas del código, y llevar un seguimiento de los cambios en el código es importante incluso si sólo hay un programador trabajando en la aplicación. Los programadores abyectos experimentados siguen un sistema como el siguiente:

  • Añade siempre tus iniciales y la fecha de la última revisión en la cabecera del fichero de código.
  • Cuando edites un fichero y te des cuenta que tus cambios son lo bastante grandes como para que revertirlos sea complicado, guarda una copia con extensión .bak.
  • Mantén múltiples copias de respaldo cerca añadiendo tu nombre o iniciales y la fecha en el nombre de archivo de copia de seguridad: datoclnt_git20040321.bak.
  • Guarda siempre copias de respaldo en el mismo directorio o carpeta que el código original, así se facilita ver la historia del archivo.

Conclusión

Probablemente encuentres que en las empresas con más solera ya se siguen algunas o todas estas prácticas abyectas. Modas como métodos ágiles o programación "extrema" vienen y van, pero el estilo abyecto ha existido desde el principio de los tiempos. Los encargados están familiarizados con las prácticas abyectas y esperan que seas capaz de trabajar con su código base de orientación abyecta.

2007/06/16

De noche, todos los blogs son pardos

No es que me hiciera falta una gráfica para comprobar que leo mis feeds por la noche, pero ya que google reader me la ofrece... mi ego blogger no ha podido resistirse (y ya se sabe que las estadísticas son para los bloggers como las scubigalletas para Scooby aunque sean así de chorras... las estadísticas, no las scubigalletas... bueno, las scubigalletas también XD).

a qué hora leo blogs

2007/06/05

alcohol y coche

Agente: El alcoholimetro marca 10.7, ¿Puede leer lo que pone en el cartel ese que tiene delante?

Conductor: Diceee: Ni uda goda de al codl ar voradte, agedte

Agente: ¿Me explica entonces la marca del alcoholimetro?

Conductor: Bueeez, loogue pone en er cardel: ni uda goda de al codl ed er vodadte, lo deggo dodo dedtdo yo, y do he didado nada ed ed vodadte.

Cosecha propia. u_u'

2007/06/04

la grapadora que dice aaaaaah

2007/06/03

envío rápido de notas al notame

Vale, ya hay un bookmarklet para enviar al meneame desde Firefox (en realidad debería valer para cualquier navegador), pero se puede hacer aún más rápido todavía de verdad de la buena y con pepinillos usando las búsquedas rápidas de Firefox.

Preparación (esto sólo hay que hacerlo una vez):

  1. Marcadores
  2. Administrar marcadores
  3. Nuevo marcador
  4. parámetros:
    • Nombre: el que querais, yo tengo puesto "Nótame rápido"
    • Ubicación:
      http://meneame.net/api/newpost.php?user=UUUUUU&key=KKKKKKK&charset=UTF-8text=%s

      con cuidado de cambiar UUUUUU por el nombre del usuario que tengais en meneame y KKKKKKK por la clave que está en el perfil de usuario.
    • Palabra clave: notame
    • Descripción: Podeis poner lo que querais o dejarlo en blanco, yo puse 'envío a notame en la barra de direcciones escribir "notame cosa" envia "cosa" como nota a meneame'
  5. Cargar este marcador en el panel lateral: sin marcar
  6. Aceptar

Y cada vez que quieras enviar una nota, elige:

Ejemplo de uso 1:

  1. CTRL+t
  2. CTRL+l
  3. notame hola mundo
  4. ENTER
  5. esperamos al OK...
  6. CTRL+w
  7. profit!!!

Ejemplo de uso 2:

  1. CTRL+l
  2. notame hola mundo
  3. ENTER
  4. esperamos al OK...
  5. pulsamos el botón de atrás
  6. profit!!!

Limitaciones:

  • Los saltos de linea no funcionan, ni con \n, ni con <br>.
  • Caracteres acentuados no se envian correctamente. He probado a poner la codificación por defecto de Firefox a utf-8, pero ni así se envian. He cambiado el charset que hay en la URL del bookmark a UTF-8, y ya se envían correctamente los acentos :)

Y se me está ocurriendo usar el bookmarklet de habladorcito, pero no estoy seguro de cómo... hmmm... ¿o sí?... otro día.

2007/06/01

traducciones automáticas en la revista EDGE en español

EDGE es una revista de videojuegos de las que se imprimen con papel. La revista es oriunda de UK, y existe una edición en español que traduce algunos artículos, y continene otros de producción propia.

Que traduzca los artículos no me parece mal, lo que me parece mal son cosas como esta:

  • pag102, recuadro amarillo (el más pasable de los 3):
    Como canal de animacíon, Morpheme consiste en un ligero motor multiplataforma para PlayStation 3, Xbox 360 y PC, llamado Morpheme:runtime, que va integrado entre la máquina del juego principal y un entorno competente, Morpheme:connect. Esto se utiliza como una interfaz visual donde la lógica de animación y mezcla se puede crear, editar y retocar utilizando gráficos de transición y árboles de mezclas y revisar utilizando el previsualizador 3D. Se incluye soporte para el pad control del juego, guión (escritura) Lua y compatibilidad con la mayoría del complejo procedimiento de tecnología de animación.
  • pag 103, primer recuadro amarillo:
    Surgido de la experiencia de la compañía en rigidez del cuerpo y física ragdoll, Havok Behavior es una herramienta para animadores y un runtime SDK para programadores. Se construye sobre un sistema de dirección que abarcan ventajas tales como equipos, ataduras de piel/engranados y clips de animación . La herramienta de creación expone dinámicas de animación tales como máquinas jerárquicas en estado finito y mezclan armazones de una manera intuitiva. El SKD integra el sistema de animación del juego y le permite unirse al sistema de IA del juego de modo que los acontencimientos pueden cambiar las animacinoes en movimiento.
  • pag 103, segundo recuadro amarillo:
    Uno de los productos se adquirió cuando Autodesk compró Alias (también fue uno de los productos adquirido cuando Ailas compró Kaydara), ha llevado un tiempo a la empresa saberse cerca de HumanIK. A diferencia de productos tales como 3ds Max y Maya, HumanIK es un componente runtime que los promotores necesitan integrar en su propia máquina de juego. Esto requiere modelo de negocio diferente y otro apoyo que el que Autodesk ha ofrecido por regla general. Pero, siguiendo el reciente acuerdo de EA y el trabajo anterior con Ubisoft, parece que Autodesk buscará despertar interés en esta tecnología dinámica de caracteres de animación que utiliza un enfoque cinemático inverso para crear movimiento en juego. También ofrece una opción de objetivos de modo que la animación se puede aplicar a esqueletos de diferentes tamaños y jerarquías.

Vale que yo también tengo faltas de ortografía, y que mi estilo deja mucho que desear, pero a mi nadie me paga. ¿No es el proofreading una práctica común en los negocios editoriales?, joder, yo pensaba que sí.

Bah, la suscripción está a nombre de la oficina y en realidad me da igual, esto sólo es un poco de talibaneo ortográfico que me apetecía. Pero no deja de ser molesto que gente que cobra cometa los mismos errores que aficionados haciendo lo mismo por que les gusta. Y este no es el único/primero/último ejemplo (p.ej. los subtítulos oficiales en el DVD de animatrix son bastante mediocres).