jueves, junio 26, 2014

FoxBin2Prg: Guía rápida de uso y configuración

[2015/04/18: Actualizado hasta FoxBin2Prg v1.19.42]

Por: Fernando D. Bozzo

En el caso de que no sepas de qué va esto porque sea la primera vez que entras aquí, te lo resumo:

FoxBin2Prg es un programa Open Source que forma parte del proyecto VFPX en CodePlex, esta hecho en Visual FoxPro 9 SP2 y pretende sustituir a TwoFox y al scctext.prg que viene con Visual FoxPro y que se usa para realizar la conversión de los binarios de VFP 9 (scx, vcx, etc) a texto estilo-prg, con la diferencia de que FoxBin2Prg es bidireccional, o sea que desde el texto puede regenerar los binarios.

Aunque este programa es un PRG, también está compilado como un EXE para que se pueda vincular a otras herramientas, como el explorador de archivos o herramientas SCM (control de código fuente) como Plastic, SourceSafe, etc., además el EXE es m´s rápido y tiene incluido todos los archivos necesarios.


Breve reseña del problema a resolver


Un problema de los binarios de Visual FoxPro (scx, vcx, etc) es justamente ese, que su código fuente está metido en tablas DBF (sí, los scx, vcx y demás son DBF renombrados) y esto dificulta enormemente poder trabajar con ellos de forma más libre y sobre todo dificulta poder integrarlo en herramientas de control de código fuente, y en parte esto es una de las causas de que muchos programadores FoxPro no usen herramientas de control de código.
A todos los efectos, desde fuera estos arhivos son binarios, y como tales, son susceptibles de corromperse, y de hecho lo hacen, y cuando lo hacen hay una alta probabilidad de perder todo o parte del código fuente.

Lo que se hizo en su momento (años 90) para minimizar este problema, fue convertir estos binarios a representaciones de texto, para lo cual, el más conocido de esos programas (scctext.prg) hacía un volcado de los campos memo internos de los forms, clases y demás a un txt con extensión sca, vca, etc, pero casi sin ningún formateo que permitiera poder verlo mejor y analizarlo, y así ha sido hasta la llegada de un nuevo programa en enero de 2014, FoxBin2Prg, que justamente pretende cubrir todas esas carencias mediante la generación de vistas modificables de texto que son un 99% código PRG para los binarios que tienen código fuente y que cualquier programador Fox entiende; y pseudo-XML para los demás, pero con un detalle importante: con este texto generado se puede volver a reconstruir el binario original, lo que permite realizar todas las operaciones de manejo de código que se suelen hacer con una herramienta SCM, incluyendo el diff y el merge, que es la operación más compleja en un entorno de desarrollo.


¡La Capitalización de nombres de archivo importa!


Es necesario conocer exactamente qué hace FoxBin2Prg, para luego poder elegir cómo, cuándo y por qué hacerlo.

FoxBin2Prg no solo genera una vista de texto de los binarios y regenera los binarios desde la vista de texto, sino que también capitaliza los programas que convierte para normalizarlos, para lo que se integra con otro programa específico llamado filename_caps.exe, y que también puede usarse por separado.

La importancia de esta capitalización radica en que cuando se usan ciertos programas o sistemas multiplataforma para gestión de código, como CVS, Subversion, Git, Plastic y otros, un archivo.así es distinto que un Archivo.ASÍ, ya que Windows es prácticamente el único Sistema Operativo que no distingue entre ambos, pero Mac, Linux, Unix, BeOS y otros sí, y los consideran como dos archivos distintos.

Estas diferencias en los nombres de archivo pueden provocar toda clase de problemas, desde errores que impidan trabajar o sincronizar con el SCM (por ejemplo GitHub, CVS, etc), hasta la sustitución de archivos por versiones erróneas.


¿Qué contiene el proyecto?:


El proyecto contiene todos los archivos fuentes, pero para su uso sólo se requieren ciertos archivos, que varían dependiendo de si se usa el EXE o el PRG.


