el peor de los errores

El peor de los errores es el que no puedes reproducir. No sabes porqué surge, ni eres capaz de anticiparlo. Asalta tu programa y tu no eres capaz de defenderlo.

Eso es lo que me está pasando con el soporte de i18n de xharbour. Primero daba errores al tomar como lenguaje base uno distinto del inglés. Giancarlo Niccolai lo corrigió permitiendo que se tome como base cualquier lenguaje. Después el problema fue que había cadenas que no se traducian. Generé 50 veces el diccionario base y revisé la traducción. Todo correcto, pero habia cadenas que quedaban sin traducir. Pensé que el problema era el uso de las letra ñ, así que cambié contraseñas por claves en todas las cadenas que mostraba el prograna. Seguía fallando, pero ahora no traducía cadenas que antes sí se traducian y viceversa.

He vuelto a escribir a Giancarlo, que es quien ha hecho el soporte de i18n para xHarbour, y me está ayudando a resolverlo. Parece que el problema está en el algoritmo de ordenación del array donde se almacenan las cadenas traducidas. El caso es que con un build de xHarbour descargado hoy del CVS la i18n no funciona bien. La verdad es que no se por donde atacar el problema. Giancarlo se está portando fenomenal conmigo y debe pensar que soy un torpe, pero no se que demonios está pasando.

si puedes usar radios quita los combos

En un artículo anterior ya comentaba que estaba restringiendo el uso de comboboxes a los casos en que tuviera una selección de una lista de valores que fueran estáticos. En Colossus estaba haciendo el formulario de selección de listados y puse dos combos: uno para seleccionar la meteria y otro para seleccionar el tipo de entrada. El segundo combo permitía elegir unicamente entre 4 opciones fijas y además había una gran separación entre las opciones del listado y el siguiente grupo de controles que permite
elegir el título y subtítulo del listado.

20030828a.gif

Como el número de elementos a elegir es pequeño – sólo 4 – y no hay problemas de espacio en el formulario, lo mejor es quitar este combo, con lo que el formulario ha quedado de esta manera:

20030828b.gif

Mucho mejor.

un PC con varios Windows

Una configuración interesante para cualquier programador consiste en tener instalados en su PC varios sistemas operativos. En mi caso tengo instalados Windows98, Windows2000 y WindowsXP. Además toda la información que manejo la tengo en una partición extendida formateada con FAT32, de manera que desde cualquier sistema operativo con el que arranque mi máquina puedo acceder a mis datos.

El truco para hacer esto consiste en hacer varias particiones del disco duro, en mi caso uno de 40GB, e instalar cada cosa en su sitio. Juntos pero no revueltos. Para gestionar las particiones utilizo PartitionMagic y para el gestionar el arranque del PC utilizo BootMagic. Los dos productos son de PowerQuest y realmente son una maravilla. Con PM puedes crearte particiones de tu disco, en mi caso tengo 3 particiones primarias para los sistemas operativos y una extendida para los datos, formatearlas de manera independiente y quitarle espacio a una partición para dársela a otra. Con BM puedes gestionar el arranque del PC, diciendole que arranque una partición por defecto o poniendo un temporizador.

Uso esta configuración por dos motivos:

  1. Me permite probar mis programas en los 3 sistemas operativos más habituales de mis usuarios.
  2. Permite que los cambios de sistema operativo no sean traumáticos ni tengas que estar 2 dias seguidos configurando e instalando software.

Normalmente uso un sistema operativo para trabajar, ahora WindowsXP-Gorilla, y los otros los tengo para probar los programas. Como después de las últimas actualizaciones de XP con los virus de las semanas pasadas mi escritorio Gorilla ha quedado tocado – razón tenía quien decía que las DLL hackeadas daban problemas – voy a formatear la partición donde tengo Windows2000 e instalar otra vez XP limpio. Iré instalando software cuando tenga ratitos para ello y cuando tenga todo instalado para trabajar comenzaré a usar el sistema operativo de esta partición por defecto. Con el XP-Gorilla veré que hago, pero es posible que instale ahí de nuevo Windows2000 o quizá algún Linux.

contestar correo

Una de las tareas diarias de un desarrollador de shareware es contestar los correos recibidos. Los correos que se reciben son de los más variado, desde usuarios agradecidos a navegantes que te pueden decir cualquier improperio. Es importante contestar en 24 horas, cómo máximo en 48, pues sino la imagen del sitio y del soporte que das queda por los suelos.

Una de las cosas que más ayuda a la hora de contestar correo es tener una serie de respuestas preparadas para las preguntas más habituales: ¿ cuanto cuesta el programa ? ¿ cómo lo pago ? ¿ cómo lo mandas ? … Si enlazas estas respuestas preparadas con las opciones de firmas de mensaje, puedes despachar correos a gran velocidad.

fsdi para xharbour

He adaptado mi clase fsdi – full single document interface – para xHarbour. El resultado es este:

20030807.gif

Como se puede ver es un programa a 32 bits, que coge perfectamente el tema de mi escritorio gorilla. Para funcionar se necesita un build de FWH posterior a junio de 2003, pues había un error en las versioes anteriores que hacía que funcionase mal la herencia de la clase Dialog.

La clase fsdi para xharbour la puedes descargar aqui – fichero de 512KB con fuentes y ejecutable para los no fivewineros. Es freeware, pero mantengo el copyright sobre ella y agradecería a los posibles usuarios de la clase que me escribieran para darme su opinión sobre la misma.

setup.exe

Esta semana estaba buscando una determinada utilidad. Busque en Google y entré en las web de los dos programas que en principio me parecieron más adecuados. Al ir a bajarme los dos programas para probarlos me pasó algo muy chocante: los dos ficheros de instalación de los programas se llamaban setup.exe. Aplicando una de las máximas canafiveanas podriamos decir que parece una tontería pero realmente es una estupidez.

¿ Cómo se le ocurre a alguien ponerle setup.exe a un fichero de instalación ? Está claro que es un setup, pero ¿ de qué programa ? ¿ Qué pasa si el usuario se baja la instalación al disco y no sabe luego donde la ha dejado ? ¿ Qué busca ? ¿ Cual de todos los setup.exe que tiene por el disco es el bueno ?

Quiza el programador piense que su programa es el único programa que el usuario va a descargar y por eso no tiene reparos en llamarle setup.exe, pero la verdad es que no me parece una buena idea.

Detalles, detalles. Son los que marcan la diferencia.

i18n en xharbour – 2

Estoy probando la i18n en xHarbour para aplicarlo en Colossus y es sumamente fácil de utilizar. En la documentación sobre la i18n hay una errata que me ha hecho atascarme un rato: donde dice…

I18N_SetPath( "c:\MyPathDifferent" )
I18N_SetLanguage( cLang )

debe decir

HB_ I18NSetPath( "c:\MyPathDifferent" )
HB_I18NSetLanguage( cLang )

Pero lo más impresionante de todo es que HbDict recuerda que cadenas has traducido ya del idioma base aunque regeneres el fichero de idioma.

Impresionante trabajo el de Giancarlo Niccolai.

i18n en xHarbour

Una nueva característica que ha pasado casi desapercibida en la versión 0.81 de xHarbour es la de internacionalización de la aplicación. La internacionalización – i18n porque entre la i y la n hay 18 letras – de una aplicación supone tener herramientas automáticas para traducir cualquier literal que muestre la aplicación en las distintas lenguas a las que se la quiera traducir. Muchos lenguajes modernos incorporan herramientas de i18n, que son muy apreciadas por los programadores de un mundo cada vez más globalizado.

Si no tenemos herramientas de i18n podemos hacer la traducción de los mensajes de varias maneras:

  • incrustando la i18n en el código, es decir meter todos los literales en el código y mostrando unos u otros en función de una variable. Esto es una auténtica burrada, con perdón.
  • almacenando los literales en un RC. En este caso lo normal es tener un RC para cada lengua a la que traduzcamos nuestra aplicación, aunque también podremos tenerlos juntos en el mismo RC y elegir cual mostrar. En cualquier caso en el programa tendremos que recuperar la cadena del RC para mostrarla. En el caso de tener que mostrar una etiqueta haremos algo como esto:
    REDEFINE SAY PROMPT LoadString(GetResources(),1164) ID 20 OF oDlg
    REDEFINE SAY PROMPT LoadString(GetResources(),1163) ID 21 OF Odlg
    

    ¿ Problema ? Que codificamos a ciegas, pues ¿ cual es la cadena 1164 ? Tenemos que estar continuamente pasando del editor de código al editor de recursos para saber que estamos diciendo al usuario y además llevar cuidado de no repetir cadenas. Un rollo.

Ahora en xHarbour 0.81 cada cadena a i18n la pasamos como parametro a una función que se llama precisamente i18n(), con lo que tenemos algo asi:

REDEFINE SAY PROMPT i18n("Introduzca la materia") ID 20 OF oDlg
REDEFINE SAY PROMPT i18n("Materia:")              ID 21 OF Odlg</p>

El lenguaje nos proporciona herramientas para generar un diccionario de terminos a traducir y realizar la traducción de los mismos. Una vez traducido el diccionario, lo único que tenemos que hacer desde nuestra aplicación es seleccionar el lenguaje en que mostraremos los mensajes.

xHarbour va pareciendo cada vez más un lenguaje moderno.

un bonito calendario

Una cosa que suelo hacer a menudo es visitar webs de empresas que hacen software y fijarme en los diseños de sus programas. Esto me da ideas para mis programas y de vez en cuando capturo alguna imagen para retenerla. Por ejemplo este calendario, no se de dónde lo saqué, pero creo que es de los mejores que he visto.

CalendarCombo.jpg

lecturas de verano

Cada vez que se acerca el verano, con el fin del trabajo en la Universidad me planteo que voy a hacer durante el verano. Otros años atrás la cosa estuvo un poco más fácil, pero este año realmente se me ha acumulado la faena. El motivo principal, Fátima aparte, ha sido que estos tres últimos años han sido flojos en cuanto a lectura, debido a que he estado realizando el master DISTICAD. Así que he estado tres años comprando libros y dejando bastantes sin leer. Por fin terminé el master y me puedo dedicar a otras cosas. Estos son algunos de los libros que tengo en casa pendientes de leer:

Cómo podeis ver, son todo libros de programación pero no hay ninguno de programación con un lenguaje determinado. Me atraen mucho los libros que hablan de aspectos relacionados con el entorno o la productividad de la programación y/o los programadores. Son lo que yo llamo libros de largo recorrido porque pienso que los conceptos que tratan perduran sobre los lenguajes de programación de moda cuando se escribieron. Pienso que es muy importante leer este tipo de libros pues afianzan el conocimiento de la disciplina de la programación más allá del lenguaje que se utilice.

Hay varios libros en inglés, no es que yo sea muy fluent leyendo inglés, pero peor es no leerlos. Si conoces la traducción de alguno de los que he mencionado en inglés te agradecería que lo anotaras en los comentarios a este post.

¿ Has leido alguno ? ¿ Por cual comenzarías ?

programar es divertido, hacer programas es difícil

Este era hasta hace poco el Nick de Messenger de un buen amigo mio. ¡ Que gran verdad !

Hacer pínitos con un lenguaje de programación es divertido. Abres tu editor de código o el IDE del entorno de programación, haces tres dibujitos, picas cuatro lineas, compilas y tienes un bonito formulario con tres etiquetas, 3 cajas de edición, un radio butón y dos botones. Hala, ya has hecho un programa. Fantástico. ¡ Qué fácil es esto de programar !

Las narices.

Hacer programas es difícil y más con entornos de desarrollo inestables. Se acaba de liberar una nueva versión de xHarbour – la 0.81 – que ya trae los CDX casi terminados. Fantástico. El Pcode ahora vale 5 …. a recompilar todas las librerías. Clases de FWH que antes funcionaban ahora no funcionan. Una clase TGet de FWH que iba después de todo el retoque que hicieron en el Get de [x]Harbour ahora no funciona bien. Cosas que funcionaban bien de momento no van. ¿?

Yo no tengo ni idea de programar componentes, pero es que no la quiero tener. Yo quiero tener un entorno de desarrollo estable de una santa vez. No digo que sea culpa de nadie, lo único que digo es que mi negocio no es hacer componentes. Ni se hacerlos, ni puedo hacerlos, ni quiero hacerlos. ¿ Alguien se imagina a un albañil construyendose sus ladrillos ? Por favor… lo importante es mantener lo importante como lo importante. Y dejarse de enredos.

Quiero recompilar mi código y que siga chutando lo que chutaba con la versión anterior del compilador y del GUI. Sólo eso. Ni más ni menos.

Llevo dos meses con Colossus en fase beta. ¡¡¡ Dos meses !!! Entre que no soy Donald Knuth, que tengo poco tiempo para programar y que el suelo se mueve bajo mis pies, así no hay quien libere una versión completa de nada. Es para ponerse a llorar.

En fin, voy a pasar por taquilla y me voy a actualizar al build de 1 de julio de FWH a ver si la cosa mejora, que estoy de los nervios.