Entra in Web con il tuo RPG/400!
dr. G.B. Perotti, iSeries (AS/400), IBM Italia
gb_perotti@it.ibm.com


    Forse nessuno te lo ha detto, ma ... se conosci l'RPG, sei pronto per sviluppare applicazioni Web.
  Non hai bisogno di imparare nè Java, nè Visual Basic, nè Perl, nè Net.Data, nè tantomeno Visual RPG.
Hai solo bisogno di sfruttare per bene le tue conoscenze.


L'RPG è da ormai trent'anni il linguaggio più popolare per lo sviluppo applicativo nei sistemi intermedi. Con il Systema/3, il Systema/32, il Sistema/34, il Sistema/38, il Sistema/36 e l'iSeries (AS/400) abbiamo dato all'informatica una intera generazione di programmatori RPG.
Non c'è quindi da meravigliarsi (come scrive Jim Utsler, associate editor della rivista NEWS/400 U.S., nel suo articolo Il futuro dell'RPG) se, mentre Java e Websphere fanno notizia, è l'RPG a far lavorare le aziende. A quanto pare, lo sviluppo in RPG si manterrà costante nel tempo, anche se lo sviluppo in Java tende ad aumentare.
Il vero problema invece è che pochi programmatori RPG sanno quanto sia facile entrare nella zona e-business sfruttando le proprie conoscenze.

A questo vuole provvedere in nostro articolo.

Common Gateway Interface (CGI)

iSeries (AS/400), come qualunque prodotto che voglia partecipare alla gara Internet, deve sottostare a dei precisi standard. Uno di questi standard, Common Gateway Interface (CGI), stabilisce il modo in cui un programma deve essere invocato da un browser remoto (navigatore Internet) ed è pienamente supportato dall'iSeries (AS/400). Questo standard consente ai programmatori iSeries (AS/400) di costruire pagine dinamiche Web utilizzando uno dei linguaggi di elezione: C++, ILE C, ILE COBOL e naturalmente ILE RPG.

La mia esperienza CGI con l'RPG

data dalla primavera del 1997.
Disperatamente alla ricerca di un modo per programmare pagine Web con l'AS/400, dopo ore di ricerche sotto Internet, atterrai in un sito IBM del PID (oggi PWD) di Rochester dove un certo Melvin (Mel) Rothman rendeva disponibile un suo "service program" che facilitava la scrittura di programmi CGI in RPG.
Scoprii che era a dir poco geniale. Facile da usare ed estremamente flessibile. In poco tempo fui in grado di realizzare un numero incredibile di pagine Web dinamiche. Il mio entusiasmo fu così contagioso che mi fu affidato un sito Web per spargere la notizia.
Questo sito
http://www.ibm.com/iseries/easy400
è diventato il santuario dell'e-RPG e conta oggi (Maggio 2005) oltre 16.000 utenti sparsi in ben 124 paesi, di cui circa un quarto in Italia (per una visione alla data, vedi la pagina http://www.easy400.net/easy400/shwdowner1.htm).
Da questo sito si scaricano e si installano gratuitamente sul proprio iSeries (AS/400) dimostrazioni Web, esempi di programmi, strumenti didattici (metedologia di sviluppo CGI con RPG, HTML, JavaScript), i quali consentono un'avvio immediato alla programmazione Web.
Non esistono prerequisiti, nè di hardware nè di software. Il livello di OS/400 minimo è la V3R2. La conoscenza dell'RPGIII consente di accedere immediatamente alle funzioni RPG ILE necessarie.
Inoltre, per qualunque problema in merito è possibile mettersi in contatto con me (gb_perotti@it.ibm.com) ed ottenere un aiuto remoto ma gratuito, a patto di essersi registrati al mio sito.

Nel resto di questo articolo vorrei introdurre la tematica CGI, così da rendere ancora più facili le cose a chi intendesse servirsene nel prossimo futuro.

