cleartype y fuentes para programar

Una de las cosas que me disgusta es ver un PC con Windows que tiene las fuentes borrosas. El motivo habitual es que se le ha cambiado la resolución de pantalla a mayor, porque con la resolución óptima las letras son muy pequeñas. Las letras en monitores LCD se ven en condiciones óptimas al máximo de resolución que admiten, y si les cambias la resolución a mayor entonces se ven borrosas. El motivo es que al cambiar la resolución a mayor el pixel no coincide con el tamaño de un punto de resolución y la tarjeta se las apaña a su manera para mostrar las letras de la pantalla con lo que aparecen los llamados dientes de sierra. La solución pasa por usar el sistema de anti-aliasing de Windows y poner fuentes grandes en el sistema. El anti-aliasing en Windows se ajusta mediante un powertoy llamado cleartype tuner. Con esto se consigue tener las letras más grandes y con una mejor calidad que cambiando la resolución de pantalla. En Genbeta explican como usar este powertoy.

En el mundo Mac esto es mucho más fácil. Por defecto el efecto de anti-aliasing – que en algunos sitios se traduce por suavizado o alisado – de fuentes está activado, lo cual desde mi punto de vista es un acierto. En el mundo Windows el 80{480d580d36768405d93963bdd82c570c8132a231e8d2b870ef0b18322d1f72b2} de los usuarios ni saben lo que es el suavizado de fuentes, con lo que pierden la oportunidad de mejorar la visión de su sistema. Otra cosa que llama la atención es la diferente manera en que se aplica el suavizado de fuentes en Windows y Mac. Mi admirado Spolsky habló sobre ello y también se pueden encontrar otros post interesantes sobre el tema como este de CodingHorror.Para mi la personalización del entorno de trabajo es un tema capital, y como paso mucho tiempo con un editor el tema del tipo de letra es fundamental. No es sólo tener el anti-aliasing activado, sino usar una fuente que sea clara y que facilite la lectura del código. A raiz del post de CodingHorror sobre fuentes de letra para programar comencé a usar Consolas y para mi esta fuente es imbatible. La uso tanto en Windows como Mac y para mi es elegante, clara y bonita como ninguna otra fuente que haya usado antes para programar.

libra

A través de Genbeta he conocido Libra, un programa de catalogación personal con una pinta estupenda. Para entendernos es un Cuaderno de Bitácora con una interfaz espectacular. El programa presenta los ejemplares de nuestras colecciones como si los tuvieramos expuestos en una estantería, mostrando las carátulas o las portadas de cada uno de ellos. La introducción de datos se hace de manera automática: el programa lee el código de barras del libros, disco o video y se conecta con Amazon para recuperar los datos del mismo. Además tiene varias opciones para importar/exportar datos, y por si fuera poco es gratuito para uso personal. Una pasada, ¿ verdad ?

La realidad es que Libra es un clon para Windows de Delicious Library. Para los que no lo sepan, Delicious Library es una de las killer app del universo Mac. Es LA aplicación de catalogación personal del mundo Mac, con todos los premios del mundo mundial. Una auténtica pasada de aplicacación que exprime el API de Cocoa como pocas. La versión 2 promete ser ya la repanocha. Y lo mejor de todo es que es una aplicación original, en que los programadores han exprimido al máximo su creatividad para crear una interfaz totalmente rompedora.

Cuando veo una aplicación como Libra, la sensación es agridulce. Por una parte reconozco el mérito del desarrollador, pero por otra parte no me parece nada bien que se clone un programa. Si un programador quiere demostrar su valía debe hacerlo con una aplicación que muestre sus dotes técnicas y que sea original. Spolsky dice que los buenos programadores, aquellos a los que debes contratar, son los que hacen las cosas de manera elegante y son capaces de terminar las cosas. Clonar un programa no me parece nada elegante.

A mi me clonaron un programa y no me sentó nada bien.

un mundo sin fin

