Servernews - 156 (septiembre 2005)

  • Uploaded by: Publicaciones HELP400, S.L.
  • 0
  • 0
  • August 2019
  • PDF

This document was uploaded by user and they confirmed that they have the permission to share it. If you are author or own the copyright of this book, please report to us by using this DMCA report form. Report DMCA


Overview

Download & View Servernews - 156 (septiembre 2005) as PDF for free.

More details

  • Words: 20,313
  • Pages: 44
INFORMACIÓN TÉCNICA Y DE GESTIÓN PARA i5 e iSeries

Programación en CGI Desarrollo con CGIDEV2 Consideraciones sobre Java

Interfaces de usuario en el iSeries Mejor portabilidad: Enterprise Generation Language

Suplemento HELP400 RPG e IFS: Obtener información sobre los archivos

NI V

15

ARI

O A

156

ERS

editorial

¿Quién dijo vacaciones?

A Imagen de la portada: Mike Friehauf Suscripción: Anual (10 números al año, no en Julio y Agosto). España: 96 euros (IVA incluido). Extranjero: 180 $ USA (incluido el envío por Correo Aéreo). Se distribuye a final de mes. © Publicaciones HELP400, S.L. Se prohibe la reproducción total o parcial de los artículos aparecidos en este número sin la autorización expresa por escrito de la empresa editora, titular del Copyright. Todos los derechos reservados en cualquier idioma. ServerNEWS es una publicación independiente de grupos de usuarios y/o de distribuidores de marcas. De las ideas expuestas en los artículos firmados son responsables sus autores. Corresponde al lector el asegurar que las noticias, técnicas y procedimientos descritos son adecuados para su instalación. Publicaciones HELP400 S.L. no asume ninguna garantía ni implícita ni explicitamente. La empresa editora no se responsabiliza de la asiduidad en la distribución gratuita a las empresas españolas equipadas con S/3X o AS/400. IBM y AS/400 son marcas registradas por International Business Machines.

www.help400.es

trás quedan los días de vacaciones y comenzamos de nuevo, después de haber recargado energías, la labor profesional que dejamos aparcada durante el mes de agosto. Ponerse al día puede resultar algo duro para todos pero en la Redacción, tras dos meses de “ausencia”, tenemos la ilusión de reencontrarnos con nuestros lectores y retomar la labor diaria con más fuerza para encarar unos meses que, desde el punto de vista del sector, se presentan llenos de contenidos, presentaciones y novedades. Para la industria de las Tecnologías de la Información no existen las vacaciones, ni siquiera durante el mes de agosto. Recordemos que ahora hace diez años, concretamente el 24 de agosto de 1995, Microsoft lanzó su Windows 95 que, en pocos meses, se convirtió en el entorno gráfico de los PC de todo el mundo. Para celebrarlo, desde el 2 de agosto de este año su último descendiente, hasta ahora conocido como Longhorn, ya tiene nombre: Windows Vista, el que será, a partir de 2006, el nuevo sistema operativo de escritorio de Microsoft. Recordemos también que Bill Joy, cofundador de Sun Microsystems y uno de los desarrolladores del Unix de Berkeley, juzgó que Internet podría ser el campo de batalla más adecuado para disputar a Microsoft su primacía casi absoluta en el terreno del software, y vió en un lenguaje interno de Sun, Oak, el instrumento idóneo para llevar a cabo estos planes. Tras un cambio de nombre y modificaciones de diseño, el lenguaje Java fue presentado al mundo también en agosto de 1995. IBM, tras dos años de vacilaciones, en Java encontró la respuesta definitiva a sus dudas sobre qué lenguaje utilizar, C++ o SmallTalk, para su nueva generación de AS/400, los llamados “AS/400e Series”, presentada el 19 de agosto de 1997, junto con la V4 del OS/400 y todos sus planes y herramientas para que las empresas pudieran beneficiarse de inmediato de las oportunidades del denominado ebusiness, “el comercio electrónico del siglo XXI”, según rezaba la publicidad de IBM de aquellas fechas... Mucho hemos hablado de Java en la revista, tanto que hasta hemos publicado un libro, “Java para programadores RPG”. Así que, para iniciar la nueva temporada como se merece, proseguimos con un tema que puede parecer polémico: la defensa del ILE RPG del iSeries como lenguaje práctico y polivalente. Como se indica en uno de los artículos de este número “Hoy, más que nunca, las empresas están interesadas en encontrar la mejor forma de ofrecer aplicaciones web interactivas a sus clientes y usuarios. Con tantas opciones disponibles... solemos pasar por alto la mejor solución y la más sencilla”. Si sabemos aprovechar las ventajas de Internet y confiamos en la profesionalidad y experiencia de nuestro equipo informático, expandir el negocio, reducir costes o responder a las demandas de los clientes más exigentes será una tarea sencilla.

Antonio Montía [email protected] AGOSTO-SEPTIEMBRE 2005 ServerNEWS 3

sumario ANTES HELP400, LA REVISTA PARA EL PROFESIONAL DE LOS S/3X Y AS/400

en portada

equipo editorial Director: Antonio Montía Redacción: Carlos Bell, Alberto C. Blanch, Equipo internacional de iSeries NEWS Colaboradores habituales: Jaime Gustavo Estany, José Mª Martín, Lluís Peiret Traducciones: Pere J. Francisco Brumós

10

Al margen de que en su día IBM eligiera Java para el desarrollo web en el iSeries, en el mercado existen tantas soluciones que puede darnos la sensación de que para este tipo de aplicaciones es necesario “utilizar otra cosa” en lugar de profundizar en lo que ya conocemos, el RPG, y aprovechar la experiencia que con él hemos adquirido.

producción Realización: Media Limits S.L. Maquetación: Ramiro Esteve Coll Impresión: G2B gràfic S.L. Distribución: Unipost S.A.

administración Suscripciones : Nuria Navarro Publicidad: Tel. 34- 932 310 049 Fax: 34-932 310 309 Servicio HelpNet: www.help400.es

edita

RPG: un puente entre dos mundos por Carlos Bell

12

PUBLICACIONES

CGIDEV facilita la vida a los programadores de RPG por Jef Sutherland CGIDEV2 es un kit de herramientas de desarrollo de páginas web gratuito suministrado por IBM que enmascara la complegidad de la programación CGI. Como veremos, CGIDEV2 ofrece un medio de incluir páginas HTML en programas escritos en RPG como si fueran plantillas, llevar a cabo sustituciones de variables y devolver páginas HTML al navegador.

Deposito legal: B-2757-90 I.S.S.N. 1698-4501 APTDO. DE CORREOS 8003 - 08080 Barcelona Gran Vía Corts Catalanes, 715, Entlo. 3ª 08013 - Barcelona Tel.: 932 310 049 Fax: 932 310 309 E-mail: [email protected] Director General: Alberto C. Blanch Llangostera Publicado con la participación de - iSeries NEWS www.pentontech.com Group Publisher/Editor: Wayne Madden Group Editorial Director: Dale Agger Penton Technology Media Darrell C. Denny, President Penton Media, Inc. David Nussbaum, Chief Executive Officer

18

Programación en CGI y el iSeries por Bradley V. Stone En el artículo se analizan las posibilidades del CGI. La programación en CGI existe en el iSeries desde hace muchos años. Desde la V3R2 del OS/400, IBM ha proporcionado APIs que permiten a los programadores crear páginas web totalmente funcionales sin necesidad de utilizar soluciones caras y que consumen muchos recursos.

LATINOAMERICA

distribuidores Belice, El Salvador, Guatemala y Honduras VIACOMP 6ª Avenida. "A" 2-83 Zona 10 Ciudad de Guatemala, GUATEMALA 01010 Telf. 502-360-0358 y 360-0350 Fax 502-332-33694 email: [email protected] www.viacomp.net Perú COMMON PERU Bajada Balta 131, Of. 10, 2º Piso Miraflores Lima 18, PERU Telf. y Fax: 46 31 32 Paraguay ANGEL LIERNUR E HIJO P.O. BOX 2448 ASUNCION - PARAGUAY [email protected] e-mail: [email protected]

4 ServerNEWS AGOSTO-SEPTIEMBRE 2005

www.help400.es

Nº 156 AGOSTO-SEPTIEMBRE 2005

www.help400.es

opinión

8

RPG ha muerto... ¡viva RPG! por Carson A. Soule El autor se pregunta si el RPG puede evolucionar o acabará extinguiéndose. El soporte dado a RPG por parte de la comunidad de usuarios de iSeries sigue siendo firme, pero al igual que le ocurre a la generación del baby boom, un linaje de expertos en RPG está aproximándose a la jubilación. ¿Quién será luego su abanderado?

management

24

Sobre las interfaces de usuario por Jef Sutherland La flexibilidad del iSeries es ventajosa a la hora de desarrollar interfaces de usuario y trabajar con ellas. Podemos tener la mejor lógica y las mejores rutinas de proceso bajo la interfaz de usuario, pero si ésta no obtiene la información correcta o no se presenta en forma inteligible, habremos despilfarrado la inversión realizada en la aplicación.

26

Mejor portabilidad: introducción al “Enterprise Generation Language” por George Farr, Phil Coulthard y Kushal Munir Un nuevo artículo de la serie sobre el trayecto que lleva del RPG a J2EE para desarrolladores del iSeries. En esta ocasión, y siguiendo la explicación del cuarto paso del itinerario, que trata sobre una mejor portabilidad, se presenta otra tecnología llamada “Enterprise Generation Language” que puede ayudarnos a desarrollar aplicaciones portables.

programación y sistemas

34

Aplicaciones Java basadas en web por Don Denoncourt Antes de que su empresa se embarque en el desarrollo de una aplicación escrita en Java para la web, debería tener en cuenta una serie de consideraciones tecnológicas. En este artículo encontrará la información necesaria para seleccionar la combinación tecnológica más apropiada para sus aplicaciones.

forum.help400 F orum.help400 es una lista de correos puesta a disposición de los lectores de ServerNEWS en la que cada día se solucionan numerosos problemas entre todos los participantes. Hallará más información en http://www.help400.es

HELP400 Suplemento Técnico i

1

Obtener información sobre los archivos por Scott Klement En los artículos anteriores sobre el RPG y el IFS hemos visto cómo leer y grabar archivos continuos en el sistema de archivos integrado (IFS). IBM también nos ofrece algunas API para obtener información sobre los archivos del IFS. En esta ocasión nos centraremos en cómo recuperar esta información y cómo modificar los atributos de esos archivos.

www.help400.es

SECCIONES HABITUALES 3 6 40

Editorial Novedades Guia

AGOSTO-SEPTIEMBRE 2005 ServerNEWS 5 AGOSTO-SEPTIEMBRE 2005 ServerNEWS 5

novedades ■ Reunion Nacional

La consola de rendimiento de Tango/04 ahora también para Windows Gestión flexible de rendimiento en múltiples plataformas

A

hora, las empresas que buscan optimizar la disponibilidad y el tiempo de respuesta de sus sistemas y aplicaciones de informática pueden consolidar la monitorización de los signos vitales de sus servidores Windows y iSeries (CPU, disco, memoria, trabajos, etc.) en una consola única de Gestión de Niveles de Servicio. El nuevo VISUAL Control for Windows 9, lanzado por Tango/04 Computing Group, lo hace posible capturando e integrando en su consola de gestión de rendimiento métricas procedentes de servidores con Windows Management Instrumentation (WMI) y Simple Network Management Protocol (SNMP). Desde hace diez años, cientos de compañías han utilizado VISUAL Control for Windows para asegurar la disponibilidad de sus sistemas, gestionar sus Acuerdos de Nivel de Servicio (SLA) y potenciar sus procesos de negocio en infraestructuras basadas en servidores iSeries. Ahora, con la versión 9, los departamentos de informática pueden controlar simultáneamente, desde una sola interfaz gráfica e intuitiva, cualquier cantidad y combinación de servidores iSeries y Windows, además de aquellos basados en SNMP. “VISUAL Control for Windows ha evolucionado hasta ser una solución de gestión de rendimiento muy flexible,” dice Raúl Cristián Aguirre, Gerente de Tango/04 Computing Group. “Las poderosas herramientas de programación de la versión 9 permiten alinear fácilmente la gestión de niveles de servicio con los objetivos de negocio de cada empresa, lo cual se traduce en una mejora inmediata en la cuenta de resultados”. Además de servidores iSeries y Windows, VISUAL Control for Windows 9 puede monitorizar sistemas Linux, UNIX y AIX gracias a la tecnología ALEV de Tango/04, que permite aprovechar al máximo el protocolo SNMP. Los operadores pueden además desarrollar scripts, definir variables y especificar umbrales propios y condiciones de alerta con el editor de expresiones lógicas ALEV. “A veces es necesario recibir una alarma de rendimiento cuando el umbral de utilización de memoria de un trabajo ha sido sobrepasado, pero sólo si es procesado en un servidor específico durante un período de tiempo preciso y si lo ejecuta un determinado usuario. Este es un ejemplo del nivel de personalización que un director de informática puede necesitar en su trabajo diario, y que con Tango/04 puede conseguir muy fácilmente,” agrega Raúl Cristián Aguirre. Más de dos mil parámetros de rendimiento pueden ser monitorizados y controlados para ejecutar ajustes en forma automática antes de que los procesos de negocio sean afectados. Los usuarios pueden personalizar en cualquier vista qué parámetros mostrar, filtrando la información irrelevante. Los indicadores claves de actividad de sistema incluyen: utilización de CPU por tipo de trabajo, los 10 usuarios y trabajos más abusivos, utilización de disco, tiempos de respuesta, trabajos (por tipo de trabajo, usuario, subsistema, colas de trabajo y colas de salida), utilización de particiones lógicas (LPAR), datos de pool de memoria, tráfico de red y muchos más. Cuando se sobrepasa un umbral de rendimiento importante en un sistema, VISUAL Control for Windows puede ejecutar una alarma de acuerdo con reglas y variables especificados por el usuario. Los administradores pueden programar acciones automáticas tales como modificar las prioridades de los procesos, ejecutar comandos locales o remotos y alterar los atributos de trabajos para corregir un problema. Si se requiere la intervención de un operador, la consola puede emitir una alerta por email o SMS y escalarla a diferentes personas hasta que el problema sea resuelto. Para más información, Telf.: 932.740.051 - www.tango04.es

■ Adélia: 4GL para desarrollos en plataformas iSeries, Gráficas C/S y Web Innova Estudi Soft, especialistas en programación a medida, en Gestión Documental, en soluciones Internet para empresas y Business Partner Advanced de IBM, es el nuevo distribuidor para España de la herramienta CASE

Adélia Studio. La compañía ubicada en Figueres (Girona) acumula una experiencia en el mercado informático de más de 14 años gestionando diversos sectores industriales y especialmente el sector eléctrico. Adélia Studio consta de una gama de herramientas de desarrollo articuladas alrededor de un modelo conceptual y de un 4GL que permiten la concepción y el

6 ServerNEWS AGOSTO-SEPTIEMBRE 2005

desarrollo de las siguientes arquitecturas: entornos gráficos C/S multi-plataforma y multi-BDs – DB2/400, SQL, etc.- (Adélia Visual Studio) que genera Java y/o C; Web en entornos JAVA-J2EE (Adélia Web Studio); y 5250 nativas sobre iSeries (Adélia iSeries Studio) que genera RPG. Para más información, Telf.: 972.673.367 www.innova-soft.com

de Common 2005 en Granada Los próximos días 20 y 21 de Octubre tendrá lugar en el Hotel Carmen de Granada la reunión anual de Common Europe España. Durante el encuentro se tratarán, entre otros, temas de Business Inteligence y Soluciones de continuidad; y, en el apartado de Experiencias de Usuario, se presentará la conexión de cajeros autómaticos a un iSeries, en base a la experiencia real de la empresa EMASAGRA. Para más información, Telf.: 912.116.114 www.common-es.org