Il ciclo CGI

Un programma CGI ha un ciclo diverso da quello interattivo cui ci ha abituato la programmazione per workstation. Il programma CGI deve essere un programma transazionale, del tipo CICS: riceve una richiesta, effettua un lavoro, formula una risposta e se ne va: finisce, chiude, in RPG accende (se vuole) LR e ritorna.
In ogni caso il programma CGI, o perchè esce con LR in "on", o perchè pur rimanendo in memoria deve azzerare le sue variabili alla chiamata successiva, in quanto essa in genere perviene da un altro utente, non mantiene memoria dello stato precedente: si dice che "non è persistente".
Questo fatto pone problemi architetturali apparentemente non di poco conto. Dato che la memoria del programma ad ogni conversazione va persa, come è possibile mantenere un dialogo (interattivo) con l'utente remoto?
Il problema è di facile soluzione, adottando la tecnica dello smemorato. Si tratta di nascondere dei bigliettini promemoria (campi nascosti) nella risposta HTML che il programma manda all'utente remoto. Dato che tale HTML sarà utilizzato dall'utente per formulare la prossima richiesta, l' utente, senza saperlo, trasmetterà, oltre alla nuova richiesta, le informazioni necessarie al programma per sapere che cosa gli era stato richiesto in precedenza. Sembra complicato, ma non lo è più degli hidden field delle DDS cui i programmatori RPG sono abituati da una vita.
Devo aggiungere per completezza che, su iSeries (AS/400), da V4R2 è disponibile la possibilità di creare programmi CGI persistenti. In questo caso il programma ritorna al chiamante (il servente http) senza necessariamente chiudere tutto, file, path, variabili, e resta in attesa di una eventuale successiva chiamata dallo stesso utente remoto. Questo si traduce in migliori prestazioni, consente approcci di tipo Commit, ecc.. Questa tecnica, che richiede alcuni accorgimenti, è naturalmente spiegata in tutti i dettagli nel mio sito, anche se io invito a ricorrervi solo dopo una certa esperienza.

Spiegato questo, veniamo al ciclo vero e proprio del programma, che può essere riassunto nei passi seguenti. Si noti che le operazioni di I/O da/a l'utente remoto (o meglio il suo browser html, Netscape, Internet Explorer, o che sia) non sono risolte da istruzioni RPG, bensì da chiamate alle API dell'http.
  1. ricezione della stringa di input inviata dal browser remoto
    (API QtmhRdStIn o QtmhGetEnv)
  2. scomposizione (parsing) della stringa di input nelle variabili del programma assimilabili ai parametri di ingresso
    (API QtmhCvtDb, o routine del programma)
  3. assegnazione (ovrdbf) dei file e loro apertura (non si utilizzano elenchi di librerie a livello job)
  4. logica di processo specifica del programma
  5. emissione della risposta HTML
    (API QtmhWrStOut)
  6. chiusura dei file, accensione LR

Il metodo Rothman

Il service program di Mel Rothman è un fantastico strumento che consente di scrivere programmi RPG per Internet (programmi CGI) in modo facilitato e con alta flessibilità di manutenzione.
Tutto questo deriva da due fatti sostanziali. Usando questo service program, i programmi RPG
  1. richiamano le API del'http indirettamente,tramite i servizi del service program. Queste API (alcune delle quali sono state poc'anzi citate) sono necessarie per comunicare con l'http e richiedere funzioni indispensabili, quali
    • l'ottenimento della richiesta trasmessa dal browser remoto
    • la spedizione dell'html di risposta al browser remoto
    o facoltative, quali
    • la editazione di un campo numerico da inserire nell'html di risposta.
    Ebbene, la possibilità di accedere a queste API non direttamente, ma tramite i servizi del service program, riduce la complessità del codice e di gran lunga le necessità di test.
  2. anzichè generare direttamente l'html di risposta (per esempio, utilizzando un file database su cui sono memorizzati spezzoni di html, come in genere viene insegnato), utilizza membri di un file source. Tali membri, che si possono scrivere come semplici testi, contengono testo html intercalato con variabili di output; il testo è poi suddivisibile in tracciati record ("sezioni").
    Questa tecnica (benchè sia estremamente più semplice) assomiglia moltissimo all'uso delle DDS per un file display o di stampa e ne ha tutti i vantaggi, in quanto consente di modificare largamente l'html di risposta senza intervenire sul programma.