Para todos los lectores de Los pilares de la tierra el libro Un mundo sin fin es una cita ineludible. En este libro la trama sigue estando centrada en Kingsbridge, una imaginaria ciudad inglesa surgida alrededor de una catedral y su priorato. En esta ocasión los protagonistas son Merthin, hijo de un caballero convertido en pensionista del priorato tras sufrir el robo de todo su dinero, y Caris, la hija del comerciante de lana mas importante de la ciudad. El libro presenta los mismos ingredientes que Los pilares de la tierra, es decir una gran documentación sobre la época y sobre los oficios de la misma, unos personajes con los que el lector se identifica rapidamente, y una trama que gira alrededor de la vida de esos personajes con algunos giros sorprendentes pero que no se separan en exceso del argumento central. Es un libro que se lee fácil y que no se hace pesado pese a us más de mil páginas, pues la secuencia de acontecimientos se sucede con la suficiente rápidez como para mantener el interés del lector. El único pero del libro es que se parece demasiado a Los pilares de la tierra, y que el autor sigue abusando en exceso del tópico de personajes buenos que son muy buenos y de personajes malos que son muy malos.Para mi ha sido una buena novela, que no pasará a los anales de la literatura, pero que hace pasar buenos ratos con su lectura. Una novela sin grandes pretensiones, recomendada si no se tiene otra cosa mas interesante entre manos.

despliegue

El despliegue de software – deployment en inglés – es el conjunto de actividades que permiten que un determinado software se pueda usar en cualquier máquina. Muchos programadores no saben lo que es el despliegue y otros muchos confunden el despliegue con preparar un paquete de instalación de su software mediante programas como InnoSetup o similares. También existe determinado tipo de software, de acuerdo a los cinco mundos de Spolsky, que no necesita despliegue. Los programadores que hacen software interno o empotrado rara vez tendrán que preocuparse por el despliegue de su aplicación. Pero si alguna vez lo tienen que hacer, casi seguro que se meterán en un buen lio.El despliegue no comienza cuando se termina el programa, sino que debe comenzar precisamente con el comienzo del mismo. Una de las partes que más dolores de cabeza dan en el despliegue es la parte de creación de bases de datos o estructuras de datos del programa. Para que el despligue de una aplicación sea correcto debe incluir procedimientos automáticos de creación de la base de datos que vaya a utilizar, y esto debe planificarse cuidadosamente desde el inicio de la aplicación.

Hace poco hablaba con un amigo que trabaja en una empresa pública. Resulta que han hecho una aplicación interna muy buena y se la han premiado como una mejora de los procedimientos administrativos. Esto ha hecho que se conozca la exstencia de la aplicación y se la pidan de otras organizaciones similares, y ahí ha empezado su calvario. Ahora están desmontando la aplicación, pues tiene un fuerte acoplamiento con otras aplicaciones internas y no tiene sistema automático de creación de las bases de datos que utiliza. El problema de todo esto es que nunca pensaron que su aplicación iba a salir de su organismo, y no pensaron jamas en términos de despliegue. Moraleja: no importa que tipo de software hagas, piensa siempre que algún dia querrás distribuir tu aplicación. Piensa en terminos de despliegue.

Con el despliegue debes asegurarte de que tu programa va a funcionar en cualquier ordenador que cumpla unos requisitos mínimos de máquina y de sistema operativo. La creación de directorios, copia de archivos, registro de componentes, activación del programa y creación de enlaces en el menú inicio o en el escritorio debe ser completamente transparente al usuario. No hay nada más frustrante que descargarte una aplicación y tener que hacer tu los ajustes a mano para que funcione el programa y que después de un buen rato de pelearte con la aplicación no consigas hacerla funcionar. A mi me ha pasado más de una vez y se te queda muy mal sabor de boca. Si quieres evitarte problemas de despliegue tienes que intentar que tu aplicación sea autocontenida en la medida de lo posible, y que no tengas que recurrir a instalar otros componentes de terceros y menos aun que estos componentes de terceros se tengan que configurar a mano.En alanit todos los programas están hechos pensando en el despliegue. Cuando un programa arranca lo primero que hace es comprobar que existen todos los ficheros de datos necesarios para funcionar, y si alguno no existe se crea automáticamente. La instalación de nuevas versiones es no agresiva, si existen ficheros de datos del usuario el programa de instalación no copia los ficheros de datos que el programa trae por defecto. Y por supuesto, ningún paquete de instalación no se llama setup.exe.