■ VII Reunión anual de usuarios de ASNA Visual RPG CaCovai 400, anuncia la “VII reunión anual de usuarios de AVR”, que se celebrará los días 6 y 7 de Octubre en el Hotel Bodega Real, en el Puerto de Santa María. Como en anteriores ocasiones, este año se presentarán las nuevas versiones de AVR Clásico, AVR. Net y Monarch. Y se mostrarán potentes aplicaciones desarrolladas con AVR. Para más información, Telf.: 902.365.787 www.cacovai.com

■ Storage Forum Barcelona 2005 Tras el éxito de las ediciones de Storage Forum en Madrid, este año Barcelona acoge el Storage Forum 2005, el salón profesional por excelencia dedicado a las tecnologías de almacenamiento de datos que se presentará los días 25 y 26 de octubre, en el Barceló Hotel Sants. Se estructurará en dos ciclos de conferencias temáticas. El primero orientado a casos prácticos, nuevas tendencias y estrategias del sector del Almacenamiento y Seguridad de datos. El segundo dará la palabra a los actores del mercado para presentar sus nuevos productos y tecnología. Para más información, www.storage-it.com www.help400.es



Seminario de optimización de la gestión de iSeries

¡Descubra cuánto puede ahorrar su instalación al optimizar la gestión de recursos de su iSeries! Al detectar las posibilidades, implementar políticas de monitorización, descubrir las reservas y efectuar las operaciones necesarias –todo sin interrumpir el trabajo de los usuarios– la mayoría de las instalaciones pueden liberar entre 20% - 40% de los recursos comprometidos de su iSeries. Software Greenhouse presenta, el día 15 de Noviembre en Madrid y el 16 en Barcelona, sendos seminarios de gestión de recursos de iSeries, con el lanzamiento del producto OS Director de Vision Solutions. Este nuevo producto ha sido incorporado a la línea de productos del conocido proveedor de Alta Disponibilidad, al ser adquirida por parte de Vision Solutions la empresa británica OS Solutions. OS Director es una excelente herramienta para la optimización de rendimientos y de utilización de recursos de iSeries que suministra un amplio rango de funcionalidades de monitorización, gestión y optimización. El CEO de Vision Solutions, Nicolaas Vlok, comenta respecto a la reciente adquisición: “El mercado de Alta Disponibilidad sigue evolucionando y han surgido nuevos requerimientos, tales como reducir el volumen de discos utilizado, mejorar rendimientos y aprovechar al máximo todos los recursos del sistema, al mismo tiempo que se mantiene alta disponibilidad. Vision Solutions ha estado trabajando en esta dirección y esta adquisición significa un rápido avance y permite una integración inmediata de optimización de sistemas con alta disponibilidad.” En el seminario actuará como invitado principal (con traducción simultánea) Mike Ryan, director de la división OS de Vision Solu-

tions y se presentarán ejemplos prácticos de ahorros significativos de recursos y casos reales de clientes con cifras de mejoras de rendimientos y utilización de iSeries.



Redbook de IBM sobre Integración de .Net con el iSeries Carlos Carminati, Director del área de tecnología de d2B Network, de Montevideo (Uruguay), empresa formada por expertos en el desarrollo de soluciones basadas en las tecnologías .Net de Microsoft, fue invitado especialmente ha realizar una residencia en IBM Rochester, con el objetivo de escribir junto a un equipo de especialistas, el libro “IBM Redbook 2005” sobre integración de Microsoft.Net Framework con los sistemas iSeries (AS/400 e i5) de IBM. Esta experiencia posiciona al equipo de desarrollo tecnológico de d2B Network como experto en integración de desarrollos .NET sobre la plataforma iSeries, especialmente con bases de datos DB2 Universal DataBase. El libro ha sido editado por IBM y, si está interesado, puede descargarse una versión en PDF desde la dirección: www.d2bnetwork.com/ download/ RedBook_IBM-2005.zip

■ Seminario de Gestión de Servicios de Negocio (BSM) ¿Qué es BSM? ¿Cómo estructurar un proyecto de monitorización? ¿Cómo mejorar el rendimiento y la disponibilidad de las aplicaciones? ¿Por qué el control de los servicios de negocio es la mayor prioridad para los directivos informáticos? El seminario gratuito “BSM 2005: De la monitorización de infraestructura a la monitorización de servicios de negocio”, organiza-

Si como proveedor posee alguna novedad relacionada con el iSeries - AS/400 de IBM, recuerde que en esta sección dispone de un espacio gratuito para darla a conocer a todos nuestros lectores. Puede enviar sus notas de prensa a ServerNEWS, Gran Vía Corts Catalanes, 715, Entlo 3ª 08013 - Barcelona. Para la inclusión de fotografías, agradeceríamos que las remitieran en formato electrónico.

www.help400.es

do por Tango/04 Computing Group, y que se celebrará el día 5 de Octubre en Barcelona, el día 6 de Octubre en Madrid y el día 14 de Octubre en Buenos Aires, responderá de modo ameno y práctico a estas y muchas otras preguntas fundamentales para que las empresas sean más competitivas y exitosas. Business Service Management (BSM) puede ayudar a mejorar los niveles de servicio, reducir costes, prevenir problemas y garantizar la satisfacción de los usuarios.

La experiencia de los ponentes en proyectos de monitorización multiplataforma aportará a los asistentes conocimientos y técnicas útiles para conseguir objetivos demostrables. Se podrán conocer de primera mano las mejores prácticas de la industria y sacarles provecho, tanto si se necesita medir el rendimiento de los servidores, como si debe cumplirse una ley (LOPD, SOX) o alcanzar estrictos niveles de servicio (SLA). Para más información, Telf.: 932.740.051 www.tango04.es/eventos

iSeries Developers Roadmap: Bienvenida de IBM a ASNA on la inclusión de ASNA en el “iSeries Developers Roadmap”, se unen las estrategias de IBM y Microsoft para los servicios Web y la implementación de arquitecturas orientadas a servicios (SOA). ASNA anuncia que IBM oficialmente ha añadido sus soluciones de desarrollo basadas en Windows y .NET, en el denominado “iSeries Developers Roadmap”, un componente crítico del programa de soporte y ayuda a terceros de IBM, conocido como “Iniciativa para la Innovación del iSeries”. La inclusión de las soluciones para el iSeries de ASNA en la “Hoja de ruta” de IBM, junto con el apoyo de Microsoft a través de la “Midrange Alliance Program” (de la cual ASNA es cofundadora), proporciona a los usuarios de iSeries la única solución .NET completa para la modernización de aplicaciones avalada por ambas empresas, IBM y Microsoft. Los usuarios de iSeries que busquen las mejores soluciones para modernizar sus sistemas midrange, ahora pueden estar seguros de que cuentan con el apoyo tanto de IBM como de Microsoft en sus esfuerzos de migración a .NET Las herramientas de terceros incluidas en el “iSeries Developers Roadmap”, son consideradas como los primeros productos que cumplen con los rigurosos criterios de la iniciativa para la “Innovación del iSeries” de IBM. Una iniciativa diseñada por IBM para incrementar su apoyo a los miles de ISVs y proveedores de herramientas para que éstos amplíen sus capacidades a través de nuevas e innovadoras soluciones eServer. El contar con los productos Windows y .NET de ASNA, es un reflejo del reconocimiento de IBM a la heterogeneidad de los entornos, y del importante papel que actualmente juega .NET en las estrategias de muchas empresas. “IBM reconoce claramente el éxito y adopción de .NET entre las empresas con sistemas iSeries, a menudo a expensas de WebSphere y JAVA” comentó Anne Ferguson, presidenta de ASNA, añadiendo: “Y es correcto, porque añadiendo los productos de ASNA, IBM cubre todas las posibilidades en interés de sus clientes...”. El distribuidor de ASNA para España y Portugal es la empresa CaCovai 400. Para más información, Telf.: 902 365 787 - www.cacovai.com

C

AGOSTO-SEPTIEMBRE 2005 ServerNEWS 7

opinion

por Carson A. Soule

RPG ha muerto... ¡viva RPG! omo fui uno de los primeros (relativamente) en usar RPG a principios de los años 70, tuve que aprender a programar yo solo. En aquel entonces no había ni clases de programación, ni departamentos de informática en las universidades... sólo algunos chicos que utilizaban mainframes y trabajaban en Cobol, algo de ensamblador y un poco de Basic para los servicios tiempo compartido. La programación estructurada no se había inventado. Había destellos de cosas venideras en trabajos de Parnas y Dijkstra, pero no teníamos ni idea de cómo aplicarlas a RPG II. RPG era único tanto conceptualmente como en la forma en que se ejecutaba. Tocábamos el cielo y al mismo tiempo sufríamos tormento con maravillas como su ciclo lógico, sus niveles de control y el MR, la consulta anticipada o montones de formularios para cada tipo de especificación y diseño de listados. Los indicadores gobernaban nuestras vidas. Nuestra idea de modularización era leer datos de un archivo, procesarlos, grabar los resultados intermedios en otro archivo y repetir la operación hasta obtener el resultado final. No había base de datos... sólo archivos indexados. No había llamadas entre programas ni parámetros.

C

Un largo reinado Una situación tan primitiva no podía durado mucho, pero lo hizo. Perduró durante casi toda la vida útil de los S/3x, sin mejorar hasta la llegada del AS/400: un periodo de casi 20 años. Sí, se mejoraron cuestiones puntuales. Con el S/34 llegaron los terminales en línea y los formularios de programación fueron desapareciendo lentamente. Es cierto que RPG III llegó con el S/38, incluyendo nuevas y atrevidas funciones como llamadas entre programas y códigos de operación estructurados, pero no se adoptaron de manera general hasta el advenimiento del AS/400. A pesar de los espectaculares avances que se dieron con RPG III y luego con RPG/400, el formato fijo siguió mandando. De hecho, el formato fijo está tan profundamente imbricado en el RPG que hasta los conceptos de formato libre se aplican sólo a una parte del lenguaje. No se trata únicamente de RPG. DDS también es de formato fijo. El formato fijo está tan arraigado en la mentalidad y en las herramientas de programación que los defensores del formato libre se han dado cuenta de que incluso después de atravesar con una estaca el corazón de las especificaciones C, ese formato se niega a morir.

¿Evolución o extinción? Me pregunto si el RPG puede evolucionar hacia un formato libre o es algo antinatural. ¿Tiene sentido hablar de formato parcialmente libre? Puede que el formato libre sólo tenga sentido si se implementa totalmente. Esto implicaría eliminar los tipos de especificación, sustituir DDS por SQL para tra8 ServerNEWS AGOSTO-SEPTIEMBRE 2005

bajar con la base de datos y utilizar HTML para la definición de la interfaz. Significa sustituir RPG por un lenguaje nuevo. En estos tiempos de sistemas abiertos y código libre, ¿debería IBM seguir invirtiendo en un lenguaje que probablemente nunca sea totalmente “moderno”? ¿Debería invertir en un nuevo lenguaje de formato libre que conquiste tanto los corazones como las mentes de la comunidad de usuarios de RPG? Ninguna opción parece lo bastante convincente. Con la desaparición del HP 3000 se ha perdido la única implantación importante que no era de IBM. El iSeries está solo. No es difícil prever en última instancia el fallecimiento de RPG independientemente de los intentos que haga IBM para salvarle la vida con el formato libre. RPG y el iSeries tienen algunos problemas graves. La ausencia de una interfaz gráfica coherente restringe sus posibilidades. Estamos siendo obligados a dejar atrás a nuestro estimado RPG por WebSphere y Java para comunicarnos con los navegadores. O si no, debemos utilizar CGIDEV y HTML o alguna clase de conexión .NET modificada. Me pregunto durante cuánto tiempo se seguirán utilizando RPG como el componente modelo de la arquitectura MVC (Modelo/Vista/Controlador). Sin soporte para interfaces XML y SOA, RPG sólo puede realizar parte del trabajo en las arquitecturas que no están centradas en la interfaz de usuario. El soporte dado a RPG por parte de la comunidad de usuarios de iSeries sigue siendo firme, pero igual que le ocurre a la generación del baby boom, un linaje de expertos en RPG está a punto de jubilarse. ¿Quién será el abanderado?

El incierto futuro Tal vez los lenguajes de aplicación general han pasado de moda. Es difícil defender que los actuales lenguajes de formato libre sean dechados de claridad. Son difíciles de aprender, difíciles de leer y tienen numerosas deficiencias en áreas relacionadas con la programación. La opción de lenguajes de aplicación específica, como SQL, HTML y XML es mucho más seria. La arquitectura y los lenguajes dirigidos por modelos son prometedores pero están lejos de la madurez. RPG y los lenguajes de formato fijo tiene mucho que enseñarnos de su evolución a lo largo de estos últimos cuarenta años. A falta de estudios formales en informática, una generación que entendía cómo funcionaban las empresas, creó aplicaciones que condujeron a la revolución de los ordenadores. Estos programadores y los lenguajes que utilizan nos mostraron de qué eran capaces con herramientas de programación sencillas y pensadas para ejecutar una función concreta. El camino que hay por delante no está claro. Espero que no no se pierda el lenguaje que amamos ni que olvidemos las lecciones que nos enseñó, independientemente del debate acerca del formato libre. RPG ha muerto. ¡Viva RPG! ■ Carson A. Soule es el director general de Computer Application Specialists. www.help400.es

www.help400.es

AGOSTO-SEPTIEMBRE 2005 ServerNEWS 9

DE LAS APLICACIONES CLÁSICAS A LA WEB Y AL COMERCIO ELECTRÓNICO

por Carlos Bell n la redacción, aceptando como muy razonable la afirmación de que “las empresas equipadas con iSeries disponen de dos de los más valiosos recursos: sus datos y unos programadores RPG muy competentes” y con la que me identifico plenamente, al preparar el número anterior (el correspondiente a Junio/Julio) nos quedó claro que en éste, para complementar la defensa del RPG como lenguaje polivalente, debíamos mostrar sus posibilidades reales en un mundo tan interconectado como el actual, donde las aplicaciones Web han pasado a ser el “pan nuestro” de cada día. Opciones disponibles Ante el desarrollo de un nuevo proyecto de comercio electrónico o de una aplicación basada en Web para la intranet corporativa o Internet, nos encontramos con varias premisas que debemos tener en cuenta si queremos alcanzar el éxito: minimizar el tiempo de desarrollo, ofrecer un entorno consistente que no dé lugar a transacciones erróneas, poder comunicarnos fácilmente con otras aplicaciones y con otras empresas, y ser capaces de mantener el contenido con el mínimo esfuerzo posible. Como es lógico, buena parte del éxito dependerá de la estrategia de desarrollo que adoptemos. Aparentemente y simplificando, si el entorno del que estuviéramos hablando no fuera el del iSeries, a la hora de tomar una decisión sobre la arquitectura a implementar tendría10 ServerNEWS AGOSTO-SEPTIEMBRE 2005

mos que decidir entre tecnología Microsoft o tecnología abierta; es decir, entre ASP.NET, ODBC y desarrollo de aplicaciones en VisualBasic, o JSP, Java Beans, JDBC y desarrollo de aplicaciones en Java. Dentro de las tecnologías abiertas podríamos incluir otras que están basadas en lenguajes de scripts como PHP o Perl, junto con MySQL como base de datos y la utilización del CGI (Common Gateway Interface) de los servidores de aplicaciones Web, como Apache. De hecho, y al margen de que en su día IBM eligiera Java para el desarrollo Web en el iSeries, en el mercado existen tantas soluciones para una u otra tecnología que puede darnos la sensación de que para este tipo de aplicaciones es necesario “utilizar otra cosa” en lugar de profundizar en lo que ya conocemos, el RPG, y aprovechar la experiencia que con él www.help400.es