Versión EXE (más compacta y rápida):
  • FoxBin2Prg.exe => Conversor principal con todo dentro
  • FoxBin2Prg.cfg => Configuración del Conversor



Versión PRG (requiere más archivos y es algo menos rápida): 

  • FoxBin2Prg.prg => Conversor principal
  • Props_*.txt => 27 Archivos para evaluación y ordenamiento de propiedades

Archivos necesarios en ambas versiones:
  • FoxBin2Prg.cfg.txt => Archivo modelo para usar de configuración del conversor
  • filename_caps.exe => Gestor de capitalización de nombres de archivo
  • filename_caps.cfg => Configuración del Gestor de capitalización
  • Convert_VFP9_BIN_2_PRG.vbs => Script para conversión masiva de Binario a Tx2, y mostrando mensaje de finalización de proceso. (Opcional, se puede reemplazar por FoxBin llamado con el parámetro BIN2PRG)
  • Convert_VFP9_PRG_2_BIN.vbs => Script para conversión masiva de Tx2 a Binario, y mostrando mensaje de finalización de proceso. (Opcional, se puede reemplazar por FoxBin llamado con el parámetro PRG2BIN)
  • Normalize_FileNames.vbs =>  Script para capitalización masiva de archivos
  • VFP9_FoxBin2Prg.vbs => Script para invocar a FoxBin2Prg.exe, pero mostrando mensaje de finalización de proceso. (Opcional, se puede reemplazar por FoxBin llamado con el parámetro SHOWMSG)


Internacionalización (localización)


Desde la versión v1.19.38 la selección de lenguaje es automática y se basa en la función VERSION(3), y se puede cambiar en el archivo de configuración foxbin2prg.cfg usando la nueva opción "Language".

Los valores adminitos son: ES  (Español), EN (Inglés), DE (Alemán) y FR (Francés) y si se indica cualquier otro o el predeterminado no es uno de estos, se seleccionará automáticamente Inglés (EN).



Vale, y ahora, ¿cómo se usa?


Para usar FoxBin2Prg desde el Explorador de archivos, puede crear 3 accesos directos de FoxBin2Prg.exe (click-derecho / crear acceso directo) y moverlos a la carpeta "SendTo" en su perfil de Windows (que normalmente está en C:\Documents and settings\<usuario>\SendTo o en C:\Users\usuario\<usuario>\SendTo), así podrá "enviar" el archivo elegido (pjx,pj2,etc) a la opción seleccionada, y hacer conversiones-al-vuelo, luego renombre esos accesos directos y modifíquelos como sigue (asegúrese de que puede ver las extensiones de archivos del sistema):

Nombre----------------------  Click-Derecho/Propiedades/destino----------------
FoxBin2Prg - Binary2Text.lnk  <path>\foxbin2prg.exe "BIN2PRG-INTERACTIVE"
FoxBin2Prg - Text2Binary.lnk  <path>\foxbin2prg.exe "PRG2BIN-INTERACTIVE"
FoxBin2Prg.lnk                <path>\foxbin2prg.exe "INTERACTIVE"

  • Con la opción "BIN2PRG" o "PRG2BIN", puede procesar directorios o archivos individuales
  • Con FoxBin2Prg.exe solamente, puede procesar archivos individuales
  • Con la opción "INTERACTIVE", un mensaje de confirmación será mostrado cuando termine, y los errores encontrados serán mostrados automáticamente también


¡Atención! No copiar los programas en la carpeta SendTo, sólo deben ponerse los "accesos directos" de los programas, ya que internamente tienen la ruta completa del programa original.


Casos de uso:

- Si se quiere convertir sólo 1 archivo binario a texto, entonces se debe hacer click-derecho en el archivo (scx, vcx, etc) y elegir Enviar a => FoxBin2Prg

- Si se quiere convertir sólo 1 archivo texto a binario, entonces se debe hacer click-derecho en el archivo (sc2, vc2, etc) y elegir Enviar a => FoxBin2Prg

