Guadalajara, Jalisco, Mexico   2 Mayo 2003, 9 Marzo 2004
I.Q. David Arturo Macias Corona

Presentacion del Modelo ClipNet-xNet

OBJETIVO:
Presentacion del Modelo ClipNet-xNet, orientado al programa clipxnet.exe

Se sugiere usar fuente monoespaciada, consultar en pantalla completa y
usar las funciones de busqueda para localizar rapidamente los segmentos

English version

CONTENIDO:
0.   Introduccion
1.   ¿ Que es el modelo ClipNet-xNet ? Historia (real)
2.   ¿ Donde interviene Harbour ?
3.   Estado actual del modelo ClipNet-xNet
4.   ¿ Que es SisGen:Sistemas Genericos ?
5.   ¿ Que es PrgExt:Programacion Externa ?
6.   ¿ Que compone al modelo ClipNet-xNet y cual es su aplicacion actual ?
7.   ¿ Que es ADS ?
8.   ¿ Que es clipxnet.exe ?
9.   ¿ Para que sirve clipxnet.exe ?
10.   clipxnet.exe como "Conector" para Servidor Web
11.   clipxnet.exe como "Programa CGI"
12.   clipxnet.exe como "Interprete" de Scripts en lenguaje Clipper, para "linea de comandos"
13.   clipxnet.exe como "Interprete" de Scripts en lenguaje Clipper, para Servidores Web
14.   ¿ Que incluye clipxnet.zip ?
15.   Sobre Xitami Web Server

16.   Preparacion para los ejemplos de uso de clipxnet.exe
      16a. Xitami Web Server
      16b. Apache para Linux
      16c. Apache para OS/2
      16d. Apache para Win32
      16e. Microsoft IIS:Internet Information Server version 5.0
      16f. English instructions

17.   Ejemplos, ejemplos y mas ejemplos
      17a. Clipxnet.exe como programa/modulo/filtro
      17b. Ejemplo de archivos .sgs: clipnet.sgs
      17c. Ejemplos de archivos .hs, de Felipe Coury
            17c1. Multiply.hs
            17c2. Hello.hs
            17c3. Ugly.hs
            17c4. Dir.hs
      17d. Ejemplo de archivos .hrb: prgxnet.hrb
      17e. Ejemplo de archivos .prg: prgxnet.prg
      17f. Busqueda de cadenas en archivos
      17g. Busqueda de cadenas en archivos con "ancla"
      17h. Directorio de archivos
      17i. Directorio de archivos con "ancla"
      17j. Hojear una base de datos DBF
      17k. Mini-sistema
      17l. y mas ejemplos ...

18.   Interfaz entre clipxnet.exe y otros sistemas
      18a. Ejemplo de Modelo en Serie
      18b. Ejemplos del Modelo en Paralelo
            18b1. Ejemplo 1 de Modelo en Paralelo
            18b2. Ejemplo 2 de Modelo en Paralelo
            18b3. Ejemplo 3 de Modelo en Paralelo
            18b4. Ejemplo 4 de Modelo en Paralelo
            18b5. Ejemplo 5 de Modelo en Paralelo
            18b6. Ejemplo 6 de Modelo en Paralelo

19.   Lo inevitable: TGraph 3 y ClipNet-xNet juntos
      19a. Ejemplos del Modelo TGraph 3
      19b. Ejemplos del Modelo TGraph 3 en actualizacion continua
      19c. Ejemplo 6 de Modelo en Paralelo con TGraph 3

20.   Aprovechamiento de sistemas existentes

21.  Modelo ClipNet-xNet y el "poder de Harbour"
      21a. Ejemplo de Modelo en Serie
      21b. Ejemplo con "Harbour Portable Object (.hrb)"
      21c. Ejemplo con "Archivos fuente (.prg)"

22.  Solicito colaboraciones

23.  Marzo 2004: Ampliacion del Modelo ClipNet-xNet
      23a. Cambio de estructura de programas
      23b. Actualizacion basada en codigo de Harbour
      23c. Actualizacion del soporte de ADS
      23d. Soporte de HbComm.lib
      23e. Soporte de Cookies
      23f. Soporte de MySQL
      23g. Actualizacion de Clipxnet existente

24.   Ejemplos adicionales
      24a. Prueba de cookies
      24b. Biblioteca Escolar
      24c. Taller de computadoras
      24d. Hojear y editar una base de datos DBF
      24e. Condiciones especificas pre-definidas
      24f. Hojear y editar bases de datos DBF o MySQL
      24g. Copiado de datos tipo DBF y/o MySQL



0.   Introduccion

El trabajo es una presentacion del "Modelo ClipNet-xNet", orientado a un archivo ejecutable
que puede usarse como:

"Interpretador de lenguaje de Clipper", en dos modalidades:
  • Linea de comandos, como lenguaje de Scripts con codigo de Clipper
  • Servidor Web, como: + Programa CGI + Interpretador de Scripts propios o equivalentes a ASP, PHP, Perl, ... pero usando codigo de Clipper
  • El documento "clipxnet.htm" es una descripcion general de los elementos del modelo, los requerimientos para las pruebas y una buena cantidad de ejemplos Ademas se exponen diferentes formas de conectar y usar otros sistemas nuevos o existentes para la generacion de contenido dinamico, y se plantean diferentes tecnicas para modificar sistemas existentes y aprovecharlos con el Modelo ClipNet-xNet
  • El Modelo ClipNet-xNet puede manejar e interpretar diferentes formatos de archivos con codigo Clipper, como son los usados con extensiones .fml, .sgs, .hs, .hrb y .prg En linea de comandos puede usarse cualquier extension
  • El Modelo ClipNet-xNet puede aplicarse con diferentes programas servidor Web, entre ellos: Xitami en Win32, OS/2 y Linux, Apache en Win32, OS/2 y Linux, IIS 5.0 en Win32
  • Tambien es posible aplicar la generacion de graficas dinamicas usando el Modelo TGraph 3 con FiveWin o el Modelo Citlalli con FiveWin
  • ClipNet-xNet permite accesar y modificar bases de datos en un entorno Intra/Extra/Inter-Net, sin necesitar algun otro modulo adicional: - Bases de datos tipo DBF - Bases de datos tipo MySQL El Modelo ClipNet-xNet esta hecho en Harbour 43++ (9 Marzo 2004) y se puede usar en Win32, OS/2 y Linux, con uso de RDD nativos, y/o con RDD de ADS Local o Remoto, y/o servidores MySQL 1. Que es el modelo ClipNet-xNet ? Historia (real) Comence a programar en dBaseIII+ en 1987, despues en dBaseIV 1.0 y 1.1, y en Clipper 5.01 en 1992 Ademas, comence a usar Internet en Junio de 1995. Hasta Septiembre de 1998, pensaba que "programar" en HTML y JavaScript era algo complicado, por lo que no revise como aplicarlo. En Julio de 1997, por las caracteristicas de un "Sistema" que me ofreci a hacer con Clipper en modo grafico, desarrolle un modelo que le llame "LH: Lenguaje de Hipertexto", donde, usando Clipper 5.3 y la libreria grafica Light Lib, visualizaba paginas con textos, tipos de fuentes y sus atributos, e imagenes Los archivos de LH tenian texto y especificaciones, por ejemplo un fragmento: ---------------------------------------------------- <<FRASE="TRATADO DE LIBRE COMERCIO" && FUENTE="ARIAL20.FNT" && COLOR="4,5,206" && SOMBRA=".T.">>; <<IMAGEN="cSvrImagen+"INDICE.JPG"" && ACCION="cFlujo := "Primera", READKILL(.T.)" && FILA="1" && COLUMNA="65" && VERBO=".F.">>; <<FRASE="Indice" && FILA=1 && COLUMNA=69 && COLOR="200,0,0" >> <*ENCABEZADO*> El Tratado de Libre Comercio de America del Norte es el acuerdo comer- cial que establece las normas y rige las operaciones de comercio entre los paises que lo suscribieron, los cuales son: Canada, Estados Unidos de America y Mexico. Este acuerdo entro en vigor el 1 de Enero de 1994 <<FRASE="Fibras" && ACCION="SGVILHC(cSvrLHC+"Fibras"+STR(AUSUARIO[5],1,0)+".LHC")" && SOMBRA=".T.">> <<FRASE="TEXTILES Y PRENDAS DE VESTIR" && ACCION="nPagina := 2, READKILL(.T.)" && FUENTE="ARIAL12.FNT" && SOMBRA=".T.">> <<FRASE="COMERCIO DE BIENES" && ACCION="nPagina := 3, READKILL(.T.)" && FUENTE="ARIAL12.FNT" && SOMBRA=".T.">> <<FRASE="REGLAS DE ORIGEN" && ACCION="nPagina := 4, READKILL(.T.)" && FUENTE="ARIAL12.FNT" && SOMBRA=".T.">> <<IMAGEN="cSvrImagen+"ADDVALUE.JPG"" && ACCION="NIL" && SOMBRA=".F." && FILA="11" && COLUMNA="30" && EFECTO="20" && PAR1="382" && VERBO=".F.">> <*PAGINA*> ---------------------------------------------------- Para este modelo se requeria: - Un conjunto de especificaciones de "Marcas" en los textos, con su significancia, tipos, atributos, etc. que se insertaran en los archivos de texto Hice este conjunto de acuerdo a las conveniencias que fui observando - Un proceso "Visualizador" que analizara estos archivos de texto para revisar las Marcas y proceder a su integracion, de acuerdo a su tipo y atributos, formateando con esto la presentacion final que se visualiza en pantalla El procedimiento SGVILHC( cTexto_LH ) se encarga de este proceso de analisis y formateo de presentacion en pantalla Este modelo se termino en 1997, y funciona muy bien en OS/2 y solo en algunos Windows XX, debido a que los Windows XX NO permiten que otros procesos "usen" la tarjeta grafica e impiden el uso de colores y resoluciones, llegando inclusive a "bloquear" la maquina en el intento Como es obvio, al no "funcionar" en todas las maquinas con Windows XX, se tenia una limitante enorme que impidio la distribucion de este modelo de hipertexto grafico con Clipper-Light Lib Alrededor de Septiembre de 1998 revise un articulo que trataba sobre "HTML basico". Quede bastante sorprendido porque: - Observe que HTML era bastante facil de entender - Sin haberme dado cuenta, habia hecho un modelo analogo al de HTML, donde se usan un conjunto de "Marcas y Atributos" que tienen significancia especifica - Tambien sin darme cuenta habia hecho un modelo analogo al del "famoso" Navegador, ya que al igual que mi Visualizador, analiza un texto para encontrar marcas y "formatear" la presentacion en pantalla de acuerdo a la significancia y atributos de las marcas Debido a que ambos modelos: Lenguaje de Hipertexto-Visualizador <--> HTML-Navegador son conceptualmente similares, resultaba interesante compararlos Hice un proceso para "convertir" mis Marcas de LH a Marcas de "HTML basico", de manera que mis paginas de LH se convertian facilmente a paginas HTML En vista de lo facil y practico que resultaba, me oriente a aprovechar el modelo de PrgExt: Programacion Externa de SisGen:Sistemas Genericos para "generar" paginas HTML pre-elaboradas con contenido basado en procesos especificos y archivos DBF que despues se pudieran consultar por Internet como "paginas estaticas" Un ejemplo reducido es el siguiente: ----------------------------------------------------------- //Generar hipertexto de contactos, TIPO HTML // puede ser con parametros FOR, WHIL , etc PRIV nArea := SELECT() PRIV aBases := {} PRIV ii PRIV cTexto IF ( aBases := SGABRIR( "SGDCTO", "SGDCTO" ) ) == NIL DBSELECTAR(nArea) RETU .F. ENDI cTexto := "SGD301.HTM" SGSALIDA0( cTexto,, ) // Todos los registros QQOUT('<'+'H'+'TML>') QOUT('<HEAD>') QOUT(' <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">') QOUT(' <META NAME="Author" CONTENT="David Arturo Macias Corona">') QOUT(' <META NAME="GENERATOR" CONTENT="Mozilla/4.04 [en] (OS/2; I) [Netscape]">') QOUT(' <META NAME="GENERATOR" CONTENT="Sistemas Genericos [SGD]">') QOUT(' <TITLE>Contactos</TITLE>') QOUT('</HEAD>') QOUT('<BODY>') QOUT('<IMG SRC="svrimage\imagen.jpg" BORDER=0 HEIGHT=100 WIDTH=133 ALIGN=ABSCENTER>') QOUT('<FONT FACE="Arial,Helvetica"><FONT COLOR="#009900"><FONT SIZE=+3>CONTACTOS') QOUT('</FONT></FONT></FONT>') QOUT('<BR>') QOUT('<FONT FACE="Arial,Helvetica"><FONT COLOR="#CC6600"><FONT SIZE=-1>') QOUT('Documento elaborado dinamicamente por ') QOUT( ALLTRIM(aUsuario[ SGVD("U_USUNOM") ])+' '+DTOS(DATE())+' '+TIME() ) QOUT( '<BR>' ) QOUT( 'usando ' ) QOUT('<FONT FACE="Arial,Helvetica"><FONT COLOR="#009900"><FONT SIZE=+1>') QOUT( '<I>Sistemas Genericos</I>') QOUT( '</FONT></FONT></FONT>') QOUT( ', con la formula ') QOUT( '<A HREF="SGD301.FML">SGD301.FML</A></FONT></FONT></FONT>') QOUT( '<P>' ) QOUT(' <TABLE WIDTH="97%" >') ii := 0 DBGOTOP() WHIL ! EOF() IF ! ACTIVO == "SI" //Excluir DBSKIP(1) LOOP ENDI IF ! aUsuario[SGVD("U_IDIOMA")] == IDIOMA //Solo en idioma del usuario DBSKIP(1) LOOP ENDI //Zoom a 86x64, obliga proporcion horizontal QOUT( '<TR><TD>' ) QOUT( '<A HREF="'+ALLTRIM(CODIGO)+'.htm">' ) QOUT( '<IMG SRC="svrimage\'+ALLTRIM(MIMAGEN)+'"' ) QOUT( 'ALT="'+ALLTRIM(NOMBRE)+'" BORDER=2 HEIGHT=64 WIDTH=80 ALIGN=TEXTTOP>&nbsp;') QOUT( '</A></TD>' ) QOUT( '<TD><FONT COLOR="#3333FF"><FONT SIZE=+2>' ) QOUT( UPPE(SGIDI("g_Nombre"))+': ') QOUT( '</FONT></FONT>' ) QOUT( '<A HREF="'+ALLTRIM(CODIGO)+'.htm">' ) QOUT( ' '+NOMBRE+'</A>' ) QOUT( '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;') QOUT( '<FONT COLOR="#3333FF"><FONT SIZE=+1>') QOUT( UPPE(SGIDI("g_Codigo"))+': ' ) QOUT( '</FONT></FONT>'+ALLTRIM(CODIGO) ) QOUT( '<BR>' ) QOUT( '<FONT COLOR="#3333FF"><FONT SIZE=+2>' ) QOUT( UPPE(SGIDI("g_Asignacion"))+': ' ) QOUT( '</FONT></FONT>'+ACTUAL+'&nbsp;' ) QOUT( '<BR>' ) QOUT( '<FONT COLOR="#3333FF"><FONT SIZE=+2>' ) QOUT( UPPE(SGIDI("g_Telefono"))+': ' ) QOUT( '</FONT></FONT>'+TELEFONO ) QOUT( '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;') QOUT( '<ADRESS>e-mail: <A HREF="mailto:' ) QOUT( LOWE( ALLTRIM(CODIGO) ) ) QOUT( '@servidor.com">' ) QOUT( '<I>' ) QOUT( LOWE( ALLTRIM(CODIGO) ) ) QOUT( '@servidor.com' ) QOUT( '</A></I></ADRESS>' ) QOUT( '</TD></TR>' ) QOUT( '<P>' ) ii := ii + 1 /* IF ii = 5 QOUT('<*PAGINA*>') ii := 0 ENDI */ DBSKIP( 1 ) ENDD QOUT('</TABLE>') QOUT('</BODY>') QQOUT('</'+'H'+'TML>') // DBSELECTAR(nArea) // SGCERRAR( aBases ) SGSALIDA0( ) SGVISUA( cTexto ) // Generar documento HTML de cada contacto DBGOTOP() WHIL ! EOF() IF ! ACTIVO == "SI" //Excluir DBSKIP(1) LOOP ENDI IF ! aUsuario[SGVD("U_IDIOMA")] == IDIOMA //Solo en idioma del usuario DBSKIP(1) LOOP ENDI SGFML( cSvrFML+"SGD302.FML" ) //Formato HTML DBSKIP( 1 ) ENDD DBSELECTAR(nArea) SGCERRAR( aBases ) // FERASE( cTexto ) RETU .T. ------------------------------------------------ Debido a que YA estaba usando Clipper para generar paginas HTML que serian consultadas por Internet, le llame: Modelo ClipNet: Clipper por Internet Posteriormente, en Enero de 1999 encontre un documento que explicaba que los programas CGI podian hacerse en "practicamente" cualquier lenguaje de programacion. Por supuesto que me desperto la curiosidad de saber si Clipper estaba dentro o fuera del "practicamente". Las pruebas mostraron que esta "dentro" Posiblemente este es el primer "programa CGI" que hice con Clipper: ------------------------------------------------- PARA P1 var := GETENV("CLIPPER") var1 := GETENV("CONTENT_LENGTH") var2 := GETENV("GATEWAY_INTERFACE") OUTSTD('Content-type: text/html'+CHR(13)+CHR(10)) OUTSTD(CHR(13)+CHR(10)) OUTSTD('<html>') OUTSTD('<head><title>Prueba con Clipper</title></head>') OUTSTD('<h1>Programa CGI en Clipper !</h1>') OUTSTD('<br>') OUTSTD('Web/2 - The small (but powerful) Web server for OS/2!<br>') OUTSTD('<br>') OUTSTD('PARAMETRO: '+P1 ) OUTSTD('<br>') OUTSTD('Valor de CLIPPER: '+var ) OUTSTD('<br>') OUTSTD('Valor de CONTENT_LENGTH: '+var1 ) OUTSTD('<br>') OUTSTD('Valor de GATEWAY_INTERFACE: '+var2 ) OUTSTD('<br>') OUTSTD('Hi, person at <host> (<ip>), the date/time is <date> <time>.<br>') OUTSTD('This page has been accessed <textcounter> times!<br>') OUTSTD('<br>') OUTSTD('<br>') OUTSTD('esto fue hecho en Clipper' ) OUTSTD('<br><br>') OUTSTD('</html>') ------------------------------------------------- Para hacer las pruebas ocupaba un programa "Servidor Web". Busque y encontre varios, y en particular me gusto Xitami Web Server, que es el que uso desde entonces, de preferencia. Me gusto tambien por la documentacion referente a programas CGI Como ya podia hacer programas CGI con Clipper que generaran "contenido dinamico", o "paginas dinamicas", a diferencia de las "paginas estaticas" que hacia, y que se podian consultar en:
  • LAN: Red Local, IntraNet
  • WAN: Red Amplia, ExtraNet
  • Internet entonces amplie bastante el modelo y le llame: Modelo ClipNet-xNet: Clipper por Intra/Extra/Inter-Net donde xNet significa Intra/Extra/Inter-Net Nota: Como las preguntas pueden ya haber surgido, estas son las respuestas: "Paginas estaticas": Son paginas HTML que residen en archivos de disco Son paginas pre-elaboradas, no cambian su contenido, y pudieron haberse hecho editandolas manualmente, con editores de paginas o con programas determinados "Paginas dinamicas": Son paginas HTML que NO residen en archivos de disco Son paginas que cambian su contenido en funcion de determinadas especificaciones, y se hacen mediante programas o procesos ejecutados al momento de solicitar la pagina Los archivos de "determinadas especificaciones" con que se crean las paginas dinamicas si pueden residir en disco, aunque no necesariamente se ocupan estos archivos, ya que la pagina puede crearse mediante codigo de un programa CGI especifico "CGI:" Common Gateway Interface: Interfaz de puente comun. Conjunto de especificaciones para comunicarse entre un Navegador, un programa Servidor Web y un programa CGI "Programa CGI": Programa que se ejecuta por un programa Servidor Web y que cumple con las especificaciones CGI "Servidor Web": Puede referirse a dos aspectos: + Programa Servidor Web, por ejemplo, Apache, IIS, Xitami, etc + Computadora donde se ejecuta el programa Servidor Web 2. Donde interviene Harbour ? http://www.harbour-project.org Aunque el modelo ClipNet-xNet estaba completo, solo funcionaba en su totalidad en Win9x, debido a lo siguiente: En los SO:Sistemas Operativos de 32 bits como OS/2, WinNT, etc., cuando el servidor Web ejecuta el programa CGI, lo hace "abriendo" una sesion de 32 bits, la cual, al detectar que el programa de Clipper es de 16 bits, abre una segunda sesion, de "soporte de DOS-16 bits", que NO tiene las "Variables de Ambiente" que fueron proporcionadas a la sesion de 32 bits por el Servidor Web, conforme al protocolo CGI. Por lo tanto, la segunda sesion carece de mucha informacion que es necesaria para el programa CGI Conoci Harbour en Febrero de 1999, con la version 32a. Harbour es un proyecto muy atractivo para los programadores en lenguaje Clipper, y su descripcion lo resume todo: "Compilador compatible con Clipper, de Software Abierto y Multiplataforma" que permite hacer programas con codigo Clipper en 32 bits en varias plataformas Inmediatamente probe el modelo ClipNet-xNet en Harbour Win32-WinNT y Harbour OS/2. Aunque Harbour tenia varios puntos pendientes y diferencias de comportamiento, en general asimilaba bastante bien el modelo ClipNet-xNet Harbour "resuelve" el problema de la "doble sesion" que ocurre en SO de 32 bits y ya no existe la falta de informacion para el programa CGI Desde entonces tengo programas CGI bajo el modelo ClipNet-xNet, hechos para Clipper, Harbour-Win98, Harbour-WinNT/2000/XP y Harbour-OS/2, usando Xitami en Win32 y OS/2, PWS:Personal Web Server, IIS:Internet Information Server 4 y Apache para OS/2 3. Estado actual del modelo ClipNet-xNet Aunque ya tenia el modelo funcionando en Win32 y OS/2, le "faltaba algo" para que fuera completo, y esto era que funcionara en Linux Usando Linux, Harbour 40 para Linux y el "multifuncional" Xitami para Unix, comence las pruebas en Diciembre de 2002. Encontre algunas diferencias basicas debidas a la estructura de Linux, pero en lo general el modelo ClipNet-xNet tambien podia aplicarse facilmente en Linux Durante algunos dias dispersos y medios tiempos me dedique a darle consistencia al modelo para usar cualquiera de las tres plataformas sin necesidad de ajustes posteriores. ClipNet-xNet ya puede usarse igual en Win32, OS/2 y Linux, compilado con Harbour El modelo ClipNet-xNet es a la fecha un modelo muy amplio con bastantes funcionalidades, tiene mucha estabilidad y consistencia y es en terminos simples, muy confiable y eficiente En este documento se expone una version reducida del modelo ClipNet-xNet, ya que no tiene sentido exponerlo en su totalidad, sino solamente las finalidades practicas para usuarios diversos 4. Que es SisGen:Sistemas Genericos ? Despues de haberlo observado durante años en diversas ocasiones, hice la conclusion de que la mayoria de los sistemas que hacia o hacian otros programadores, en lo general son similares, y que podian desarrollarse con un "modelo comun" que sirviera para los diferentes sistemas Lo importante no es la conclusion en si misma, sino los planteamientos que pueden definirse a partir de ella Desde entonces me dedique a modelar y "programar" en forma "generica", para desarrollar este "modelo comun" y lo llame "Sistemas Genericos" Sistemas Genericos es un conjunto de conceptos, lineamientos y herramientas para el desarrollo de diversos sistemas a partir de un modelo base. Los objetivos principales son
  • Acelerar el desarrollo de sistemas
  • Asegurar la confiabilidad de los sistemas
  • Disminuir el mantenimiento de sistemas
  • Incrementar la potencialidad y flexibilidad de los sistemas Algunos de los conceptos y herramientas que conforman Sistemas Genericos son:
  • GenRes:Generador de Resultados
  • PrgExt:Programacion Externa
  • Trilogia: Multiproceso, uso de "Conjuntos de Bases de Datos", Multiusuario
  • Modelo distribuido: Procesos en Cliente y procesos en Servidor
  • Sistema de "Objetos". Elementos de interaccion con el usuario
  • AcumPor:Acumulado por ...
  • CondAdi:Condicion adicional
  • RDD Multiple:Varios RDD en el mismo sistema
  • Modelo CHA:Clipper-Harbour-Advantage
  • Programacion dual: Mismo codigo para sistema en texto y grafico
  • Modelo ClipNet-xNet
  • Modelo TGraph 3
  • ... En la actualidad tengo un conjunto de programas que le llamo "Nucleo de Sistemas Genericos" con el cual se desarrollan varios Sistemas muy diferentes La enorme ventaja es que cualquier mejoramiento a alguna herramienta, queda disponible inmediatamente para todos los sistemas que la usan 5. Que es PrgExt:Programacion Externa ? Durante 1991, en el desarrollo de un sistema comun que se usa en varias empresas diferentes, se requeria diferenciar las formas de captura y conversion de datos para cada una de ellas y los diferentes equipos de produccion que tienen. Para esto, desarrolle un modelo que consiste en usar archivos de texto para especificar instrucciones de Clipper que pudieran ejecutarse durante la evaluacion de la captura. A los archivos les llame "Formulas de Captura", y les puse la extension .fml, por lo que desde entonces se les conoce como archivos FML El modelo resulto tan eficiente que hasta el momento, 12 años despues, esta en uso diario Como los archivos FML contienen instrucciones de Clipper que se ejecutan y son "como programas", y residen en forma externa al ejecutable, le puse al modelo el nombre "natural" de PrgExt:Programacion Externa, ya que permite ejecutar instrucciones sin necesidad de compilar El modelo inicial tenia una gran limitante: esta formado por lineas individuales de ejecucion En Agosto de 1997 decidi ampliarlo, y rapidamente me encontre envuelto en las complicaciones y requerimientos que exigia. Encontre que tenia que incluirle la capacidad de manejar lo que le llame "Estructuras de control y flujo". Resulto laborioso y complejo, pero finalmente el modelo quedo bastante flexible y practico, y desde 1997 mantiene su estructura basica, con algunas muy pequeñas modificaciones que le he hecho Actualmente PrgExt puede manejar las siguientes estructuras de control y flujo:
  • BEGIn sequence
  • WHILe / DO While
  • FOR ... TO ... STEP ...
  • DO Case
  • IF
  • BREAk
  • RECOver
  • EXIT
  • LOOP
  • ELSEIF
  • ELSE
  • CASE
  • OTHErwise
  • ENDSequence
  • ENDDo
  • NEXT
  • ENDI
  • ENDCase
  • RETUrn (xReturn)
  • PRIVate con / sin macrosustitucion
  • PUBLic con / sin macrosustitucion
  • FUNCtion
  • PROCedure
  • GLOBal FUNCtion
  • GLOBal PROCedure ademas de las caracteristicas listadas:
  • #incluido, #include "archivo"
  • #definicion, #define idConstant resultText
  • Identificadores de comentarios: COMEN, REM, ;, *, //
  • Zonas de comentarios /* */
  • Multilinea con terminacion ;
  • SGFML( archivo_fml ): Ejecucion de archivo de formula en disco
  • SGSUB( funcion_fml ): Ejecucion de formula en memoria
  • Uso de parametros mediante la matriz aParam SGFML( archivo_fml, {param1, ..., paramN} ) SGSUB( funcion_fml, {param1, ..., paramN} )
  • Anidamiento de ejecucion, recursion
  • Cualquier archivo en disco o texto en programas, campos memo, etc. puede ser un archivo de formula de PrgExt, sin importar la extension en el nombre Naturalmente, PrgExt tiene algunas limitaciones que deben siempre considerarse. Algunas de las que me acuerdo son:
  • No pueden usarse COMANDOS, todo tiene que ser especificado con FUNCIONES/PROCEDIMIENTOS Pueden usar cualquier FUNCION/PROCEDIMIENTO de Clipper, de librerias y definidas por el usuario
  • No tiene pre-procesador, a excepcion de la aplicacion basica de #include y #define
  • No pueden definirse/usarse variables LOCAL, STATIC y cualquier otra definicion valida solo en tiempo de compilacion
  • Las instrucciones en la misma linea deben separarse con , (coma) en vez de ; Invalido: var1 := "a" ; var2 := "b" Valido: var1 := "a" , var2 := "b"
  • No pueden definirse varias variables PRIVATE/LOCAL en la misma linea Debe usarse una linea por cada variable Invalido: PRIV var1 := "a",var2 := "b" valido: PRIV var1 := "a" PRIV var2 := "b"
  • No pueden usarse elementos de objetos Invalido: oGraph:oLegend:lShow := .F.
  • Se tiene un limite de 64 K por texto de formula ( creo que ya no lo aplico en Harbour ) PrgExt me sirve para mas del 60 % de procesos que aplico en varios sistemas, y la principal ventaja es que se hacen las modificaciones sin necesidad de recompilar PrgExt es una herramienta fundamental de SisGen y es indispensable para el Modelo ClipNet-xNet. Por esta razon, es necesario entender suficientemente las ventajas y limitaciones de PrgExt para aprovecharla en ClipNet-xNet Mini-nota: Despues de comenzar a aplicar FiveWin en Octubre de 2001, me di cuenta que existen varias herramientas que son conceptual y operativamente similares a PrgExt: ejecutar codigo de Clipper especificado en archivos de texto Hasta el momento no he usado ni pienso usar alguna de ellas Aunque PrgExt tiene mayores limitaciones que varias de estas herramientas, hasta el momento no he observado una razon suficiente para dejar de usarla cambiandola por otra herramienta. Ademas, yo la hice :-) "Insercion 20030723" Se incluyo el soporte de "Harbour Portable Object (.hrb)" y "Archivos fuente (.prg)", lo que influye considerablemente en la importancia y participacon de PrgExt y amplia en forma muy importante el potencial de aplicacion del Modelo ClipNet-xNet. Mayor informacion en: 21. Modelo ClipNet-xNet y el "poder de Harbour" 6. Que compone al modelo ClipNet-xNet y cual es su aplicacion actual ? El modelo ClipNet-xNet es una herramienta integrada a SisGen y esta formado por un conjunto de programas, funciones y procedimientos y otras herramientas de SisGen Con este modelo, se le puede agregar a cualquier programa de Clipper / Harbour la capacidad de una estructura robusta para programas CGI y programas para contenido dinamico de paginas HTML Actualmente todos los sistemas que tengo derivados de SisGen, tienen integrado automaticamente el modelo ClipNet-xNet, por lo que inmediatamente sirven para ser usados en un ambiente de paginas HTML, en lenguaje Clipper y con acceso a bases de datos tipo DBF, con o sin servidor ADS 7. Que es ADS ? http://www.advantagedatabase.com ADS es Advantage Database Server, un "Servidor de datos" para un modelo Cliente/Servidor Una de las caracteristicas que lo hace interesante es que dispone de librerias para Clipper que permiten que Clipper pueda usar ADS en el modelo Cliente / Servidor. Mediante el enlazado de estas librerias y aplicar unas cuantas funcionalidades, se tiene un sistema de Clipper con un servidor de base de datos tipo DBF, con controladores RDD DBFNTXAX, DBFCDXAX, y protocolos de comunicaciones IP e IPX ADS tambien tiene ACE: Advantage Client Engine, el cual es un conjunto de APIs que permiten desarrollar sistemas en diversos lenguajes de 32 bits para accesar el Servidor ADS En Harbour tambien existe una libreria que permite usar estas especificaciones API para accesar el Servidor ADS, por lo que Harbour puede usarse con ADS Ademas del servidor ADS, conocido como "ADS Remote Server", tambien existe una aplicacion reducida llamada "ADS Local Server", que aunque no es un servidor de bases de datos real, si permite usar algunas funcionalidades del modelo de ADS Otro programa de Advantage es ARC: Advantage Data Architect, que es una utileria que permite usar bases de datos sin ADS o con ADS Local o Remoto. Aun cuando no se use ADS, es muy conveniente tener esta utileria 8. Que es clipxnet.exe ? Como se puede hacer cualquier sistema con las funciones del modelo ClipNet-xNet, tambien se puede hacer un programa "independiente" que tenga las capacidades de ClipNet-xNet: a este programa le he llamado clipxnet.exe Usando el mismo archivo .prg de codigo fuente, se puede generar clipxnet.exe en:
  • Clipper con/sin ADS
  • Harbour Win32, con/sin ADS Local/Remoto, con/sin MySQL
  • Harbour OS/2 sin ADS (no existe ADS en OS/2), con/sin MySQL
  • Harbour Linux, con/sin ADS Local/Remoto, con/sin MySQL Para Linux: Observaciones IMPORTANTES: - Para Apache es conveniente que el ejecutable se llame clipxnet, con lo que bastara copiar o renombrar clipxnet.exe como clipxnet - Se tienen tambien los archivos ejecutables con el prefijo n, llamados nclipxnet.exe Estos son creados con la libreria ncurses para el manejo de consola, y deben de utilizarse en linea de comandos para poder hacer programas con interfaz de usuario, que tengan procesos de entradas/salidas con intervencion del usuario Pueden usarse directamente o renombrarse como clipxnet.exe o clipxnet No deben usarse desde el servidor Web 9. Para que sirve clipxnet.exe ? clipxnet.exe tiene toda la funcionalidad del modelo ClipNet-xNet. En realidad el modelo es muy amplio, y en este documento solo se expone una version reducida de esta funcionalidad, orientado al programa clipxnet.exe clipxnet.exe sirve para: a) Como "conector" o enlace entre el Servidor Web y otros programas Existe una buena cantidad de este tipo de "conectores" para otros lenguajes como VBasic, VFoxPro, etc En el caso de ClipNet.exe, ES un "conector" para el lenguaje Clipper que permite tomar informacion de y enviar informacion al Servidor Web, que puede provenir del mismo sistema o de otros sistemas concurrentes b) Como programa CGI Es y hace todo lo que un buen programa CGI deba hacer, para procesos propios o procesos concurrentes que trabajan en serie o en paralelo c) Como "Interprete" de Scripts en lenguaje Clipper c.1 Para linea de comandos c.2 Para Servidores Web 10. clipxnet.exe como "Conector" para Servidor Web El programa clipxnet.exe colecciona toda la informacion que provenga del servidor Web desde varias fuentes, y la deja disponible a otros procesos / sistemas, para que puedan usarla y hacer los procesos correspondientes, y posteriormente envia la informacion resultante al Servidor Web. En resumen, hace estas etapas:
  • Colecciona la informacion proveniente del Servidor Web Esta informacion proviene del Navegador/pagina HTML y del Servidor Web
  • Pone a disposicion de otros procesos esta informacion
  • Toma la informacion generada por otros procesos y la envia al Servidor Web, que a su vez la envia al Navegador. Generalmente esta formateado como HTML 11. clipxnet.exe como "Programa CGI" Un programa CGI es cualquier programa que es ejecutado por el Servidor Web cuando es requerido desde algun enlace o ancla en una pagina HTML, y que usa el protocolo CGI El Servidor Web ejecuta el programa poniendo a su disposicion determinada informacion, y espera hasta que el programa CGI termine o se cumpla un tiempo limite, y envia al Navegador la informacion que haya generado el programa CGI, a traves de la "salida estandar" STDOUT clipxnet.exe es un "programa CGI" porque hace y participa en todas la caracteristicas mencionadas para un programa CGI 12. clipxnet.exe como "Interprete" de Scripts en lenguaje Clipper, para "linea de comandos" Cuando amplie la funcionalidad de PrgExt, me di cuenta que seria interesante hacer un programa independiente que "funcionara" como un interpretador de Scripts, en forma similar al uso de programas .bat, .cmd, y otros parecidos Este programa seria como un "procesador de comandos o scripts", pero para lenguaje Clipper clipxnet.exe puede usarse como un interpretador de lenguaje Clipper desde linea de comandos, donde los "Scripts" son archivos de "formula" de PrgExt Un ejemplo sencillo es: - Hacer con cualquier editor de texto un archivo llamado por ejemplo "clipnet.fml" - Incluirle el siguiente codigo: //Ejemplo de ClipxNet----------------------- PRIV ii Scroll() QOUT( "Hola Mundo !" ) QOUT( "Ejemplo de ClipxNet" ) QOUT() FOR ii = 1 TO LEN( aParam ) QOUT( "Parametro "+ALLTRIM(STR(ii))+": ", aParam[ii] ) NEXT ii QOUT( ) QOUT( "Fecha: "+DTOC(DATE()) ) QQOUT( " Hora: "+TIME() ) QOUT( "Pulse cualquier tecla para terminar o espere 10 segundos " ) QOUT( ) FOR ii = 1 TO 10 QQOUT( "."+ALLTRIM(STR(ii)) ) IF ! INKEY( 1 ) == 0 EXIT ENDI NEXT ii RETU NIL - "Ejecutarlo" desde la linea de comandos usando: clipxnet.exe clipnet.fml Con este modelo es posible ejecutar una gran cantidad de procesos con codigo Clipper, con o sin acceso a bases de datos con el RDD que se desee. En lo personal lo uso bastante para hacer mini-procesos temporales o rutinas sin necesidad de compilar/enlazar Basta escribir en un texto las instrucciones de Clipper con las consideraciones de PrgExt y "ejecutarlo" Observaciones:
  • Si el archivo tiene la extension .fml, se asume que es un archivo de formula y se ejecuta directamente "Insercion 20030723" Se aplico la siguiente ampliacion: Si se usa una expresion del tipo: clipxnet.exe proceso.ext p2 p3 p4 ... p9 se revisa si el primer parametro tiene las extensiones .fml, .sgs, .hs, .hrb, .prg, y en ese caso se asume que es un proceso a ejecutar directamente con los parametros p2 ... p9 Esto le proporciona una mayor diversidad de uso al Modelo ClipNet-xNet, ya que con una aplicacion asi se pueden "ejecutar" directamente estos archivos
  • Puede tener cualquier otra extension, pero en este caso debe usarse: clipxnet.exe SGFML('archivo_script') Ejemplo: clipxnet.exe SGFML('clipnet.fml')
  • Si se requieren parametros, se aplican mediante una matriz: clipxnet.exe SGFML('archivo_script',{'ClipxNet',5,DATE()-5}) Ejemplo: clipxnet.exe SGFML('clipnet.fml',{'ClipxNet',5,DATE()-5})
  • Distintos compiladores/interpretes de comandos actuan diferente dependiendo de que se uso Algunas reglas basicas son: + No usar espacios en las expresiones + Si se provoca error con ', intentar con " o [] Por ejemplo esto puede fallar: clipxnet.exe SGFML('archivo_script',{'ClipxNet',5,DATE()-5}) y funcionar con: clipxnet.exe SGFML("archivo_script",{"ClipxNet",5,DATE()-5})
  • El archivo micgierr.err registra los errores que se producen Tambien se puede utilizar la expresion del tipo: clipxnet.exe EJECUTAR=funcion_especifica clipxnet.exe EJECUTAR=secuencia_de_instrucciones Ejemplos: clipxnet.exe EJECUTAR=MiMenu() clipxnet.exe EJECUTAR=sgfml('clipnet.fml'),tone(1000,3),qout('Terminado !') clipxnet.exe EJECUTAR=dbusearea(,'DBFCDX','libpar.dbf'),browse() clipxnet.exe EJECUTAR=memoedit(memoread('texto.txt')) 13. clipxnet.exe como "Interprete" de Scripts en lenguaje Clipper, para Servidores Web Con clipxnet.exe se pueden hacer aplicaciones de "guiones (Scripts) de servidor" tipo ASP, PHP, ColdFusion, Perl, ... u otros similares, pero usando codigo Clipper Tal vez ya se habran "dado cuenta" que una de las enormes ventajas del modelo ClipNet-xNet que usa el lenguaje Clipper, es que se tiene acceso a los clasicos archivos de bases de datos tipo DBF, sin requerir ningun otro modulo o aplicacion Esta es una caracteristica fundamental que permite seguir usando los archivos DBF como siempre hemos estado acostumbrados a hacerlo, pero ahora a traves de paginas HTML Otra de las ventajas es que se pueden reproducir los modelos de ASP, PHP, etc., pero con lenguaje Clipper para accesar las bases de datos tipo DBF, en forma local, remota, exclusiva o compartida con otros sistemas de Clipper En general los modelos ASP, PHP, etc., pertenecen al concepto que se denomina "HTML analizado" o "analisis gramatical de HTML", en forma similar a lo que se conoce como "Includes de Servidor" El concepto basico es: Si el Navegador solicita una pagina HTML de un tipo especifico, el servidor Web aplica un proceso previo antes de enviar los resultados al navegador Por ejemplo, para una pagina .shtml, el Servidor Web primero "analiza" la pagina para encontrar determinadas "directivas" y las sustituye, enviando posteriormente la pagina analizada y sustituida al Navegador Lo mismo aplica para una pagina .ssi denominada como "server side include", primero se analiza y procesa y lo resultante se envia al Navegador Los programas CGI tambien sirven para hacer este tipo de analisis y proceso Muchas directivas y procesos las puede ejecutar el Servidor Web, pero cuando "no puede", "no quiere", "no debe" y/o "no sabe" como hacerlo, se lo entrega a otro programa para que el lo haga. Estos otros programas son los "interpretadores", "filtros" o "procesadores de Scripts" que hacen el trabajo de analisis y sustitucion En el caso de paginas .asp, el Servidor Web ejecuta un programa/modulo que "interpreta" ASP En el caso de paginas .php, el Servidor Web ejecuta un programa/modulo que "interpreta" PHP lo mismo se aplica para "paginas" para Perl, ColdFusion, TCL, etc Es facil entender que cada programa/modulo "hace las cosas" como quiere y con las funcionalidades que tenga determinadas En el caso de clipxnet.exe, este es un programa/modulo que interpreta "paginas" con codigo Clipper Los procesos basicos que hace un "modulo intepretador" tipo ASP, PHP, etc. son: a) Tomar la pagina y "analizarla" para "encontrar y extraer" el codigo ejecutable conocido insertado en ella b) "Ejecutar" el codigo reconocido y extraido c) Durante la ejecucion se genera "contenido" que es enviado al servidor Web, generalmente formateado como HTML clipxnet.exe puede operar de dos formas: Forma A) Con etapa de analisis a) Tomar la pagina y "analizarla" para "encontrar y extraer" el codigo Clipper conocido insertado en ella b) "Ejecutar" el codigo Clipper reconocido y extraido usando PrgExt c) Durante la ejecucion se genera "contenido" que es enviado al servidor Web, generalmente formateado como HTML Forma B) Sin etapa de analisis a) Toma la pagina y "Ejecuta" el codigo Clipper usando PrgExt b) Durante la ejecucion se genera "contenido" que es enviado al servidor Web, generalmente formateado como HTML En lo personal "me gusta" mas la Forma B, ya que no le veo mucho sentido la existencia de la etapa de "analisis para extraer codigo" La Forma B se aplica automaticamente si la extension de la "pagina HTML" es .fml (el "clasico" archivo de formula de PrgExt) "Insercion 20030723" La Forma B se aplica automaticamente si la extension de la "pagina HTML" es:
  • .hrb para "Harbour Portable Object (.hrb)"
  • .prg para "Archivos fuente (.prg)" La Forma A se aplica si la pagina tiene:
  • Extension .sgs: SisGenScript: Sistemas Genericos Script
  • Extension .hs: En honor a HarbourScript de Felipe Coury Es obvio que se pueden manejar otras extensiones que se consideraran en el futuro La etapa de analisis reconoce codigo delimitado por: <% %>, como ASP <? ?>, como PHP <$ $>, como una ocurrencia << >>, <* *> como mi LH: Lenguaje de Hipertexto Notas:
  • Podran encontrar que es muy facil convertir una pagina ASP para usarla como .sgs, .hs con codigo de Clipper y acceso a archivos DBF
  • No me interesa aplicar cualquier tipo de compatibilidad con ASP, PHP, Perl, etc. Simple y sencillamente el objetivo es usar y aplicar el codigo de Clipper como mejor convenga
  • Solo basta tener en consideracion las caracteristicas y limitaciones de PrgExt mencionadas "Insercion 20030723" Con el soporte incluido de:
  • "Harbour Portable Object (.hrb)"
  • "Archivos fuente (.prg)" se tiene una mayor variedad de aprovechamiento al no existir algunas limitaciones de PrgExt:Programacion Externa, y poder usar directamente el codigo de Clipper en archivos compilados a .hrb o en programas fuente .prg Este es un ejemplo sencillo de una pagina .sgs o .hs: - Hacer con cualquier editor de texto un archivo llamado por ejemplo "clipnet.sgs" - Incluirle el siguiente codigo: <%//Ejemplo para clipxnet.exe %> <HTML> <HEAD> <TITLE>Ejemplo de clipxnet.exe como interprete de SGS</TITLE> <HEAD> <BODY> <H1>Bienvenido <% SGOutStd( NetName( ) ) %></H1> <% SGOutStd(DTOC(DATE())+" "+TIME()) %> <P> El uso de clipxnet.exe como "interprete" de paginas con codigo Clipper es muy sencillo<BR> Basta tener en cuenta las consideraciones para PrgExt:Programacion Externa, <BR> y consultar los ejemplos para tener mas ideas sobre su aplicacion<BR> </BODY> </HTML> "Insercion 20040227" Debido al soporte de Cookies ya no puede usarse OUTSTD(), sino que debe usarse SGOutStd() - Como aun no se tiene implementado un Servidor Web para probarlo, se puede probar desde una linea de comandos usando: clipxnet.exe CGIMODO=SCRIPT SCRIPT=clipnet.sgs Lo que observan en pantalla al ejecutar esta instruccion, es precisamente lo que clipxnet.exe le envia al Servidor Web como resultado final para el Navegador De esta manera pueden probar sus Scripts sin usar un Servidor Web. Tambien pueden enviarlo a un archivo de texto. Por ejemplo: clipxnet.exe CGIMODO=SCRIPT SCRIPT=clipnet.sgs > clip.htm En este caso se genera el archivo clip.htm que contiene el codigo HTML final, y que puede usarse como una "pagina estatica" Como podran observar, esta es otra manera de usar clipxnet.exe: como programa para generar "paginas estaticas" usando "scripts" para generar el contenido dinamico. En este caso no se ocupa el Servidor Web. Se puede usar por ejemplo para crear a medianoche todas las "paginas estaticas" que se usan en el sitio Web, pero con informacion actualizada, usando un proceso .bat que genere todas estas paginas: REM Batch para crear las paginas estaticas de MiCompania.com clipxnet.exe CGIMODO=SCRIPT SCRIPT=clientes.sgs > clientes.htm clipxnet.exe CGIMODO=SCRIPT SCRIPT=productos.sgs > productos.htm clipxnet.exe CGIMODO=SCRIPT SCRIPT=ofertas.sgs > ofertas.htm clipxnet.exe CGIMODO=SCRIPT SCRIPT=pedidos.sgs > pedidos.htm clipxnet.exe CGIMODO=SCRIPT SCRIPT=ventas.sgs > ventas.htm Nota: En muchas ocasiones, por cuestion de desempeño, es preferible usar "paginas estaticas" cuando la informacion no cambia con frecuencia o sus cambios no son muy relevantes, de manera que se le reduce trabajo al Servidor Web. En situaciones de mucho cambio en la informacion o que reflejar estos cambios es muy importante, entonces son preferibles las "paginas dinamicas" aunque se requiera un equipo de mayor capacidad "Insercion 20030723" Con la ampliacion hecha para la ejecucion directa de procesos, se puede usar: clipxnet.exe clipnet.sgs en lugar de clipxnet.exe CGIMODO=SCRIPT SCRIPT=clipnet.sgs Si a alguien le interesa saber cual es el resultado de la etapa de analisis del HTML, para conocer el codigo Clipper que sera ejecutado por PrgExt, puede usar: clipxnet.exe EJECUTAR=QOUT(SGCGITTOS('clipnet.sgs')) o para enviarlo a un texto: clipxnet.exe EJECUTAR=OUTSTD(SGCGITTOS('clipnet.sgs')) > verfml.fml Observar que se usa OUTSTD( ) para poder re-direccionar la salida estandar Este texto tambien se puede ejecutar: clipxnet.exe verfml.fml 14. ¿ Que incluye clipxnet.zip ? Como ya lo mencione, la presentacion del modelo ClipNet-xNet en este documento va orientada principalmente al programa clipxnet.exe Este programa es de uso libre y no tiene limitaciones para ser usado inmediatamente en aplicaciones de Intra/Extra/Inter-Net usando paginas HTML de contenido dinamico, usando Clipper y acceso a bases de datos tipo DBF y/ot tipo MySQL El archivo clipxnet.zip incluye:
  • El programa clipxnet.exe creado y probado con: + Harbour 43++ (9 Marzo 2004) Win32 Xitami Web Server para Win32 IIS:Internet Information Server 5 Sin ADS Con ADS Local / Remoto 6.11 / Remoto 6.20 "Insercion 20040227" - Con MySQL 3.23.57 para Win32 Windows 2000, XP Pro Observaciones: - El programa con soporte para ADS ha sido creado con las librerias para ADS 5.7 "Insercion 20040227" - Los programas con soporte para ADS han sido creados con las librerias para ADS 6.2x + Harbour 43++ (9 Marzo 2004) OS/2 Xitami Web Server para OS/2 Apache 1.3.26 para OS/2 Apache 2.0.40 para OS/2 Sin ADS ( no existe ADS en OS/2 ) "Insercion 20040227" - Con MySQL 3.23.50 para OS/2 eComStation 1.0, 1.1 + Harbour 43++ (9 Marzo 2004) Linux Xitami Web Server para Unix Apache-AdvancedExtranetServer/1.3.26 (Mandrake Linux/6mdk) sxnet/1.2.4 mod_ssl/2.8.10 OpenSSL/0.9.6g PHP/4.2.3 Apache 2.0.40 Sin ADS Con ADS Local / Remoto 6.11 / Remoto 6.20 "Insercion 20040227" - Con MySQL 3.23.47 para Linux Mandrake 8.2, 9 RedHat 7.3, 8 Observaciones IMPORTANTES: - Los programas con soporte para ADS ha sido creado con las librerias para ADS 6.20 - Para Apache es conveniente que el ejecutable se llame clipxnet, con lo que bastara copiar o renombrar clipxnet.exe como clipxnet - Se tienen tambien los archivos ejecutables con el prefijo n, llamados nclipxnet.exe Estos son creados con la libreria ncurses para el manejo de consola, y deben de utilizarse en linea de comandos para poder hacer programas con interfaz de usuario, que tengan procesos de entradas/salidas con intervencion del usuario Pueden usarse directamente o renombrarse como clipxnet.exe o clipxnet No deben usarse desde el servidor Web
  • Bases de datos e indices .cdx para los ejemplos y pruebas
  • Ejemplos y formulas, archivos Script, etc.
  • Archivos de musica en formato .mid, para relajarse Notas:
  • El archivo clipxnet.exe correspondiente a cada tipo se encuentra en su directorio propio Para Linux: Observaciones IMPORTANTES: - Para Apache es conveniente que el ejecutable se llame clipxnet, con lo que bastara copiar o renombrar clipxnet.exe como clipxnet - Se tienen tambien los archivos ejecutables con el prefijo n, llamados nclipxnet.exe Estos son creados con la libreria ncurses para el manejo de consola, y deben de utilizarse en linea de comandos para poder hacer programas con interfaz de usuario, que tengan procesos de entradas/salidas con intervencion del usuario Pueden usarse directamente o renombrarse como clipxnet.exe o clipxnet No deben usarse desde el servidor Web
  • Para ADS Local se requieren determinados archivos. Inclui los que use en las pruebas
  • Para ADS Remoto se requieren determinados archivos y ADS. Inclui los que use en las pruebas "Insercion 20040227"
  • Para MySQL se requieren determinados archivos. Inclui los que use en las pruebas Notas mas importantes:
  • Las versiones Harbour 43++ (9 Marzo 2004) estan sujetas al estado actual de los RDD, incluyendo los RDD para Advantage y MySQL. Es obvio que conforme vaya evolucionando Harbour, deberan irse generando versiones de clipxnet.exe actualizadas
  • El modelo ClipNet-xNet incluye los modelos "RDD Multiple" y "Modelo CHA", lo que le permite usar indistintamente cualquier RDD valido. Pueden usarse: "DBFNTX", "DBFCDX" "DBFNTXAX" o "ADSNTX": NTX con ADS Local/Remoto "DBFCDXAX" o "ADSCDX": CDX con ADS Local/Remoto Como tambien ya lo mencione, la mejor forma de entender la aplicacion de PrgExt y las formulas de Scripts, es consultando los archivos de ejemplos, que se hicieron para denotar estas aplicaciones y particularidades 15. Sobre Xitami Web Server http://www.xitami.com Cuando comence a hacer las pruebas con programas CGI y paginas Web, busque y probe varios programas servidores Web. Sencillamente Xitami resulto ser el mejor. Entre las cosas que me gustaron fueron:
  • Tiene una version gratuita :-)
  • Pequeño, rapido y eficiente
  • Multiplataforma: Win32, OS/2, Linux
  • Funciona y se configura igual en Win32, OS/2, Linux
  • Sencillo de instalar o desinstalar, sin problemas
  • Estable y consistente
  • Facil administracion ya sea manual o mediante paginas de administracion
  • Buena documentacion No se tienen problemas con Xitami, en tanto que PWS:Personal Web Server resulto ser "un infierno" e IIS:Internet Information Server muy veleidoso Otra de las ventajas de Xitami es que incluye un servidor FTP muy practico y eficiente Les recomiendo que aunque ya tengan un programa Servidor Web, prueben Xitami No le causa ningun problema a su programa Servidor Web ya instalado 16. Preparacion para los ejemplos de uso de clipxnet.exe
  • Pueden escoger las plataformas que quieran: Win32 (Win98/2000/XP/...), OS/2, Linux
  • Descompacten el archivo clipxnet.zip, de preferencia en el directorio c:\clipxnet en Win32, OS/2 y /clipxnet en Linux, y usando los directorios incluidos
  • Se incluye la descripcion de implementacion usando diferentes programas Servidores Web, los cuales son necesarios para las pruebas Y USO de clipxnet.exe en sus propios sistemas Web, ya sea maquina local, red local, red amplia o Internet
  • Todas las pruebas y ejemplos son funcionales en cada uno de los entornos que se describen para cada Servidor Web, sin embargo, Ustedes los pueden implementar en diferentes directorios o configuraciones de acuerdo a su preferencia
  • Se pueden usar otros directorios para los archivos de bases de datos, para lo cual es necesario modificar las referencias de ubicaciones en los archivos de ejemplo Actualmente se esta usando el directorio de ejecucion de clipxnet.exe como directorio de las bases de datos, en la mayoria de los casos 16a. Xitami Web Server
  • Como Xitami Web Server es multiplataforma, la configuracion es similar en cualquiera de ellas. Pueden escoger las plataformas que quieran: Win32 (Win98/2000/XP/...), OS/2, Linux Inclui los programas Xitami que yo estoy usando para cada plataforma
  • Preferentemente usen la estructura de directorios por omision, instalandolo en: c:\xitami\ Win32 y OS/2 /xitami/ Linux Notas: - En el caso de Linux, es necesario "recompilar", pero no es nada dificil Basarse en la documentacion y usar ./xibuild - En el caso de Linux, yo uso el usuario "root". Para otros usuarios, permisos, etc., refieranse a la documentacion y a su conocimiento de Linux
  • Si ya tienen instalado otro Servidor Web que usa el puerto 80, cambien el puerto de Xitami en cualquiera de estas maneras: + Editar xitami.cfg y aplicar portbase=5000 # e.g. 5000 for port 5080 + o, usar xitami -b 5000 al ejecutar Xitami Despues, el navegador debe "orientarse" al puerto de Xitami http://direccion:5080
  • Despues de instalar Xitami, es INDISPENSABLE definir clipxnet.exe como el programa/modulo/filtro "interpretador" para paginas .fml, .sgs, .hs "Insercion 20030723" Se incluyeron las extensiones .hrb y .prg En la seccion [Filter] de xitami.cfg o defaults.cfg se agrega .sgs=clipxnet.exe .hs=clipxnet.exe .fml=clipxnet.exe .hrb=clipxnet.exe .prg=clipxnet.exe Asi de simple se tiene clipxnet.exe como "interpretador" de paginas con codigo Clipper Observacion: En Linux se pueden usar los programas clipxnet.exe o renombrados como clipxnet En Xitami se esta usando clipxnet.exe para mantener similitud con las demas plataformas. Si se decide usar clipxnet, cambiar las referencias donde corresponda
  • Copiar el archivo clipxnet.exe del tipo correspondiente a los directorios: \xitami\ \xitami\cgi-bin\ El tipo correspondiente se refiere a Win32, OS/2, Linux, con ADS, sin ADS, etc.
  • Copiar los archivos del directorio \clipxnet\webpages\ al directorio \xitami\webpages\
  • Copiar los archivos del directorio \clipxnet\dbf\ al directorio \xitami\ Observacion: Solo se incluyen archivos .dbf con indices .cdx No se incluyen los archivos .ntx correspondientes ya que al actualizar indices con un RDD, los indices del otro RDD perderian la "sincronia"
  • Copiar los archivos inter_01.exe, inter_02.exe del tipo correspondiente al directorio: \xitami\ El tipo correspondiente se refiere a Win32, OS/2, Linux. No incluyen ADS
  • Copiar los archivos htg3xnet.exe, nconvert.exe al directorio: \xitami\ "Insercion 20030723"
  • Copiar el archivo inter_01.hrb al directorio: "Insercion 20030723"
  • Copiar el archivo inter_01.prg al directorio: \xitami\ Si es necesario, copiar el archivo harbour.exe al directorio \xitami\
  • Si se desea usar ADS: Observacion: Si no se copian los archivos mencionados, se tendra error de ejecucion que no sera reportado correctamente por Xitami + Se debio copiar el archivo clipxnet.exe correspondiente a ....\CONADS "Insercion 20040227" Debido a que se incluyo soporte de MySQL, se disponen de archivos con soporte de ADS sin y con soporte de MySQL, que se encuentran en ....\conads y ....\conadsmysql, y si se elige el que tambien tiene soporte de MySQL, deberan seguirse ademas las instrucciones para aplicar soporte de MySQL + Se deben copiar archivos adicionales de ADS: Win32: Copiar a los directorios: \xitami \xitami\cgi-bin los archivos: ACE32.dll Funciones AXCWS32.dll Comunicaciones a ADS remoto ADSLOC32.dll ADS Local (numero de usuarios ilimitado) - Estos archivos corresponden a la version ADS 5.7 - Clipxnet.exe esta creado con las librerias de ADS 5.7 "Insercion 20040227" - Los programas con soporte para ADS han sido creados con las librerias para ADS 6.2x Linux: "Bajar" de http://www.advantagedatabase.com seccion "Developer Zone", el archivo: adsapi-6.20.0.tar.gz e instalarlo. La instalacion distribuye las librerias necesarias en los directorios correspondientes - Clipxnet.exe (clipxnet) estan creados con las librerias de ADS 6.20 + Puede usarse ADS Local o ADS Remoto + Es recomendable instalar ARC: Advantage Data Architect para revisar / probar las bases de datos. Yo estoy usando los archivos: http://www.advantagedatabase.com seccion "Developer Zone", Win32: ARC6.11.06.exe, ARC32.6.20.0.7.exe Linux: arc-6.20.0.tar.gz "Insercion 20040227"
  • Si se desea usar MySQL: Observacion: Si no se copian los archivos mencionados, se tendra error de ejecucion que no sera reportado correctamente por Xitami + Se debio copiar el archivo clipxnet.exe correspondiente a ....\conmysql, sin soporte de ADS, o ....\conadsmysql con soporte de ADS, para el cual deberan seguirse ademas las instrucciones para aplicar soporte de ADS + Se deben copiar archivos adicionales de MySQL: Win32: Copiar a los directorios: \xitami \xitami\cgi-bin los archivos: LibMySQL.dll Funciones - Clipxnet.exe estan creados con las librerias de MySQL 3.23.57 para Win32 OS/2: Copiar a los directorios: \xitami \xitami\cgi-bin los archivos: mysql.dll mysqlu.dll - Clipxnet.exe estan creados con las librerias de MySQL 3.23.50 para OS/2 Linux: Generalmente Linux ya tiene instalado un servidor MySQL, con las librerias necesarias en los directorios correspondientes - Clipxnet.exe (clipxnet) estan creados con las librerias de MySQL 3.23.47 para Linux + Puede usarse MySQL en forma local (misma computadora) o remota
  • Y finalmente, ejecutar el servidor Xitami Web Server Xitami indica que direcciones IP y puertos esta "escuchando", tanto para http como para ftp
  • Usar el Navegador apuntando a la direccion http://direccion donde: direccion es la direccion IP o nombre de maquina que esta usando Xitami, o 127.0.0.1 Si se cambio el numero de puerto, usar el que esta indicando Xitami: http://direccion:puerto Cuando no se especifica pagina inicial, Xitami muestra la documentacion, que es muy adecuada Es muy conveniente e interesante leer la documentacion
  • Usar el Navegador apuntando a la direccion: http://direccion/clipxnet.htm http://direccion:puerto/clipxnet.htm si es que se cambio el puerto Se muestra esta pagina 16b. Apache para Linux
  • Las pruebas de implementacion se efectuaron en: + Linux Mandrake 8.2, 9 + Linux RedHat 7.3, 8 Notar que Mandrake y RedHat estan usando diferentes versiones de Apache: + Mandrake: Apache-AdvancedExtranetServer/1.3.26 (Mandrake Linux/6mdk) sxnet/1.2.4 mod_ssl/2.8.10 OpenSSL/0.9.6g PHP/4.2.3 + RedHat: Apache 2.0.40
  • En el caso de Linux, yo uso el usuario "root". Para otros usuarios, permisos, etc., refieranse a la documentacion y a su conocimiento de Linux
  • Es INDISPENSABLE definir clipxnet como el programa/modulo/filtro "interpretador" para paginas .fml, .sgs, .hs Observaciones IMPORTANTES: - Para Apache es conveniente que el ejecutable se llame clipxnet, con lo que bastara copiar o renombrar clipxnet.exe como clipxnet - Se tienen tambien los archivos ejecutables con el prefijo n, llamados nclipxnet.exe Estos son creados con la libreria ncurses para el manejo de consola, y deben de utilizarse en linea de comandos para poder hacer programas con interfaz de usuario, que tengan procesos de entradas/salidas con intervencion del usuario Pueden usarse directamente o renombrarse como clipxnet.exe o clipxnet No deben usarse desde el servidor Web "Insercion 20030723" Se incluyeron las extensiones .hrb y .prg Para Linux Mandrake, usar el archivo /etc/httpd/conf/commonhttpd.conf Para Linux RedHat, usar el archivo /etc/httpd/conf/httpd.conf Este archivo incluye los archivos httpd.conf y commonhttpd.conf que estan separados en Linux Mandrake + Despues de esta seccion: # # Action lets you define media types that will execute a script whenever # a matching file is called. This eliminates the need for repeated URL # pathnames for oft-used CGI file processors. # Format: Action media/type /cgi-script/location # Format: Action handler-name /cgi-script/location # aplicar la siguiente seccion: # Files of a particular file extension # DAVID: Configuracion para los "Scripts" del Modelo ClipNet-xNet #Handler "clipxnet" y programa interpretador "cgi-bin/clipxnet": Action clipxnet /cgi-bin/clipxnet #Extensiones asociadas al Handler "clipxnet": AddHandler clipxnet .fml AddHandler clipxnet .sgs AddHandler clipxnet .hs AddHandler clipxnet .hrb AddHandler clipxnet .prg # Tipos MIME para las extensiones asociadas al Handler "clipxnet": AddType text/html .fml AddType text/html .sgs AddType text/html .hs AddType text/html .hrb AddType text/html .prg Asi de simple se tiene clipxnet como "interpretador" de paginas con codigo Clipper Observacion: En Apache para Linux se usa el programa clipxnet en lugar de clipxnet.exe, aunque son identicos. Se aplica de esta manera ya que la extension .exe es considerada para una descarga de archivos Se pudiera cambiar el tipo MIME para .exe, pero esto requiere una modificacion adicional poco util, cuando basta usar clipxnet como programa ejecutable
  • En la seccion: Directory /var/www/cgi-bin verificar que se tenga la siguiente linea: Allow from all Sin esta linea, no podran accesarse y ejecutarse el programa clipxnet u otros que se encuentren en el mismo directorio
  • Copiar el archivo clipxnet del tipo correspondiente a los directorios: /var/www/cgi-bin/ El tipo correspondiente se refiere a Linux, con ADS, sin ADS, etc.
  • Copiar los archivos del directorio /clipxnet/webpages/ al directorio /var/www/html/
  • Copiar los archivos del directorio /clipxnet/dbf/ al directorio /var/www/cgi-bin/ Observaciones: + Solo se incluyen archivos .dbf con indices .cdx No se incluyen los archivos .ntx correspondientes ya que al actualizar indices con un RDD, los indices del otro RDD perderian la "sincronia" + Se requieren habilitar permisos de lectura/escritura para poder accesar y modificar las bases de datos Pueden aplicarse usando: chmod 777 *.dbf chmod 777 *.cdx chmod 777 *.fpt
  • Copiar los archivos inter_01.exe, inter_02.exe del tipo correspondiente al directorio: /var/www/cgi-bin/ El tipo correspondiente se refiere a Win32, OS/2, Linux. No incluyen ADS
  • Copiar los archivos htg3xnet.exe, nconvert.exe al directorio: /var/www/cgi-bin/ Observacion: Para usar htg3xnet.exe y nconvert.exe se requiere tener el soporte de WINE "Insercion 20030723"
  • Copiar el archivo inter_01.hrb al directorio: /var/www/cgi-bin/ "Insercion 20030723"
  • Copiar el archivo inter_01.prg al directorio: /var/www/cgi-bin/
  • Habilitar permiso de "Escribir" para usuarios del "Grupo" y "Otros" al directorio: /var/www/cgi-bin/ Sin este permiso no podran crearse y usarse algunos archivos temporales necesarios
  • Si se desea usar ADS: Observacion: Si no se copian los archivos mencionados, se tendra error de ejecucion que no sera reportado correctamente por el servidor Web + Se debio copiar el archivo clipxnet correspondiente a ..../conads "Insercion 20040227" Debido a que se incluyo soporte de MySQL, se disponen de archivos con soporte de ADS sin y con soporte de MySQL, que se encuentran en ..../conads y ..../conadsmysql, y si se elige el que tambien tiene soporte de MySQL, deberan seguirse ademas las instrucciones para aplicar soporte de MySQL + Se deben copiar archivos adicionales de ADS: Linux: "Bajar" de http://www.advantagedatabase.com seccion "Developer Zone", el archivo: adsapi-6.20.0.tar.gz e instalarlo. La instalacion distribuye las librerias necesarias en los directorios correspondientes - Clipxnet.exe (clipxnet) estan creados con las librerias de ADS 6.20 + Puede usarse ADS Local o ADS Remoto + Es recomendable instalar ARC: Advantage Data Architect para revisar / probar las bases de datos. Yo estoy usando los archivos: http://www.advantagedatabase.com seccion "Developer Zone", Linux: arc-6.20.0.tar.gz "Insercion 20040227"
  • Si se desea usar MySQL: Observacion: Si no se copian los archivos mencionados, se tendra error de ejecucion que no sera reportado correctamente por el servidor Web + Se debio copiar el archivo clipxnet correspondiente a ..../conmysql, sin soporte de ADS, o ..../conadsmysql con soporte de ADS, para el cual deberan seguirse ademas las instrucciones para aplicar soporte de ADS + Se deben copiar archivos adicionales de MySQL: Linux: Generalmente Linux ya tiene instalado un servidor MySQL, con las librerias necesarias en los directorios correspondientes - clipxnet.exe (clipxnet) estan creados con las librerias de MySQL 3.23.47 para Linux + Puede usarse MySQL en forma local (misma computadora) o remota
  • Y finalmente, reiniciar Apache reiniciando el servicio (daemon) "httpd" para que se apliquen las nuevas configuraciones
  • Usar el Navegador apuntando a la direccion http://direccion donde: direccion es la direccion IP o nombre de maquina que esta usando Apache, o 127.0.0.1 Cuando no se especifica pagina inicial, Apache muestra la documentacion, que es muy adecuada Es muy conveniente e interesante leer la documentacion
  • Usar el Navegador apuntando a la direccion: http://direccion/clipxnet.htm Se muestra esta pagina 16c. Apache para OS/2
  • Las pruebas de implementacion se efectuaron en: + eComStation 1.0, 1.1 y se usaron dos versiones de Apache para OS/2 a) Apache 1.3.26, directorio f:\apache b) Apache 2.0.40, directorio f:\Apps\apache2 Se aplicaron los directorios por omision En lo sucesivo ambos directorios se referiran en comun como: "directorio_apache"
  • Es INDISPENSABLE definir clipxnet.exe como el programa/modulo/filtro "interpretador" para paginas .fml, .sgs, .hs "Insercion 20030723" Se incluyeron las extensiones .hrb y .prg Usar el archivo directorio_apache\conf\httpd.conf + Despues de esta seccion: # # Action lets you define media types that will execute a script whenever # a matching file is called. This eliminates the need for repeated URL # pathnames for oft-used CGI file processors. # Format: Action media/type /cgi-script/location # Format: Action handler-name /cgi-script/location # aplicar la siguiente seccion: # Files of a particular file extension # DAVID: Configuracion para los "Scripts" del Modelo ClipNet-xNet #Handler "clipxnet" y programa interpretador "cgi-bin/clipxnet.exe": Action clipxnet /cgi-bin/clipxnet.exe #Extensiones asociadas al Handler "clipxnet": AddHandler clipxnet .fml AddHandler clipxnet .sgs AddHandler clipxnet .hs AddHandler clipxnet .hrb AddHandler clipxnet .prg # Tipos MIME para las extensiones asociadas al Handler "clipxnet": AddType text/html .fml AddType text/html .sgs AddType text/html .hs AddType text/html .hrb AddType text/html .prg Asi de simple se tiene clipxnet.exe como "interpretador" de paginas con codigo Clipper
  • En la seccion: Directory directorio_apache/cgi-bin verificar que se tenga la siguiente linea: Allow from all Sin esta linea, no podran accesarse y ejecutarse el programa clipxnet.exe u otros que se encuentren en el mismo directorio
  • Copiar el archivo clipxnet.exe a los directorios: directorio_apache\cgi-bin\
  • Copiar los archivos del directorio \clipxnet\webpages\ al directorio directorio_apache\htdocs\
  • Copiar los archivos del directorio \clipxnet\dbf\ al directorio directorio_apache\cgi-bin\ Observaciones: + Solo se incluyen archivos .dbf con indices .cdx No se incluyen los archivos .ntx correspondientes ya que al actualizar indices con un RDD, los indices del otro RDD perderian la "sincronia"
  • Copiar los archivos inter_01.exe, inter_02.exe al directorio: directorio_apache\cgi-bin\
  • Copiar los archivos htg3xnet.exe, nconvert.exe al directorio: directorio_apache\cgi-bin\ Observacion: Para htg3xnet.exe y nconvert.exe se requiere tener el soporte de ODIN, con PE "Insercion 20030723"
  • Copiar el archivo inter_01.hrb al directorio: directorio_apache\cgi-bin\ "Insercion 20030723"
  • Copiar el archivo inter_01.prg al directorio: directorio_apache\cgi-bin\ Si es necesario, copiar el archivo harbour.exe al directorio directorio_apache\cgi-bin\ "Insercion 20040227"
  • Si se desea usar MySQL: Observacion: Si no se copian los archivos mencionados, se tendra error de ejecucion que no sera reportado correctamente por el servidor Web + Se debio copiar el archivo clipxnet.exe correspondiente a ....\conmysql + Se deben copiar archivos adicionales de MySQL: OS/2: Copiar a los directorios: directorio_apache\cgi-bin\ los archivos: mysql.dll mysqlu.dll - Clipxnet.exe estan creados con las librerias de MySQL 3.23.50 para OS/2 + Puede usarse MySQL en forma local (misma computadora) o remota
  • Y finalmente, reiniciar Apache para que se apliquen las nuevas configuraciones Apache 1.3.26: directorio_apache\httpd Apache 2.0.40: directorio_apache\startup.cmd
  • Usar el Navegador apuntando a la direccion http://direccion donde: direccion es la direccion IP o nombre de maquina que esta usando Apache, o 127.0.0.1 Cuando no se especifica pagina inicial, Apache muestra la documentacion, que es muy adecuada Es muy conveniente e interesante leer la documentacion
  • Usar el Navegador apuntando a la direccion: http://direccion/clipxnet.htm Se muestra esta pagina 16d. Apache para Win32
  • Esta implementacion no la he probado por mi propia cuenta Pero esta funcionando bien
  • De acuerdo a la informacion proporcionada por Rafa R. Gaona: "At 12:52 pm 08/14/03 +0200, you wrote: >Bueno David ya tienes el sistema en Apache Windows >Solo decirte que con los cambios que indicas para Linux/os2 tambien valen >para windows (el mio es 2000). >Todo es identico en el directorio conf\httpd.conf >No hay que hacer nada mas ;-)) " se observa que basta seguir las instrucciones similares de Apache, de preferencia para OS/2, para tener la configuracion conveniente en Apache para Win32
  • Obviamente hay que usar los archivos ejecutables correspondientes a Win32 Si se va a utilizar soporte de ADS y/o soporte de MySQL, seguir las instrucciones en Xitami para Win32 o IIS 5.0 16e. Microsoft IIS:Internet Information Server version 5.0
  • Las pruebas de implementacion se efectuaron usando el directorio raiz de IIS: c:\inetpub\wwwroot\ Se pueden usar otros directorios definiendo directorios virtuales y haciendo los cambios correspondientes en las referencias a directorios
  • Es INDISPENSABLE definir clipxnet.exe como el programa/modulo/filtro "interpretador" para paginas .fml, .sgs, .hs "Insercion 20030723" Se incluyeron las extensiones .hrb y .prg Seguir la siguiente secuencia en Win2000 o aplicar la que corresponda en su sistema: - Panel de Control Herramientas Administrativas Servicios y aplicaciones Servicios de Internet Information Server Sitio Web predeterminado Propiedades Directorio particular Configuracion Agregar Ejecutable: c:\inetpub\wwwroot\clipxnet.exe Extension: fml Agregar Ejecutable: c:\inetpub\wwwroot\clipxnet.exe Extension: sgs Agregar Ejecutable: c:\inetpub\wwwroot\clipxnet.exe Extension: hs Agregar Ejecutable: c:\inetpub\wwwroot\clipxnet.exe Extension: hrb Agregar Ejecutable: c:\inetpub\wwwroot\clipxnet.exe Extension: prg
  • Con el programa de Administracion de IIS: - Opciones avanzadas En el directorio virtual "raiz" Modificar propiedades Permisos de acceso Habilitar Lectura, Escritura Permisos de la aplicacion Habilitar "Secuencias de comandos" o, habilitar "Ejecucion" SOLAMENTE si se requiere ejecutar directamente clipxnet.exe u otro programa CGI Asi, no tan simple, se tiene clipxnet.exe como "interpretador" de paginas con codigo Clipper
  • Copiar el archivo clipxnet.exe del tipo correspondiente a los directorios: \inetpub\wwwroot\ El tipo correspondiente se refiere a Win32, con ADS, sin ADS, etc.
  • Copiar los archivos del directorio \clipxnet\webpages\ al directorio \inetpub\wwwroot\
  • Copiar los archivos del directorio \clipxnet\dbf\ al directorio \inetpub\wwwroot\ Observacion: Solo se incluyen archivos .dbf con indices .cdx No se incluyen los archivos .ntx correspondientes ya que al actualizar indices con un RDD, los indices del otro RDD perderian la "sincronia"
  • Copiar los archivos inter_01.exe, inter_02.exe del tipo correspondiente al directorio: \inetpub\wwwroot\ El tipo correspondiente se refiere a Win32, OS/2, Linux. No incluyen ADS
  • Copiar los archivos htg3xnet.exe, nconvert.exe al directorio: \inetpub\wwwroot\ "Insercion 20030723"
  • Copiar el archivo inter_01.hrb al directorio: \inetpub\wwwroot\ "Insercion 20030723"
  • Copiar el archivo inter_01.prg al directorio: \inetpub\wwwroot\ Si es necesario, copiar el archivo harbour.exe al directorio \inetpub\wwwroot\
  • Si se desea usar ADS: Observacion: Si no se copian los archivos mencionados, se tendra error de ejecucion que no sera reportado correctamente por el servidor Web + Se debio copiar el archivo clipxnet.exe correspondiente a ....\CONADS "Insercion 20040227" Debido a que se incluyo soporte de MySQL, se disponen de archivos con soporte de ADS sin y con soporte de MySQL, que se encuentran en ....\conads y ....\conadsmysql, y si se elige el que tambien tiene soporte de MySQL, deberan seguirse ademas las instrucciones para aplicar soporte de MySQL + Se deben copiar archivos adicionales de ADS: Win32: Copiar a los directorios: \inetpub\wwwroot\ los archivos: ACE32.dll Funciones AXCWS32.dll Comunicaciones a ADS remoto ADSLOC32.dll ADS Local (numero de usuarios ilimitado) - Estos archivos corresponden a la version ADS 5.7 - Clipxnet.exe esta creado con las librerias de ADS 5.7 "Insercion 20040227" - Los programas con soporte para ADS han sido creados con las librerias para ADS 6.2x + Puede usarse ADS Local o ADS Remoto + Es recomendable instalar ARC: Advantage Data Architect para revisar / probar las bases de datos. Yo estoy usando los archivos: http://www.advantagedatabase.com seccion "Developer Zone", Win32: ARC6.11.06.exe, ARC32.6.20.0.7.exe "Insercion 20040227"
  • Si se desea usar MySQL: Observacion: Si no se copian los archivos mencionados, se tendra error de ejecucion que no sera reportado correctamente por el servidor Web + Se debio copiar el archivo clipxnet.exe correspondiente a ....\conmysql, sin soporte de ADS, o ....\conadsmysql con soporte de ADS, para el cual deberan seguirse ademas las instrucciones para aplicar soporte de ADS + Se deben copiar archivos adicionales de MySQL: Win32: Copiar a los directorios: \inetpub\wwwroot\ los archivos: LibMySQL.dll Funciones - Clipxnet.exe estan creados con las librerias de MySQL 3.23.57 para Win32 + Puede usarse MySQL en forma local (misma computadora) o remota
  • Usar el Navegador apuntando a la direccion: http://direccion/clipxnet.htm donde: direccion es la direccion IP o nombre de maquina que esta usando IIS, o 127.0.0.1 Se muestra esta pagina 16f. English instructions You can find instructions in: clipxeng.htm 17. Ejemplos, ejemplos y mas ejemplos Los ejemplos los hice y probe usando:
  • Maquina local
  • Red Local
  • Internet y con los siguientes entornos:
  • Harbour 43++ (9 Marzo 2004) Win32 Xitami Web Server para Win32 http://www.xitami.com IIS: Internet Information Server 5.0 Sin ADS Con ADS Local Con ADS Remoto 6.11 y ADS Remoto 6.20 en Win2000 "Insercion 20040227" - Con MySQL 3.23.57 para Win32 Windows 2000, Windows XP Pro Mozilla 1.4a - Mozilla 1.6 http://www.mozilla.org Opera 6.01, Opera 7.11 http://www.opera.com Internet Explorer 5
  • Harbour 43++ (9 Marzo 2004) OS/2 Xitami Web Server para OS/2 http://www.xitami.com Apache 1.3.26 para OS/2 Apache 2.0.40 para OS/2 Sin ADS ( no existe ADS en OS/2 ) "Insercion 20040227" - Con MySQL 3.23.50 para OS/2 eComStation 1.0, eComStation 1.1 http://www.ecomstation.com Mozilla 1.4a - Mozilla 1.6 http://www.mozilla.org Opera 5 http://www.opera.com
  • Harbour 43++ (9 Marzo 2004) Linux Xitami Web Server para Unix http://www.xitami.com Apache-AdvancedExtranetServer/1.3.26 (Mandrake Linux/6mdk) sxnet/1.2.4 mod_ssl/2.8.10 OpenSSL/0.9.6g PHP/4.2.3 Apache Sin ADS Con ADS Local Con ADS Remoto 6.11 y ADS Remoto 6.20 (en pruebas) "Insercion 20040227" - Con MySQL 3.23.47 para Linux Mandrake 8.2, 9 RedHat 7.3, 8 Mozilla 1.4a - Mozilla 1.6 http://www.mozilla.org 17a. Clipxnet.exe como programa/modulo/filtro Este ejemplo muestra a clipxnet.exe como: programa/modulo/filtro "interpretador" para paginas .fml, .sgs, .hs usando codigo Clipper "Insercion 20030723" Se incluyeron las extensiones .hrb y .prg Se ejecuta una liga y como respuesta se devuelven todos los "valores CGI" obtenidos desde todas las fuentes. Dicho contenido es generado por el Script La liga contiene un archivo .fml, que como ya se explico, se ejecuta sin requerir etapa de analisis de HTML Liga para clipxnet.exe como filtro "interpretador" 17b. Ejemplo de archivos .sgs: clipnet.sgs Este ejemplo muestra a clipxnet.exe como: programa/modulo/filtro "interpretador" para paginas .fml, .sgs, .hs usando codigo Clipper "Insercion 20030723" Se incluyeron las extensiones .hrb y .prg Se ejecuta una liga y como respuesta se devuelve el contenido generado por el Script La liga contiene un archivo .sgs de SisGenScript, que como ya se explico, se ejecuta aplicando previamente una etapa de analisis de HTML clipnet.sgs, archivo de SisGenScript 17c. Ejemplos de archivos .hs, de Felipe Coury Este ejemplo muestra a clipxnet.exe como: programa/modulo/filtro "interpretador" para paginas .fml, .sgs, .hs usando codigo Clipper "Insercion 20030723" Se incluyeron las extensiones .hrb y .prg Se ejecuta una liga y como respuesta se devuelve el contenido generado por el Script La liga contiene un archivo .hs de HarbourScript, que como ya se explico, se ejecuta aplicando previamente una etapa de analisis de HTML 17c1. Multiply.hs El archivo multiply.hs original se modifico para tomar en cuenta las caracteristicas de PrgExt Multiply.hs, de Felipe Coury 17c2. Hello.hs El archivo hello.hs original se modifico para tomar en cuenta las caracteristicas de PrgExt Hello.hs, de Felipe Coury 17c3. Ugly.hs El archivo Ugly.hs original se modifico para tomar en cuenta las caracteristicas de PrgExt Ugly.hs, de Felipe Coury 17c4. Dir.hs El archivo Dir.hs original se modifico para tomar en cuenta las caracteristicas de PrgExt Dir.hs, de Felipe Coury 17d. Ejemplo de archivos .hrb: prgxnet.hrb Este ejemplo muestra a clipxnet.exe como: programa/modulo/filtro "interpretador" para paginas .fml, .sgs, .hs usando codigo Clipper "Insercion 20030723" Se incluyeron las extensiones .hrb y .prg Se ejecuta una liga y como respuesta se devuelve el contenido generado por el Script La liga contiene un archivo .hrb, que como ya se explico, se ejecuta sin requerir etapa de analisis de HTML prgxnet.hrb, archivo de "Harbour Portable Object (.hrb)" 17e. Ejemplo de archivos .prg: prgxnet.prg Este ejemplo muestra a clipxnet.exe como: programa/modulo/filtro "interpretador" para paginas .fml, .sgs, .hs usando codigo Clipper "Insercion 20030723" Se incluyeron las extensiones .hrb y .prg Se ejecuta una liga y como respuesta se devuelve el contenido generado por el Script La liga contiene un archivo .prg, que como ya se explico, se ejecuta sin requerir etapa de analisis de HTML prgxnet.prg, archivo de "Archivos fuente (.prg)" 17f. Busqueda de cadenas en archivos Se presenta un ejemplo simple para usar un FORM que permite introducir informacion que sera enviada al Servidor Web / Script El Script genera el contenido dinamico de acuerdo a los valores especificados en la forma Estas FORM se usan generalmente para definir informacion tecleada por el usuario
    Cadenas a buscar, separadas por comas (ejemplo: cadena1, cadena2):
    Especificaciones de archivos, separados por comas (ejemplo: *.prg, *.fml):
    17g. Busqueda de cadenas en archivos con "ancla" Se presenta un ejemplo simple para usar una ANCLA que especifique informacion que sera enviada al Servidor Web / Script El Script genera el contenido dinamico de acuerdo a los valores especificados en la ancla Estas Anclas se usan generalmente para definir informacion sin que el usuario la teclee Buscar "Xitami" en todos los *.txt 17h. Directorio de archivos Se presenta un ejemplo simple para usar un FORM que permite introducir informacion que sera enviada al Servidor Web / Script El Script genera el contenido dinamico de acuerdo a los valores especificados en la forma Estas FORM se usan generalmente para definir informacion tecleada por el usuario
    Especificaciones de archivos, separados por comas (ejemplo: *.prg, *.fml):
    17i. Directorio de archivos con "ancla" Se presenta un ejemplo simple para usar una ANCLA que especifique informacion que sera enviada al Servidor Web / Script El Script genera el contenido dinamico de acuerdo a los valores especificados en la ancla Estas Anclas se usan generalmente para definir informacion sin que el usuario la teclee Directorio de todos los archivos 17j. Hojear una base de datos DBF Decidi incluir este ejemplo porque me parece que es uno de los mas interesantes para presentar la funcionalidad del modelo ClipNet-xNet con el acceso a bases de datos tipo DBF, con diferentes RDD Este ejemplo es una version reducida de una aplicacion que tengo Se usa un elemento FORM que permite introducir informacion que sera enviada al Servidor Web / Script El Script genera el contenido dinamico de acuerdo a los valores especificados en la forma Estas FORM se usan generalmente para definir informacion tecleada por el usuario "Insercion 20040227" Este ejemplo fue reemplazado completamente por el ejemplo: 24c. Hojear y editar una base de datos DBF Hojear una base de datos DBF 17k. Mini-sistema Este es un ejemplo muy especial Tome un "viejo" sistema y sus bases de datos, hecho en Clipper en 1997 pero que sigue en uso constante dia tras dia, y lo use para ejemplificar una "modernizacion" de sistemas, de manera que se pueda usar en un entorno Intra/Extra/Inter-Net Le llame "mini-sistema" porque es un prototipo basico de como se puede desarrollar este tipo de sistemas. Entre los objetivos que se pretenden estan los siguientes: a) Que se observe que basta con sustituir el contenido de las bases de datos, para usarlo inmediatamente en una aplicacion propia b) Que se observe que basta con sustituir las bases de datos con algunas propias y hacer algunas adaptaciones, para usarlo en una aplicacion propia c) Que se observe que es muy factible desarrollar este tipo de sistemas y usando el programa clipxnet.exe se pueden comenzar a aplicar inmediatamente d) Para aquellos que aun no lo han hecho, comiencen a experimentar y desarrollar este tipo de aplicaciones usando Clipper como lenguaje de programacion base Los dos primeros objetivos son muy faciles de entender. Como he comentado, la mayoria de sistemas son genericos, y una base de datos de "partes de computadoras" no es conceptualmente diferente de una base de datos de, por ejemplo, "partes de automoviles". Lo mismo aplica para listados de clientes, contactos, etc. Desarrolle los "Scripts" de manera que fueran lo suficientemente descriptivos, aplicando diversas tecnicas en cada uno de ellos a manera de enseñanza de estrategias, de forma que los objetivos c) y d) fueran percibidos como bastante viables y cualquier persona se decida a desarrollarlos. Tambien se agrega un ejemplo de modificacion de bases de datos DBF La consulta de estos Scripts y de los demas ejemplos son suficientes para dar una buena idea del potencial del modelo ClipNet-xNet y de la oportunidad de comenzar a aplicarlo. Mini-sistema 17l. y mas ejemplos ... Se tienen mas ejemplos en: 18. Interfaz entre clipxnet.exe y otros sistemas 19. Lo inevitable: TGraph 3 y ClipNet-xNet juntos 21. Modelo ClipNet-xNet y el "poder de Harbour" 24. Ejemplos adicionales 18. Interfaz entre clipxnet.exe y otros sistemas Con frecuencia he incluido el siguiente parrafo en preguntas y cuestionamientos que recibo acerca del uso del Modelo ClipNet-xNet: ------------------------------------------------------------------------------------------- Contiene los archivos "clipxnet.exe" creados / para: - Win32 Harbour 42, con / sin soporte de ADS - OS/2 Harbour 42, sin soporte de ADS - Linux Harbour 42, con / sin soporte de ADS Usando estos programas, ya NO requieres hacer programas CGI Puedes usar estos programas como "Conectores" para el Servidor Web, y usar la informacion que recolectan para ejecutar tus procesos con otros programas hechos en forma separada, sin necesidad de que sean programas CGI La informacion resultante de estos programas se envia nuevamente al servidor Web por el "conector" Se dispone del siguiente esquema de operacion: Navegador <---> Servidor Web <---> Clipxnet.exe como "conector" CGI <---> Programas para procesos Los "programas para procesos" pueden ser cualquiera, hechos en Clipper, FW, Harbour, VBasic, Basic, etc., con/sin soporte para SQL. Basta que usen la informacion que proporciona clipxnet.exe y le devuelvan la informacion que quieran como salida Hice clipxnet.htm para presentar la mayor informacion posible para que las personas puedan ir imaginando y planeando sus modelos Te recomiendo que la revises a detalle Despues, revisando los Scripts de los ejemplos, te daras cuenta que facil es usar este modelo ------------------------------------------------------------------------------------------- Como podran observar, usando clipxnet.exe pueden usar sus sistemas y programas actuales para generar contenido para Servidores Web, mediante unas ligeras modificaciones La mayoria de mis "viejos" sistemas y todos mis sistemas actuales ya tienen incluida esta capacidad, debido a que todos incluyen el Modelo ClipNet-xNet En este capitulo se exponen consideraciones y aplicaciones de este "concepto de interfaz" para aprovechar los sistemas y procesos existentes o aquellos que se desarrollen en funcion de esta aplicacion, generalmente independiente del lenguaje elegido Hasta el momento se ha descrito la utilidad de clipxnet.exe como un "interprete" de Scripts con lenguaje Clipper, ya sea en linea de comandos o mediante Servidores Web. Aunque la capacidad de interpretar Scripts le proporciona al usuario un enorme potencial, los Scripts por su propia naturaleza estan orientados a procesos "ligeros" y reducidos que NO pueden competir contra los sistemas ejecutables que tienen decenas de archivos fuentes y miles de lineas de programacion, donde van incluidos muchos procesos complejos desarrollados a lo largo de años y que contienen mucha de la experiencia y conocimiento de los desarrolladores En esta situacion es mucho mas conveniente usar clipxnet.exe como "conector" CGI para aprovechar sistemas complejos, que como interpretador de Scripts para sistemas mas reducidos En el esquema de operacion planteado: Navegador <---> Servidor Web <---> Clipxnet.exe como "conector" CGI <---> Programas para procesos entre las etapas: Clipxnet.exe como "conector" CGI <---> Programas para procesos debe de existir una "capa de interfaz y enlace" entre ambas etapas, de la siguiente manera: Clipxnet.exe como "conector" CGI <---> Capa de Interfaz <---> Programas para procesos Esta "capa de interfaz" debe de cumplir con los siguientes elementos: a) Poner a disposicion del "otro programa" toda la informacion recolectada en el proceso CGI b) Esperar mientras el "otro programa" ejecuta sus procesos c) Enviar al servidor Web la informacion que haya sido generada por el "otro programa" El elemento c) es procesado automaticamente por clipxnet.exe Los elementos a) y b) deben aplicarse de manera especifica, dependiendo de las caracteristicas y requerimientos de cada proceso de interfaz Se llama "otro programa" a cualquier programa, hecho en cualquier lenguaje y con cualquier caracteristica (acceso a archivos DBF, soporte SQL, procesos en redes, etc. ) y con diversa complejidad, que se quiera y pueda usar como "servidor de procesos" para peticiones realizadas mediante el Modelo ClipNet-xNet En esta capa de interfaz se puede aplicar la siguiente caracteristica de clipxnet.exe: En cada peticion CGI, clipxnet.exe crea, usa y destruye los siguientes archivos temporales:
  • cgi*.tgi: Archivo de entrada, contenido en la variable de memoria cArcEntra Contiene toda la informacion que se recolecta en el proceso CGI, desde todas las fuentes
  • cgi*.tgo: Archivo de salida, contenido en la variable de memoria cArcSale Contiene la informacion que se enviara al Servidor Web. Este archivo inicialmente esta vacio y posteriormente puede tener el contenido escrito por algunos Scripts o programas externos Su uso es opcional ya que los Scripts pueden escribir directamente a STDOUT mediante OUTSTD() "Insercion 20040227" Debido al soporte de Cookies ya no puede usarse OUTSTD(), sino que debe usarse SGOutStd() Analizando los elementos a) y b): a) Poner a disposicion del "otro programa" toda la informacion recolectada en el proceso CGI Conociendo lo anterior, puede hacerse de la siguiente manera: + Crear un archivo de "control de intercambio", que generalmente sera temporal + Escribir en este archivo el contenido de las variables cArcEntra y cArcSale Usando este archivo de control de intercambio el otro programa tendra indicado donde tomar la informacion disponible y donde debe de escribir la informacion de salida que generalmente estara formateada con codigo HTML b) Esperar mientras el "otro programa" ejecuta sus procesos Este elemento es el que tiene mas variantes, ya que puede tener un proceso de control de intercambio sencillo o en otros casos puede ser muy complejo. En cualquiera de sus variantes generalmente corresponde a uno de los siguientes modelos: b.1. Modelo en Serie: La capa de interfaz lanza la ejecucion del otro programa y espera su termino. El otro programa se ejecuta cada vez que hay una peticion b.2. Modelo en Paralelo: El otro programa se encuentra en ejecucion continua atendiendo las peticiones provenientes de la capa de interfaz, como un "servidor de procesos" El Modelo ClipNet-xNet cuenta con diversas variantes de los modelos en Serie y en Paralelo, los cuales son lo bastante completos y complejos para asegurar la eficiencia y consistencia de los procesos. Como ya se ha mencionado, este trabajo esta orientado a una presentacion reducida del Modelo ClipNet-xNet, por lo cual no se explicaran los modelos en Serie y en Paralelo con los que cuenta. En su lugar se expondran algunas alternativas simples que se pueden aplicar y que el usuario podra extender de acuerdo a sus necesidades y conveniencias 18a. Ejemplo de Modelo en Serie Apache para Linux presento complicaciones, las cuales estan descritas en: 22. Solicito colaboraciones La formula Inter_01.fml es una interfaz sencilla que cuenta con los tres elementos necesarios en la interfaz. En este caso la interfaz LANZA la ejecucion del programa inter_01.exe, el cual hace la representacion del "otro programa". El programa inter_01.exe debe estar en el directorio donde esta ubicado clipxnet.exe (o clipxnet en Linux Apache) Recordar que este "otro programa" puede ser tan complejo como se desee y puede hacerse con cualquier lenguaje de programacion que sea conveniente. En este ejemplo inter_01.exe esta hecho con Harbour y se incluye el programa fuente Con la proposito de darle a la formula inter_01.fml la capacidad de aplicacion generica, puede usarse la variable CGI de nombre CGIEJEC para definir el archivo ejecutable que debe usarse como el "otro programa". Por omision es Inter_01.exe De esta manera puede usarse inter_01.fml como la capa generica de interfaz en serie a la que se le pueden definir diferentes archivos ejecutables segun los requerimientos del proceso. Esta variable CGIEJEC puede usarse en metodos GET o POST GET: Liga inter_01.fml?CGIEJEC=miprogr.exe POST: ACTION=inter_01.fml INPUT ... NAME=CGIEJEC VALUE=miprogr.exe Al tener la posibilidad de aplicar cualquier archivo ejecutable conveniente se tiene un enorme potencial de aplicacion Prueba 01 de Interfaz con Modelo en Serie 18b. Ejemplos de Modelo en Paralelo La formula Inter_02.fml es una interfaz sencilla que cuenta con los tres elementos necesarios en la interfaz. En este caso la interfaz ESPERA el termino del proceso de la peticion por el programa inter_02.exe, el cual hace la representacion del "otro programa" que esta actuando como un "servidor de procesos" en forma continua Recordar que este "otro programa" puede ser tan complejo como se desee y puede hacerse con cualquier lenguaje de programacion que sea conveniente. En este ejemplo inter_02.exe esta hecho con Harbour y se incluye el programa fuente Observaciones:
  • Las formulas Inter_01.fml e Inter_02.fml son los prototipos basicos para las capas de interfaz en los modelos en Serie y en Paralelo, y SON SUFICIENTES para ser utilizados como interfaz con cualquier otro programa que se desee. Las caracteristicas, complejidades y capacidades de estos otros programas quedan a discrecion del programador
  • El programa Inter_02.prg de ejemplo para el modelo en Paralelo contiene una mayor cantidad de funciones y procesos que facilitan la aplicacion del proceso de interfaz. Estos los inclui para que sirvan de muestra y que a su vez puedan usarse inmediatamente Las funciones y procesos incluidos en Inter_02.prg forman parte de una "capa de enlace" con el Modelo ClipNet-xNet y que Ustedes pueden incluir en sus sistemas para agregarles esta funcionalidad. En general esta formado por dos partes estructurales: + Una parte generica que es aplicable directamente a cualquier sistema + Otra parte particular que es especifica a las caracteristicas de cada sistema. En el programa de ejemplo esta constituida por la funcion CGIPROCESO(), donde se especifican los procesos diferenciados incluidos en cada sistema Si mantienen esta estructura y procesos les sera mas facil la aplicacion de la capacidad de enlace con el Modelo ClipNet-xNet Si se desarrollan en otros lenguajes, basta desarrollar procesos para que en forma similar lean los archivos de intercambio y analicen el contenido de los mismos, escribiendo posteriormente lo que se desee como "pagina HTML" en el archivo de salida cArcSale Observacion muy importante: Para el modelo en paralelo se introdujo el concepto de PREFIJO En este modelo se estan usando "archivos de control de interfaz" que tienen un nombre temporal unico para evitar colision entre procesos. Los nombres de estos archivos usan un prefijo especifico con lo cual se tienen familias de archivos con el mismo prefijo Por omision, se usa el prefijo "inter" para la familia de archivos de control de interfaz El uso de prefijos para el archivo de control de interfaz esta implementado para que las peticiones puedan diferenciarse segun sea conveniente, ya que se puede tener en ejecucion diversos programas "servidores de procesos", cada uno de ellos atendiendo archivos de control de un prefijo especifico Los programas "servidores de procesos" pueden tener procesos muy diferentes entre ellos Por ejemplo: contabil.exe Atiende peticiones de prefijo "conta" ventas.exe Atiende peticiones de prefijo "venta" El valor del prefijo puede ser sustituido con el contenido de la variable CGI de nombre PREFIJO, y el tiempo de espera con la variable MAXESPERA Al tener la posibilidad de aplicar:
  • cualquier archivo ejecutable conveniente como "servidor de procesos"
  • cualquier prefijo conveniente para la familia de archivos de control de interfaz
  • cualquier variedad de procesos que atienden peticiones dentro de cada archivo ejecutable, mediante la parte particular CGIPROCESO() se tiene un enorme potencial de aplicacion No calcule la variedad de combinaciones, pero se pueden obtener con: x archivos ejecutables "servidores de procesos" y prefijos que pueden ser usados por cada archivo ejecutable z procesos en cada archivo ejecutable En lugar de un solo ejemplo para el Modelo en Paralelo, inclui varios ejemplos para ir gradualmente incrementando la complejidad de la aplicacion exponiendo las diferentes caracteristicas, las cuales le proporcionan al modelo una gran diversidad de uso 18b1. Ejemplo 1 de Modelo en Paralelo Usar la siguiente liga y esperar al menos 1 minuto, despues de lo cual debe tenerse una respuesta: Ejemplo 1 de Modelo en Paralelo En este caso aun no esta en estado de ejecucion continua el programa Inter_02.exe, por lo tanto no se pueden procesar peticiones porque no hay "servidor de procesos" que las atienda La respuesta es generada por la capa de interfaz como contingencia, ya sea que no se haya atendido o que no se haya terminado la atencion en el tiempo especifico que tiene asignada la interfaz, el cual es modificable por una variable CGI Debe notarse que los servidores Web tambien cuentan con su propio tiempo de espera, por lo que este debe incrementarse cuando se requieran procesos que consuman mucho tiempo 18b2. Ejemplo 2 de Modelo en Paralelo Para este ejemplo debe de ejecutarse el "otro programa" para que funcione como "servidor de procesos". En el directorio donde esta ubicado clipxnet.exe (o clipxnet en Linux Apache), ejecutar desde una linea de comandos: inter_02.exe y Enter El programa mostrara la pantalla de verificacion continua de peticiones de proceso Usar la siguiente liga y esperar, despues de lo cual debe tenerse una respuesta Ejemplo 2 de Modelo en Paralelo El navegador muestra una respuesta y la pantalla de inter_02.exe muestra que se atendio una peticion En este caso tanto la capa de interfaz inter_02.fml como el "otro programa" inter_02.exe estan usando el valor por omision "inter" para el "prefijo" para archivos de peticion de procesos La respuesta es generada por el "otro programa" como contingencia, debido a que no se ha especificado el tipo de proceso que se requiere. El "otro programa" puede hacerse para que atienda un solo tipo de proceso, en cuyo caso no existiria una contingencia por proceso no especificado; sin embargo, es mas conveniente y provechoso tener el "otro programa" con la capacidad de atender varios procesos definidos, los cuales se diferencian en la "parte particular" CGIPROCESO() 18b3. Ejemplo 3 de Modelo en Paralelo Si ya se ha probado el ejemplo anterior, entonces inter_02.exe ya esta en ejecucion Para este ejemplo debe de ejecutarse el "otro programa" para que funcione como "servidor de procesos". En el directorio donde esta ubicado clipxnet.exe (o clipxnet en Linux Apache), ejecutar desde una linea de comandos: inter_02.exe y Enter El programa mostrara la pantalla de verificacion continua de peticiones de proceso Usar la siguiente liga y esperar, despues de lo cual debe tenerse una respuesta Ejemplo 3 de Modelo en Paralelo El navegador muestra una respuesta y la pantalla de inter_02.exe muestra que se atendio una peticion En este caso tanto la capa de interfaz inter_02.fml como el "otro programa" inter_02.exe estan usando el valor por omision "inter" para el "prefijo" para archivos de peticion de procesos La respuesta es generada por el "otro programa" para el tipo de proceso o tarea identificada como AA y asignada en la variable CGITAREA Observaciones:
  • La variable CGITAREA que se esta usando esta relacionada con el programa Inter_02.exe, donde se esta revisando para determinar cual es el proceso especifico que se esta solicitando No es obligatorio el uso de la variable CGITAREA, ya que simplemente se uso como ejemplo, y el programador podra definir y usar cualquier variable que desee
  • Estas variables se usan para establecer UNA RELACION entre la informacion proporcionada en el navegador y los procesos especificos que puede atender el programa "servidor de procesos"
  • Estas variables pueden ser transmitidas por el metodo GET o POST. En este ejemplo por omision se aplico el metodo GET. Independientemente del metodo empleado, estas variables y sus valores estan disponibles para el programa "servidor de procesos" en el archivo cArcEntra 18b4. Ejemplo 4 de Modelo en Paralelo Si ya se ha probado el ejemplo anterior, entonces inter_02.exe ya esta en ejecucion Para este ejemplo debe de ejecutarse el "otro programa" para que funcione como "servidor de procesos". En el directorio donde esta ubicado clipxnet.exe (o clipxnet en Linux Apache), ejecutar desde una linea de comandos: inter_02.exe y Enter El programa mostrara la pantalla de verificacion continua de peticiones de proceso Usar la siguiente liga y esperar lo necesario, despues de lo cual debe tenerse una respuesta Ejemplo 4 de Modelo en Paralelo El navegador muestra una respuesta y la pantalla de inter_02.exe NO muestra cambios La respuesta es generada por la capa de interfaz como contingencia En este caso la capa de interfaz inter_02.fml esta usando el prefijo "otro", que no es el valor por omision, en tanto que el "otro programa" inter_02.exe esta usando el valor por omision "inter" para el "prefijo" para archivos de peticion de procesos El prefijo para inter_02.fml fue modificado durante la peticion desde el navegador por medio de la variable PREFIJO Como la interfaz y el "otro programa" estan usando diferentes prefijos para los archivos de peticion de procesos, entonces NO tienen la misma correspondencia e Inter_02.exe NO puede atender las peticiones con el prefijo usado por inter_02.fml Observaciones:
  • Las variables CGITAREA y PREFIJO tienen las mismas observaciones que se mencionan en el ejemplo 3 en lo que respecta al uso de variables de RELACION y/o coordinacion La variable PREFIJO se esta usando en Inter_02.fml para diferenciar al "otro programa" que puede atender las peticiones de ese prefijo. Desde esta manera desde el navegador se puede definir cual de los prefijos debe ser usado para la peticion, y el "otro programa" que esta atendiendo ese prefijo, atendera esa peticion 18b5. Ejemplo 5 de Modelo en Paralelo Este ejemplo esta relacionado con el Ejemplo 4 y es una variante del mismo Si ya esta en ejecucion Inter_02.exe, cancelar su ejecucion Para este ejemplo debe de ejecutarse el "otro programa" para que funcione como "servidor de procesos". En el directorio donde esta ubicado clipxnet.exe (o clipxnet en Linux Apache), ejecutar desde una linea de comandos: inter_02.exe otro y Enter El programa mostrara la pantalla de verificacion continua de peticiones de proceso Observar que se esta usando el parametro "otro" para cambiar el "prefijo" para archivos de peticion de procesos que atendera en esta ocasion Inter_02.exe La pantalla debe mostrar que esta atendiendo archivos con prefijo "otro" Usar la siguiente liga y esperar lo necesario, despues de lo cual debe tenerse una respuesta Ejemplo 5 de Modelo en Paralelo El navegador muestra una respuesta y la pantalla de inter_02.exe muestra que se atendio una peticion En este caso tanto la capa de interfaz inter_02.fml como el "otro programa" inter_02.exe estan usando el valor por SUSTITUCION "otro" para el "prefijo" para archivos de peticion de procesos La respuesta es generada por el "otro programa" para el tipo de proceso o tarea identificada como AA y asignada en la variable CGITAREA Observaciones:
  • El ejemplo 5 es igual que el ejemplo 3, pero usando diferente "prefijo" para los archivos de peticion
  • Las variables CGITAREA y PREFIJO tienen las mismas observaciones que se mencionan en el ejemplo 3 en lo que respecta al uso de variables de RELACION y/o coordinacion 18b6. Ejemplo 6 de Modelo en Paralelo Este ejemplo es el mas complejo y completo, y esta orientado a mostrar la integracion de todas las caracteristicas mostradas en los ejemplos previos, y algunas variantes El ejemplo incluye lo siguiente:
  • Usa inter_02.fml como capa de interfaz e inter_02.exe como el "otro programa" servidor de procesos
  • Ambos usan el prefijo "tarea" para los archivos de peticion de procesos En inter_02.fml se aplica con la variable PREFIJO y en inter_02.exe con el parametro
  • Se solicita la ejecucion de la tarea BB mediante la variable CGITAREA
  • La informacion se transmite mediante el metodo POST que permite usar una mayor cantidad de informacion
  • En forma similar a otros ejemplos para los Scripts, se usa una estructura FORM para solicitar la especificacion de condiciones para el proceso BB Si ya esta en ejecucion Inter_02.exe, cancelar su ejecucion Para este ejemplo debe de ejecutarse el "otro programa" para que funcione como "servidor de procesos". En el directorio donde esta ubicado clipxnet.exe (o clipxnet en Linux Apache), ejecutar desde una linea de comandos: inter_02.exe tarea y Enter El programa mostrara la pantalla de verificacion continua de peticiones de proceso Observar que se esta usando el parametro "tarea" para cambiar el "prefijo" para archivos de peticion de procesos que atendera en esta ocasion Inter_02.exe La pantalla debe mostrar que esta atendiendo archivos con prefijo "tarea" Usar la siguiente liga y esperar lo necesario, despues de lo cual debe tenerse una respuesta Ejemplo 6 de Modelo en Paralelo El navegador muestra una respuesta y la pantalla de inter_02.exe muestra que se atendio una peticion Observaciones:
  • Las variables CGITAREA y PREFIJO tienen las mismas observaciones que se mencionan en el ejemplo 3 en lo que respecta al uso de variables de RELACION y/o coordinacion
  • Las demas variables involucradas tambien son definidas por el programador. Es importante notar la correlacion que se tiene entre las variables usadas en las paginas del navegador y su uso dentro de los procesos correspondientes en el "otro programa". Esta correlacion debe ser establecida convenientemente por el programador y es crucial para una operacion practica y confiable 19. Lo inevitable: TGraph 3 y ClipNet-xNet juntos Habiendo desarrollado el Modelo TGraph 3 y el Modelo ClipNet-xNet, era inevitable que intentara usarlos juntos, lo cual si fue posible "Insercion 20040227" En Agosto 20 de 2003 descontinue el desarrollo del Modelo TGraph 3, quedando la ultima version de esas fechas como una "joya" de la programacion con FiveWin(Harbour) A partir del Modelo TGraph 3 desarrolle el Modelo Citlalli, que puede hacer todo lo que TGraph 3 hace ademas de muchas otras adiciones interesantes El Modelo Citlalli puede usarse en lugar del Modelo TGraph 3 para todas las aplicaciones mencionadas en su relacion con el Modelo ClipNet-xNet El programa citxnet.exe reemplaza al programa tg3xnet.exe Observaciones y advertencias: a) Esta implementacion aun es un prototipo, pero quedo lo suficientemente desarrollada de manera que pudiera usarse sin problemas como si fuera definitiva b) Aun no tengo bien determinada la aplicacion de las direcciones de directorios para los archivos de imagen resultantes. Decidi no forzar la creacion y uso de algun directorio especifico que pudiera quedar en conflicto con directorios de algunos usuarios, y en su lugar estoy usando el directorio por omision para las paginas HTML, de acuerdo a los diferentes servidores Web que he probado Si estos directorios son diferentes a los directorios por omision de cada servidor Web, hacer los cambios correspondientes para la variable cDirTG3 en las formulas: + tg3xnet.fml + inter_06.fml Ejemplos: cDirTG3 := "\midirect\xitami\webpages\" cDirTG3 := "/midirect/var/www/html/" c) TGraph 3 puede guardar las imagenes en archivos de imagen tipo BMP (BitMaps) La idea original era: + Guardar la imagen en archivo tipo BMP + Convertir el archivo tipo BMP a archivo tipo JPG El motivo es que los archivos JPG son de menor tamaño que los archivos BMP, y por lo tanto son mas adecuados para transportarse por Internet o redes de baja velocidad Por recomendacion de Víctor Manuel Tomás Díaz (http://vikthor.netfirms.com) inclui el archivo ejecutable "nconvert.exe" -------------------------------------------------------------------------------------------- ** NCONVERT v2.73 Copyright 1991-99 Pierre-E Gougelet (May 06 1999/09:29:45) ** Version for Windows 95/98/NT (All rights reserved) ** This is a freeware software -------------------------------------------------------------------------------------------- para la conversion del archivo de imagen tipo BMP a archivo de imagen tipo JPG, la cual funciona satisfactoriamente en todas las plataformas Cada quien podra sustituir este proceso de conversion por los procesos y programas que mas le convengan: - Se pretende que la conversion sea un proceso desatendido, que se haga en la forma: ejecutar programa ---> convertir imagen ---> terminar ejecucion - Esta conversion debe ser igual en Win32, OS/2 y Linux d) Si hubiera conflictos en el proceso de conversion BMP a JPG, se pueden usar directamente los archivos tipo BMP generados por FiveWin anulando el proceso de conversion y usando la variable cArcTG3 en vez de cArcJPG para especificar la liga al archivo de imagen Esto causa que si la grafica es grande, el archivo de imagen tipo BMP tambien lo sera y el transporte del archivo sera tardado en Internet y en redes lentas Pero si se dispone de acceso de alta velocidad a Internet o de redes locales, el uso de los archivos tipo BMP no representa mayor problema, y se reduce una capa de probable conflicto e) Hay algunas otras alternativas para esta conversion de archivo tipo BMP a archivo tipo JPG, pero decidi no incluirlas ya que representaban una solucion parcial Si alguien conoce algunas otras alternativas practicas para esta conversion, son bienvenidas
  • Las graficas son hechas con TGraph 3 y guardadas en archivos tipo BMP usando: htg3xnet.exe: creado con FiveWin para Harbour 2.4 (Julio 2003) y su Harbour 42 correspondiente, usando Borland C++ 5.5.1 Se incluye el programa fuente tg3xnet.prg
  • tg3xnet.prg es una modificacion del programa G_TEST3.prg que se usa para los ejemplos de aplicacion de TGraph 3. Las modificaciones fueron menores ya que solo basto: + Una capa de manejo del archivo de control de transferencia + Aplicar para cada ejemplo: IF lClipxNet ACTIVATE WINDOW oGWnd:oWnd ON INIT ( ; oGraph:Save2BMP( cArcTG3 ), ; oGWnd:oWnd:End() ) ELSE oGWnd:Activate() ENDI Debido a esto, tg3xnet.prg puede usarse directamente como el clasico G_TEST3 o como un sistema de generacion de imagenes para el Modelo ClipNet-xNet
  • El programa tg3xnet.prg puede tomarse como base para la creacion de programas que ejecuten procesos y generen imagenes de TGraph 3, guardandolas en archivos tipo BMP, para cualquier aplicacion de sus sistemas existentes
  • tg3xnet puede compilarse con Clipper+FW o Harbour+FWH, usando la libreria TGraph 3 correspondiente que esta incluida Para los ejemplos de "TGraph 3 y ClipNet-xNet juntos" se requiere:
  • Formulas tg3xnet.fml y tg3xneti.fml. La segunda formula es una interfaz sencilla que es una variante del "modelo en Serie"
  • htg3xnet.exe: creado con FWH (Julio 2003) y su Harbour 42 correspondiente, con BCC 5.5.1
  • nconvert.exe: incluido El esquema fue probado y funciona en:
  • Win2000
  • OS/2, usando ODIN en su modalidad PE Se observan algunos problemas de cambio de colores, debido posiblemente a la densidad de colores usada para el escritorio
  • Linux, usando WINE del 20030618 El desempeño en este entorno es sencillamente: excelente IIS y Apache para Linux presentaron complicaciones, las cuales estan descritas en: 22. Solicito colaboraciones 19a. Ejemplos del Modelo TGraph 3 Estos ejemplos son casi todos los incluidos en G_TEST3 del Modelo TGraph 3 El programa htg3xnet.exe debe estar en el directorio donde esta ubicado clipxnet.exe (o clipxnet en Linux Apache). htg3xnet.exe puede reemplazarse con otro usando la variable CGI de nombre CGIEJEC Tambien debe estar el archivo nconvert.exe en el mismo directorio Ejemplos del Modelo TGraph 3 19b. Ejemplos del Modelo TGraph 3 en actualizacion continua Estos ejemplos son casi todos los incluidos en G_TEST3 del Modelo TGraph 3 El programa htg3xnet.exe debe estar en el directorio donde esta ubicado clipxnet.exe (o clipxnet en Linux Apache) htg3xnet.exe puede reemplazarse con otro usando la variable CGI de nombre CGIEJEC Tambien debe estar el archivo nconvert.exe en el mismo directorio Una de las caracteristicas mas importantes del Modelo TGraph 3 es la de la actualizacion continua a intervalos regulares de tiempo, lo que permite que automaticamente se este renovando la grafica y esta se genera con la informacion actual De esta manera se tienen graficas "en vivo", "en linea" y "en tiempo real" Cuando se usa TGraph 3 para generar graficas para el Modelo ClipNet-xNet, no puede usarse esta caracteristica de actualizacion automatica debido a que el programa TGraph 3 se ejecuta y termina en cada peticion Sin embargo, esta caracteristica puede reproducirse usando las capacidades del Navegador y un poco de HTML Se usan las graficas del ejemplo anterior, pero ahora en la modalidad de "refrescamiento" cada 2 minutos. El valor de refrescamiento se puede modificar mediante la variable CGI de nombre REFRESCA No es dificil imaginar muchas de las aplicaciones que se le pueden dar a esta caracteristica Ejemplos del Modelo TGraph 3 en actualizacion continua 19c. Ejemplo 6 de Modelo en Paralelo con TGraph 3 El programa htg3xnet.exe debe estar en el directorio donde esta ubicado clipxnet.exe (o clipxnet en Linux Apache) htg3xnet.exe puede reemplazarse con otro usando la variable CGI de nombre CGIEJEC Tambien debe estar el archivo nconvert.exe en el mismo directorio Tambien debe estar el archivo epsilon.bmp en el mismo directorio Este ejemplo es el mas complejo y completo, y esta orientado a mostrar la integracion de todas las caracteristicas mostradas en los ejemplos previos, y algunas variantes Por supuesto que resultaba muy interesante usarlo para TGraph 3 El ejemplo incluye lo siguiente:
  • Usa inter_02.fml como capa de interfaz e inter_02.exe como el "otro programa" servidor de procesos
  • Ambos usan el prefijo "tarea" para los archivos de peticion de procesos En inter_02.fml se aplica con la variable PREFIJO y en inter_02.exe con el parametro
  • Se solicita la ejecucion de la tarea BB mediante la variable CGITAREA
  • La informacion se transmite mediante el metodo POST que permite usar una mayor cantidad de informacion
  • En forma similar a otros ejemplos para los Scripts, se usa una estructura FORM para solicitar la especificacion de condiciones para el proceso BB Si ya esta en ejecucion Inter_02.exe, cancelar su ejecucion Para este ejemplo debe de ejecutarse el "otro programa" para que funcione como "servidor de procesos". En el directorio donde esta ubicado clipxnet.exe (o clipxnet en Linux Apache), ejecutar desde una linea de comandos: inter_02.exe tarea y Enter El programa mostrara la pantalla de verificacion continua de peticiones de proceso Observar que se esta usando el parametro "tarea" para cambiar el "prefijo" para archivos de peticion de procesos que atendera en esta ocasion Inter_02.exe La pantalla debe mostrar que esta atendiendo archivos con prefijo "tarea" Algunas de las caracteristicas importantes del Modelo TGraph 3 son la "ventana de navegacion" y el uso de muy diversas propiedades para las graficas. En este ejemplo se estan mostrando algunas formas de aplicar estas caracteristicas, ya que por medio de la informacion dada por el usuario desde el navegador, se varia y define la presentacion de la grafica. Estos valores pueden ser pre-definidos o abiertos a ser modificados por el usuario La variedad y complejidad de esta aplicacion queda a discrecion del programador Usar la siguiente liga y esperar lo necesario, despues de lo cual debe tenerse una respuesta Ejemplo 6 de Modelo en Paralelo con TGraph 3 El navegador muestra una respuesta y la pantalla de inter_02.exe muestra que se atendio una peticion Observaciones:
  • Las variables CGITAREA y PREFIJO tienen las mismas observaciones que se mencionan en el ejemplo 3 en lo que respecta al uso de variables de RELACION y/o coordinacion
  • Las demas variables involucradas tambien son definidas por el programador. Es importante notar la correlacion que se tiene entre las variables usadas en las paginas del navegador y su uso dentro de los procesos correspondientes en el "otro programa". Esta correlacion debe ser establecida convenientemente por el programador y es crucial para una operacion practica y confiable Windows 2000 presento complicacion, la cual esta descrita en: 22. Solicito colaboraciones 20. Aprovechamiento de sistemas existentes Para los ejemplos de "18. Interfaz entre clipxnet.exe y otros sistemas" se usaron:
  • inter_01.exe: Creado especificamente
  • inter_02.exe: Creado usando funciones y procedimientos de sistemas existentes
  • htg3xnet.exe: Se tomo G_TEST3.prg del Modelo TGraph 3 y se hicieron ligeros cambios Lo hice de esta manera para mostrar que, aparte de crear sistemas nuevos, se pueden usar sistemas existentes de Clipper con o sin FW, los cuales existen en "cantidades industriales", o en otros lenguajes, para aprovechar el Modelo ClipNet-xNet Estos sistemas pueden ser adaptados para trabajar con el Modelo ClipNet-xNet en las formas ya presentadas previamente: ------------------------------------------------------------------------------------------- b.1. Modelo en Serie: La capa de interfaz lanza la ejecucion del otro programa y espera su termino. El otro programa se ejecuta cada vez que hay una peticion b.2. Modelo en Paralelo: El otro programa se encuentra en ejecucion continua atendiendo las peticiones provenientes de la capa de interfaz, como un "servidor de procesos" ------------------------------------------------------------------------------------------- La adaptacion de cualquier sistema existente debe cumplir dos requerimientos:
  • REQUERIMIENTO A: Aplicar una "capa de enlace" con el Modelo ClipNet-xNet
  • REQUERIMIENTO B: Orientar las "salidas" de los procesos al archivo de salida cArcSale Abundando sobre el Requerimiento A, vuelvo a incluir lo previamente señalado: Los programas inter_01.prg e inter_02.prg muestran algunas formas de aplicar este enlace ------------------------------------------------------------------------------------------- Las funciones y procesos incluidos en Inter_02.prg forman parte de una "capa de enlace" con el Modelo ClipNet-xNet y que Ustedes pueden incluir en sus sistemas para agregarles esta funcionalidad. En general esta formado por dos partes estructurales: + Una parte generica que es aplicable directamente a cualquier sistema + Otra parte particular que es especifica a las caracteristicas de cada sistema. En el programa de ejemplo esta constituida por la funcion CGIPROCESO(), donde se especifican los procesos diferenciados incluidos en cada sistema Si mantienen esta estructura y procesos les sera mas facil la aplicacion de la capacidad de enlace con el Modelo ClipNet-xNet Si se desarrollan en otros lenguajes, basta desarrollar procesos para que en forma similar lean los archivos de intercambio y analicen el contenido de los mismos, escribiendo posteriormente lo que se desee como "pagina HTML" en el archivo de salida cArcSale ------------------------------------------------------------------------------------------- Estos lineamientos son aplicables tanto al Modelo en Serie como al Modelo en Paralelo, y cualquira de ellos puede tener las "partes generica y particular" que se mencionan. La "parte generica" lee y prepara la informacion de intercambio, y la "parte particular" diferencia las operaciones dependiendo de las solicitudes recibidas Incluso pueden usarse los mismos programas para operar en modalidad Serie o Paralelo, mediante algunos parametros o archivos de configuracion Revisando el Requerimiento B: Las "salidas" de los procesos de los sistemas estan orientadas generalmente a la Pantalla, la Impresora, el archivo en disco, el puerto de comunicaciones, etc. La "clave" esta en orientar estas "salidas" hacia el archivo de salida cArcSale El nombre de este archivo en la variable cArcSale se obtiene mediante la "capa de enlace", junto con toda la demas informacion disponible desde ClipNet-xNet La "salida" enviada al archivo cArcSale generalmente estaria formateada como HTML, pero tampoco es obligatorio que lo este. Usando el redireccionamiento y sin la obligacion de usar formato HTML, es posible tener la mayoria de procesos de salida y reportes de los sistemas existentes aprovechandose con el modelo ClipNet-xNet. La adaptacion generalmente consiste en enviar a archivos temporales la informacion y resultados que "normalmente" irian a la impresora o a la pantalla, y una vez obtenidos estos archivos temporales, escribirlos en cArcSale junto con algun tipo de formateo HTML Los ejemplos del Modelo ClipNet-xNet tienen muchas variantes acerca de esta "salida" Un ejemplo sencillo es el mostrado en Inter_01.prg, que en forma reducida es: //Procesar y escribir informacion de salida SET CONSOLE OFF SET PRINTER TO (cArcSale) SET PRINTER ON QOUT('<HTML>') QOUT('<HEAD><TITLE>Modelo ClipNet: Prueba 01 de Interfaz con Modelo en Serie</TITLE>') QOUT(' <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">' ) QOUT(' <META NAME="Author" CONTENT="David Arturo Macias Corona">' ) QOUT('</HEAD>') QOUT('<BODY') //Escribir cualquier tipo de informacion resultante de los procesos y reportes QOUT( "Computadora: "+NETNAME()+", Fecha y hora: "+DTOC(DATE())+" "+TIME()+"<BR>" ) QOUT( "<BR>" ) QOUT( "Contenido de Archivo de entrada:<BR>" ) QOUT( "<PRE>" ) QOUT( MEMOREAD( cArcEntra ) ) QOUT( "</PRE>" ) QOUT('<BR>' ) QOUT('</BODY></HTML>' ) // Cerrar salida SET PRINTER OFF SET PRINTER TO SET CONSOLE OFF Si un proceso de este tipo se hacia "directo" a la impresora mediante SET PRINTER TO PRINTER, basta redireccionarlo al archivo cArcSale usando SET PRINTER TO (cArcSale) Si fuera conveniente usar algun archivo temporal intermedio, se puede hacer de esta manera: //Generar reporte en archivo temporal cArcTmp := SGArcTmp( ".tmp" ) SET CONSOLE OFF SET PRINTER TO (cArcTmp) SET PRINTER ON //Escribir cualquier tipo de informacion resultante de los procesos SET PRINTER OFF SET PRINTER TO SET CONSOLE OFF y luego escribirlo en cArcSale con un ligero formato de HTML: SET CONSOLE OFF SET PRINTER TO (cArcSale) SET PRINTER ON QOUT('<HTML>') QOUT('<HEAD><TITLE>Modelo ClipNet: Prueba 01 de Interfaz con Modelo en Serie</TITLE>') QOUT(' <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">' ) QOUT(' <META NAME="Author" CONTENT="David Arturo Macias Corona">' ) QOUT('</HEAD>') QOUT('<BODY') QOUT( "<PRE>" ) QOUT( MEMOREAD( cArcTmp ) ) QOUT( "</PRE>" ) QOUT('<BR>' ) QOUT('</BODY></HTML>' ) // Cerrar salida SET PRINTER OFF SET PRINTER TO SET CONSOLE OFF y borrar el archivo temporal: FERASE( cArcTmp ) Las marcas de HTML "PRE" y "/PRE" le indican al navegador que presente la informacion contenida entre ellas sin ningun cambio. Si no estuvieran estas marcas, el servidor Web suprime los codigos CR+LF, con lo que se "pierden" los cambios de linea del contenido En mis sistemas acostumbro usar variables, por ejemplo, lHTML, lesCGI u otras, para diferenciar cuando se debe enviar una salida para cArcSale y cuando no. De esta manera el mismo codigo me sirve para ClipNet-xNet o para el sistema "tradicional" Usando pseudo-codigo seria:
  • cArcTmp := IF( lHTML, SGArcTmp( ".tmp" ), "lpt1" )
  • Generar reporte en cArcTmp
  • Si es lHTML, escribir en cArcSale y borrar cArcTmp Ademas podran ver en los ejemplos que utilizo la funcion SGSALIDA0() para abrir y cerrar las "salidas", sean a archivos o dispositivos. Les recomiendo usarlas. El mismo tipo de adaptacion se puede aplicar a otros procesos y reportes. Por ejemplo, si se esta usando la salida a impresora: REPORT FORM mirepor.frm TO PRINTER FOR xFor WHILE xWhile HEADING cHeader Esto se puede modificar a: IF lHTML cArcTmp := SGArcTmp( ".tmp" ) REPORT FORM mirepor.frm TO (cArcTmp) FOR xFor WHILE xWhile HEADING cHeader SGSALIDA0( cArcSale ) QOUT('<HTML>') QOUT('<HEAD><TITLE>'+cHeader+'</TITLE>') QOUT(' <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">' ) QOUT(' <META NAME="Author" CONTENT="David Arturo Macias Corona">' ) QOUT('</HEAD>') QOUT('<BODY') QOUT( "<PRE>" ) QOUT( MEMOREAD( cArcTmp ) ) QOUT( "</PRE>" ) QOUT('<BR>' ) QOUT('</BODY></HTML>' ) // Cerrar salida SGSALIDA0() FERASE( cArcTmp ) ELSE REPORT FORM mirepor.frm TO PRINTER FOR xFor WHILE xWhile HEADING cHeader ENDI Exactamente lo mismo se puede aplicar a otros comandos que tienen "salida" a impresora y que se puede redirigir a archivos en disco, tales como: REPORT FORM ... LABEL FORM ... LIST TO ... DISPLAY TO ... COPY TO .... SDF, DELIMITED, DELIMITED WITH Para el caso de FiveWin la adaptacion es similar: Observacion: FiveWin para Clipper (16 bits) no soporta SET PRINTER, QOUT() y otros. En su lugar desarrolle SGSALIDA0(), YOUT(), YYOUT(), YYYOUT() y mas. Todos estan incluidos en Inter_02.prg Debe usarse SGSALIDA0() y YOUT(), YYOUT() en lugar de QOUT(), QQOUT(), etc. Yo las uso independientemente que el programa sea con Clipper o con Clipper+FW Hay algunas variables y funciones que tambien deben incluirse en sus programas para tener esta funcionalidad, y que estan incluidas en Inter_02.prg Si van a aplicar los programas con FiveWin, compilar usando las macros /DFIVEWIN y /DFIVECLIP, y sustituir QOUT(), QQOUT() por YOUT(), YYOUT() en los ejemplos previos, ademas de usar la funcion SGSALIDA0()
  • Si se esta usando TDosPrn o equivalentes - cArcTmp := IF( lHTML, SGArcTmp( ".tmp" ), "lpt1" ) - oPrn := TDosPrn():New(cArcTmp) - Generar reporte en cArcTmp usando oPrn - oPrn:End() - Si es lHTML, escribir en cArcSale y borrar cArcTmp
  • Si se esta usando REPORT oReport Usar la clausula TO FILE (cArcTmp) en forma similar al ejemplo de REPORT FORM ... Con lo anterior se puede observar que es muy facil adaptar "las salidas" para que sean usadas por el Modelo ClipNet-xNet Pero lo mismo tambien es aplicable para las "entradas", que generalmente son pantallas de condiciones para que el usuario especifique los valores bajo los cuales debe efectuarse determinado proceso o reporte: En estos casos la adaptacion es: IF lHTML Escribir marcas HTML tipo INPUT para cArcSale La escritura puede ser directamente en cArcSale o en un archivo temporal que luego se escribe en cArcSale ELSE Los clasicos: @ a, b SAY texto GET xVar .... ENDI Algunas marcas HTML tipo INPUT que pueden usar en las estructuras FORM son:
  • INPUT TYPE=TEXT Entradas numericas, de texto, fechas, logicas, ...
  • PASSWORD Claves de uso
  • TEXTAREA Textos grandes
  • RADIO Seleccion de una opcion entre varias
  • CHECKBOX Intercambio
  • SELECT Listas de seleccion
  • HIDDEN Asignar valores sin edicion
  • ... En los ejemplos para el Modelo ClipNet-xNet inclui una amplia variedad de marcas tipo INPUT de forma que les sirvieran de motivacion en su aplicacion Habiendo ya tomado en consideracion las adaptaciones a las "entradas" y las "salidas", se puede observar que es conveniente aplicar otro tipo de adaptaciones. Si se tiene un proceso que tiene la siguiente estructura: FUNCTION MiProceso( .... ) //Proceso para reportes //"Entrada" de datos @ a, b SAY texto GET xVar .... READ o ACTIVATE ... IF Cancelado RETU .F. ENDI //"Salida" de datos Se usa la salida habitual RETU .T. se puede cambiar a la siguiente estructura: FUNCTION MiProceso( .... ) //Proceso para reportes IF ! MiProc_E( ... ) RETU .F. ENDI MiProc_S( ... ) RETU .T. con lo cual se separan los procesos de "Entrada" y "Salida": FUNCTION MiProc_E( .... ) //"Entrada" de datos IF lHTML Escribir marcas HTML tipo INPUT para cArcSale La escritura puede ser directamente en cArcSale o en un archivo temporal que luego se escribe en cArcSale, como se explico previamente ELSE Los clasicos: @ a, b SAY texto GET xVar .... READ o ACTIVATE ... IF Cancelado RETU .F. ENDI ENDI RETU .T. FUNCTION MiProc_S( .... ) //"Salida" de datos IF lHTML Las condiciones para el reporte se toman de las variables CGI ELSE Las condiciones para el reporte se toman de las variables de MiProc_E( ) ENDI //Generar la informacion para el reporte IF lHTML La escritura puede ser directamente en cArcSale o en un archivo temporal que luego se escribe en cArcSale, como se explico previamente ELSE Se usa la salida habitual ENDI RETU .T. Al separar los procesos de "Entrada" y "Salida" en funciones independientes, estas pueden ser usadas directamente para uno u otro proceso, de manera que pueden especificarse como procesos diferenciados en la mencionada "parte particular" CGIPROCESO() de la "capa de enlace" con el Modelo ClipNet-xNet, demostrada en inter_02.prg Por otro lado, la "parte generica" de esta "capa de enlace" se encargo de obtener las variables CGI contenidas en el archivo cArcEntra En los ejemplos estan expuestos todos estos tipos de aplicacion Procediendo de esta manera tengo varios sistemas que pueden usarse en su totalidad en la forma "tradicional" o a traves de servidores Web Conforme vayan avanzando en la aplicacion del Modelo ClipNet-xNet con sus sistemas existentes, podran ir observando formas mas complejas de aprovechamiento 21. Modelo ClipNet-xNet y el "poder de Harbour" Cuando estaba por terminar la integracion de los trabajos para los capitulos 18 al 20, sus programas y ejemplos, el dia 22222 recibi un correo de Rafa R. Gaona donde me comento: "Nosotros estamos usando archivos .hrb ... y son muy rapidos " a lo cual le conteste: "Pensaba incluirlos pero no lo hice por diversas razones ..." Despues de eso estuve pensando que en realidad no hay razones fuertes para que el Modelo ClipNet-xNet no cuente con soporte de archivos "Harbour Portable Object (.hrb)", por lo que decidi incluir este soporte Mientras hacia la implementacion del soporte de archivos .hrb, observe que en realidad tampoco hay razones fuertes para que el modelo ClipNet-xNet no cuente con soporte de "Archivos fuente (.prg)", asi que tambien decidi incluir este soporte Con estas inclusiones, el Modelo ClipNet-xNet cuenta ahora con soporte para:
  • Archivos .fml: "Formula de PrgExt", como interprete en Servidor Web
  • Archivos .sgs: "Sistemas Genericos Script", como interprete en Servidor Web
  • Archivos .hs: "HarbourScript", como interprete en Servidor Web
  • Archivos .hrb: "Harbour Portable Object (.hrb)", como interprete en Servidor Web
  • Archivos .prg: "Archivos fuente (.prg)", como interprete en Servidor Web
  • Archivos .exe: "Archivos ejecutables", con el Modelo en Serie
  • Archivos .fml: "Formula de PrgExt", como interprete en linea de comandos
  • Archivos .sgs: "Sistemas Genericos Script", como interprete en linea de comandos
  • Archivos .hs: "HarbourScript", como interprete en linea de comandos
  • Archivos .hrb: "Harbour Portable Object (.hrb)", como interprete en linea de comandos
  • Archivos .prg: "Archivos fuente (.prg)", como interprete en linea de comandos
  • Archivos .exe: "Archivos ejecutables", con el Modelo en Serie Se aplico la siguiente ampliacion: Si se usa una liga con metodo GET que tenga una expresion del tipo: clipxnet.exe?proceso.ext¶m .... se revisa si el primer parametro tiene las extensiones .fml, .sgs, .hs, .hrb, .prg, y en ese caso se asume que es un proceso a ejecutar directamente Una aplicacion de este tipo permite "ejecutar" un archivo especificado sin necesidad de que clipxnet.exe este asignado como "filtro interpretador" para el Servidor Web Simplemente se solicita la ejecucion de clipxnet.exe para que a su vez ejecute el archivo especificado si es que tiene la extension permitida Algunos ejemplos son: http://127.0.0.1/cgi-bin/clipxnet.exe?miprogr.hrb http://127.0.0.1/cgi-bin/clipxnet.exe?\xitami\webpages\clipnet.sgs http://127.0.0.1/cgi-bin/clipxnet.exe?\xitami\webpages\multiply.hs http://127.0.0.1/cgi-bin/clipxnet.exe?\xitami\webpages\prgxnet.hrb http://127.0.0.1/cgi-bin/clipxnet.exe?\xitami\webpages\prgxnet.prg http://127.0.0.1/cgi-bin/clipxnet.exe?\xitami\inter_01.prg Observaciones:
  • Win32 y OS/2 usan CHR(13)+CHR(10) como identificador de cambio de linea, en tanto que Linux usa CHR(10) para el mismo proposito. Esto causa el problema de que no se puedan usar directamente los archivos creados en Win32 - OS/2 en Linux y viceversa, hasta que se cambien estos identificadores
  • Para evitar este conflicto, el Modelo ClipNet-xNet cuenta con los procesos necesarios para que los archivos ".fml, .sgs, .hs, y .prg" puedan usarse directamente y sin cambios, independientemente de si fueron creados en Win32 - OS/2 o Linux Por esta razon no es necesario aplicar adaptaciones para cambiar los identificadores
  • Un archivo "Harbour Portable Object (.hrb)" creado en Win32, OS/2 o Linux puede ser usado directamente en las plataformas restantes, sin cambios
  • En base a lo anterior, los archivos ".fml, .sgs, .hs, .hrb, .prg" son considerados como de "plataforma neutra" en Win32, OS/2 y Linux, y cumple con el proposito de que el Modelo ClipNet-xNet sea "multiplataforma" en el mismo sentido en que Harbour lo sea 21a. Ejemplo de Modelo en Serie Como comparacion, se repite el "18a. Ejemplo de Modelo en Serie" La formula Inter_01.fml es una interfaz sencilla que cuenta con los tres elementos necesarios en la interfaz. En este caso la interfaz LANZA la ejecucion del programa inter_01.exe, el cual hace la representacion del "otro programa". El programa inter_01.exe debe estar en el directorio donde esta ubicado clipxnet.exe (o clipxnet en Linux Apache) Recordar que este "otro programa" puede ser tan complejo como se desee y puede hacerse con cualquier lenguaje de programacion que sea conveniente. En este ejemplo inter_01.exe esta hecho con Harbour y se incluye el programa fuente Con la proposito de darle a la formula inter_01.fml la capacidad de aplicacion generica, puede usarse la variable CGI de nombre CGIEJEC para definir el archivo ejecutable que debe usarse como el "otro programa". Por omision es Inter_01.exe De esta manera puede usarse inter_01.fml como la capa generica de interfaz en serie a la que se le pueden definir diferentes archivos ejecutables segun los requerimientos del proceso. Esta variable CGIEJEC puede usarse en metodos GET o POST GET: Liga inter_01.fml?CGIEJEC=miprogr.exe POST: ACTION=inter_01.fml INPUT ... NAME=CGIEJEC VALUE=miprogr.exe Al tener la posibilidad de aplicar cualquier archivo ejecutable conveniente se tiene un enorme potencial de aplicacion Prueba 01 de Interfaz con Modelo en Serie 21b. Ejemplo con "Harbour Portable Object (.hrb)" Se repite el ejemplo anterior usando "Harbour Portable Object (.hrb)" La formula Inter_01.fml es una interfaz sencilla que cuenta con los tres elementos necesarios en la interfaz. En este caso la interfaz LANZA la ejecucion del "programa" inter_01.hrb, el cual hace la representacion del "otro programa". El "programa" inter_01.hrb debe estar en el directorio donde esta ubicado clipxnet.exe (o clipxnet en Linux Apache) En este ejemplo inter_01.hrb esta hecho con Harbour y se incluye el programa fuente, que es el mismo programa fuente para inter_01.exe Con la proposito de darle a la formula inter_01.fml la capacidad de aplicacion generica, puede usarse la variable CGI de nombre CGIEJEC para definir el archivo ejecutable que debe usarse como el "otro programa". Se esta usando para aplicar "inter_01.hrb" De esta manera puede usarse inter_01.fml como la capa generica de interfaz en serie a la que se le pueden definir diferentes archivos ejecutables segun los requerimientos del proceso. Esta variable CGIEJEC puede usarse en metodos GET o POST GET: Liga inter_01.fml?CGIEJEC=miprogr.exe POST: ACTION=inter_01.fml INPUT ... NAME=CGIEJEC VALUE=miprogr.exe Al tener la posibilidad de aplicar cualquier archivo ejecutable conveniente se tiene un enorme potencial de aplicacion Ejemplo con "Harbour Portable Object (.hrb)" 21c. Ejemplo con "Archivos fuente (.prg)" Se repite el ejemplo anterior usando "Archivos fuente (.prg)" La formula Inter_01.fml es una interfaz sencilla que cuenta con los tres elementos necesarios en la interfaz. En este caso la interfaz LANZA la ejecucion del "programa" inter_01.prg, el cual hace la representacion del "otro programa". El "programa" inter_01.prg debe estar en el directorio donde esta ubicado clipxnet.exe (o clipxnet en Linux Apache) En este ejemplo inter_01.prg es el programa fuente que se usa para inter_01.exe e inter_01.hrb Con la proposito de darle a la formula inter_01.fml la capacidad de aplicacion generica, puede usarse la variable CGI de nombre CGIEJEC para definir el archivo ejecutable que debe usarse como el "otro programa". Se esta usando para aplicar "inter_01.prg" De esta manera puede usarse inter_01.fml como la capa generica de interfaz en serie a la que se le pueden definir diferentes archivos ejecutables segun los requerimientos del proceso. Esta variable CGIEJEC puede usarse en metodos GET o POST GET: Liga inter_01.fml?CGIEJEC=miprogr.exe POST: ACTION=inter_01.fml INPUT ... NAME=CGIEJEC VALUE=miprogr.exe Al tener la posibilidad de aplicar cualquier archivo ejecutable conveniente se tiene un enorme potencial de aplicacion Ejemplo con "Archivos fuente (.prg)" Observaciones generales:
  • Se dispone de la funcion: SGHrbRun( cHRBArchivo, xParam1, xParam2, xParam3, xParam4, xParam5, xParam6, xParam7, xParam8, xParam9 ) para "ejecutar" archivos "Harbour Portable Object (.hrb)" y "Archivos fuente (.prg)", la cual devuelve un valor de retorno
  • Se asume que el "entorno Harbour": compilador, SET INCLUDE, SET LIB, etc. estan disponibles para compilar los "Archivos fuente (.prg)" En algunos casos puede bastar el copiar el archivo ejecutable Harbour.exe (o harbour en Linux), al directorio donde esta ubicado clipxnet.exe (o clipxnet en Linux Apache)
  • Para compilar los "Archivos fuente (.prg)" se estan usando los "switches": "/m /n /gh /q0" Como es conveniente y algunos usuarios ocuparan usar sus propios "switches": - Inclui en Inter_02.prg el codigo fuente de SGHrbRun( ) para que el usuario pueda hacer su propia funcion con sus "switches" convenientes - En la formula inter_01.fml inclui una "Forma alternativa" deshabilitada, para que el usuario pueda aplicar su propio proceso de compilacion de "Archivos fuente (.prg)" a archivos "Harbour Portable Object (.hrb) Esta "Forma alternativa" podran aplicarla en sus propias formulas y procesos, sin necesidad de usar o crear su propia funcion equivalente a SGHrbRun( )
  • Como los archivos "Harbour Portable Object (.hrb)" y "Archivos fuente (.prg)" se ejecutan dentro del "entorno" del Modelo ClipNet-xNet, como si fueran unas funciones mas que se hayan agregado al momento de "enlazar", disponen de acceso a todas las variables, funciones y procedimientos que existen en clipxnet.exe, ademas de todos los de Harbour
  • La inclusion del soporte de "Harbour Portable Object (.hrb)" y "Archivos fuente (.prg)" se hace que ya no sea tan determinante el uso de PrgExt, debido a que los procesos equivalentes pueden ser hechos desde archivos .prg o archivos .hrb
  • Como beneficios adicionales se tiene el soporte de pre-procesamiento y uso de comandos, que son ventajas fundamentales sobre PrgExt. Aun asi, sigue siendo "vital" el uso de PrgExt para lanzar la "ejecucion" de los archivos .hrb y .prg
  • Por lo tanto, no se descontinua el uso de PrgExt:Programacion Externa, sino que se convierte en un herramienta para un "entorno cooperativo" con los diferentes soportes de los que dispone el Modelo ClipNet-xNet
  • La inclusion del soporte de "Harbour Portable Object (.hrb)" permite que muchos usuarios que ya estan habituados a usarlos puedan seguirlo haciendo con el Modelo ClipNet-xNet, y el soporte de "Archivos fuente (.prg)" amplia aun mas el potencial de aprovechamiento
  • Como esta inclusion ha "afectado" a la documentacion y ejemplos previos a su inclusion, he hecho las adecuaciones correspondientes a la documentacion y ejemplos convenientes, las cuales pueden localizar rapidamente mediante la etiqueta "Insercion 20030723" Es evidente que el mensaje de Rafa R. Gaona (http://www.itc-viajes.net) fue muy oportuno Aunque ya le habia agregado al Modelo ClipNet-xNet caracteristicas y ejemplos que aumentan su potencial de aplicacion, la inclusion del soporte de "Harbour Portable Object (.hrb)" y "Archivos fuente (.prg)" le proporcionan un potencial enorme: el uso directo del "poder de Harbour" 22. Solicito colaboraciones Los trabajos para esta presentacion del Modelo ClipNet-xNet han sido muy amplios, y la diversidad de situaciones debido a las diferentes plataformas y servidores Web tambien ha sido muy abundante, como era de esperarse. Ha habido situaciones que van desde lo simpatico hasta lo incomprensible Hasta el momento he resuelto todas las complicaciones que se han presentado Sin embargo, al estar analizando y tratando de resolver las ultimas tres o cuatro de ellas para dar por concluido el trabajo, despues de haber dedicado varios dias a encontrar las causas pero aun no las soluciones practicas, pense que tal vez era buena oportunidad de:
  • Recurrir a los "expertos", sobre todo en Linux David G. Holm ya hizo su cooperacion
  • Propiciar que otras personas colaboren en la resolucion de estas situaciones faltantes y que tal vez proporcionen soluciones mas practicas y versatiles En vista de esta oportunidad, tambien conviene que participen en otros pendientes, asi que hice una breve lista de lo que queda por resolver, y donde es aplicable, las causas que encontre y que pueden servir como base para resolverlo. Las alternativas aplicadas deben de comunicarmelas para integrarlas al Modelo ClipNet-xNet a) Traduccion de este documento al ingles Yo puedo hacer la traduccion, pero resulta muy laborioso Si algunos quieren cooperar, o conocen personas que saben o estan estudiando ingles y ocupan practicar, esta es una buena oportunidad Se puede traducir por secciones y posteriormente irlas integrando. Lo mas urgente es la traduccion de las secciones con las instrucciones de preparacion para los ejemplos para cada servidor Web Naturalmente que yo revisaria la traduccion resultante para mantener la coherencia en los aspectos tecnicos No se admiten "traducciones" hechas por software de traduccion b) Conflicto con IIS:Internet Information Server Durante la generacion de la grafica con el Modelo TGraph 3 y almacenamiento en un archivo tipo BMP, solo se visualiza en el navegador un rectangulo negro Causa probable: Al parecer IIS "bloquea" la "salida a pantalla" de la ventana con la grafica Encontre que IIS hace esta clase de "bloqueos" en otros procesos que tienen que ver con el entorno de ejecucion c) Conflicto con Windows 2000 Durante la generacion de la grafica con el Modelo TGraph 3 y almacenamiento en un archivo tipo BMP, cuando se aplica el Modelo en Paralelo: Se observo un conflicto cuando se usa Windows 2000, y probablemente suceda lo mismo con los demas Windows de 32 bits: Windows XP, 2003, .... En Windows 98 no ocurre este conflicto: En bastantes ocasiones, cuando el "otro" programa lanza el programa de generacion de graficas con FiveWin, Windows "bloquea" que la ventana del programa de generacion de graficas sea la ventana "en foco", y superpuesta a todas las demas. Esto ocasiona que la imagen guardada como archivo BMP sea el contenido del escritorio que corresponde a la zona donde debia haberse dibujado la ventana de la grafica, y no sea el contenido de la ventana de la grafica, por lo tanto no se obtiene el contenido de la grafica No se ha encontrado la causa, patron o razones de este comportamiento ni como controlarlo Lo que si se ha observado, es que la ventana de la grafica si se superpone en todas las ocasiones si se tienen las siguientes situaciones:
  • La sesion que ejecuta el "otro" programa es la ventana "en foco"
  • o, todas las ventanas se encuentran "minimizadas" Si no se tiene cualquiera de estas dos situaciones, eventualmente no se obtiene el contenido de la grafica o se obtiene parcialmente con algunas otras ventanas superpuestas Esto representa un conflicto menor en una maquina servidor Web, ya que generalmente no tendra otras ventanas abiertas que provoquen que Windows "bloquee" que la ventana de la grafica se superponga a las demas. d) Conflicto con IIS:Internet Information Server Los mensajes generados por Harbour al terminar la ejecucion de clipxnet.exe son "anexados" por IIS al contenido final de la pagina HTML Causa probable: Al parecer IIS "controla" la "salida a consola" de la sesion del ejecutable Encontre que IIS hace esta clase de "bloqueos" en otros procesos que tienen que ver con el entorno de ejecucion e) Conflicto con Apache para Linux Al intentar generar una grafica de los ejemplos del Modelo TGraph 3, se produce un error de ejecucion, debido a que no se tienen permisos de escritura Solucion: habilitar permisos de escritura para Grupo y Otros en el directorio especificado inter_06.fml y tg3xnet.fml, el cual generalmente es: /var/www/html f) Conflicto con Apache para Linux sh: line 1: wine: command not found Se produce al intentar generar una grafica de los ejemplos del Modelo TGraph 3 Para generar la grafica de TGraph 3 se ejecuta el programa por omision htg3xnet.exe mediante wine, y al no poderse ejecutar no se genera la grafica wine si existe, pero Apache para Linux no lo localiza Esto funciona perfectamente usando Xitami Web Server para Unix Causa probable: obviamente es un asunto de configuracion de Apache g) Conflicto con Apache para Linux sh: line 1: inter_01.exe: command not found Se produce al probar 18a. Ejemplo de Modelo en Serie inter_01.exe o cualquier otro programa "en Serie" no se ejecuta inter_01.exe si existe, pero Apache para Linux no lo localiza Esto funciona perfectamente usando Xitami Web Server para Unix Causa probable: obviamente es un asunto de configuracion de Apache h) Conflicto con Apache para Linux (13)Permission denied: file permissions deny server access: /var/www/html/tg31.jpg Se produce al probar 19c. Ejemplo 6 de Modelo en Paralelo con TGraph 3 El "otro programa" inter_02.exe si genera la grafica, pero Apache no puede accesarla Esto funciona perfectamente usando Xitami Web Server para Unix Causa probable: obviamente es un asunto de configuracion de Apache Aunque el directorio /var/www/html/ tiene habilitados los permisos para todos, Apache, que tiene el usuario y grupo "apache" no puede leer la grafica creada con "root" 23. Marzo 2004: Ampliacion del Modelo ClipNet-xNet En los ultimos meses se han hecho modificaciones y ampliaciones de las capacidades del Modelo ClipNet-xNet. Se ha insistido en que la mayoria de estas ampliaciones esten disponibles en las tres plataformas: Win32, OS/2 y Linux 23a. Cambio de estructura de programas Debido a que Clipxnet.exe se hizo como una reduccion del modelo general de ClipNet-xNet, este quedo constituido por un solo programa compuesto de procedimientos propios y otros tomados de SisGen:Sistemas Genericos. Esto causaba una dificultad para sincronizar el mantenimiento de procedimientos y una carencia en Clipxnet de procedimientos complejos ya existentes en SisGen. Se hizo una re-estructuracion de Clipxnet de manera que compartiera programas y codigo ya existente en SisGen. Con esto se logro:
  • Uniformidad de codigo entre Clipxnet y SisGen
  • Facilidad de mantenimiento continuado al codigo de Clipxnet
  • Inclusion de una gran cantidad de procedimientos fundamentales y complejos ya existentes en SisGen, con lo que se incrementan bastante las capacidades de Clipxnet 23b. Actualizacion basada en codigo de Harbour Uno de los propositos de la presentacion de Clipxnet es apoyar el desarrollo de Harbour Debido a este proposito, se tiene la intencion de actualizar regularmente Clipxnet con el codigo actualizado de Harbour Los programas de Clipxnet actualizados estan hechos con el codigo de Harbour vigente al dia 9 Marzo 2004, en sus tres plataformas: Win32, OS/2 y Linux 23c. Actualizacion del soporte de ADS Los programas de Clipxnet actualizados estan a su vez actualizados en el soporte de ADS, para usar las caracteristicas de ADS 6.2x, en sus dos plataformas: Win32, y Linux Se incluyen los archivos DLL de ADS 6.2x para Win32 23d. Soporte de HbComm.lib Valido unicamente en clipxnet para Win32 Los programas de Clipxnet actualizados para Win32 cuentan con soporte de HbComm.lib, de Julio 2003 con documentacion actualizada en Octubre 2003 Este soporte le brinda a los usuarios de Clipxnet la posibilidad de consultar, accesar y/o controlar dispositivos con acceso por puerto serie, como basculas, equipos de instrumentacion y control industrial, equipos de laboratorios medicos o especializados, etc. El uso del soporte de HbComm en Clipxnet es igual que en cualquier otro programa que use HbComm. Los parametros de comunicacion serial pueden ser fijos en el programa o dados a Clipxnet a traves de variables CGI Observaciones:
  • El archivo README.txt para HbComm, de fecha 24 Octubre 2003, tiene algunas correcciones hechas por Luiz Culik y/o Luis Krause Mantilla
  • El programa PORTA.prg de ejemplo en HbComm NO coincide con el uso de funciones y parametros actuales de HbComm. La diferencia basica es que no usa el manejador necesario para diferenciar multiples puertos Por lo tanto, es necesario hacer modificaciones a PORTA.prg
  • Incluyo en Clipxnet el programa PbaComm.prg que hice, basado en PORTA.prg, para hacer pruebas. Ya incluye el uso correcto de funciones y parametros actuales de HbComm, y puede usarse como prototipo para el desarrollo de sus propios programas que hagan uso del soporte de HbComm en Clipxnet Mis modificaciones estan marcadas con la etiqueta "DAVID:", para una consulta rapida Algunos ejemplos del uso del soporte de HbComm en Clipxnet: a) Una pagina que solicite el peso determinado en alguna bascula b) Una pagina con refrescamiento que regularmente solicite los pesos determinados en diferentes basculas y los presente en una sola pagina en el navegador c) Una pagina que permita enviarle valores de operacion a algun equipo de medicion o control, por ejemplo para cambiar la presion, volumen, temperatura, velocidad, etc. Esto constituiria la administracion de equipos mediante sistemas HTML disponibles desde cualquier parte del mundo 23e. Soporte de Cookies Por la sugerencia e insistencia de Rafa R. Gaona, le agregue soporte de Cookies a Clipxnet Esta adicion le proporciona a Clipxnet un mayor potencial de aprovechamiento De acuerdo a la documentacion de Netscape: "Cookies son un mecanismo general el cual las conexiones por el lado del servidor (como programas CGI) pueden usar para almacenar y recuperar informacion en el lado del cliente de la conexion. La adicion de un simple, persistente, estado por el lado del cliente extiende significativamente las capacidades de aplicaciones Cliente/Servidor basadas en Web. Un servidor, cuando retorna un objeto HTTP a un cliente, puede tambien enviar una pieza de informacion de estado la cual el cliente almacenara. Incluido en ese objeto de estado esta una descripcion del rango de URLs para el cual el estado es valido. Cualquier peticion HTTP futura hecha por el cliente que este dentro del rango incluira la transmision del valor actual del objeto de estado desde el cliente de regreso al servidor. El objeto de estado es llamado cookie, por ninguna razon especifica. Una cookie es introducida al cliente por medio de la inclusion de una cabecera Set-Cookie como parte de una respuesta HTTP, tipicamente esta sera generada por un programa CGI" En otras palabras, el servidor Web envia informacion al navegador para que sea almacenada por este localmente, y la envie de regreso al servidor Web en conexiones posteriores La sintaxis de la cabecera de respuest HTTP tipo Set-Cookie es: Set-Cookie: NAME=VALUE; expires=DATE; path=PATH; domain=DOMAIN_VALUE; secure Existen limitaciones en el numero de Cookies que un cliente puede almacenar a cualquier tiempo (ignoro si estos valores son vigentes):
  • 300 cookies totales
  • 4 kilobytes por cookie
  • 20 cookies por servidor o dominio Las Cookies en ClipxNet tienen dos clasificaciones: a) Cookies primarias. Son aquellas que se especifican por un proceso primario, el cual es aquel que es efectuado directamente por Clipxnet, mediante archivos .sgs, .hs, .fml, .hrb y .prg. Clipxnet conoce directamente la especificacion de Cookies solicitadas b) Cookies secundarias. Son aquellas que se especifican por un proceso secundario, el cual es aquel que es efectuado indirectamente por Clipxnet, mediante archivos .exe en Modelo en Serie, o programas "servidores de procesos" en Modelo en Paralelo En este caso el proceso secundario necesita comunicar a Clipxnet cuales son las Cookies que desea establecer, y por lo tanto se implemento un mecanismo para comunicar esta informacion Como establecer una Cookie primaria: SGSetCookie( NAME, VALUE, expires, path, domain, secure ) donde: NAME: Nombre de la Cookie VALUE: Valor de la Cookie NAME y VALUE son obligatorios. Son una secuencia de caracteres excluyendo punto y coma, coma, y espacios en blanco. Si es necesario poner tales datos en el nombre o valor, se recomienda usar algun metodo de codificacion como el estilo %XX de URL - Clipxnet convierte los espacios a caracter "+" - Si se recibe un valor nulo para VALUE, Clipxnet asume que se desea borrar la cookie expires Especifica una cadena de fecha que define el tiempo de vida valido de esa cookie. Una vez que la fecha de expiracion ha sido alcanzada, la cookie ya no se almacenara o proporcionara. La cadena de fecha esta formateada como: Wdy, DD-Mon-YYYY HH:MM:SS GMT expires es un atributo opcional. Si no se especifica, la cookie expirara cuando la sesion del usuario termine Clipxnet puede recibir los siguientes valores para expires: - Cadenas DATE, TODAY, NOW, HOY Se asigna la fecha actual como fecha de expiracion - Cadena TOMORROW Se asigna la fecha actual + 1 como fecha de expiracion - Cadena ETERNO Se asigna la fecha actual + 20 años como fecha de expiracion - Cualquier otra cadena Se asume una expresion valida para expires - Si se recibe o reasigna tipo de dato fecha, esta se convierte a una cadena en el formato: Wdy, DD-Mon-YYYY HH:MM:SS GMT domain Cuando se busca en la lista de cookies por cookies validas, se hace una comparacion de los atributos domain de las cookies contra el nombre de dominio de Internet del anfitrion desde el cual el URL sera tomado. Si hay una coincidencia, entonces la cookie ira a traves de la coincidencia de path para determinar si sera enviada El valor por omision de domain es el nombre de host del servidor que genera la peticion para la cookie Clipxnet usa cualquier cadena de caracteres para domain path El atributo path es usado para especificar el subconjunto de URLs en un dominio para el cual la cookie es valida. El path "/" es el mas general Si no se especifica path, es asumido que es el mismo path del documento siendo describido por la cabecera que contiene la cookie Clipxnet usa cualquier cadena de caracteres para path secure Si una cookie es marcada secure, solo sera transmitida si el canal de comunicaciones con el anfitrion es uno seguro, por ejemplo, servidores HTTPS Si no se especifica secure, una cookie es considerada segura para ser enviada en canales no seguros Clipxnet usa cualquier valor especificado no nulo para asignar atributo secure Si se quiere ver cual es la forma de la Cookie con los diferentes parametros usar: QOUT( SGMkCookie( NAME, VALUE, expires, path, domain, secure ) ) Como establecer una Cookie secundaria: Una Cookie secundaria queda especificada dentro de las marcas: especificacion de una o mas cookies Si se especifican mas de una Cookie, debe usarse la cadena ;; como delimitador Clipxnet analizara los textos para encontrar las Cookies secundarias y convertirlas a Cookies primarias Se tienen dos maneras de especificar una Cookie secundaria: 1.- Mediante la funcion SGSecCookie(), en la forma: SGSecCookie( NAME, VALUE, expires, path, domain, secure ) SGSecCookie() aplica automaticamente las marcas delimitadoras y Si se quiere ver cual es la forma de la Cookie con los diferentes parametros usar: QOUT( SGMkCookie( NAME, VALUE, expires, path, domain, secure ) ) 2.- Mediante escritura directa - Escribir la marca - Escribir la Cookie en la forma: NAME=VALUE; expires=DATE; path=PATH; domain=DOMAIN_VALUE; secure - Si se escribe mas de una Cookie, usar ;; para separarlas - Escribir la marca Como obtener el valor de una Cookie: Clipxnet analiza la variable HTTP_COOKIE para determinar las Cookies enviadas por el Navegador (cliente), y las asigna a la lista general de variables CGI El valor de la Cookie se obtiene de la misma manera en que se obtiene el valor de una variable CGI, usando: SGCGIVARIA( "nombre de la Cookie" ) Ejemplo: cMiCookie := SGCGIVARIA( "MICOOKIE" ) Ejemplos de definicion de Cookies: //Cookies primarias SGSetCookie( "PRIMA1","Cookie primaria 1" ) SGSetCookie( "PRIMA2","Cookie primaria 2" ) //Cookies secundarias: marcas en texto QOUT( SGSecCookie( "SECUN1","Cookie secundaria 1" ) ) QOUT( SGSecCookie( "SECUN2","Cookie secundaria 2" ) ) //Cookies secundarias escritas manualmente QOUT( '' ) QOUT( 'MANUAL1=Cookie manual 1' ) QOUT( 'MANUAL2=Cookie manual 2' ) QOUT( '' ) QOUT( 'MANUAL3=Cookie manual 3 ;;' ) QOUT( 'MANUAL4=Cookie manual 4 ;;' ) //Otras cookies con mas parametros SGsetcookie( "cookie[tres]", "cookietres" ) SGsetcookie( "cookie[dos]", "cookiedos", DATE()+5 ) SGsetcookie( "cookie[una]", "cookieuna", "today" ) El codigo anterior forma parte del archivo cookies.fml, el cual se puede usar para probar las Cookies llamando el archivo cookies.fml desde el navegador Nota: Hasta la segunda llamada del archivo se tienen las Cookies Prueba de cookies Complicaciones del soporte de Cookies en Clipxnet:
  • Aunque la implementacion basica es sencilla, tuvo que cambiar mucho la estructura de ClipxNet por la arquitectura que tiene y las modalidades de operacion que maneja La principal perdida es que ya no se puede usar OUTSTD(), porque debe revisarse la "salida" para detectar las Cookies que se enviaran en las cabeceras HTTP En consecuencia, ya no se debe usar directamente OUTSTD(). Para aproximar un poco el comportamiento con OUTSTD(), en Clipxnet se hace lo siguiente: * Clipxnet usa un archivo temporal en disco de extension *.std para que el usuario pueda escribir en el lo que normalmente escribiria con OUTSTD() al dispositivo STDOUT * Se debe usar la funcion SGOutStd() para escribir en este archivo temporal Se modificaron los ejemplos de Clipxnet para reflejar este comportamiento
  • En Xitami para Linux la variable HTTP_COOKIE siempre tiene un valor nulo, por lo que es imposible conocer las Cookies y sus valores. A pesar de esto, las Cookies si fueron escritas correctamente por el navegador Por lo tanto, no se pueden usar Cookies en Xitami para Linux
  • No es posible determinar si una Cookie fue primaria o secundaria, o cual de los procesos secundarios establecio determinada Cookie secundaria Por lo tanto, todas las Cookies son difundidas a todos los procesos, independientemente de que sean primarios o secundarios 23f. Soporte de MySQL Por la sugerencia e insistencia de Rafa R. Gaona, le agregue soporte de MySQL a Clipxnet Esta adicion le proporciona a Clipxnet un mayor potencial de aprovechamiento El soporte de MySQL esta basado completamente en el trabajo de Maurilio Longo, que hizo como una contribucion al desarrollo de Harbour. Dicho trabajo pueden encontrarlo en el directorio de los programas fuente de Harbour: harbour\contrib\mysql En el archivo README.txt encontraran la forma de aplicarlo Como en Clipxnet ya quedo incluido este trabajo, ya no es necesario crear librerias o hacer alguna otra operacion para implementarlo, sino simplemente usarlo desde Clipxnet El desarrollo hecho por Maurilio Longo esta compuesto de dos elementos:
  • Funciones de bajo nivel
  • Clases, contenidas en: TMySQL.prg: TMySQLRow, TMySQLQuery, TMySQLTable, TMySQLServer TSQLBrw.prg: TBColumnSQL, TBrowseSQL Se puede usar con cualquiera de los elementos para hacer las operaciones, y en Clipxnet es valido usar las funciones de bajo nivel y/o las clases Debido a que observe algunas inconveniencias en el codigo de TMySQL.prg y en algunos procesos, hice modificaciones a los mismos. Se incluye en los archivos de Clipxnet los archivos modificados para el soporte de MySQL, junto con los demas archivos integrantes del trabajo de Maurilio Longo Para facilitar la revision de las modificaciones, hice dos actividades:
  • TMySQL.prg y TSQLBrw.prg: Se marcaron los lugares de las modificaciones con la etiqueta "DAVID:", ademas de agregar algunos comentarios convenientes
  • En el archivo DIFER.txt incluido se describen todos los cambios hechos y el sentido de las aplicaciones Estas modificaciones estan completamente integradas en Clipxnet El soporte de MySQL en Clipxnet fue probado y funciona correctamente con: Win32: MySQL 3.23.57 para Win32 OS/2: MySQL 3.23.50 para OS/2 Linux: MySQL 3.23.47 para Linux, usando Mandrake 8.2 23g. Actualizacion de Clipxnet existente Si ya se tiene una instalacion de Clipxnet funcionando, para aplicar las nuevas modificaciones refierase a estas indicaciones:
  • Configuracion del Servidor Web. No requiere cambios
  • Copiar el nuevo programa clipxnet.exe correspondiente al sistema operativo y soportes incluidos, ya sea ADS y/o MySQL. Debido a que se tienen diferentes versiones del archivo clipxnet.exe, se tienen tambien varios directorios con los archivos correspondientes
  • Si se esta aplicando soporte de ADS y/o MySQL, copiar los archivos DLLs correspondientes de acuerdo al tipo de sistema operativo. En el caso de ADS, hubo cambio de version de 5.7 a 6.2x y por lo tanto se usan otros DLLs
  • Copiar todos los archivos de clipxnet\webpages al directorio correspondiente donde se esten usando las paginas HTML
  • Copiar el nuevo programa harbour.exe correspondiente al sistema operativo Si se tiene una version superior a 9 Marzo 2004, puede usarse en lugar de la de Clipxnet 24. Ejemplos adicionales Basicamente los ejemplos adicionales de ClipxNet estan centrados en mostrar en forma conjunta los procesos de ABC-C: Alta/Baja/Cambios/Consulta, tambien conocidos como "Mantenimiento" Con la ampliacion del Modelo ClipNet-xNet, tambien se desarrollaron ejemplos que mostraran las nuevas funcionalidades, ademas de algunos que sirvieran de apoyo en los procesos de conversion de datos entre bases de datos DBF y MySQL Los ejemplos adicionales, al igual que los anteriores, les pueden servir de modelo para sus propios sistemas en Win32, OS/2 y Linux 24a. Prueba de cookies Este ejemplo se hizo para probar las diferentes modalidades de peticion de cookies implementadas en Clipxnet Nota: Hasta la segunda llamada del archivo se tienen las Cookies Prueba de cookies 24b. Biblioteca escolar Hace tiempo me preguntaron sobre un sistema para biblioteca escolar que fuera "facil de usar". Como no conozco ninguno, en dos o tres tardes hice un prototipo con ClipxNet que despues detallaria para agregarle funcionalidades Lo interesante de este ejemplo es que usa un campo clave para busquedas y control de procesos Basta que cambien la base de datos, el nombre del campo clave y algunos textos para que lo usen en sus propios sistemas con control por campo clave Este es un excelente ejemplo de procesos de ABC-C: Alta/Baja/Cambios/Consulta Biblioteca Escolar 24c. Taller de computadoras Basado en el sistema de Biblioteca escolar, bastaron tres horas para hacer el sistema para el taller de computadoras Lo interesante de este ejemplo es que genera el campo clave durante las Altas, al igual que ocurriria con un sistema de facturas, visitas, reportes, pacientes, etc. Otros aspectos interesantes es que muestra los registros por campos predefinidos y que el listado tiene indicadores visuales basados en las caracteristicas de los registros incluidos Basta que cambien la base de datos, el nombre del campo clave y algunos textos para que lo usen en sus propios sistemas con control por campo clave Este es un excelente ejemplo de procesos de ABC-C: Alta/Baja/Cambios/Consulta Taller de computadoras 24d. Hojear y editar una base de datos DBF El ejemplo: 17j. Hojear una base de datos DBF, ya obsoleto, resulto ser uno de los mas interesantes porque permite hojear cualquier base de datos tipo DBF, mostrando las capacidades de Clipxnet. Es muy evidente que una ampliacion natural de esta aplicacion resultaba ser la inclusion de procesos de ABC-C: Alta/Baja/Cambios/Consulta, y asi se hizo La aplicacion esta conformada por las formulas conddbf.fml y visuadbf.fml conddbf.fml es una "pantalla de condiciones" generica que mediante un elemento FORM permite introducir informacion que sera enviada al Servidor Web y este a visuadbf.fml visuadbf.fml es un proceso generico de visualizacion/edicion que puede aplicar ABC-C opcionalmente a cualquier archivo tipo DBF en cualquier parte del mundo Incluso se puede caracterizar el contenido de informacion que edita/visualiza, lo que lo convierte en uno de los prototipos mas versatiles y poderosos para ClipxNet Las consultas pueden hacerse por paginas completas tipo Hojeador (browse) o por registros individuales Esta basado en el numero de registro, y puede facilmente modificarse para usar otros metodos de control, por ejemplo, campo(s) clave Hojear y editar una base de datos DBF 24e. Condiciones especificas pre-definidas Ya habran observado que conddbf.fml del ejemplo anterior es simplemente una "pantalla frontal" o "interfaz de usuario", para definir los valores que se usaran en visuadbf.fml, y que esta interfaz puede ser facilmente sustituida por cualquier otra de propositos especificos En este ejemplo la formula abcc.fml muestra un conjunto de opciones que tienen valores pre-definidos, y todas las opciones son procesadas por visuadbf.fml En sentido estricto, equivale a un menu de un sistema que accesa a diferentes archivos y procesos, pudiendo editar en algunos y en otros unicamente consultar, dependiendo de su caracterizacion y los contenidos de cada opcion Ya habran captado la idea Condiciones especificas pre-definidas 24f. Hojear y editar bases de datos DBF o MySQL La inclusion en Clipxnet del soporte de MySQL hizo conveniente la adaptacion del proceso de visualizacion/edicion de archivos tipo DBF, para visualizar/editar bases de datos tipo MySQL Aun mas conveniente resulto ser la combinacion de los procesos para manejar indistintamente bases de datos tipo DBF o tipo MySQL La aplicacion esta conformada por los programas conddb.fml y visuadb.prg, que conforman un modelo universal aplicable para archivos DBF o MySQL, e incluye todas las funcionalidades de conddbf.fml y visuadbf.fml Observacion: debido a que se esta usando un archivo .prg, es necesario que el compilador Harbour este accesible en cualquier forma, ya sea ubicado en el mismo directorio del programa clipxnet.exe o mediante una referencia del sistema operativo, como esta indicado en las instrucciones de preparacion para los ejemplos conddb.fml es una "pantalla de condiciones" generica que mediante un elemento FORM permite introducir informacion que sera enviada al Servidor Web y este a visuadb.prg Estas condiciones pueden ser para un archivo tipo DBF, o en su caso un archivo tipo MySQL visuadb.prg es un proceso generico de visualizacion/edicion que puede aplicar ABC-C opcionalmente a cualquier archivo tipo DBF o tipo MySQL en cualquier parte del mundo Incluso se puede caracterizar el contenido de informacion que edita/visualiza, lo que lo convierte en uno de los prototipos mas versatiles y poderosos para ClipxNet Las consultas pueden hacerse por paginas completas tipo Hojeador (browse) o por registros individuales Esta basado en el numero de registro, y puede facilmente modificarse para usar otros metodos de control, por ejemplo, campo(s) clave Un aspecto interesante del soporte de MySQL es que resulto que es posible, usando cualquier computadora servidor Web con Clipxnet, visualizar/editar cualquier base de datos MySQL accesible desde Internet, ubicada en cualquier lugar del mundo Por ejemplo, usando la computadora propia con un servidor Web con soporte de Clipxnet, es posible usar cualquier servidor MySQL accesible por Internet o en cualquier red TCP/IP Esto constituye un acceso mundial a servidores MySQL por medio de Clipxnet Hojear y editar bases de datos DBF o MySQL 24g. Copiado de datos tipo DBF y/o MySQL La inclusion en Clipxnet del soporte de MySQL hizo conveniente la existencia de una herramienta para el copiado de datos tipo DBF a tipo MySQL Inicialmente se adapto el programa dbf2mysql.prg de Maurilio Longo Resultaba mas interesante que esta herramienta pudiera copiar datos de tipo DBF a tipo MySQL y viceversa, y finalmente desarrolle el programa dbfmysql.prg Observacion: debido a que se esta usando un archivo .prg, es necesario que el compilador Harbour este accesible en cualquier forma, ya sea ubicado en el mismo directorio del programa clipxnet.exe o mediante una referencia del sistema operativo, como esta indicado en las instrucciones de preparacion para los ejemplos Asi, dbfmysql.prg es un programa que permite hacer copiados de datos entre bases de datos:
  • DBF a DBF. Mismo o diferente RDD, pero no el mismo archivo
  • DBF a MySQL
  • MySQL a DBF
  • MySQL a MySQL. En la misma base de datos, no permite el mismo nombre de tabla El copiado puede ser selectivo en:
  • Registros o filas, mediante la especificacion de filtro / clausula WHERE
  • Campos. Se pueden especificar los campos a copiar y/o cambiar la secuencia de los campos, con lo cual pueden copiarse datos en bases de datos de estructura diferente a la base de datos original Se puede usar en dos modalidades, usando Clipxnet en:
  • Modo http, usando el servidor Web: http://direccion/dbfmysql.prg
  • Modo de linea de comandos: clipxnet.exe dbfmysql.prg ADVERTENCIA: En modo http con archivos grandes, el tiempo de proceso del copiado puede exceder facilmente el tiempo de espera del Servidor Web. En este caso de copiado de grandes archivos o grandes cantidades de datos, es preferible usar el modo de linea de comandos Este resulto ser un buen ejemplo de las capacidades de Clipxnet y una herramienta util para la manipulacion de datos y reestructuracion de bases de datos Copiado de datos tipo DBF y/o MySQL
    "Si no preguntas, yo no se que quieres saber y te quedas con la duda"
    I.Q. David Arturo Macias Corona dmacias@mail.udg.mx