hemos adquirido desarrollando todo tipo de aplicaciones empresariales.

Sea pragmático y utilice el RPG Aunque el marketing y los intereses creados sean muy agresivos, en Febrero de 1997 y con el título de “Acceder a los datos del AS/400 desde Internet” presentábamos por primera vez las APIs del CGI incluidas en el OS/400 que permiten combinar la potencia de nuestras bases de datos con la simplicidad de la Web mediante los lenguajes más clásicos del iSeries (RPG y Cobol). Como parte de DB2/400 el OS/400 también incluye “de serie” un producto llamado Net.Data. En realidad Net.Data es un lenguaje de filosofía similar a la de PHP, es decir, uno o varios scripts de servidor que a través de CGI procesan formularios HTML. Detrás, Net.Data puede acceder a DB2/400 vía SQL así como llamar a cualquier ejecutable que esté en el sistema (y que no sea interactivo, claro). Por ejemplo, podemos tener una pantalla HTML de petición de un informe, por detrás llamar a un programa RPG que mediante parámetros o un archivo de trabajo devuelva unos resultados mediante una página HTML que los presente al navegador del usuario o que mediante SQL los añada al archivo de trabajo o a la Base de Datos. Como es lógico, con Net.Data (o con cualquier “otra cosa” relacionada con la Web) también es necesario saber algo de HTML, XML, Hojas de estilo y JavaScript. Si se sabe RPG, la manera más fácil para desarrollar aplicaciones Web es usar tecnología CGI aunque en sí misma dicha tecnología no sea nada fácil de utilizar. Sin embargo, entre otras utilidades de terceros que enmascaran su complejidad, existe una gratuita, la CGIDEV2, basada en un programa de servicio, que permite desarrollar páginas Web muy fácilmente utilizando programación RPG CGI.

Otros artículos relacionados Desarrollo de una aplicación CGI con RPG (1ª parte) Marzo 1997 - número 72 Desarrollo de una aplicación CGI con RPG (2ª parte) Octubre 1997 - número 79 Utilización del RPG con Net.Data Mayo 1999 - número 94 Formularios HTML con Net.Data Octubre 1999 - número 97 Utilizar un archivo de registro de la web con Net.Data Junio/Julio 2000 - número 105 HTML y RPG-CGI para gestionar listas de validación Junio/Julio 2002 - número 125 (Suplemento HELP400) RPG y CGI te invitan a la web Diciembre 2002 - número 129 Simplifique el desarrollo web con Net.Data Febrero 2003 - número 131 RPG para aplicaciones web Febrero 2003 - número 131

www.help400.es

La rebelión de los disidentes Si uno pregunta en cualquier centro de IBM cómo puede desarrollar aplicaciones Web, la respuesta unánime será que con tecnología Java y a través de WebSphere. Como consecuencia de este “pensamiento único”, en IBM nadie ha oído hablar de otras posibilidades y alternativas. La utilidad CGIDEV2 fue desarrollada entre 1996 y 1999 por Mel Rothman (jubilado de IBM desde 2002) para ser utilizada por el personal de IBM Global Services. En 1997, Giovanni B. Perotti, de IBM Italia, convenció al responsable del CTC (Client Technology Center) de IBM en Rochester para que se distribuyera gratuitamente a través de una página web (www-922.ibm.com). Más de 17.000 descargas de 126 paises distintos avalan su popularidad. Según Perotti, al menos tres mil webs iSeries han sido construidas utilizándola. Perotti se retiró de IBM a finales del pasado mes de Junio, y pidió permiso a IBM para redistribuir CGIDEV2 en su página web personal, www.easy400.net, con el fin de ofrecer soporte y actualizaciones a la comunidad que la utiliza. La respuesta de IBM fue negativa. Sin renunciar a su idea, el día 19 de Julio mediante e-mail Perotti solicitó el apoyo de los usuarios de CGIDEV2 para pedir a IBM que otorgara a la aplicación el status de código abierto. En pocos días todos los foros del entorno (incluido el nuestro, forum.help400) y las webs especializadas se hicieron eco de la petición. Como consecuencia, más de 350 mensajes fueron remitidos a las direcciones e-mail de Peter Bingaman, (actual World Wide iSeries Marketing de IBM) y del responsable del CTC en Rochester, tal y como refleja el documento Pleadings.doc (accesible en easy400.net) y donde se puede ver que 10 de esos mensajes proceden de España. Conste que CGIDEV2 se sigue distribuyendo libremente desde la web de IBM y desde www.easy400.net con acceso a IBM. A mediados de Agosto, IBM había pasado del NO más rotundo al inicio de una valoración de las posibles implicaciones de cederlo a la comunidad Open Source. Afortunadamente, parece que ese famoso “pensamiento único” del iSeries tiene los días contados: En Agosto IBM ha admitido el VisualRPG.Net de ASNA como parte de su “iSeries Developer Roadmap” y pronto, muy pronto, PHP podrá correr en el iSeries en modo nativo. Por la misma razón, esperemos que el producto Net.Data no sea discontinuado.

A modo de resumen Como muestra el recuadro adjunto (“Otros artículos relacionados”) no es la primera vez que tratamos este tema en la revista. Durante años, Java ha recibido buena parte de la atención de la prensa especializada por lo que se refiere al desarrollo de aplicaciones en el iSeries pero... ¿por qué aprender otro lenguaje si utilizando las APIs disponibles en el iSeries, bien directamente o bien mediante programas de terceros, el RPG ya hace lo que quiero y en menos tiempo que con otras soluciones? ■

Carlos Bell es colaborador habitual de esta revista. AGOSTO-SEPTIEMBRE 2005 ServerNEWS 11

por Jef Sutherland

Cree páginas web dinámicas sin tener que programar a mano código HTML en los programas escritos en RPG

GIDEV (en realidad, CGIDEV2, que es la versión no está totalmente seguro de saber qué es CGI, consulte el remás reciente) forma parte de Easy400 (www- cuadro “CGI: qué es y cómo funciona”, en la página 15. 922.ibm.com), un kit de herramientas de desarrollo de páginas web gratuito suministrado por IBM. Cómo desarrollamos en KOA nuestras CGIDEV2 es un programa de servicios que pro- aplicaciones web porciona un sencilla envoltura (wrapper) para las API de IBM, En KOA utilizamos dos herramientas para el desarrollo de además de otros procedimientos que facilita el trabajo a los aplicaciones web. Empezamos con iSeries Net.Data de IBM y desarrolladores de RPG. CGIDEV2 ofrece un medio de in- seguimos usándola. Para nosotros, Net.Data es el CL del cluir páginas HTML en progradesarrollo web en el iSeries. mas escritos en RPG como si Net.Data es fácil de aprender y CGIDEV2 ofrece un medio de fueran plantillas, llevar a cabo de utilizar, tiene acceso completo sustituciones de variables y devola los archivos de DB/400 medianincluir páginas HTML en ver páginas HTML. La inclusión te sentencias de SQL y ofrece una de plantillas de HTML significa forma de enviar y recibir datos programas escritos en RPG que no es necesario crear el códidesde aplicaciones del iSeries. como si fueran plantillas, go HTML escribiendo manualLas macros de Net.Data (es demente instrucciones en el progracir, los archivos de código fuente) llevar a cabo sustituciones de ma de RPG. Utilizar CGIDEV2 y no se compilan. En vez de ello, el HTML es tan sencillo como utiliservidor HTTP interpreta el arvariables y devolver páginas zar DDS para las aplicaciones de chivo de macro, lo que facilita HTML. pantalla verde. cambiar su código fuente para IBM diseñó específicamente el kit hace pruebas. Naturalmente, el de herramientas para los programadores de RPG que deseen inconveniente de las aplicaciones que no se compilan es que desarrollar aplicaciones web. CGIDEV2 es ILE, de manera que los problemas del código, como por ejemplo las sentencias que también funciona con Cobol. La herramienta no sólo es fácil de no son válidas, no se descubren hasta que se ejecuta la apliutilizar, sino que en el kit también pueden encontrarse varios cación. Y el código interpretado generalmente no se ejecuta ejemplos que le ayudarán a empezar a utilizarlo enseguida. Si tan deprisa como el código compilado. 12 ServerNEWS AGOSTO-SEPTIEMBRE 2005

www.help400.es

www.help400.es

AGOSTO-SEPTIEMBRE 2005 ServerNEWS 13

■ EN PORTADA No obstante, para algunas de nuestras necesidades relacionadas con las aplicaciones web, Net.Data es engorroso. Por ejemplo, si una aplicación necesita acceder a varios archivos para obtener un registro (o unos pocos) de cada archivo, la sentencia de SQL puede ser inmanejable. Sin duda, para acceder a los datos no hay nada más fácil que una secuencia CHAIN o SETLL/READ de RPG, y aquí es donde CGIDEV2 entra en acción. Las excelentes funciones integradas (BIF) de manejo de series y de fechas de RPG también son difíciles de batir. En KOA, todavía utilizamos ambas herramientas. Si necesitamos una aplicación web sencilla para obtener una determinada entrada y responder con una lista de datos fáciles de obtener con una sola sentencia de SQL, utilizamos Net.Data. Si necesitamos una base de datos o una interfaz de usuario más compleja, por ejemplo algo que implique una tabla (comparable a un subarchivo de DDS) que proporciona entrada y salida, utilizamos CGIDEV2.

FIGURA 1 Solicitud para que el usuario escriba el número de artículo que buscar

Ejemplo de CGIDEV2 Veamos un ejemplo sencillo de cómo utilizar RPG, un poco de HTML y CGIDEV2 para hacer una búsqueda de un artículo, además de usar el navegador como Interface de Usuario (IU). Generalmente, cuando me enfrento a un proyecto, empiezo primero por la IU. Prefiero diseñar la forma en que el usuario interactúa con la aplicación y luego llevar a cabo el desarrollo del programa. Durante el diseño la IU, todavía no se utilizan RPG, HTML ni CGIDEV2. Para la aplicación de ejemplo necesito tres páginas de IU. La primera muestra la solicitud para que el usuario escriba el número de artículo (Figura 1). La segunda muestra el resultado si se encuentra el artículo (Figura 2). La tercera muestra la página de error que recibe el usuario si no se encuentra el artículo (Figura 3). En esta aplicación he utilizado la herramienta de diseño de páginas web de WDSc, Page Designer, que me encanta desde hace mucho tiempo, pero usted puede utilizar la herramienta de diseño web que desee. En la Figura 4 puede verse la solicitud de la búsqueda de artículos y las páginas de resultados dentro de la herramienta de diseño WYSIWYG de WDSc. El diseño del código HTML es sencillo. En una aplicación real, probablemente utilizaría hojas de estilo en cascada (CSS), más colores y otros elementos de diseño. Pero, como puede verse en las Figuras 1, 2 y 3, para la interfaz de usuario utilizaré pocos colores e imágenes. En la Figura 5 se muestra el archivo itemlookup.html, que contiene el código HTML de la solicitud de búsqueda de artículos y de los formularios de resultados. En la Figura 6 se ve el archivo errorforms.html, que contiene el código HTML del formulario de error. CGIDEV2 permite poner cualquier número de páginas web en un solo archivo fuente gracias a que utiliza el marcador /$ para separar cada formulario o página. Por ejemplo, como puede verse en la Figura 5, he diseñado dos plantillas de formulario, initialform y resultform, en el archivo HTML. Más adelante veremos cómo incluir los formularios en un programa escrito en RPG. 14 ServerNEWS AGOSTO-SEPTIEMBRE 2005

FIGURA 2 Página de resultados de la búsqueda de artículos

Fíjese en los marcadores /%nombre_variable%/, como / %price%/. CGIDEV2 utiliza espacios reservados, de modo que en RPG puedo incluir valores para los nombres de variables. Los espacios reservados pueden considerarse como campos de un archivo de pantalla. Después de diseñar la interfaz de usuario, ya puede desarrollarse el programa en RPG. La lógica del programa es sencilla: www.help400.es

FIGURA 3 Página de error que el usuario recibe si el artículo no se encuentra

1. Mostrar el formulario de solicitud (Figura 1). 2. Esperar a que el usuario escriba un número de artículo y pulsar el botón Find It! (Buscar). 3. Obtener el número de artículo del formulario HTML. 4. Buscar el número de artículo en el archivo maestro de la base de datos de artículos. 5. Devolver los resultados: a. Si se encuentra el artículo, mostrar la información de éste (Figura 2).

FIGURA 4 Páginas de solicitud de búsqueda de artículo y de resultados en la herramienta de diseño WYSIWYG de WDSc

b. Si no se encuentra, devolver un mensaje de error en el formulario. Éste tiene un botón Try Again (Intentarlo otra vez), que el usuario puede pulsar para volver al paso 1 y hacer otra búsqueda (Figura 3).

CGI: qué es y cómo funciona

C

GI significa Interfaz común de pasarela y es un medio estándar para un navegador de interactuar con un servidor web que se esté ejecutando en cualquier plataforma, como Apache en el i5 o Microsoft IIS en Windows. CGI permite ejecutar páginas web dinámicas en las que el usuario hace una petición y se le devuelve un resultado. Las páginas dinámicas difieren de las páginas web estáticas en que las páginas estáticas son iguales cada vez que se muestran. Así es como funciona CGI: en el servidor web, una o más aplicaciones CGI (es decir, programas) permiten que se le hagan peticiones. Cuando las aplicaciones CGI del lado del servidor reciben la petición, la ejecutan y muestran una página de resultados. Normalmente, cuando un servidor utiliza una aplicación CGI, el URL contiene referencias a “cgi” o “cgi-bin”, como en el ejemplo siguiente: http://www.miservidorweb.com/cgibin/miaplicweb?parm1?12345&parm2=codigopostal.

Si el URL anterior se utilizara en un servidor web de un i5, la parte “cgi-bin” dirigiría la solicitud a las aplicaciones cgi-bin de lado del servidor. En el servidor web, cgi-bin se correlacionaría con una biblioteca en que residen los programas CGI. A

www.help400.es

su vez, la aplicación CGI llamaría al programa MIAPLICWEB especificado en el URL y le pasaría dos variables, parm1 y parm2. La aplicación de la que estamos hablando puede estar escrita en cualquier lenguaje del i5 y, sin duda, RPG sería un buen candidato. La aplicación se ejecutaría en el servidor i5 y tendría acceso a las variables parm1 y parm2. La variable parm1 se enviaría con el valor “12345”, mientras que la variable parm2 se enviaría con el valor “codigopostal”. En la aplicación, se utilizarían las API suministradas por IBM para acceder a las variables enviadas a la aplicación y luego se prepararía una página de resultados que se devolvería al navegador web. La aplicación que acabo de describir requeriría varias API relativamente complejas. Para que se haga una idea de esa complejidad, devolver la salida al navegador con esas API sería parecido a preparar una salida de pantalla verde sin DDS y que esa salida estuviera formada por una serie de caracteres larguísima. Puede hacerse, pero sería una tarea imponente. Esa es la causa de que la primera vez que oímos hablar de CGIDEV en KOA, nos sintiéramos muy interesados por saber más cosas sobre este kit de herramientas. —J.S.

AGOSTO-SEPTIEMBRE 2005 ServerNEWS 15