Tutto il mio sito è imperniato sull'utilizzo questo metodo. Esiste una parte didattica molto estesa che ne spiega tutti i particolari.
Impadronirsene e farne uso produttivo è questione di una giornata.
Questo è il motivo per cui, chi sceglie di utilizzare questo metodo, non ha bisogno di seguire alcun corso di programmazione CGI.
I risultati in termini di velocità e affidabilità di creazione sono impressionanti e la cosa è dimostrata dalla montagna di source code CGI che è possibile scaricare dal mio sito.
Per dare un esempio, nell'Ottobre del 1997 mi fu chiesto di creare un sito per un convegno IBM (1998 IBM EuropeMiddleEastAfrica Server Masters) che si tenne ad Istanbul nel Gennaio 1998. Io sviluppai tutta la parte dinamica (programmi CGI), un altro mio collega tutta la parte statica. Furono realizzati quattro fronti:
  1. un fronte Iscrizioni che consentiva alle persone di iscriversi, segnalare i giorni di arrivo / partenza e le proprie preferenze in termini di albergo, prenotare il posto per le conferenze preferite
  2. un fronte Amministrazione che consentiva a persone di un nostro centro belga di assegnare gli alberghi
  3. un fronte Alberghi che consentiva agli alberghi di Istanbul di ricevere in tempo reale le prenotazioni
  4. un fronte Banco Informazioni che avrebbe consentito alla segreteria del convegno di registrare chiamate esterne e segnalarle immediatamente ai partecipanti su appositi monitor