qué pc compro ?

Mi amigo Miguel Angel Folgado se ha lanzado a la blogosfera con Qué PC compro ? En su blog habitualmente hace comentarios sobre ofertas de PC de diversos canales de distribución, resaltando sus características y sus carencias. También tiene artículos de ayuda muy buenos como ¿ Qué monitor compro ? o ¿ Qué antivirus compro ? donde hace un auténtico despliegue de conocimientos para abordar en profundidad los temas que trata. Es un blog a seguir, pues sus opiniones provienen de un gran profesional.Como a mi me gusta hacer rabiar a Miguel Angel, le digo siempre que el mejor PC que se puede comprar es un Mac

negresbetanics.com

En las últimas semanas he estado haciendo una web para mi comparsa de moros y cristianos, los Negres Betànics. Es una comparsa de solera en las fiestas de Novelda, y una de sus características más importantes es que todas las filás o escuadras desfilamos con trajes de guerrero y pintados de negros. Estas pinturas aportan un plus de vistosidad a los desfiles y siempre somos una de las comparsas más aplaudidas en estos actos.Cuando planteamos hacer una web, yo me negué a hacer una web clásica – con xhtml/css y picado a mano para entendernos – y expuse que la mejor manera era hacerla con un gestor de contenidos, como si fuera un blog de tal manera que cada filá pudiera publicar lo que quisiera dentro de una normas.El sitio está hecho con WordPress y usa como base el tema BlueBox. A la hora de categorizar las entradas, opté por poner enlaces fijos a las distintas categorías, de tal manera que la barra lateral tiene una estructura fija separada en secciones. Además he usado los siguientes plugins de WP:

Además he hecho una modificación sobre el tema de WP para que la imagen de cabecera de la web vaya cambiando cada vez que se carga una página. Esto le da mucha vida a la web, ya que cada vez que haces un click ves una imagen distinta en el encabezado. La web tiene este aspecto:

Por cierto, mi filá se llama Viidones.

Findemes 1.1

Tengo casi lista la versión 1.1 de Findemes, mi programa de contabilidad personal. Además del autocompletado en los campos que son claves ajenas, el programa trae dos novedades importantes, una es una mejora de usuabilidad y otra una funcionalidad nueva.La mejora de usabilidad es el remarcado de colores de las rejillas de datos de apuntes. En la versión anterior del programa, se permitía disntiguir los apuntes de ingresos y gastos mediante los colores de los mismos. Sin embargo cuando un apunte se iluminaba el color era el mismo, de tal manera que sabías que apunte era ingreso o gasto en todos los apuntes menos en el que tenías iluminado. Esto ya se corrige en esta versión, haciendo video inverso sobre los colores del tipo correspondiente. La verdad es que canta un poco en función de los colores que tengas asignados a cada tipo de apunte, pero mejora mucho la claridad de la información.

La segunta mejora consiste en que el programa permite generar archivos PDF de los listados. Esto es posible gracias a Image2PDF.DLL y unos wrappers de las funciones de esta librería que se publicaron el el foro de FWH. Ahora al generar el listado, en el formulario que permite seleccionar las opciones del informe aparece una nueva pestaña que permite elegir el nombre del fichero PDF que se va a crear. En la previsualización del informe aparece un botón con el dibujo de PDF y haciendo click en este botón se genera el informe.