■ EN PORTADA En la Figura 7 se muestra el código fuente escrito en RPG del programa ITEMLOOKUP. ITEMLOOKUP está compilado en el iSeries y se llama siempre que el servidor web necesite solicitar al usuario un número de artículo, mostrar información sobre el artículo o una pagina de error, en caso de que no se encuentre. El parámetro action del formulario (en el punto A de la Figura 5) especifica el programa del servidor al que hay que llamar. Examinemos paso a paso el código fuente (las letras utilizadas como secuencia se corresponden con las secciones de la Figura 7): A. Sin duda, CGIDEV2 y RPG permiten acceder de forma sencilla a todos los archivos de DB2/400. He especificado la ubicación del archivo. Generalmente, los programadores que empiezan a trabajar con CGI o aplicaciones web tiene problemas con las listas de bibliotecas. Si los archivos no están en la biblioteca CGI, habrá que utilizar la palabra clave EXTFILE o actualizar manualmente la lista de bibliotecas del trabajo del servidor web para asegurarnos de encontrar los archivos. B. Los prototipos y variables de CGIDEV2 se incluyen con uno o varios miembros de copia. C. Estas dos variables de trabajo son las únicas que hay que definir para la aplicación. D. Este código borra el buffer de CGIDEV2 e incluye los formularios HTML que hemos creado. Piense en la llamada a GetHtmlifsMult como una operación de apertura de varios archivos de pantalla. El subprocedimiento GetHtmlifsMult carga en memoria (con una sola llamada) varios archivos IFS (es decir, continuos) de HTML definidos externamente. E. Este es un paso importante. Si el servidor web tiene que devolver algo al programa en el campo del formulario de la solicitud, podemos recuperar el valor. Si en la solicitud no se ha de recuperar nada, sabremos que es la primera solicitud realizada por la aplicación y que debe mostrar el formulario inicial que se ha presentado en la Figura 1. Después de mostrar el formulario en el navegador, observe que 16 ServerNEWS AGOSTO-SEPTIEMBRE 2005

FIGURA 5 Código HTML de las páginas de solicitud de búsqueda de artículos y de resultados /$initialform Item Lookup

Item lookup



A

  Item number

B

/$resultform Item Lookup - Result Page

Item lookup

Item number/%number%/
Description/%desc%/
Sales price$/%price%/
Picture


FIGURA 6 Código HTML de la página de error /$notfound Item Lookup - Item not found

Item lookup

Sorry, Dude. The item number you requested, <strong> /%number%/ , could not be found. Click the Try Again button.


www.help400.es

hay un campo oculto llamado Request (Solicitud) cuyo valor es “lookup” (búsqueda; punto B en la Figura 5). Cuando el usuario introduce un valor para el número del artículo y pulsa Find It!, el campo del formulario Request contiene el valor “lookup”, que la aplicación recupera en este paso, de manera que ya sabe que tiene que buscar un número en el archivo ITEMS1, el archivo maestro de artículos de la base de datos.

F. En esta parte de la lógica de SELECT es cuando averiguamos, basándonos en el valor del campo Request, lo que se necesita para hacer la búsqueda. Para ello, se llama a ZhbGetVar para poder recuperar lo que el usuario ha escrito en la entrada del número de artículo del formulario web. El resultado se guarda en el campo Number de ITEMS1. Se concatena con el archivo y se decide qué hacer dependiendo de si se ha encontrado algo o no.

FIGURA 7 Código fuente en RPG del programa ITEMLOOKUP A

*===================================================================== FITEMS1 IF E K DISK EXTFILE('MYLIB/ITEMS1')

B *===================================================================== * Includes to be used in CGIs *===================================================================== /copy mysource/CGIDEV2

C D E

D imagelink D request

S S

100 10

/free clrhtmlBuffer(); IfsMultIndicators = GetHtmlifsMult('/itemlookup.html /errorforms.html'); // The variable request holds the result of ZhbGetVar, // which determines whether the program was sent a value // for the HTML form field called Request. request = ZhbGetVar('request'); select; // Determine the action requested. when request = 'lookup';

F

// Get the requested item number from the HTML form. number=ZhbGetVar('number'); // Get item record. chain number itemsr;

G

// If found, update variables and write out a new HTML page. if %found(items1); updHTMLvar('number': number ); updHTMLvar('desc' : descript ); updHTMLvar('price' : %editc(salesprice : '3'); imagelink = '/js/' + image; updHTMLvar('image' : imagelink ); WrtSection('resultform');

H

// If not found, display error page. else; updHTMLvar('number': number ); WrtSection('notfound'); endif;

I

// No request was sent, so write the initial request page. other; //Write the initial form that asks for an item number. WrtSection('initialform'); endsl;

J

//Write the end of the form (required with CGIDEV) WrtSection('*fini'); *INLR = *ON; /end-free

www.help400.es

G. Si se ha encontrado el número de artículo, se utiliza el procedimiento updHTMLVar para devolver el valor de la variable de HTML al navegador. Por ejemplo, updHTMLVar(‘desc’ : descript ); toma el valor de descript y actualiza (es decir, sustituye) cualquier referencia a /%desc%/ en el formulario de salida. Al final del proceso, se utiliza el procedimiento WrtSection con el nombre del formulario desde el fuente HTML para devolver el formulario al navegador. ¡Fácil! H. Si no se ha encontrado el número de artículo, se utiliza el procedimiento updHTMLVar para actualizar /%number%/ en el formulario del mensaje de error y luego se copia el formulario de error con el procedimiento WrtSection. I. Si el campo Request tiene otro valor distinto de lookup, se mostrará el formulario inicial de la entrada del número de artículo (Figura 1). J. Hemos acabado. En CGIDEV2 se utiliza WrtSection(‘*fini’) para indicar que se ha acabado todo el trabajo y que debe devolverse la salida al navegador. Finalmente, un poco de mantenimiento: se cierran todos los archivos. Cuando repase el código fuente verá que no tiene mucho en cuenta si la aplicación utiliza la IU de un navegador. Y aunque este ejemplo es bastante sencillo, en KOA hemos utilizado CGIDEV2 para desarrollar aplicaciones parecidas a una aplicación de entrada/salida de un subarchivo. Estoy seguro de que después de poner en funcionamiento su primera aplicación CGIDEV2, descubrirá otros usos para esta herramienta tan útil (y gratuita). Asegúrese de echar un vistazo a los ejemplos del sitio web sobre CGIDEV2 de IBM (www-922.ibm.com/easy400p/framer1.html?url=/cgidev2/start). Así es cómo nosotros aprendimos a utilizar CGIDEV2. ■

Jef Sutherland es redactor técnico de iSeries NEWS y vicepresidente de los servicios de información de Kampgrounds of America, Inc., Billings, Montana. AGOSTO-SEPTIEMBRE 2005 ServerNEWS 17

por Bradley V. Stone

La programación en CGI permite ofrecer información actualizada a los usuarios finales a través de la Web a programación de la Interfaz común de pasaTomemos por ejemplo la industria de los componentes de rela (CGI) existe en el iSeries desde hace unos automoción. En el pasado, si necesitaba determinada pieza, cuantos años. Desde por lo menos el release digamos, por ejemplo, un faro original de un Ford Focus de V3R2, IBM ha proporcionado APIs que permi- 1998, visitaría un concesionario oficial de la marca y compraten a los programadores crear páginas web to- ría allí la pieza. talmente funcionales sin necesidad de utilizar Hoy en día hay literalmente cientos de empresas que ofrecen soluciones caras y que consumen muchos recursos. piezas originales y de segunda mano para casi cualquier marca Hoy, más que nunca, las empresas están interesadas en y modelo de vehículo. Algunas de esas empresas son concesioencontrar la mejor forma de ofrenarios locales que han ampliado su cer aplicaciones web interactivas a La programación en CGI es lo negocio de venta de componentes a sus clientes y usuarios. Con tantas Internet, aumentando su base de clientes exponencialmente. opciones disponibles y algunas que permite a las empresas Localizarlos utilizando un motor mucho más comerciales que otras, de búsqueda es fácil y el resultado solemos pasar por alto la mejor so- crear aplicaciones dinámicas, lución y la más sencilla. funcionales e interactivas para final es que recibiremos directamente la pieza en nuestro domiciUtilizando las APIs disponibles en el iSeries, directamente o me- ayudarlas a crecer o para lio. Además, nos ahorraremos un diante un programa de utilidad de montón de dinero comparándolo terceros, los programadores que facilitar el trabajo de sus con lo que nos habría costado si la trabajan con iSeries descubrirán empleados. hubiéramos comprado en nuestro que la tecnología que IBM parece concesionario local. estar intentando eliminar es la úniGracias a Internet, ahora las ca que realmente tiene sentido utilizar. empresas pueden llegar a clientes a los que normalmente nunca hubieran podido acceder. Este es sólo un ejemplo entre mil del papel crucial que tiene Internet en el juego empresarial La importancia del contacto con la Web Si no está familiarizado con las aplicaciones web, es bastante de la “supervivencia de los más aptos”. probable que acabe varado en una isla desierta. Las empresas están utilizando con gran éxito la web en su propio bene- ¿Qué es la programación en CGI? ficio para llegar a clientes a los que normalmente no ten- La programación en CGI es lo que permite a las empresas drían acceso. crear aplicaciones dinámicas, funcionales e interactivas para 18 ServerNEWS AGOSTO-SEPTIEMBRE 2005

www.help400.es

www.help400.es

AGOSTO-SEPTIEMBRE 2005 ServerNEWS 19

■ EN PORTADA ayudarlas a crecer o para facilitar el trabajo de sus emplea- más funcionales o más “atractivas”. Lo que determina esos dos. La programación en CGI permite a empresas como eBay atributos es la destreza de la persona que cree el código tener entornos cambiantes sin necesidad de tener que crear HTML. páginas web manualmente. En vez de ello, igual que haceEstos lenguajes de programación en CGI también dispomos con las pantallas verdes y los informes, escribimos pro- nen de herramientas que les permiten leer la información de gramas en CGI que crean contenido web dinámicamente con- una página web. Si alguna vez ha estado en una página web forme cambian los datos. donde se le solicitaba introducir determinada información, Antes de tomar una decisión como la de qué juego de he- seleccionar artículos para añadirlos a un carrito de la comrramientas utilizar para crear aplicaciones web dinámicas, pra o hacer algo que sea “interactivo”, quiere decir que ha deberá tener claro qué es exactamente lo que desea llevar a visto CGI en acción. Para que un programa pueda responder cabo, cuáles son sus conocimientos actuales y, por último, a su interacción o leer la información de un formulario en cuántas herramientas de aplicaciones web le ofrecen el mis- línea, ese programa debe ser capaz de leer los datos para pomo resultado. Esto significa comder reaccionar en consecuencia. prender qué es exactamente la proDe modo que, en resumidas cuengramación web o en CGI. tas, las aplicaciones web no hacen En el nivel más bajo, casi todas Los programas en CGI más que lo que hemos hecho todos las páginas web (por no decir todas) antes utilizando pantallas verdes o se crean utilizando HTML. También pueden escribirse en muchos informes. La única cosa que ha pueden utilizarse otras formas de lenguajes de programación cambiado es que ahora debemos lenguajes de marcado (como XML o interactuar con un navegador web los lenguajes de códigos de disposi- distintos, incluyendo RPG, en lugar de con una pantalla vertivos inalámbricos), pero en general de. Seguimos leyendo información utilizaremos páginas web, lo que Cobol, Java y C. de la interfaz y devolviendo inforsignifica que estaremos creando cómación a esa interfaz. digo HTML dinámico utilizando programas escritos en CGI. Aplicaciones web y comunicación HTML es lo que permite que un programador muestre de- La siguiente pieza del rompecabezas que hemos de tener en terminado contenido en el navegador web de un usuario. Este cuenta es la interacción entre el navegador web del usuario y contenido pueden ser imágenes, formularios de entrada e in- el iSeries. formación detallada (como la lista de un inventario o toda Esta interacción se realiza utilizando un servidor web, tamuna tienda) para vender prácticamente cualquier producto. bién conocido como servidor HTTP. Un servidor web no es Casi todo lo que vemos en una página web se ha creado utili- nada más que un trabajo o un grupo de trabajos que se ejecuzando HTML. tan en segundo plano en el iSeries esperando peticiones y En el nivel siguiente, los programadores pueden escribir luego respondiéndolas. Las peticiones hechas al servidor web programas que creen código HTML dinámicamente para que se hacen cuando un usuario escribe (o pulsa en) un enlace lo vea un usuario final en tiempo real. De la misma forma que contiene un URL que apunta al iSeries. Esta conexión se hace porque en todo URL hay un nombre que utilizamos DDS para crear informes y subarchivos a partir de los datos del iSeries, podemos crear una salida pareci- de dominio (o dirección IP). Por ejemplo, “miempresa.com” es da utilizando HTML y páginas web. Lo importante es recor- un nombre de dominio. Este nombre de dominio apunta a dar que gracias a ello podemos proporcionar a nuestros una dirección IP. La dirección IP se asigna al iSeries (o a un usuarios finales información actualizada a través de la web. cortafuegos o a un router instalados antes que el iSeries). Así es como se hace la conexión entre el navegador y el iSeries. La programación en CGI es lo que nos permite hacerlo. Una vez que el servidor web recibe una petición, la interEs importante entender que CGI no es un lenguaje de programación concreto. No hay ningún lenguaje de programa- preta y devuelve información al usuario. Esta información ción llamado “CGI”. CGI es un método de programación. Los puede ser en forma de una página web estática o el resultado programas en CGI pueden escribirse en muchos lenguajes de de ejecutar un programa CGI, que crea la información de la página web en tiempo real. En el iSeries tenemos dos opcioprogramación distintos, incluyendo RPG, Cobol, Java y C. Cada uno de esos lenguajes dispone de herramientas que nes para un servidor web. La primera posibilidad, que ya no les permiten enviar contenido creado dinámicamente a un es una opción viable en las máquinas con el release V5R3 o navegador web. Así que, en cierto sentido, toda la progra- posterior instalado, es lo que se conoce como el servidor HTTP mación en CGI consiste en crear series de datos (en este “clásico”. La segunda posibilidad y la más viable es el servicaso, código HTML) y luego en introducir esos datos en una dor HTTP Powered by Apache. Este servidor se basa en el página web para que los vea el usuario que los ha solicita- famoso servidor web Apache que utilizan la mayoría de las do. Eso es todo. Una vez entienda esto, debería quedar cla- máquinas en Internet en la actualidad. Con el servidor web se pueden establecer configuraciones ro porqué ningún lenguaje o juego de herramientas de programación en particular hará mejores sus aplicaciones web, para que el servidor web sepa qué hacer con determinadas 20 ServerNEWS AGOSTO-SEPTIEMBRE 2005

www.help400.es

peticiones, qué programas CGI se están ejecutando y en qué directorios (por ejemplo, HTML, imágenes, JavaScript u hojas de estilos) el usuario puede acceder a archivos.

Entrada y salida

gación). Los datos que se ven allí son la variable de entorno QUERY_STRING. No es totalmente necesario entender estas dos formas de entrada, pero sí que es importante entender qué método se está utilizando para poder determinar qué API usar para leer los datos que se envían con una página web.