Il tutto fu realizzato in meno di tre mesi uomo con 75 mila linee di codifica, metodo Rothman.
Fu un successo organizzativo enorme. Non un fax, non una telefonata, solo Web. Le nostre controparti organizzative IBM non volevano credere che tutto fosse stato fatto con un AS/400!
L'aver saltato con il web tutte le barriere burocratico-amministrative ebbe il non trascurabile risultato di far portare gli iscritti dal numero iniziale previsto di 1500 a praticamente il doppio.
Ebbene, questa applicazione è stata recentemente da me generalizzata, ed è diventata Websiter/400 ( http://www.easy400.net/websiter ), un generatore multilinguale di siti web per eventi, ed è disponibile per scarico gratuito, corredata di tutti i simbolici, dal mio sito.

Un esempio di CGI

A titolo puramente esemplificativo della tecnica CGI con il metodo Rothman, propongo il seguente programma che viene citato nella mia parte didattica. Si tratta di un programma che consente di verificare se sull'iSeries (AS/400) ci sono tutte le PTF necessarie per far funzionare ammodo l'http.
Un html di bootstrap ( http://www.easy400.net/cgidevo/hello.mbr ) presenta la seguente pagina:
Test your http server functionality for CGIs

This html is intended to test your http server for CGI support.
Enter your first and last names below, and press the Send button.

Your first name
Your last name
Nell'html di questa pagina, c'e un form che serve per immettere i dati e chiamare il programma CGI che li elaborerà:
<form method="POST" action="/CGIDEVPGM/hello1.pgm">
Your first name: <input type="text" name="cgiinp01" size="20" maxlength="40">
Your last name: <input type="text" name="cgiinp02" size="20" maxlength="40">
<input type="submit" value="Send">
In pratica, sarà invocato il programma hello1 il quale nella sua stringa di input troverà
firstname=Ermanno&lastname=Rossi
secondo il protocollo CGI.

Prima di scrivere il programma hello1, come buon uso presso tutti i programmatori iSeries (AS/400), si scrivono le specifiche del device file esterno, in questo caso non le DDS di un file display, ma il membro sorgente di html che sarà gestito con il metodo Rothman:
/$all
Content-type: text/html

<HTML><BODY>
HELLO!<br>
your first name is <b>/%FIRSTNAME%/</b> and
your last name is <b>/%LASTNAME%/</b>.
</BODY></HTML>
In questo membro sorgente di HTML esiste un tracciato record di nome All il quale contiene due variabili di output FIRSTNAME e LASTNAME.

Ecco ora il programma RPG ILE hello1:


 
 /copy CGIDEV2/qrpglesrc,hspecs
 /copy CGIDEV2/qrpglesrc,hspecsbnd
 *
 /copy CGIDEV2/qrpglesrc,prototypeb
 /copy CGIDEV2/qrpglesrc,usec
 /copy CGIDEV2/qrpglesrc,variables1
 *=====================================================================
 * PROLOG
 * -Receive input from the remote browser
 * -Use QtmhCvtDb API to parse the input
 *  into fields of an externally defined data structure
 *=====================================================================
 /copy CGIDEV2/qrpglesrc,prolog1
 *=====================================================================
 * MAIN PROCESS LINE
 *=====================================================================
 * Read external html member into memory
C                   callp     gethtml('DEMOHTML':'CGIDEV2':'HELLO1')
 * Set html output variables
 *     -first name
C                   callp     updHTMLvar('FIRSTNAME':cgiinp01:
C                             InitHTMLVars)
 *     -last name
C                   callp     updHTMLvar('LASTNAME':cgiinp02)
 * Send just one html output section
C                   callp     wrtsection('all')
 * Send the output buffer
C                   callp     wrtsection('*fini')
 * Back to caller
C                   return
       

Ed ecco infine la risposta del programma, come compare all'utente remoto, dopo che il browser Netscape o Internet Explorer (o altro) ha interpretato l'html speditogli:


HELLO!
Your first name is Ermanno and your last name is Rossi.



Per capire questo esempio occorre:
  • aver letto qualche pagina di un manualetto di html
  • aver capito qualche istruzione operativa di RPG ILE (sostanzialmente eval; le callp sono chiamate alle procedure del service module di Rothman: non si tratta di capire, si tratta di copiare gli statement).

Conclusioni

  • Lo standard CGI (Common Gateway Interface) vale per tutte le piattaforme Internet.
    L'iSeries (AS/400) vi aderisce pienamente.
  • Nella gestione di pagine dinamiche, il metodo CGI è quello che carica di meno l'iSeries (AS/400)
  • Il service program di Mel Rothman's facilita lo sviluppo dei CGI in RPG perchè:
    • annulla la complessità delle API
    • consente di separare la logica del programma dalla sua presentazione
  • L'HTML è un linguaggio script per la presentazione in Internet. È molto semplice ma potentissimo ed è onorato da tutti i browser (Navigatori Internet).
    Un manuale tascabile è più che sufficiente per incominciare.
  • Le implicazioni RPG ILE sono veramente modeste.
    Se conosci l'RPG III, conosci più del 95% di quanto ti serve. Il resto lo imparerai mentre già starai sviluppando.
  • Nessun prerequisito per il tuo iSeries (AS/400), a partire dall'OS/400 V3R2M0.
  • Il nostro sito
    www.easy400.net
    tratta tutti gli aspetti del service program di Mel Rothman.
    Ha dimostrazioni, codice esemplificativo, didattica e programmi di utilità scaricabili gratuitamente insieme con i relativi sorgenti. in modo da consentire una partenza rapida sul Web.
Scegli questo metodo e ti troverai ad aver prodotto pagine Web dinamiche già nella prima settimana di lavoro.