- Si se quieren convertir los archivos binarios a texto de un directorio, entonces se debe hacer click-derecho en el directorio y elegir Enviar a => FoxBin2Prg - Binary2Text

- - Si se quieren convertir los archivos de texto a binario de un directorio, entonces se debe hacer click-derecho en el directorio y elegir Enviar a => FoxBin2Prg - Text2Binary

- Si se quieren capitalizar los archivos de un directorio, entonces se debe hacer click-derecho en un directorio y elegir Enviar a => Normalize_FileNames



El caso de uso normal sería el siguiente:

- Se trabaja un form, una clase, etc., en una sesión de FoxPro hasta que se termine y se cierra el form

- Clear all en la ventana de comandos

- En el explorador de archivos se elije el form (o clase, etc) y se convierte a texto

- Luego se elige el archivo de texto recién generado y se vuelve a convertir a binario

Listo!



Configuración

El Gestor de Capitalización por defecto está configurado para respetar la capitalización de los nombres de archivo y pasar las extensiones a minúsculas, y normalmente con eso es suficiente. Pero si se quiere controlar más, mirar dentro del archivo filename_caps.cfg que está más detallado y con algunos ejemplos.

La configuración por defecto es esta:

filemask=*.*:N.L

El Conversor por defecto está configurado para generar las extensiones xx2, soportar la conversión bidireccional de todas menos los DB2 (por seguridad, pero se puede cambiar) y dejar vacíos los Timestamps e ID's de registro.

[2015/04/18 - v1.19.42 >>]
En el directorio de instalación hay un archivo de configuración llamado foxbin2prg.cfg.txt donde están detallados los valores por defecto en Inglés y Español, y más abajo están las configuraciones modificables.
Este archivo, si se le quita la extensión .txt (foxbin2prg.cfg), se puede usar como modelo para crear configuraciones personalizadas por directorio, aprovechando la herencia de CFGs entre directorios padre/hijo.

FoxBin2Prg.cfg - Si no se proporcionan valores, estos son los predeterminados Detalle y valores soportados
extension: xx2 Las extensiones por defecto de FoxBin2Prg terminan en '2'
ShowProgressbar: 1 1=Mostrar barra de progreso por defecto en procesamiento multi-archivo, 0=No mostrar PB
DontShowErrors: 0 Mostrar mensajes de error por defecto
NoTimestamps: 1 Vaciar Timestamps por defecto para minimizar diferencias
Debug: 0 No Activar <archivo>.Log por defecto
ExtraBackupLevels: 1 Por defecto 1 BAK es creado. Con esto puede crear más .N.BAK, o ninguno si indica 0.
ClearUniqueID: 1 0=Mantener UniqueID, 1=Borrar Unique ID. Util para Diff y Merge
OptimizeByFilestamp: 0 1=Optimizar la regeneración de archivos dependiendo del timestamp de archivo, 0=No optimizar (más seguro si se usa para merge o para editar el tx2)
ClearDBFLastUpdate: 1 1=No mantener la fecha LastUpdate de los DBFs, 0=Mantenerla
DropNullCharsFromCode: 1 1=Quitar NULLs del código fuente, 0=Dejar los NULLs en el código
Language: (auto) Lenguage de los mensajes mostrados y Logs. EN=Inglés, FR=Francés, ES=Español, DE=Alemán, No definido = AUTOMATICO [DEFAULT]
XXX_Conversion_Support: N 0=Sin soporte, 1=Generar solo TXT (Diff), 2=Regenerar BINARIOS (Merge), 4=Generate TXT with DATA for DIFF (DBF only)
PJX_Conversion_Support: 2 Ver XXX_Conversion_Support
VCX_Conversion_Support: 2 Ver XXX_Conversion_Support
SCX_Conversion_Support: 2 Ver XXX_Conversion_Support
FRX_Conversion_Support: 2 Ver XXX_Conversion_Support
LBX_Conversion_Support: 2 Ver XXX_Conversion_Support
MNX_Conversion_Support: 2 Ver XXX_Conversion_Support
DBC_Conversion_Support: 2 Ver XXX_Conversion_Support
DBF_Conversion_Support: 1 Ver XXX_Conversion_Support >> FoxBin2Prg tiene soporte bi-direccional para convertir DBF, pero no mantiene los datos. Usar con cuidado.
DBF_Conversion_Included: * Si DBF_Conversion_Support:4, se pueden indicar múltiples máscaras de archivo: www,fb2p_free.dbf
DBF_Conversion_Excluded: Si DBF_Conversion_Support:4, se pueden indicar múltiples máscaras de archivo: www,fb2p_free.dbf
UseClassPerFile: 0 0=Una archivo librería tx2, 1=Múltiples archivo.clase.tx2, 2=Múltiples archivo.clasebase.clase.tx2, incluyendo DBCs y sus miembros
RedirectClassPerFileToMain: 0 0=No redireccionar a archivo.tx2, 1=Redireccionar a archivo.tx2 cuando se seleccione archivo.clase.tx2
ClassPerFileCheck: 0 0=No verificar la inclusión de archivo.clase.tx2, 1=Verificar la inclusión de archivo.clase.tx2

