sábado, julio 16, 2005

Crónica de una migración exitosa, Parte 1

Entre mas trabajo con Clipper.... mas me gusta xHarbour, y parece modo de mentira, de aproximadamente un año y medio a la fecha, he dejado de lado totalmente a Clipper y todo lo que he desarrollado lo he hecho a 32 bits.

En mi último reformateo de disco duro (procuro hacerlo cada año) realizado en Diciembre del 2004, instale todo lo básico, incluyendo xHarbour, Xailer, FiveWin, Borland C++, MultiEdit, AJMake y me olvidé totalmente de instalar las herramientas de 16 bits, a excepción del Workshop, Clipper y Blinker no se aparecieron por el disco duro hasta mediados de Marzo del 2005.

Con esto en mente, he tratado que todos mis clientes se muevan a 32 bits, que son plataformas sumamente estables, y es que además hoy en día es una labor de urgencia el mover los viejos programas de 16 a 32 bits, porque los 64 ya están a la vuelta de la esquina.

Como casi todo el mundo sabe, me liga un sentimiento afectivo y profesional con Sanrom's Software de México, de una forma u otra, soy algo así como el abuelo de la empresa, así que con esta confianza me puse a trabajar con Israel y Carolina para llevar a cabo la migración a 32 bits de sus 2 programas base: Grades y Cashier, sistemas de control escolar y de caja escolar respectivamente y 2 sistemas "satélites" Bancos y Módulo Web.

Si ya haz migrado tus aplicaciones, entonces sabrás que realmente no es una labor muy compleja, en si misma, casi todo pasa sin cambios, pero para su nueva versión de 32 bits, Isra y Caro querían darle una buena "lavada de cara" al sistema, no solo por fuera sino por dentro, entre los puntos que se querían atacar tenemos:

  • Cambio de la base de datos a tecnología Cliente/Servidor
  • Implementación de esquemas de seguridad para la base de datos
  • Refactorización del código para explotar al máximo los beneficios de xHarbour
  • Rediseño de la interfaz con el usuario para hacerla 100% "XP Look"
  • Implementación de rutinas para integración con Internet

Parte 1, Consiguiendo las herramientas.

Antes de atacar directamente la migración, fue necesario ver que cosas de la versión de 16 bits no pasarían a 32 bits, cuales pasarían con cambios y cuales permanecerían sin cambios.

Lo primero que se acordó fue revisar cuales eran todos lo componentes de terceros que se estaban usando y ver la manera de sustituirlos o de que en caso de contar con el código fuente de los mismos de recompilarlos, la lista fue de dar miedo:

  • TSBrowse, utilizado en casi un 80% del código y prácticamente para todo
  • TImage, para visualización de fotos de los alumnos
  • ChartFX, como generador de gráficas, en su versión de 16 bits, en formato VBX.
  • FileXLS, para exportar la información a Excel
  • TMultiPreview, para tener varias ventanas de vista previa abiertas al mismo tiempo
  • TSMTP, de Luis Krause para envío de correo electrónico
  • CanalFive Calendar, para captura de los datos tipo fecha.
  • INFOUNZ.DLL y WIZZIP.DLL para generación de archivos .ZIP de respaldo.

La parte mas compleja fue sin duda el TSBrowse, ya que a 32 bits, en su ultima versión (7.01) presenta varias fallas, y además había que tomar en cuenta que todo el sistema nuevo sería basado en Advantage Database Server, razón por la cual y después de probar sin éxito la nueva versión de TSBrowse, se decidió cambiar totalmente de browse, por el TWBrowse de Hernán.... mala idea.... mas del 80% del código del sistema son browses y todos basados en TSBrowse, la labor de cambiar todos los browses del sistema llevaría a tener que volver a escribir casi todo el código, con lo cual descartamos la idea, y nos arriesgamos en una misión suicida... tomar el código del TSBrowse, tal cual se tenía en la versión de 16 bits y compilarlo a 32 bits "a ver que pasa".... pues no pasó mucho...., bueno si, en realidad el código fuente pasó completo y funcionó a 32 bits, con algunas fallas sobre todo en el tema de manejo de "alias" cuando se trabaja en ventana MDI, pero gracias a la inestimable colaboración de Victor Tomás (www.listoelpollo.blogspot.com) que nos facilitó algunas modificaciones que él había hecho a esta clase, ahora funciona casi impecablemente a 32 bits (aún hay cosas que no nos gustan, pero nada que nos detenga o que impida funcionar al sistema).

Luego de librar el problema del TSBrowse atacamos el problema de la visualización de imágenes, en la versión de 16 bits se había venido utilizado la clase TImage de FiveWin, esta clase permite visualizar archivos con el formato BMP, JPG, GIF, TIFF, etc y está basada en las DLLs NVIEWLIB.DLL (32 bits) y NVIEWL16.DLL (16 bits), ambas gratuitas y que se incluyen con FiveWin. En estricta teoría, FiveWin de 16 bits puede hacer uso de las DLLs de 32 bits y esto es cierto bajo los Windows 9x (95, 98 y ME), sin embargo, bajo sistemas operativos TRUE-32 (NT, 2000 y XP) ¡ no se puede utilizar la DLL de 32 bits desde un programa de 16 !, así que para la version de 16 bits tuvimos que modificar la clase TImage para que siempre funcionara con la DLL de 16 bits, pero esto lleva un precio que pagar... la carga de las imagenes es muy lenta y eventualmente cuando se satura la memoria de la máquina, el programa invariablemente falla con un GPF. Por esta razón, a 32 bits decidimos cambiar totalmente de herramienta, y utilizamos la clase FreeImage de Enrico Maria Giordano. Esta clase está basada en un DLL OpenSource llamado precisamente FREEIMAGE.DLL, Enrico hizo un excelente trabajo escribiendo la clase y haciendo los wrappers para FiveWin Harbour que hacen uso de este DLL que es gratuita, 100% 32 bits y con una velocidad de carga muy muy rápida y lo mejor de todo, sin cambiar ni una linea del código fuente, porque la clase integra los mismos métodos y datas que la clase original de FiveWin. De la mano de lo anterior, se utilizó también la clase TZoomImage de Jaime Iruzun (www.codigoescrito.com), esta clase permite aumentar o disminuir la visualización de imagenes pero realiza esta operación sin deformación de la imagen.