Los programas en CGI funcionan con un entorno que es bastante nuevo para casi todos los programadores que trabajan con iSeries. Pero si aprende cómo funcionan esos programas GET o POST en CGI, será capaz de crear mejores aplicaciones. En la sección anterior hemos explicado dos métodos de leer Cuando los programas en CGI crean y copian contenido datos de una página web, casi siempre mediante el uso de un dinámico, lo hacen en lo que se conoce como salida estándar. formulario de página web. La forma en que un formulario Técnicamente, la salida estándar es la ubicación a la que se envía estos datos al programa CGI, a través de la entrada envían los datos si no se especifica estándar o de la variable de enotra salida (por ejemplo, una imtorno QUERY_STRING, la deterpresora). En la terminología de la mina el método que se especifique programación en CGI, escribir daal crear un formulario de página tos en una salida estándar signifi- Una vez conocido el método web o incluso un hiperenlace. ca que los datos se guardan en una Cuando se crea un formulario de de petición, ejecutar la API ubicación a la que el navegador página web, normalmente se espeweb del usuario visitante puede adecuada para leer los datos cifica un identificador de método acceder y que luego puede utilizar para ese formulario. Con ese no es ningún problema. para visualizar una página web. identificador de método se especiCuando un usuario solicita un fica un método GET o POST. archivo HTML estático (creado El método GET indica al formupreviamente) al servidor web, no lario que pase los datos desde el hay una interacción directa de ningún programa. Esto quie- formulario hasta el programa que los procesará utilizando la re decir que el usuario solicita el archivo HTML, el servi- variable de entorno QUERY_STRING. Los datos también dor web copia el contenido de ese archivo estático en la pueden pasársele a un programa CGI mediante la variable salida estándar y los datos aparecen en el navegador web de entorno QUERY_STRING simplemente incluyendo datos del usuario. a continuación de un hiperenlace en una página web. Cuando un usuario hace una petición a un programa CGI, El método POST especifica que los datos del formulario el servidor web ejecuta ese determinado programa CGI. Éste deben pasarse al programa que los procesará mediante la crea el código HTML dinámicamente en tiempo real y graba entrada estándar. Esta es la razón por la que es importante que el programa esos datos en la salida estándar donde, a continuación, el navegador web del usuario visualizará los datos como una que procesa los datos sepa qué método -GET o POST- se está utilizando. El programa debe saber qué API utilizar para leer página web. La entrada que se lee de una página web, por otro lado, se los datos y cada método requiere utilizar una API distinta. obtiene de dos formas distintas. La entrada normalmente son Para determinar qué método se está utilizando, un progradatos que se leen de lo que se conoce como un formulario de ma puede recuperar el valor de la variable de entorno página web. Seguramente todos hemos utilizado uno antes. REQUEST_METHOD. El valor obtenido será GET o POST. Si alguna vez ha rellenado información en una página web, Una vez conocido el método de petición, ejecutar la API adecuada para leer los datos no es ningún problema. ya sabe lo que es. Como el método GET pasa los datos como parte del URL, La primera forma de leer la entrada es mediante lo que se conoce como entrada estándar. Cuando se leen los datos de la no es recomendable utilizar este método si los datos pueden entrada estándar se hace desde el cuerpo de la solicitud. No ser confidenciales o si su tamaño es de unos pocos kilobytes. es importante entender completamente esto. Lo que sí es En estas situaciones, deberá utilizar el método POST. Como importante es entender la diferencia entre entrada estándar utilizando el método POST los datos que se pasan forman parte de las cabeceras de la petición HTTP, éstos no son y el otro método de entrada. La segunda forma en que se leen los datos es desde lo que visibles inmediatamente por el navegador web del usuario. llamamos variables de entorno. En el caso concreto de los datos Pero seguirán estando a disposición del programa que los de un formulario, se utiliza una variable de entorno conocida procesará. como QUERY_STRING. Esto significa que los datos se pasan con el URL de la petición. Si alguna vez se ha fijado en la Las API disponibles de CGI barra de situación del navegador web, habrá visto una serie El iSeries incluye de serie un conjunto de API gratuitas de datos que se incluyen en el URL después del nombre de que pueden utilizarse para crear páginas web e interactuar dominio (generalmente precedidos por un signo de interro- con ellas. Si está familiarizado con el uso de las API, no www.help400.es

AGOSTO-SEPTIEMBRE 2005 ServerNEWS 21

■ EN PORTADA tendrá problemas con ellas. Si no lo está, piense en ellas como si fueran programas suministrados por IBM a los que basta con “llamar” desde el programa para que ejecuten una función. Estas API se incluyen en un programa de servicio llamado QZHBCGI, que se encuentra en la biblioteca QHTTPSVR. Si utiliza el mandato DSPSRVPGM (Visualizar programa de servicio) en el programa de servicio QZHBCGI, verá la extensa lista de subprocedimientos de que se dispone. La documentación en línea de IBM puede ayudarle a entender más cosas acerca de las API, puesto que aquí sólo le daremos una breve explicación. La primera API (y la más utilizada) es QtmhWrStout (Grabar a salida estándar). Se llama a esta API cuando se desea grabar datos a una página web. Basta con crear una serie de caracteres HTML y pasársela a esta API y los datos se grabarán en la salida estándar y se mostrarán en un navegador web. Esta API puede llamarse muchas veces sucesivamente, por lo que no hay que preocuparse por tener que crear una página web completa de una sola vez. Por el contrario, puede crearla por secciones, llamando a la API QtmhWrStout tantas veces como sea necesario. Otra API muy utilizada es QtmhGetEnv (Obtener variable de entorno). Esta API recupera el valor de una variable de entorno. Esta API puede utilizarse para recuperar el valor de los campos de un formulario web enviado utilizando el método GET. Los datos estarán disponibles en la variable de entorno QUERY_STRING, en pares campo/datos, donde cada par campo/datos está separado por el símbolo &. Para leer datos de un formulario que utiliza el método POST debería utilizar la API QtmhRdStin (Leer entrada estándar). De nuevo, los datos se devolverán utilizando los pares campo/datos con el delimitador & separando cada par. Después de leer datos de la página web, puede utilizarse la API QtmhCvtDB (Convertir a base de datos) para convertir los pares campo/datos leídos de una de las API descritas antes en un formato que puedan utilizar las aplicaciones. Evidentemente, puede analizar los datos usted mismo, pero utilizando la API QtmhCvtDB podrá convertir los datos en estructuras de datos fáciles de usar que no sólo dan acceso directo a todos los campos y a su contenido, sino que también llevan a cabo las conversiones de tipos de datos necesarias. Estas conversiones de tipos de datos son necesarias porque todos los datos leídos en una página web están en formato de tipo carácter. Otra API útil es QzhbCGIParse (Analizar datos de CGI). Esta API permite leer los datos de un campo de un formulario simplemente especificando el nombre del campo del que se desean recibir los datos. Esta API hace que la programación en CGI en el iSeries sea mucho más sencilla.

(“e-RPG”). La documentación en línea de IBM también puede serle de ayuda para dar sus primeros pasos. Pero, antes de sumergirse profundamente en las API que son necesarias, deberá entender (sea cual sea la plataforma, solución o kit de herramientas de aplicaciones web que elija) los conceptos básicos de HTML, JavaScript, Hojas de estilo e inclusiones del lado del servidor (SSI). La mayoría de programadores pasan por alto estas cuestiones, pero yo no lo recomiendo. Casi todos nosotros ya sabemos cómo funciona RPG, pero no entendemos las herramientas que utilizaremos con RPG para crear aplicaciones web. Saltarnos estos temas es como intentar conducir un coche sin saber cómo se utiliza el volante. Una vez conozca los conceptos básicos, tal vez desee echarle un vistazo al kit de herramientas CGIDEV2 de IBM (www922.ibm.com) comentado en el artículo precedente, aunque existen otros en el mercado. Estos kits de herramientas permiten externalizar el código HTML y hacen que actualizar las aplicaciones sea coser y cantar. Espero que este artículo haya despertado su interés por una posible solución para que el equipo empiece a escribir aplicaciones web en el iSeries. Como hablo con cientos de personas cada semana sobre esta cuestión, sé que está empezando a hacerse popular. La razón principal por la que sé que la programación web en RPG se está haciendo popular es porque hay algunos que se ponen en contacto conmigo y me dice que “nuestro socio nos ha dicho que las aplicaciones escritas en RPG se ejecutarán más lentamente y/o utilizarán más recursos que las aplicaciones WebSphere”. Naturalmente, se trata de un mentira descarada (o de un malentendido, concedámosles el beneficio de la duda). Cualquiera que tenga el mínimo conocimiento del uso de los recursos que hace RPG y de lo que se tarda únicamente en ejecutar WebSphere (sin incluir las aplicaciones escritas en Java que también son necesarias) debería ser capaz de imaginarse que se trata de un simple sensacionalismo comercial. Como digo siempre, si una máquina ejecuta las aplicaciones escritas en Java deprisa, imagínese lo deprisa que se ejecutaría la aplicación desarrollada en RPG. ■

Primeros pasos

Bradley V. Stone es autor de varios manuales de formación sobre CGI y de la exitosa serie de libros “e-RPG”, que puede verse en bvstools.com/erpg. También es el creador del kit de desarrollo de software eRPG (eRPG SDK), que puede obtenerse en erpgsdk.com. Bradley es propietario de BVSTools.com, donde ofrece software alternativo de bajo coste así como cursos de formación y servicios de consultoría para el iSeries desde hace más de diez años.

La mejor forma de empezar a escribir aplicaciones web para RPG es haciéndose con uno de los muchos recursos disponibles. Personalmente, he escrito varios libros y manuales sobre el tema, agrupándolos bajo una denominación genérica 22 ServerNEWS AGOSTO-SEPTIEMBRE 2005

www.help400.es

www.help400.es

AGOSTO-SEPTIEMBRE 2005 ServerNEWS 23

Sobre las interfaces de usuario La flexibilidad y fiabilidad del iSeries son ventajosas a la hora de desarrollar interfaces de usuario y trabajar con ellas por Jef Sutherland

¿

Management

▲ ▲ ▲

24

A cuántas interfaces de usuario (IU) se enfrenta cada basadas en texto o gráficas, si una presentación no es intuitiva, día? Despertadores, relojes, cafeteras, hornos la aplicación será mala y los resultados también. microondas, teléfonos, contestadores, teclados para introducir códigos de seguridad, coches... son sólo unos La progresión de las IU cuantos aparatos que presentan interfaces que utili- Para los desarrolladores que trabajan con el iSeries que tiezamos casi a diario. Y en la mayoría de los casos, antes si- nen más experiencia (yo no he dicho “viejos”), las decisiones quiera de sentarnos en nuestra mesa, encender el ordenador de diseño sobre la interfaz de usuario solían ser más fáciles y mirar a la pantalla. porque había un solo dispositivo con el que interactuar. El La forma en que los aparatos eléctricos suelen presentar la método de la IU era una terminal, que tenía un número deinformación a los humanos a menudo decide el destino y la terminado de filas y columnas. Más aún, los amigos de IBM utilidad del dispositivo. Por supesto, lo mismo ocurre con las les habían suministrado un maravilloso juego de estándares aplicaciones. llamado SAA (Arquitectura para aplicaciones de sistemas) Como desarrolladores, podemos que especificaba desde cuál debía tener la mejor lógica y las mejoser la apariencia que debía tener res rutinas de proceso bajo la Tanto si se trata de interfaces la IU basada en texto hasta el núinterfaz de usuario, pero si ésta mero de puntos iniciales que deno obtiene la información correc- de usuario basadas en texto o bía haber después de la descripta de los usuarios o no se la preción pero antes de la entrada. senta de forma inteligible, habre- gráficas, si una presentación no Cuando los PC hicieron su apamos despilfarrado la inversión es intuitiva, la aplicación será rición, los desarrolladores del realizada en la aplicación. La iSeries básicamente siguieron interfaz de usuario es vital y no mala y los resultados también. trabajando con las mismas filas debe tomarse a la ligera. y columnas, pero ahora manejadas mediante la emulación de Las dos partes de una IU terminales. Apenas había que hacer cambios, aunque hubieSi descomponemos una IU, veremos que se compone de dos ra que subir o bajar información de esa nueva y extraña hepartes. La primera es el dispositivo o aplicación utilizado para rramienta llamada Lotus 1-2-3. A medida que el PC tomaba posesión de los escritorios con presentar la información. Suelo pensar en ellos como los métodos. Tanto si se trata del teléfono móvil como de Netscape Microsoft Windows y se ponía a disposición de los Navigator, la información se obtiene y se recopila a través de desarrolladores interesantes herramientas de desarrollo para esos métodos. La segunda parte es la forma en que se le pre- PC (como Visual Basic de Microsoft), a éstos se les ofreció un senta la información al usuario. Coja dos teléfonos móviles nuevo conjunto de herramientas gráficas para la interfaz de distintos y verá dos presentaciones diferentes de la informa- usuario, como ventanas múltiples, botones, recuadros de seción. Utilice Navigator para ir a Google y Yahoo! Y verá dos lección, menús desplegables, recuadros de listas, botones de presentaciones distintas de la información utilizando el mis- selección y hasta fotos. El método de la interfaz fue más allá mo método. de la emulación de terminales; convirtió todo el escritorio del Muchos desarrolladores del iSeries pueden sentir que es- PC en una opción. Se desarrollaron aplicaciones cliente-sertán atrapados en una interfaz de usuario basada en texto. vidor que permitían una nueva forma de presentación para ¡Pero no es cierto! Su experiencia con una de las plataformas la misma información que antes se había mostrado en una más flexibles y fiables para almacenar y recuperar informa- IU basada en texto. ción es una gran ventaja. El siguiente método de IU, y puede que el más reciente, es En los artículos de este número descubrirá que como el navegador. Hoy en día, el navegador no es meramente el desarrollador del iSeries tiene ventajas cuando hablamos de método para acceder a Internet... es el método de IU más métodos de interfaces de usuario y opciones de presentación. utilizado. Los navegadores han proliferado y ahora se puePero recuerde que tanto si se trata de interfaces de usuario den encontrar fuera del escritorio del PC, en los teléfonos

ServerNEWS AGOSTO-SEPTIEMBRE 2005

www.help400.es

móviles y hasta en las neveras. Los navegadores generalmente usan lenguajes de códigos, como HTML, para crear la parte de la presentación, o son una fuente en la que copiar un applet desde un servidor para ofrecer la interfaz. Una pregunta que se hacen muchos desarrolladores de iSeries es si sus IU basadas en texto son arcaicas e inútiles comparadas con los navegadores y sus GUI. La respuesta es que sí. Bueno, espere... Una vez más, la respuesta podría ser que no. Si sus aplicaciones pueden salir ganando si usa una GUI que utiliza fuentes diferentes, fotografías, ventanas múltiples o efectos multimedia para hacer la IU más eficaz de modo que represente un ahorro en los costes finales para la empresa, entonces la respuesta es sí, la interfaz basada en texto es arcaica. Sin duda, un sitio web es mucho más atractivo para los clientes cuando pueden ver una foto –no sólo una descripción– del producto. Pero si las necesidades de sus aplicaciones son la entrada de datos, entonces una IU basada en texto tiene sus ventajas, mientras se presente correctamente. Nunca cambie una aplicación de una IU basada en texto a una IU gráfica sólo porque le apetezca tener una interfaz “bonita” si no pretende vendérsela a nadie. Al final, puede que tenga una apariencia agradable a la vista, pero si no funciona mejor habrá derrochado el dinero de su empresa. La entrada de registros horarios, la de pedidos y las aplicaciones contables raramente se

beneficiarán de una interfaz “bonita”. Los hoteles, las empresas de alquiler de coches, las tiendas de comestibles, los supermercados y los servicios de atención telefónica son ejemplos de organizaciones en las que sigo viendo montones de IU basadas en texto, incluso aunque la aplicación esté basada en PC. Ahora, volviendo a la idea de que los desarrolladores que trabajan con iSeries tienen ventajas, si ha estado desarrollando IU basadas en texto, conocerá perfectamente un método. En este número le mostraremos algunos métodos (puede que sean nuevos para usted) de desarrollar o visualizar una IU gráfica. Como se explica en el artículo “Programación en CGI y el iSeries” (página 18), si decide utiliza CGI, podrá seguir trabajando con RPG como lenguaje de desarrollo para las IU. Y en caso de que desarrolle aplicaciones en Java, el artículo “Aplicaciones Java basadas en web: consideraciones tecnológicas”, que encontrará en la página 34, muestra cómo utilizar JSP y servlets. Explore estos métodos para el desarrollo de interfaces de usuario. Y la próxima vez que se le pida una “aplicación web” al grupo de desarrollo, no se le dejará fuera. ■

Jef Sutherland es redactor técnico de iSeries NEWS y vicepresidente de los servicios de información de Kampgrounds of America, Inc., Billings (Montana).

Suscríbase a

Management

y recibirá gratuitamente el suplemento técnico

▲ ▲ ▲

www.help400.es

AGOSTO-SEPTIEMBRE 2005 ServerNEWS

25

Mejor portabilidad: introducción al “Enterprise Generation Language” por George Farr, Phil Coulthard y Kushal Munir

U

Management

▲ ▲ ▲

26

na vez más, bienvenidos a nuestra serie de arDespués de crear un programa de EGL se genera el código tículos sobre el trayecto que lleva de RPG a fuente en Java o en Cobol a partir de él. Como lenguaje, EGL J2EE para desarrolladores de iSeries (véase es un cruce entre Cobol y Java. Aunque es procedural, tiene ibm.com/iseries/roadmap). En el artículo an- elementos de constructores del lenguaje Java. Es un lenguaterior (Mejor portabilidad: las herramientas de je sencillo pero potente que oculta muchos detalles de la desarrollo de Java, de mayo de 2005) describimos el desarrollo implementación para permitir que el desarrollador se conde aplicaciones portables utilizando las herramientas de desa- centre en resolver el problema y que llegue rápidamente a rrollo para Java proporcionadas por WebSphere Development una solución que funcione. También puede utilizarse para el Studio Client (WDSc). En artículos anteriores nos hemos cen- desarrollo rápido de aplicaciones (por ejemplo, para crear un trado en las herramientas de WDSc prototipo de una aplicación de gran tapara desarrollar aplicaciones de maño). El propio lenguaje no es nada interfaz de usuario para la web. restrictivo y puede usarse para desaDesarrollo en J2EE En este artículo seguiremos con rrollar aplicaciones completas. nuestra explicación del cuarto paso de Mejor ¿Cuán portable es EGL? este itinerario, el que trata sobre una escalabilidad EGL permite escribir aplicaciones mejor portabilidad. Además de Java, Mejor portables porque oculta los siguientes otra tecnología llamada Enterprise portabilidad detalles de la implementación: Generation Language (EGL) puede Mejor Plataforma. EGL es un lenguaje de ayudarnos a desarrollar aplicaciones arquitectura alto nivel y proporciona API indepenportables. Empezaremos viendo qué Mejor dientes de la plataforma de manera que es EGL. Después, pensaremos cómo interfaz permite que las aplicaciones sean el programador no tiene que preocuparMejores portables y valoraremos cuáles son sus se de las dependencias específicas de herramientas ventajas. También examinaremos algucada plataforma o de las diferencias nas de las herramientas específicas entre ellas. El código en Java generado para trabajar con EGL que existen en se puede ejecutar en una plataforma WDSc y cómo pueden utilizarse para iSeries, Windows, Linux o Unix, y el desarrollar aplicaciones en Java. código en Cobol únicamente en el iSeries. ¿Qué es EGL? Nivel de especificación. Los desarrolladores no tienen que EGL es una tecnología de desarrollo y un lenguaje de progra- preocuparse del nivel del código generado. Por ejemplo, si se mación que permite escribir rápidamente aplicaciones em- está generando código de un EJB, se basará en el último nipresariales totalmente funcionales. Ha evolucionado a partir vel de EJB soportado, sea el que sea, de modo que no es necede un lenguaje procedural que se utilizaba en VisualAge sario preocuparse por las especificaciones de EJB para los Generator, un antiguo producto de IBM. La versión actual de niveles 1.1, 2.0, etcétera, por ejemplo. Si desea utilizar otro EGL permite utilizar un sencillo lenguaje procedural para nivel de especificación, simplemente especifíquelo y vuelva a crear programas en Cobol no interactivos que pueden ejecu- generar el código. Almacenamientos de datos. Puede concentrarse en el protarse en el iSeries y programas en Java que pueden ejecutarse en cualquier plataforma, incluyendo el iSeries, Windows, blema de la empresa que está intentando resolver en vez de Linux, Unix y z/OS (con los servicios del sistema Unix). Pue- hacerlo en las complejidades técnicas de los almacenamientos den instalarse aplicaciones escritas en Java fuera de J2EE o de datos como, por ejemplo, el acceso a la base de datos, SQL, en el contexto de uno de los siguientes contenedores de J2EE: CICS o MQSeries. Se pueden utilizar instrucciones de E/S parecidas para acceder a distintos tipos de almacenamientos de datos externos, sean éstos archivos, bases de datos •cliente de aplicaciones de J2EE •aplicación web de J2EE relacionales o colas de mensajes. Esto permite manejar los •contenedores de EJB (en este caso, también se crea un bean futuros cambios en el almacenamiento de datos sin tener que de sesión de EJB) remodelar apenas el código.

ServerNEWS AGOSTO-SEPTIEMBRE 2005

www.help400.es

Management

▲ ▲ ▲ www.help400.es

AGOSTO-SEPTIEMBRE 2005 ServerNEWS

27

■ INTRODUCCIÓN AL “ENTERPRISE GENERATION LANGUAGE” Ventajas de utilizar EGL En el artículo anterior sobre las herramientas de desarrollo de Java explicamos las características de Java que hacen de él un lenguaje portable. Ahora puede que se pregunte cuáles son las ventajas de utilizar EGL y si puede utilizar Java para proporcionar portabilidad a sus programas. La diferencia principal es que EGL es un lenguaje de más alto nivel que Java. Una sola sentencia de EGL a menudo puede utilizarse para implementar funciones que requerirían muchas líneas de código en Java. EGL permite que el programador se concentre en resolver el problema de la empresa simplificando u ocultando muchos detalles de menor nivel relacionados con el acceso a los datos, el entorno de ejecución y la instalación. Además, aunque Java proporciona independencia de la plataforma, no siempre nos aisla de los cambios entre las distintas especificaciones (especialmente las especificaciones de J2EE para servlets, EJB, etcétera) y los cambios en el almacenamiento de datos externos. Por ejemplo, si una especificación cambia para poder implementar una determinada función de una forma más óptima, tendrá que hacer cierto número de modificaciones en el código escrito en Java para poder beneficiarse del cambio. Con EGL, es posible que tenga que hacer pequeños cambios o puede que no tenga que hacer nada en absoluto; el generador de EGL a Java creará el código conforme a la especificación más reciente. Otro ejemplo es que si se cambia el almacenamiento de datos externo, digamos que de una base de datos a una cola de mensajes, puede que necesite hacer modificaciones sustanciales en el código escrito en Java. Con EGL, como las sentencias de E/S son muy parecidas para los distintos tipos de almacenamientos de datos externos, probablemente tendrá que hacer menos cambios en el código. Otra ventaja de utilizar EGL es que puede generar aplicaciones escritas en Java (independientes o web) sin tener que aprender programación orientada a objetos. Para los programadores que sólo tienen experiencia en RPG o Cobol, o para los que no tienen ninguna experiencia programando, la curva de aprendizaje de Java puede ser un obstáculo importante. Además, aprender a escribir buenos programas orientados a objetos generalmente requiere algo más de experiencia. EGL permite escribir aplicaciones flexibles y completas rápidamente, sin tener que ser un experto en Java ni en programación orientada a objetos.

Management

▲ ▲ ▲

28

Herramientas para trabajar con EGL WDSc ofrece un completo juego de herramientas para el desarrollo en EGL. Esas herramientas pueden utilizarse para editar, ejecutar, depurar, generar y crear aplicaciones en EGL (es decir, todo el ciclo del desarrollo de una aplicación). EGL puede utilizarse para desarrollar aplicaciones autónomas en Java o aplicaciones web.

Para empezar Como primer paso para empezar a desarrollar una aplicación en EGL, sería una buena idea establecer algunas preferencias. Estas son opciones globales que se aplicarán a todos

ServerNEWS AGOSTO-SEPTIEMBRE 2005

FIGURA 1 Preferencias de EGL

FIGURA 2 Asistente Nuevo proyecto web de EGL los proyectos de EGL. Para acceder al recuadro de diálogo de preferencias, seleccione Preferencias (Preferences) del menú Ventana (Window). En la Figura 1 pueden verse las preferencias disponibles para EGL. Aquí, pueden establecerse opciones relacionadas con las conexiones de la base de datos (por ejemplo, el controlador JDBC y el ID y la contraseña del usuario de la base de datos). También debería establecer las clases necesarias para el depurador (por ejemplo, el controlador JDBC de la base de datos).

www.help400.es

www.help400.es

página JSP abierta en el editor, incluyendo, por ejemplo, los registros SQL de EGL. Galería contiene una lista de imágenes, elementos multimedia (audio y animación), hojas de estilos y plantillas de páginas. Cuando se pulsa en un elemento, en la vista Imágenes reducidas aparece la imagen en miniatura. Imágenes reducidas contiene imágenes en miniatura que pueden arrastrarse hasta cualquier página HTML o JSP abierta en el editor Page Designer. Servidores muestra una lista de configuraciones de servidor. Puede crear una configuración de servidor para comprobar las aplicaciones web en un entorno de prueba del servidor de aplicaciones de WebSphere. Si se crea un proyecto de EGL sencillo, observará que hay dos carpetas bajo el proyecto en la vista Project Navigator. Cree archivos fuente de EGL en la carpeta EGLSource y cree archivos fuente de Java (incluyendo los archivos fuente generados) en la carpeta JavaSource. Para un proyecto web de EGL, el fuente de Java se encuentra en la carpeta Java Resources. En la Figura 3 puede verse un entorno de un proyecto web de EGL típico, donde se está editando un archivo de EGL; en la vista Esquema (Outline) se muestra el contenido del archivo.

Crear y editar partes de EGL Un proyecto de EGL puede contener uno o varios archivos de EGL. Un archivo de EGL contiene un conjunto de partes que son unidades de declaración de la declaración global del programa. Las partes pueden declararse en el orden que se quiera y a todas se les puede asignar un nombre. Las partes pueden categorizarse como partes de datos, lógicas o de construcción: Partes de datos: definen las estructuras de datos disponibles para el programa. Una parte de datos puede incluir una estructura, que es una presentación jerárquica de elementos de una estructura, cada uno de los cuales se corresponde con un área de memoria. Partes lógicas: son las sentencias que se escriben en el lenguaje procedural EGL que se ejecutan durante la ejecución. Las parte lógicas pueden ser: • una parte de programa que define la unidad lógica central durante la ejecución. Es parecida a una clase de Java. • una parte de función que es una unidad de código que, o bien es la primera en el programa, o bien se ha llamado desde otra función. La función que contiene el primer código del programa se llama main (principal). Una función es parecida a un método de Java. • una parte pageHandler que controla la interacción del usuario con una página web. Un manejador de páginas proporciona datos y servicios a una JSP, que es la encargada de mostrar la página. El propio manejador de páginas incluye variables y manejadores de eventos, que se llaman en respuesta a una determinada acción del usuario (por ejemplo, al pulsar un botón). La estructura básica de pageHandler se genera automáticamente cuando se usan los asistentes de JSF y EGL, pero tendrá que añadir su propio código escrito en EGL para implementar la lógica.

AGOSTO-SEPTIEMBRE 2005 ServerNEWS

Management

El paso siguiente es crear un proyecto de EGL, que contendrá el código fuente de EGL de la aplicación. Para crear un proyecto nuevo en WDSc, seleccione Archivo|Nuevo|Proyecto. Esto muestra en pantalla el recuadro de diálogo Proyecto nuevo. Seleccione EGL a la izquierda del recuadro de diálogo. Pueden crearse dos tipos de proyectos de EGL: Proyecto de EGL o Proyecto web de EGL. Si va a desarrollar una aplicación autónoma en Java deberá utilizar el tipo Proyecto de EGL. Utilice Proyecto web de EGL para las aplicaciones web que contengan componentes JSP, Java Server Faces (JSF) y servlets. Cuando haya seleccionado el tipo de proyecto EGL, pulse Siguiente. Esto le llevará a la primera página de un asistente donde puede especificarse el nombre del proyecto de EGL y la plataforma de ejecución de destino, que debe ser Java (Figura 2). Si va a crear un proyecto web, puede seleccionar Configurar opciones avanzadas en la primera página del asistente para establecer en las páginas siguientes varias opciones relacionadas con la aplicación web. Entre las opciones posibles se incluye el nivel de J2EE y la activación de funciones, como por ejemplo la compatibilidad con Struts, la biblioteca de códigos de JSP y la biblioteca de códigos de componentes web de iSeries. También puede especificarse una plantilla de estilo por omisión para el sitio web. Escriba un nombre para el proyecto y pulse Finalizar para crearlo. Cuando cree un proyecto de EGL nuevo, WDSc le preguntará si desea cambiar a la perspectiva EGL. Esta perspectiva tiene algunas vistas muy útiles que le facilitarán la tarea de desarrollar una aplicación en EGL. Las vistas son las siguientes: Project Navigator permite trabajar con proyectos EGL y web de EGL, y con elementos como servlets y páginas JSP, así como archivos EAR (Enterprise Archive). Esta vista está especializada en Java, EGL y proyectos web y oculta archivos innecesarios (como los archivos *.class) al compilar los archivos de Java generados. Navigator es una vista genérica que permite trabajar con cualquier proyecto en WDSc. Tareas muestra los errores de compilación y cualquier tarea que especifique el usuario. En el caso de los errores de compilación, puede pulsarse dos veces en la vista Tareas para abrir automáticamente en un editor el fuente donde se ha producido el error. Esquema muestra el esquema del archivo abierto en el editor. Esto permite saltar rápidamente a secciones concretas del fuente en el editor. Si, por otra parte, crea un proyecto web de EGL, WDSc le preguntará si desea cambiar a la perspectiva Web de EGL. Esta perspectiva es parecida a la perspectiva EGL pero tiene unas cuantas vistas más pensadas para ayudar a desarrollar un sitio web. Estas vistas adicionales son las siguientes: Paleta contiene plantillas de páginas, códigos de JSP y componentes de JSF, así como los componentes de EGL que haya desarrollado, que puede simplemente arrastrar y soltar para crear un control JSF en una página JSP. Datos de página lista todos los datos disponibles de una

▲ ▲ ▲

Crear un proyecto de EGL

29

■ INTRODUCCIÓN AL “ENTERPRISE GENERATION LANGUAGE” • una parte de biblioteca, que es un conjunto de funciones y variables generadas y compiladas independientemente de los programas o los manejadores de páginas. El programa puede tener libre acceso a los recursos de la biblioteca.

Management

▲ ▲ ▲

30

Partes de construcción: definen el proceso de generación. Los descriptores de construcción se crean automáticamente cuando se crea un proyecto de EGL. Cada aplicación debe tener un descriptor de construcción asociado, que incluye información sobre la forma en que se generará la aplicación (por ejemplo, si código que se ha de generar es Java o Cobol, información sobre cómo acceder a la base de datos, etcétera). Para crear una parte de datos, pulse con el botón derecho del ratón sobre la carpeta EGLSource y seleccione Nuevo|Archivo fuente de EGL. Aparecerá el recuadro de diálogo Nueva parte de EGL. Especifique un nombre para el archivo fuente. Al nombre del archivo se le asignará automáticamente la extensión .egl. Para crear una parte de programa de EGL, pulse con el botón derecho del ratón sobre la carpeta SourceEGL y seleccione Nuevo|Programa. Los descriptores de construcción se definen en un archivo con la extensión .eglbld. Entre las herramientas para trabajar con EGL de WDSc se encuentra un editor de partes de EGL que puede utilizarse para cambiar las opciones de construcción (es decir, de generación del código). Pulse dos veces en un archivo con extensión .egl para abrirlo en el editor de EGL. Éste contiene muchas funciones que le ayudarán a simplificar las tareas de desarrollo. Estas son algunas de las más destacadas: Resaltado sintáctico: el editor resalta varias secciones del código fuente para facilitar su lectura. Las palabras clave, los tipos de datos, las series de caracteres y los comentarios se resaltan con colores distintos. Asistente de contenido: Al pulsar Ctrl+espacio en el editor aparece una lista de opciones que pueden añadirse al archivo. Por ejemplo, en la Figura 4 se muestra cómo añadir un registro de SQL a un archivo fuente de EGL utilizando el asistente de contenido. Fíjese que para cada opción propuesta se ofrece una descripción de esa opción. Plantillas de EGL: cuando se utiliza el asistente de contenido para añadir un bloque de código al archivo fuente, el editor utilizar una plantilla previamente definida para la opción elegida. Puede consultar o modificar las plantillas de varios constructores en Preferencias; basta con seleccionar EGL|Editor|Plantillas. En la Figura 5 se muestra la plantilla de un registro. También debería utilizar algunas de las otras características de EGL que ofrecen las herramientas de WDSc para ayudarle en el proceso de desarrollo. La vista Esquema ofrece un esquema jerárquico del código escrito en EGL que puede utilizarse para identificar rápidamente secciones concretas del código y saltar a ellas en el editor. Cuando se guarda el código, el compilador de EGL lo compila automáticamente y muestra los mensajes de error en la vista Tareas. En esa vista, pulse dos veces sobre un error para abrir el código en la posición en que se ha producido el error. Por último, si tiene muchos proyectos de EGL o muchas

ServerNEWS AGOSTO-SEPTIEMBRE 2005

FIGURA 3 Típico entorno de un proyecto web de EGL

FIGURA 4 Añadir un registro de SQL utilizando el asistente de contenido

partes de EGL en un proyecto, puede que le lleve mucho tiempo encontrar la parte en Project Navigator para abrirla en el editor. Si está en la perspectiva EGL o Web de EGL, seleccione Navegar|Abrir parte (o escriba Ctrl+Mayús+N) para abrir un diálogo en el que se puede elegir una parte escribiendo las primeras letras de su nombre.

Ejecutar y depurar aplicaciones de EGL Para ejecutar o depurar una aplicación, WDSc requiere que el usuario cree una configuración de inicio. Con EGL, puede utilizarse el depurador interpretativo de EGL para depurar el código fuente de EGL sin tener que generar primero código en Java o en Cobol. Si ha desarrollado una aplicación de EGL autónoma, pulse con el botón derecho del ratón en un archivo de programa de EGL y seleccione Depurar programa de EGL para iniciar el depurador. Esto creará una configuración de inicio en segundo plano y cambiará a la perspectiva Depurar. Esta perspectiva ofrece varias vistas que muestran los puntos de inte-

www.help400.es

Management

▲ ▲ ▲ www.help400.es

AGOSTO-SEPTIEMBRE 2005 ServerNEWS

31



INTRODUCCIÓN AL “ENTERPRISE GENERATION LANGUAGE”

rrupción, las variables, sus valores y una vista de consola donde se ve la salida. Para establecer un punto de interrupción en el código escrito en EGL, simplemente pulse dos veces en la regleta que hay a la izquierda de la línea, como se ilustra en la Figura 6. Para ejecutar o depurar una aplicación web de EGL, primero deberá definir una configuración de servidor y prepararla para depurar el código escrito en EGL. En la perspectiva Web de EGL, abra la vista Servidores, pulse con el botón derecho del ratón sobre la vista y seleccione Nuevo|Servidor|Configuración de servidor. Elija el servidor de aplicaciones, asígnele un nombre y pulse Finalizar para crear la configuración de servidor. Ahora, pulse con el botón derecho del ratón sobre la configuración de servidor de la vista Servidores y seleccione Añadir archivos Jar del depurador de EGL con el fin de preparar el servidor para depurar código escrito en EGL. Para iniciar una sesión de depuración, pulse con el botón derecho del ratón sobre el proyecto web de EGL y seleccione Depurar en el servidor. Utilice la opción de servidor existente y pulse Finalizar para dar comienzo a la sesión de depuración. Observe que no es necesario generar código escrito en Java desde EGL para poder depurar el código. Si desea generar el código en Java y depurarlo, deberá eliminar los archivos Jar del depurador de EGL de la configuración de servidor.

FIGURA 5 Recuadro de diálogo Plantillas de EGL

Generar Java a partir de EGL Ahora que ya ha escrito y depurado su aplicación escrita en EGL es el momento de generar el código en Java a partir de ella. Con ese fin, pulse con el botón derecho del ratón sobre la carpeta EGLSource y seleccione Generar. Esto generará código en Java para todas las partes de EGL. El resultado de esa generación aparece en la vista Resultados de la generación de EGL. Para generar solamente determinadas partes de EGL, pulse con el botón derecho del ratón sobre la carpeta EGLSource y seleccione Generar con asistente. Esto hará que aparezca un asistente en el que podrá seleccionar un subconjunto de partes. Además, puede pulsar con el botón derecho del ratón sobre un archivo fuente de EGL y seleccionar Generar o Generar con asistente para generar código en Java a partir de todas las partes del archivo fuente o de un subconjunto de ellas, respectivamente.

FIGURA 6 Definición de un punto de interrupción en la perspectiva Depurar

Simple y rápido

Management

▲ ▲ ▲

32

El entorno de programación de EGL es el de un lenguaje sencillo y de alto nivel que puede utilizarse para desarrollar aplicaciones completas muy deprisa. EGL permite la portabilidad entre plataformas y oculta muchos detalles de la implementación relacionados con el acceso a los datos y con las diferencias entre los niveles de las especificaciones. Es posible desarrollar aplicaciones en EGL y generar código en Java o en Cobol. En el caso de Java, la aplicación puede ser autónoma o una aplicación web. Si se decide a desarrollar aplicaciones utilizando EGL y a dar el paso hacia una mejor portabilidad tal y como se esboza en el itinerario para los desarrolladores del iSeries, le recomendamos que utilice las herramientas de EGL que propor-

ServerNEWS AGOSTO-SEPTIEMBRE 2005

ciona WDSc. El completo juego de funciones incluido con el producto, algunas de las cuales hemos descrito en este artículo, le ayudarán a que la transición se mucho más fácil. ¡Diviértase y páseselo bien usando WDSc para iSeries! ■ Kushal Munir es desarrollador de software en el laboratorio de Toronto de IBM desde 2001. participa en el diseño, desarrollo y comprobación de las herramientas Explorador de sistemas remotos (RSE) que se incluye con WDSc. Phil Coulthard trabaja en el laboratorio de Toronto de IBM como arquitecto jefe del equipo de desarrollo de herramientas y lenguajes para el desarrollo de aplicaciones para el iSeries. George Farr trabaja en el laboratorio de Toronto de IBM como director de desarrollo técnico de los lenguajes de programación RPG y VisualAge para RPG y de las nuevas herramientas de WDSc para RPG y Cobol.

www.help400.es

Management

▲ ▲ ▲ www.help400.es

AGOSTO-SEPTIEMBRE 2005 ServerNEWS

33

Aplicaciones Java basadas en web Consideraciones tecnológicas: escoja sus armas sabiamente antes de empezar a programar por Don Denoncourt

A

ntes de que su empresa se embarque en el desarrollo de una aplicación escrita en Java basada en web, tendrá que considerar la posibilidad de utilizar varias tecnologías Java del lado del servidor. Las tecnologías obvias son HTML, JavaBeans, páginas JavaServer (JSP) y servlets. Probablemente habrá oído hablar de Struts y de la técnica de diseño Modelo/Vista/Controlador (MVC), pero, ¿qué pasa con JavaScript, JSTL (JSP Standard Tag Library) y la tecnología más reciente de Sun, JSF (JavaServer Faces)? En este artículo encontrará la información que necesita para seleccionar la combinación tecnológica más apropiada para sus aplicaciones.

HTML y JavaScript

Programación y sistemas

▲ ▲ ▲

34

Independientemente de la fiabilidad demostrada a lo largo de tanto tiempo de la interfaz 5250 del iSeries, HTML es la nueva interfaz de usuario. Las aplicaciones basadas en HTML ofrecen funciones de tipo GUI (como botones de selección, recuadros de selección, listas de selección desplegables y posibilidad de utilizar el ratón), pero no están controladas por eventos como una GUI de Windows. Cuando un usuario pulsa el botón Enviar, todos los datos de entrada del panel se envían al servidor. Ahí es donde entra en escena JavaScript. JavaScript (que no es Java) es un lenguaje de scripts basado en el navegador. Puede añadir funciones de JavaScript a casi cualquier elemento HTML para responder a varios eventos (por ejemplo, onClick, onChange, onKeyPress, onLoad u onFocus). Ya sé que acabo de decir que HTML no está controlado por eventos, pero lo que le estoy diciendo ahora es que se puede utilizar JavaScript para manejar los eventos de la IU de HTML. La cuestión es que JavaScript está limitado en lo que puede hacer para responder a un evento. No puede acceder a una base de datos. No puede grabar a disco. No puede ejecutar programas escritos en RPG. Todo lo que puede hacer JavaScript es modificar la información mostrada con HTML.

ServerNEWS AGOSTO-SEPTIEMBRE 2005

JavaScript se utiliza para realizar operaciones de edición en el lado del cliente y para animar la IU del navegador (con cosas como menús que se desplazan por la ventana y HTML dinámico). Hay que comprender que las ediciones del código escrito en JavaScript –así como las más sofisticadas operaciones de validación y manejo de errores– también deben programarse en Java en el lado del servidor de la aplicación. Esta indiscutible redundancia en el código aumenta la complejidad de la aplicación, pero a veces es necesaria para reducir el tiempo de ida y vuelta hasta el servidor.

Páginas JavaServer Una página JSP es HTML con código Java incrustado. Pueden escribirse aplicaciones web totalmente en JSP. He visto algunas. Lo que no he visto es aplicaciones escritas únicamente en JSP que puedan mantenerse. La experiencia nos dice que debe haber tan poco código escrito en Java como sea posible. Sirva de ejemplo el fragmento de código escrito en JSP de la Figura 1. El código escrito en Java que contiene es moderadamente complejo; sirve para procesar una lista de objetos Customer (Cliente) y ni siquiera muestra el código JSP verdaderamente complejo que crea la lista de clientes. Hay varios problemas con la estrategia de escribir programas exclusivamente en JSP: 1.Se necesita un desarrollador en Java para mantener la IU. 2.El código escrito en Java no se puede comprobar, depurar o mejorar fácilmente. 3.Es un sistema de desarrollo monolítico que no aprovecha la mejor característica de Java: el desarrollo basado en componentes.

Biblioteca JSTL Publicada en 1999, la especificación JSP incluía la posibilidad de crear códigos HTML personalizados. Pero cuando los desarrolladores empezaron a utilizar esta característica, resultó que todos creaban bibliotecas de códigos HTML que en el fondo eran muy parecidas. La respuesta de Sun vio la luz en 2002: la biblioteca JSTL (JSP Standard Tag Library). Sin embargo, muchas empresas, incluyendo la mía, hicieron caso omiso a JSTL, ¿Por qué? En parte por la pereza de utilizar otra tecnología nueva. Pero, sobre todo, porque cuando se presentó JSTL, los servidores de aplicaciones que estábamos

www.help400.es

FIGURA 1 Ejemplo de una aplicación escrita únicamente en JSP <% Iterator iter = custList.iterator(); while (iter.hasNext()) { Customer cust = (Customer)iter.next(); %> <% } %>
NameAddress
<%=cust.getName()%> <%=cust.getAddr()%>


FIGURA 2 Página de JSP que utiliza códigos básicos de JSTL y expresiones de EL
NameAddress
${cust.name} ${cust.addr}


utilizando aún no eran compatibles con los requisitos de JSTL de JSP 2.0 y Servlet 2.4. Sin embargo, esa excusa ya no es válida porque WebSphere 5.0 (y WebSphere 5.1) es un servidor compatible con J2EE 1.3, lo que significa que da soporte a JSP 2.0 y a Servlet 2.4. Los códigos HTML de JSTL pueden agruparse en cuatro categorías:

aplicaciones JSP monolíticas. La famosa solución a este dilema es la técnica de diseño MVC. Como se describía en el artículo “Sobre la arquitectura MVC” (número 130, de enero de 2003): “MVC divide una aplicación en tres componentes: el modelo de la lógica de empresa, la vista o IU y un controlador que los relaciona a los tres. El objetivo es separar la vista del modelo para que los cambios que se produzcan en la primera no afecten al segundo y viceversa. El controlador permite esta separación. El modelo no sabe nada sobre la IU; simplemente proporciona un conjunto de servicios o API que permiten leer o modificar el estado del modelo. A continuación, el controlador correlaciona, de forma estándar, el flujo de información y los eventos entre la vista y el modelo. Por lo que hace al diseño, esto significa que los cambios en los controles o en los elementos individuales de la IU no afectan al modelo. Por lo que hace a la arquitectura, significa que los cambios en el cliente no afectan al modelo.” El resultado de emplear la técnica de diseño MVC es que el código escrito en JSP es más fácil de mantener por los programadores que no saben Java. Además, el código puede mantenerse con diferentes editores WYSIWYG, como Dreamweaver, FrontPage o WebSphere Development Studio Client (WDSc). Las aplicaciones MVC también pueden ser “refactorizadas” más fácilmente. Y, lo que tal vez sea más importante, los componentes de la lógica de la empresa pueden comprobarse –sin utilizar la capa de presentación– utilizando metodologías de comprobación de facto como JUnit (junit.org) y de comprobación automática con Ant. Encontrará más información sobre JUnit en la web. MVC no es un producto ni una especificación de Sun; es una técnica de diseño, una estrategia estándar para separar la presentación de la programación. Pero no intente crear su propia arquitectura MVC. Ya se ha hecho. Hay más de una docena de infraestructuras MVC de código libre, pero la que se ha convertido en un estándar de facto es Jakarta Struts.

Jakarta Struts

Aplicaciones web monolíticas (MVC) Pero aunque JSTL permite simplificar el código escrito en Java de una JSP, todavía hay que tener cuidado de no crear

www.help400.es

AGOSTO-SEPTIEMBR 2005 ServerNEWS

Programación y sistemas

Junto con esos cuatro juegos de bibliotecas de códigos, JSTL incluía una característica nueva llamada Lenguaje de expresión (Expression Language, EL). EL permite utilizar a los autores de páginas una sintaxis más sencilla para que puedan manipular datos de aplicación. En la Figura 2 puede verse una página de JSP que incluye el uso de códigos de JSTL básicos y de expresiones de EL (que se pueden identificar por el símbolo del dólar y las llaves).

Struts es un producto de código libre disponible en el proyecto Apache Jakarta Project (jakarta.apache.org). Struts se presentó en el año 2000 y desde entonces su aceptación ha sido generalizada. De hecho, todos los IDE de Java más importantes son compatibles con Struts. Struts proporciona una infraestructura para una aplicación web. Gestiona el flujo de una aplicación (según se especifica en un archivo de configuración basado en XML) empezando por la interfaz HTML/ JSP pasando por un controlador de servlets y llegando hasta las clases que gestionan el proceso de la lógica de la empresa. Struts es una infraestructura muy buena y yo mismo he escrito e instalado docenas de aplicaciones que utilizan Struts. Puede obtener más información sobre Struts leyendo los artículos “Una mejor arquitectura con MVC” y “Presumir de Struts” (publicados en los números 147 y 148, de octubre y noviembre de 2004, respectivamente) o el libro “Programming Jakarta Struts”, de Chuck Cavaness (O’Reilly, 2004).

▲ ▲ ▲

• Básicos • Manipulación de XML • SQL • Internacionalización y formato

35

■ APLICACIONES JAVA BASADAS EN WEB A parte de su arquitectura de control de la aplicación y de otras características muy interesantes, Struts tiene dos recursos que me gustaría destacar. El primero es un conjunto de bibliotecas de códigos de JSP. Estos prácticos códigos simplifican el desarrollo de JSP. Uno de mis códigos favoritos de Struts es iterate. En la Figura 3 puede verse un fragmento de código escrito en JSP en que se usa el código iterate para mostrar una lista de clientes. El segundo recurso de Struts es su infraestructura de validación. Struts tiene varios sofisticados mecanismos para llevar a cabo la validación. El que más me gusta, permite poner la semántica de validación en un archivo de configuración XML. Y hay que señalar que la infraestructura de validación de Struts puede generar código en JavaScript, eliminando por lo tanto el problema de programación por duplicado que mencionaba antes.

JavaServer Faces

Programación y sistemas

▲ ▲ ▲

36

La especificación JSF es la más reciente de las tecnologías que se describen en este artículo. Se publicó formalmente en marzo de 2004. A primera vista, JSF parece la competencia de Struts. Y es curioso, porque uno de los promotores de la especificación JSF, Craig McClanahan, es el creador original de Struts. Pero mientras que Struts es una infraestructura para desarrollar aplicaciones web, JSF es una infraestructura para interfaces de usuario. Struts maneja el flujo de una aplicación desde la página web hasta la lógica de la empresa; JSF se diseñó para manejar la IU de una aplicación. De modo que Struts y JSF se solapan, pero las características de IU de JSF eclipsan las de Struts. Eso no significa que no puedan utilizarse Struts y JSF a la vez. De hecho, actualmente Jakarta tiene un proyecto llamado Struts-Faces que ayuda a combinar ambas tecnologías. (Craig McClanahan es arquitecto de Sun Java Studio Creator –un rival de WDSc. Puede leer sus opiniones sobre JSF y Struts en blogs.sun.com/roller/page/craigmcc/ 20040927). Como pasa con JSTL y Struts, JSF tiene un conjunto de códigos HTML. Pero JSF es mucho más que un conjunto de bibliotecas de códigos. JSF se diseñó con el fin de ofrecer características parecidas a las del modelo controlado por eventos de las aplicaciones de Windows. Todos los códigos de JSF tienen asociados sus correspondientes componentes IU (como recuadros de texto, listas, paneles con pestañas y cuadrículas de datos) con lo que pueden asociarse (o enlazarse, para utilizar el término que se usa en JSF) beans de datos y procesos de la interfaz con la lógica de la empresa. El juego de componentes IU de JSF puede ampliarse fácilmente, de modo que es posible personalizar el comportamiento de la IU. La arquitectura de componentes permite a los proveedores de IDE crear herramientas WYSIWYG de arrastrar y soltar similares a las herramientas de desarrollo rápido de aplicaciones (RAD) de VisualBasic, PowerBuilder y Delphi. Al igual que Struts, JSF tiene funciones de validación. Pero el código de validación de JSF está en el sitio al que pertene-

ServerNEWS AGOSTO-SEPTIEMBRE 2005

FIGURA 3 Fragmento de código escrito en JSP que utiliza el código iterate
NameAddress
<%=cust.getName()%> <%=cust.getAddr()%>


FIGURA 4 Ejemplo de código escrito en Java que utiliza un enlace de valor <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %> <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>

ce: en la JSP, con los códigos del validador. JSF incluye tres validadores estándar: • Pero también es muy fácil escribir sus propios validadores. Así mismo, pueden encontrarse validadores personalizados en Internet. De forma parecida a Struts, los mensajes de los errores de validación pueden modificarse en archivos de propiedades y mostrarse con códigos de JSP. Un gran problema que se daba con el desarrollo con Struts era la programación del proceso de presentación, validación y visualización de los resultados. De hecho, un conocido libro, “Jakarta Pitfalls: Time-Saving Solutions for Struts, Ant, JUnit, and Cactus” (John Wiley & Sons, 2003) dedica la mayoría de sus capítulos a ofrecer soluciones a los problemas de desarrollo con Struts. De todas formas, JSF no tienen ninguno de esos problemas. Los beans de datos se asocian con

www.help400.es

Programación y sistemas

▲ ▲ ▲ www.help400.es

AGOSTO-SEPTIEMBR 2005 ServerNEWS

37

■ APLICACIONES JAVA BASADAS EN WEB los componentes de entrada gracias a una característica denominada enlace de valor (en la Figura 4 se utiliza un enlace de valor en un campo de salida). Durante el procesamiento de la salida de formulario por parte de JSF, los valores de los bean de datos examinan rápidamente todos los componentes conocidos como representadores (renderers), dando formato a datos como fechas, símbolos del dólar, numéricos o lo que sea. Durante el procesamiento de la entrada de formulario por parte de JSF, los valores enlazados examinan rápidamente todos los componentes conocidos como conversores (converters), devolviendo el formato original a los datos que tenían en el formulario de beans de datos (por ejemplo, String, Date o BigDecimal). De nuevo, los desarrolladores pueden crear fácilmente sus propios representadores y conversores. La configuración de JSF (que también es parecida a la de Struts) se escribe en un archivo de XML y la gestiona un controlador de servlets. Pero JSF introduce un sofisticado servicio llamado beans gestionados. Los beans gestionados son JavaBeans que mantiene el controlador de JSF. Estos beans generalmente hacen dos cosas: sirven de envoltura (wrapper) de los datos que se muestran en HTML y proporcionan métodos para procesar los datos de entrada de formulario. Un método de un bean gestionado puede enlazarse con un componente de entrada de JSF con una propiedad action:

Recursos sobre JSF Sitios web jamesholmes.com/JavaServerFaces Una lista de recursos de JSF entre los que se incluye el plugin para Eclipse del propio Holmes, Faces Console exadel.com/tutorial/jsf/jsftutorial-guessnumber.html Una sencilla aplicación de ejemplo “Adivina el número” basada en JSF

Programación y sistemas

▲ ▲ ▲

38

www-106.ibm.com/developerworks/websphere/techjournal/ 0401_barcia/barcia.html Desarrollo de aplicaciones en JSF utilizando WebSphere Studio V5.1

(Observe que JSF tiene un EL parecido al de JSTL. El código EL de JSF es fácilmente distinguible del de JSTL porque las expresiones van precedidas por el símbolo # en vez del del dólar). Para desarrollar e instalar aplicaciones en JSF es necesario un servidor de aplicaciones compatibles con JSP 1.2 y Servlet 2.3, y se necesita una implementación de la especificación JSF. En la actualidad se dispone de tres implementaciones: la de referencia de Sun (en java.sun.com/j2ee/ javaserverfaces), la de código libre MyFaces (myfaces.org) y la de IBM. Tenga en cuenta que la implementación de IBM se ofrece con WebSphere 5.1, pero nada impide que utilice la de Sun o MyFaces con WebSphere 5.0 (ni 5.1, de hecho). Debería mencionar, no obstante, que el conjunto de herramientas visuales de JSF de WDSc puede utilizar funciones no disponibles en las implementaciones de Sun o MyFaces. Para saber más cosas sobre JSF, eche un vistazo a los “Recursos sobre JSF” incluidos en esta página.

Elija sus armas Antes de empezar a programar su aplicación web basada en Java, necesita obtener las tecnologías que utilizará. HTML y JSP se dan por supuesto, pero le recomiendo encarecidamente que aprenda a utilizar JSTL y que adquiera alguna experiencia en JavaScript. Por otro lado, no pierda tiempo desarrollando su propia arquitectura MVC. Utilice JSF o Struts. Struts es el estándar de facto de las infraestructuras de aplicaciones web. Es una tecnología madura, todos los IDE más importantes son compatibles con Struts y hay más de una docena de libros publicados sobre Struts. JSF indudablemente tiene un conjunto de funciones relacionadas con la IU más sofisticado, pero si la aplicación web es relativamente sencilla, JSF puede ser excesivo. Sin embargo, si necesita una IU muy conseguida, añadir funciones con los códigos de Struts o con código propio puede ser decididamente más complejo que con JSF. Sí, JSF es una tecnología nueva, pero la versión Early Access existe desde hace dos años y en diciembre de 2003 ya se habían publicado por lo menos cuatro buenos libros sobre JSF. En cualquier caso, independientemente de lo que digan los fabricantes de los IDE, seguirá necesitando tener conocimientos de Java, tanto si usa JSF como si se decide por Struts. ■

jsfcentral.com Una lista de novedades sobre JSF, preguntas más frecuentes, artículos, libros y otros recursos Libros “JavaServer Faces Programming”, Budi Kurniawan (McGrawHill, 2003) “JavaServer Faces”, Hans Bergsten (O’Reilly, 2004) “JavaServer Faces in Action”, Kito Mann (Manning, 2004)

ServerNEWS AGOSTO-SEPTIEMBRE 2005

Don Denoncourt es consultor en WebSphere de Computer Applications Specialists, Inc.

www.help400.es

Programación y sistemas

▲ ▲ ▲ www.help400.es

AGOSTO-SEPTIEMBR 2005 ServerNEWS

39

GUIA

40 ServerNEWS AGOSTO-SEPTIEMBRE 2005

www.help400.es

GUIA

MANTENIMIENTO Y BROKERAGE INFORMÁTICO, S.L. Mantenimiento / Alquiler y Brokerage / Venta / Redes Backup Center Pere IV 78-82, 7º 3ª 08005 - Barcelona (Spain) T. 34 934 854 427 Fax 34 934 850 168

www.help400.es

P.T.A. Edificio CENTRO EMPRESAS 29590 Málaga

AGOSTO-SEPTIEMBRE 2005 ServerNEWS 41

confidencial

por Carlos Bell

EL MERCADO DEL ISERIES SE RECUPERA... Uno se va de vacaciones con la esperanza de que en su ausencia no ocurra nada digno de ser tenido en cuenta, pero en nuestro mundillo no suele ser así. El primer día, al regresar, aparte de pasarme un par de horas suprimiendo mensajes de spam (desde viagra y otros sucedáneos, hasta trolex, acciones y títulos académicos, pasando por aplicaciones ofimáticas por menos de la mitad de precio y otras ofertas comerciales de dudosa calidad) lo destiné por completo a revisar “mis fuentes” de información habituales. Me esperaban un montón de sorpresas. Aparte de las que comento en el artículo “RPG: un puente entre dos mundos” (incluido en la página 10) sobre la rebelión de los disidentes (ya sabes, aquellos que no están de acuerdo con el “pensamiento único” de IBM) que ha favorecido la ampliación y flexibilización del llamado “iSeries El científico de IBM Ravi Arimilli con un microprocesador Developer Roadmap”, la “Hoja de ruta” a seguir para estar tecnológicamen- Power5, el que equipa a los actuales eServer iSeries y pSeries de IBM. (Foto cortesía de IBM) te al día, también me he encontrado con otras interesantes noticias. Así, de la lectura del informe de los resultados de IBM correspondientes al segundo trimestre se desprende que en IBM se han vuelto a poner las pilas: “El crecimiento de STG (Grupo de Sistemas y Tecnología) en el área de servidores ha sido impulsado por los servidores UNIX pSeries, que han tenido un crecimiento del 36%, los servidores xSeries y los iSeries de gama media, que han crecido un 11% y un 10% respectivamente. Además de los servidores, los ingresos por sistemas de almacenamiento han crecido un 19%...” Sin duda, éste será el año triunfal del Power5. La buena noticia es que para el iSeries éste es el primer crecimiento de dos dígitos desde el primer trimestre del 2003, lo que demuestra el gran potencial del iSeries para seguir ganando cuota de mercado. Tal parece que los esfuerzos de marketing de IBM durante la primera mitad del año han hecho renacer el interés por el iSeries puesto que, en lo que va de año, los resultados de nuestra plataforma han sido los mejores desde 1998. Aparentemente, aquellos días de los “Penosos resultados del iSeries” (número 148, de noviembre de 2004) han pasado a la historia. Según se comenta en el último informe de Gartner correspondiente al segundo trimestre de 2005, por noveno trimestre consecutivo IBM ocupa la primera posición por facturación en el mercado mundial de servidores. El informe destaca, asimismo, el importante crecimiento experimentado por la Compañía en los servidores Unix (más de 5,5 puntos interanuales).

■ System z9, larga vida al mainframe ¿Quién dijo que el mainframe había muerto? IBM defiende su vigencia y apuesta por seguir renovando su gama de equipos, pioneros a la hora de incorporar determinadas tecnologías y avances que luego se van incorporando al resto de los servidores de la compañía. Así, IBM ha lanzado la iniciativa

INDICE DE ANUNCIANTES SEPTIEMBRE 2005 Empresa

Página

AMERICAN TOP TOOLS ............................................ 27, 40 CACOVAI ................................................................................ 37 CPI SOFTWARE ..................................................................... 19 GUÍA ................................................................................. 40, 41 IBM .................................................................. Contraportada LAKEVIEW ............................................................................... 31 MAIN MEMORY ....................................... Interior Portada MICROSOFT .............................. Interior Contraportada OCÉ ........................................................................................... 13 SOFTWARE GREENHOUSE............................................... 23 SUSCRIPCION NEWS/400 .......................................... 25, 39 TANGO/04 ................................................................................ 9 TRANSTOOLS ........................................................................ 33 42 ServerNEWS AGOSTO-SEPTIEMBRE 2005

IBM Systems Agenda que pretende ser la respuesta a un nuevo escenario de trabajo, el colaborativo. La iniciativa se sustenta en tres pilares: virtualización ("una buena manera de tener un entorno flexible, fácil de gestionar y con ahorro de costes"), el compromiso con los estándares abiertos ("para que el cliente tenga la libertad de poder integrar todo aquello que quiera o necesite") y la colaboración para innovar. Los primeros anuncios que efectúa IBM bajo el paraguas de su Systems Agenda son Virtualization Engine 2.0, la creación de Blade.org (asociación promovida junto a Intel) y el nuevo mainframe IBM System z9 que, según Álvaro Álvarez Santullano, director de ventas de zSeries de IBM, es un producto “para todo tipo de empresas, incluidas las medianas o pequeñas, y piedra angular de Systems Agenda”. De acuerdo con IBM, el z9 es uno de los sistemas de cómputo más confiables y seguros que jamás se hayan construido. Además, duplica en potencia de procesamiento, capacidad y memoria a su antecesor, el eServer z990, conocido familiarmente como “T-Rex” (“Tiranosaurio Rex”). Sigilosamente, IBM sigue avanzando en el proyecto ECLipz (enmarcado en la iniciativa “Power Everywhere”) del que casi nadie habla y cuyo acrónimo nos sugiere una convergencia entre las series i, p, y z de la empresa, basada en la arquitectura del chip Power6, previsto para finales de 2006. ■ Como sabes, esta información es estrictamente confidencial. Aunque nosotros neguemos haberlo dicho o escrito, te autorizo a que obres en consecuencia www.help400.es

Related Documents

156
December 2019 27
156
May 2020 10
156
November 2019 16
156
November 2019 19
Choices Iar Septiembre 2005
October 2019 12

More Documents from ""