[<<]



Exportar datos para Diff (DBF_Conversion_Support:4)


Con esta configuración se pueden exportar los datos de las tabla, y con las siguientes configuraciones se puede hilar más fino, eligiendo qué tablas sí, cuáles no, y con qué ordenamiento y filtro.

DBF_Conversion_Included: <filemask>[ ,<filemask> [ , ... ] ]
DBF_Conversion_Excluded: <filemask>[ ,<filemask> [ , ... ] ]

Ejemplo de las máscaras <filemask>, separadas por coma:

DBF_Conversion_Included: PET*.*, ??ME.DBF, ???.DBF, ?.*


Si se quisieran filtrar los datos de una tabla llamada mitabla.dbf  para solo exportar los registros cuyo campo is_initial = .T. y se desea exportar ordenado por cust_order, habría que crear un archivo cfg en el mismo directorio de la tabla, así:

mitabla.dbf.cfg:
DBF_Conversion_Order: cust_order
DBF_Conversion_Condition: is_initial = .T

Nota: En DBF_Conversion_Order se puede poner cualquier expresión FoxPro válida para ordenar


[2015/04/18 - v1.19.42 >>]

Generar una clase por archivo (UseClassPerFile:1 ó 2)


Desde la v1.19.37 se puede configurar FoxBin2Prg para generar las clases de una librería en archivos independientes, si se pone el seteo UseClassPerFile:1 en foxbin2prg.cfg, lo que generará archivos con la nomenclatura de TwoFox (libreria.nombreclase.tx2)

Por defecto, si luego se elige uno de esos archivos de clases (libreria.nombreclase.tx2) y se intenta regenerar el binario, se creará una nueva librería archivo.clase.vcx, que en algún caso puede ser útil si se quieren separar algunas clases de una librería.

Desde la v1.19.42 se puede usar el nuevo valor "2" para UseClassPerFile, que a diferencia del anterior genera archivos con una nomenclatura libreria.clasebase.nombreclase.tx2 que es más explícita y por tanto más útil para poder identificar rápidamente las clases visuales de las no visuales, por ejemplo.

Además con "2" se aplicará esta división en archivos individuales también a los DBC, donde la nomenclatura de los miembros será nombrebdd.tipo.nombre.dc2, por ejemplo: nombrebdd.connection.cnxoracle.dc2 o nombrebdd.table.clientes.dc2

En el caso de que que siempre se quiera que se regenere la librería original, sin importar cuál de sus partes se elija, se debe usar el seteo RedirectClassPerFileToMain:1, lo que redirigirá las peticiones al archivo principal.

Cuando se ensamblan las librerías desde las partes archivo.clase.tx2, no se verifica si esa parte realmente corresponde a la librería, lo ue permite anexar nuevas clases con solo ponerle la nomenclatura adecuada.