Los reportes son parte importante de cualquier sistema, y la graficación y exportación de datos también, en la versión de 16 bits se utilizaba un VBX llamado ChartFX que se podía distribuir de manera gratuita, a 32 bits habia 2 opciones unicamente: la TGraph nativa de FiveWin, o bien utilizar ChartFX pero ahora en su modalidad ActiveX. Usar TGraph era una solución buena, pero llevaba implicito cambiar TODO el motor de graficación del sistema, aquí entró nuevamente a rescatarnos Victor Tomás con su clase TChartFX para 32 bits, adquirimos una copia de ella y también del ChartFX ActiveX. Este componente se maneja por OLE, por lo tanto se integra super bien con xHarbour, además tiene un montón de posibilidades y lo mejor de todo, a pesar que tuvimos que cambiar algunas cosas del código, se mantuvo mucha de la filosofia de programación para las gráficas.

La exportación de datos a Excel se realizaba por medio de la clase TFileXLS de Ramón Avendaño, desafortunadamente, no existen los códigos fuentes de dicha clase, solo se tiene la LIB para 16 bits y algunas compilaciones de la misma para versiones viejas de Harbour, la opción lógica era usar TExcelScript de Victor Tomás, pero esta clase te limita porque requiere que tengas instalado Excel en el equipo donde la vas a ejecutar. Ante este desolador paisaje, tuvimos que recurrir a un "truco sucio" para obtener el código fuente de TFileXLS, no quiero entrar en detalles de como lo hicimos, pero que se sepa unicamente que hay un Valkyrie involucrado.

La clase TMultiPreview no tuvo mucho problema, se cuenta con el código fuente y además se aprovechó para modificar el RPREVIEW.PRG para que la barra de botones de la ventana de vista previa se ajustara al estilo de la nueva interfaz.

El sistema cuenta con un sistema de "mail merge" que permite enviar correos electrónicos masivos a los padres de familia, para eso se utilizó inicialmente la clase TSMTP modificada por Luis Krause sobre la clase original de FiveWin, sin embargo, esta clase no maneja autenticación de usuarios en servidores que requieran clave de acceso y presenta algunos problemas cuando se quieren enviar archivos anexos, razón por la cual y debido a que además se integrarían otras funciones de internet, se hizo uso de la libreria FUNCKY, que integra un objeto SMTP para estos menesteres, además de otras cosas muy interesantes, la ventaja de usar esta libreria de funciones es que no requieres de tener una ventana abierta para enrutar los mensajes al WINSOCK, Funcky se hace cargo de eso directamente, además de que Funcky despacha los correos de una manera sumamente eficiente y super rápida.

CanalFive es el nombre de LOS COMPONENTES visuales que debes utilizar cuando quieres tener una aplicación que sea muy atractiva visualmente hablando, son componentes muy baratos y muy simples de implementar, escritos casi en su totalidad en FiveWin, el sistema de16 bits utilizaba C5 Calendar, para capturar campos fechas, y a pesar de contar con el código fuente de este componente, hubo un módulo en "C" que no se dejó compilar, por esta razón se decidió cambiar todos los gets que utilizaban este control por un control tipo DATEPICKER nativo de FiveWin Harbour, no hubo problema con la implementación salvo un pequeño detalle.... un DatePicker no permite dejar una fecha vacía, estamos estudiando varias soluciones que nos han sugerido, pero hasta ahora ninguna ha funcionado, seguiremos informando......

Finalmente, el sistema de respaldo/restauración de archivos se basaba en funciones que FiveWin traía incluidas y que estaban incluídas en 2 DLLs: WIZZIP.DLL para crear archivos .ZIP e INFOUNZ.DLL para desempacar archivos ZIP, sin embargo estos DLLs son de 16 bits y no son utilizables bajo 32 bits. Afortunadamente para nosotros, xHarbour incluye entre sus contribuciones la HBZIP, unas librerías que permiten manipular archivos .ZIP y que no requieren de ningun DLL externo.

Una vez conseguidas todas las herramientas, pasamos al cambio de tecnología de la base de datos, pero eso.... eso es otra historia.

6 comentarios:

Jaime Irurzun dijo...

No imaginaba que alguien utilizaría mi TZoomImage, me ha hecho mucha ilusión.

Jesús Díez González dijo...

Lo mismo me paso con el control DATEPICKER pero he utilizado otro control que hizo Santiago Perez que utiliza SysMonthCal32. Utilizo una ventana donde muestro el calendario y escoge una fecha. Te lo paso por e-mail por si te hace falta.

Un saludo
Jesús Díez González

Anónimo dijo...

Well done!
[url=http://rvsryvrr.com/cnuy/yvny.html]My homepage[/url] | [url=http://zjimvmgr.com/kdss/eosn.html]Cool site[/url]

Anónimo dijo...

Thank you!
My homepage | Please visit

Anónimo dijo...

Thank you!
My homepage | Please visit

Anónimo dijo...
Este blog ha sido eliminado por un administrador de blog.