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:
----------------------------------------------------
<>;
<>;
<>
<*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
<>
<>
<>
<>
<>
<*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('')
QOUT(' ')
QOUT(' ')
QOUT(' ')
QOUT(' ')
QOUT(' Contactos')
QOUT('')
QOUT('')
QOUT('')
QOUT('CONTACTOS')
QOUT('')
QOUT(' ')
QOUT('')
QOUT('Documento elaborado dinamicamente por ')
QOUT( ALLTRIM(aUsuario[ SGVD("U_USUNOM") ])+' '+DTOS(DATE())+' '+TIME() )
QOUT( ' ' )
QOUT( 'usando ' )
QOUT('')
QOUT( 'Sistemas Genericos')
QOUT( '')
QOUT( ', con la formula ')
QOUT( 'SGD301.FML')
QOUT( '
' )
QOUT('
')
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( '
' )
ii := ii + 1
/*
IF ii = 5
QOUT('<*PAGINA*>')
ii := 0
ENDI
*/
DBSKIP( 1 )
ENDD
QOUT('
')
QOUT('')
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('')
OUTSTD('Prueba con Clipper')
OUTSTD('
Programa CGI en Clipper !
')
OUTSTD(' ')
OUTSTD('Web/2 - The small (but powerful) Web server for OS/2! ')
OUTSTD(' ')
OUTSTD('PARAMETRO: '+P1 )
OUTSTD(' ')
OUTSTD('Valor de CLIPPER: '+var )
OUTSTD(' ')
OUTSTD('Valor de CONTENT_LENGTH: '+var1 )
OUTSTD(' ')
OUTSTD('Valor de GATEWAY_INTERFACE: '+var2 )
OUTSTD(' ')
OUTSTD('Hi, person at (), the date/time is
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 .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 %>
Ejemplo de clipxnet.exe como interprete de SGS
Bienvenido <% SGOutStd( NetName( ) ) %>
<% SGOutStd(DTOC(DATE())+" "+TIME()) %>
El uso de clipxnet.exe como "interprete" de paginas con codigo Clipper es muy sencillo
Basta tener en cuenta las consideraciones para PrgExt:Programacion Externa,
y consultar los ejemplos para tener mas ideas sobre su aplicacion
"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) 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 SisGenScript17c. 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 Coury17c2. Hello.hs
El archivo hello.hs original se modifico para tomar en cuenta las caracteristicas
de PrgExt
Hello.hs, de Felipe Coury17c3. Ugly.hs
El archivo Ugly.hs original se modifico para tomar en cuenta las caracteristicas
de PrgExt
Ugly.hs, de Felipe Coury17c4. Dir.hs
El archivo Dir.hs original se modifico para tomar en cuenta las caracteristicas
de PrgExt
Dir.hs, de Felipe Coury17d. 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
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 *.txt17h. 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
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 archivos17j. 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 DBFHojear una base de datos DBF17k. 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-sistema17l. y mas ejemplos ...
Se tienen mas ejemplos en:
18. Interfaz entre clipxnet.exe y otros sistemas19. Lo inevitable: TGraph 3 y ClipNet-xNet juntos21. Modelo ClipNet-xNet y el "poder de Harbour"24. Ejemplos adicionales18. 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 Serie18b. 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 colaboraciones19a. 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 319b. 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 continua19c. 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 colaboraciones20. 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('')
QOUT('Modelo ClipNet: Prueba 01 de Interfaz con Modelo en Serie')
QOUT(' ' )
QOUT(' ' )
QOUT('')
QOUT('" )
QOUT( " " )
QOUT( "Contenido de Archivo de entrada: " )
QOUT( "
" )
QOUT( MEMOREAD( cArcEntra ) )
QOUT( "
" )
QOUT(' ' )
QOUT('' )
// 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('')
QOUT('Modelo ClipNet: Prueba 01 de Interfaz con Modelo en Serie')
QOUT(' ' )
QOUT(' ' )
QOUT('')
QOUT('" )
QOUT( MEMOREAD( cArcTmp ) )
QOUT( "" )
QOUT(' ' )
QOUT('' )
// 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:
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('')
QOUT(''+cHeader+'')
QOUT(' ' )
QOUT(' ' )
QOUT('')
QOUT('" )
QOUT( MEMOREAD( cArcTmp ) )
QOUT( "" )
QOUT(' ' )
QOUT('' )
// 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 Serie21b. 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 DIFFER.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 cookies24b. 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 Escolar24c. 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 computadoras24d. 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 DBF24e. 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-definidas24f. 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 MySQL24g. 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