La nueva versión esta casi lista, la estoy probando y en breve la enviaré a los usuarios registrados. Ahora queda cambiar la ayuda del programa, montar la edición gratuita y actualizar la web.

backspaceware

Al instalar la última actualización de Paint.NET me llamó poderosamente la atención el siguiente mensaje que apareció en el formulario de instalación del programa.

No soy seguidor del blog del creador de Paint.NET, pero si lo he leido alguna vez y recordaba haber leido por encima algo sobre una copia del programa. Revisando el blog encontré la entrada en cuestión y la lei con mas detenimiento. Resulta que un programador había cogido el código fuente de Paint.NET, le había quitado la información relativa al autor original, había añadido una serie de plugins al programa y había creado un nuevo instalador. Pero con el detalle de borrar la información relativa a los créditos de los autores del programa y atribuyéndose la autoría del mismo. El programa era el original, y los plugins sacados de los foros del programa. Esta nueva manera de hacer software es bautizada por el programador de Paint.NET como backspaceware, software hecho borrando lo que no interesa de un código disponible.El caso es que el reempaqueteador es bien conocido por esas prácticas, y ya ha hecho lo mismo con otros programas. Para mas guasa, el nombre dado al programa reempaquetado fue Creative Paint, lo cual refleja el espiritu creativo del sujeto este.En el debate que acompaña al post se pueden leer opiniones para todos los gustos. Desde los que acusan de ladrón al reempaquetador, hasta los que dicen que de acuerdo a la licencia de Paint.NET – que parece ser una licencia MIT – se puede derivar cualquier trabajo sin tener que reconocer el trabajo del desarrollador original. Ahí es nada.Tras el revuelo armado con el tema, el desarrollador de Paint.NET ha conseguido que el programa reempaquetado desaparezca de la mayoría de sitios de descargas de software, y ha cambiado la licencia de Paint.NET a una CreativeCommons-By-Nd que obliga a mantener la atribución del software a su autor original y prohibe hacer productos derivados del programa.

autocompletado en FWH

Prologo: Quitando comboboxes – hace seis años.

En el caso de campos que son claves ajenas sobre otras tablas, pienso que se debe combinar la facilidad de la introducción de los datos correctos con la capacidad para dar de alta valores nuevos en la tabla auxiliar de una manera directa, y esto último no se puede hacer con comboboxes. Para ello utilizo una combinación de cuadro de texto donde el usuario escribe el valor del campo, y un botón que muestra un formulario de selección de valores. Si el usuario quiere escribir el valor de la clave ajena lo puede hacer directamente y el programa lo valida sobre la tabla auxiliar. Si el valor no está dado de alta en la tabla auxiliar el programa pregunta si se quiere dar de alta, y en caso afirmativo presenta el formulario de alta de la tabla auxiliar. Si el usuario no quiere escribir el valor, puede usar el botón que muestra el formulario de selección y elegir un valor o darlo de alta.Esta manera de hacer las cosas está bien, pero no es perfecta. Como me han comentado varios usuarios de mis programas, lo correcto sería que funcionase un autocompletado del campo de texto sobre el campo que es clave ajena en el mismo. Teclear los valores cada vez es pesado y lleva a errores si no recuerdas como has dado de alta cada valor. Por otra parte el soltar el teclado para hacer click en el botón y seleccionar el valor es un engorro que te hace perder tiempo, sobre todo si tienes que dar de alta muchos registros.

Fisgoneando por los foros de Fivetech encontré una clase TAutoGet que hace precisamente esto, un autocompletado sobre un array donde previamente se han introducido los valores. Incorporar esta clase a un programa es muy sencillo, basta con cargar los valores de los arrays de autocompletado antes de editar el campo correspondiente. Los resultados son espectaculares. Conforme tecleas las primeras letras del valor, te van apareciendo los valores que coinciden coon ellas. Una vez tienes el valor que quieres, con un tab validas el nombre y saltas al siguiente campo. Es mucho más cómodo que soltar el teclado, hacer click en el botón de al lado y ponerte a buscar el valor que quieres introducir. Pocas veces una clase tan pequeña me ha dado unos resultados tan espectaculares. Pura dinamita.