En el caso de que se quiera asegurar de que solamente las clases originales se ensamblen en la librería VCX, se puede usar el seteo ClassPerFileCheck:1, lo que comprobará que los archivos encontrados figuren en la lista interna del archivo principal de cabecera. 
[<<]

Está generando un archivo de error .ERR, ¿que hago?


Pues lo primero es abrir ese archivo y ver qué error muestra. Es probable que diga algo como esto:

Error 1098, El archivo [C:\DESA\foxbin2prg\tst1.sct] no está soportado

Y es correcto, porque se debió elegir el que termina en 'x' (scx, vcx, etc)

Para cualquier otro tipo de error, por favor, reportármelo así lo analizo.



Una cosa más


Aquí no hablé de la integración y uso con ninguna herramienta SCM, porque la idea era que conozcan el uso de este programa en solitario, y porque no todo el mundo pretende usar una herramienta SCM (control de código fuente)

Para el uso integrado con otras herramientas, ya he comentado sobre la integración con PlasticSCM en esta nota sobre su instalación y en esta nota sobre su uso en ramas, y en futuras notas podrá ser con otras herramientas SCM.



Eso es todo!



Si te interesa conocer más detalles, aquí unos links:
- FoxBin2Prg: El sucesor mejorado del scctext
- FoxBin2Prg: Detalle de vistas, datos de uso, configuraciones y más
- FoxBin2Prg: Descarga de VFPx
- FoxBin2Prg: Descarga de GitHub

6 comentarios:

  1. Que tal Fernando buenas tardes, como me afectaría usar esta herramienta si yo tengo mis proyectos desarrollados con VFP 8

    ResponderEliminar
    Respuestas
    1. Hola Luis: realmente esta herramienta es para VPF9 y solamente la pude probar con VFP 9. No se puede recompilar en VFP 8 porque utilizo varias mejoras solamente disponibles en la versión 9, pero eso no quita de que se pueda usar FoxBin2Prg con las DLLs de VFP 9 (que son de libre disrtribución) y que lo uses para tus proyectos en VFP 8, ya que mientras FoxBin2prg se ejecute con los runtimes de VFP 9, solo verifica que los archivos que abre sean compatibles, y dado que los archivos binarios (scx, mnx, vcx, etc) de VFP 8 son compatibles con VFP 9, creo que podrías usarlo, pero tendrías que hacer la prueba de copiar los runtimes de VFP 9 en el directorio de FoxBin2Prg para comprobarlo.

      Eliminar
  2. Hola Fernando, un placer saludarte. He estado leyendo bastante sobre esta herramienta.
    Creo entender que por cada scx o vcx se genera un archivo prg. Como voy a trabajar como único programador usaría la opción para tener las diferencias mi duda es donde se almacenan todos estos prg? tengo que tenerlos dentro de mi proyecto en VFP?
    como sería el caso para usarlo con varios proyectos?

    ResponderEliminar
    Respuestas
    1. Hola Jorge:

      - Sí, es así, por cada vcx,scx,etc se genera un archivo de texto (los llamo genéricamente tx2) con extensión vc2,sc2,etc.

      - Estos tx2 se generan en el mismo directorio donde están los vc2,sc2,etc, por lo que con el explorador de archivos los vas a ver juntos, y no, no tenés que meterlos en el pjx.

      - Cuando se usa control de código fuente, los archivos tx2 generados se deben guardar con checkin, y además son los que se usan para hacer los merge y para regenerar los binarios

      En caso de que vayas a usar control de código (te lo recomiendo, al menos git desde la línea de comandos te sirve como backup rápido), con proteger los tx2 es suficiente.

      Saludos.-

      Eliminar
  3. Hola Fernando D Bozzo tu crees que podrías hacer un vídeo de la instalación y un ejemplo pequeño con un repositorio en bitbucket te lo agradecería un monton y colgarlo en tu canal

    ResponderEliminar
  4. Me funciono perfectamente gracias.

    ResponderEliminar