Para los perezosos de visitar el foro de Fivetech dejo un fichero con la clase TAutoGet completa: código fuente, fichero de preprocesado y un pequeño ejemplo, todo sacado del foro. Tengo ya el autocompletado implementado en Findemes, y estará disponible en la próxima versión que vamos a publicar el breve. Ahora estoy pensando en si el autocompletado irá en la edición gratuita o unicamente en la registrada, pero eso es otra historia.

msgbox a la windows vista

En mis programas tengo los mensajes del sistema personalizados. De esta manera controlo que mis programas siempre muestren los típicos mensajes de confirmación, información, alerta y parada de la misma manera en todas las versiones de Windows. También uso mis propios iconos para los mensajes, sacados de las colecciones de iconexperience que uso también en mis programas. De esta manera consigo uniformidad en los programas.

En Windows Vista los mensajes del sistema presentan un aspecto distinto a las anteriores versiones de Windows. Además de los iconos característicos de la nueva versión de Windows, el formulario está visualmente dividido en dos zonas, la de arriba es blanca y contiene el icono y el texto del mensaje, mientras que la parte de abajo es del color habitual del formulario y contiene el botón o botones del mismo.Con FWH es fácil hacer un formulario de estas características usando el control Pages. No hay más que definir el formulario con un control pages donde va la zona blanca y luego crear otro formulario que se solapará encima del anterior. La definición del formulario principal en el fichero RC es de la siguiente manera:

UT_INFO DIALOG DISCARDABLE 29, 34, 206, 88
STYLE WS_POPUP|DS_MODALFRAME|WS_CAPTION|WS_SYSMENU
CAPTION "Cuaderno de Bitácora"
FONT 8, "Ms Sans Serif"
{
  CONTROL "&Aceptar", IDOK, "Button", BS_DEFPUSHBUTTON|WS_TABSTOP, 144, 66, 50, 16
  CONTROL "", 110, "Static", SS_WHITERECT, 0, 0, 206, 60
}

El control que va a contener el control page es el identificado con 110. La definición del formulario que va dentro del control Page del formulario principal es como sigue:

UT_INFO_PAGE DIALOG DISCARDABLE 77, 112, 203, 60
STYLE WS_CHILD|WS_CLIPCHILDREN
FONT 8, "MS Sans Serif"
{
  CONTROL "", 10, "Static", WS_GROUP, 48, 8, 142, 44
  CONTROL "", 111, "TBitmap", 0x00000000, 8, 4, 36, 36
}

El código de la función que muestra el formulario es el siguiente:

FUNCTION msginfo(cText, cCaption)
   LOCAL oDlgInfo, oPage
   LOCAL oBmp

   DEFAULT cCaption := oApp():cAppName+oApp():cVersion

   DEFINE DIALOG oDlgInfo RESOURCE "UT_INFO" TITLE cCaption
   oDlgInfo:oFont  := oApp():oFont

   REDEFINE PAGES oPage ID 110 OF oDlgInfo ;
      DIALOGS "UT_INFO_PAGE"
	oPage:oFont := oApp():oFont

   REDEFINE SAY PROMPT cText ID 10 OF oPage:aDialogs[1]
   REDEFINE BITMAP oBmp ID 111 OF oPage:aDialogs[1] RESOURCE "xpinfo" TRANSPARENT

   REDEFINE BUTTON ID IDOK OF oDlgInfo  ;
      ACTION oDlgInfo:End()

   ACTIVATE DIALOG oDlgInfo ;
      ON INIT oDlgInfo:Center( oApp():oWndMain )

RETURN Nil

con lo que conseguimos un formulario como el siguiente: