Last Updated on 8 Aprile 2020 by Roberto De Pedrini
Index
iOSS-FAQ-001: Da dove iniziare
Non possiamo che mettere al primo posto delle nostre FAQ & Howto questa domanda: Da dove iniziare se voglio lavorare con linguaggi e pacchetti Open Source in ambiente IBM i.
Diciamo che, innanzitutto, la cosa migliore è essere aggiornati con il livello di sistema operativo di IBM i : dalle ultime release di sistema (a partire dalla 7.1) IBM ha sempre di più migliorato l’approccio alle soluzioni Open Source in ambiente IBM i…. se ho una vecchia V6R1 o peggio V5R4 meglio darsi all’ippica, ci sono più probabilità di portarsi a casa qualcosa!
iOSS-FAQ-002: Hello world con Node.js
Niente di meglio di un video per iniziare da un Hello World application con Node.js …. il nostro amico Yusy4Code è sempre pronto con i suoi tutorial di base, come questo “Hello World to Node.js from IBM i”
iOSS-FAQ-003: I primi passi con Python su IBM i, non solo Hello World
Ecco due siti dai quali partire per un classico Hello World con Python in ambiente IBM i
- Guru: Getting started with Python on IBM i
- Say hallo World to Java & Python on IBM i : A Mohammed Yusuf Video on Youtube
In alternativa una piccola guida passo passo creata dal sottoscritto: seguendo una guida IT-Jungle di Stephanie Rabbani (“Guru: Getting Started With Python On IBM i”) e qualche altro post in giro per il web (“Introduction to Python for IBM i” di Mike Pavlak e “Pratical guide to Python” di Kevin Adler) ho installato Python3 sulla mia macchina IBM i 7.2.
In meno di 20 minuti ho testato il classico Hello World e scaricato da Github un progetto di Alan Seiden Group con qualche bel esempio di Python e IBM i… non è fantastico? E’ proprio qui il bello … rispetto allo sviluppo classico RPG con Python (e altri linguaggi disponibili su IBM i) possiamo trovare in giro migliaia di applicazioni Open Source da assemblare insieme nei nostri progetti.
Ecco i pochi passi fatti, con qualche commento, e, a seguire, i riferimenti del materiale:
- Da IBM ACS Access Client Solution scelgo “Strumenti – Gestione pacchetti Open Source”
- Installo oppure aggiorno se non aggiornati i pacchetti “yum” e “python3” e “git”
- Apro una sessione con Putty in SSH sul mio IBM i (assolutamente meglio di QP2TERM!)
- Aggiorno la PATH come indicato nella guida di Stephanie Rabbani ( PATH=/QOpenSys/pkgs/bin:$PATH export PATH )
- Creo nella mia home IFS un piccolo programma con la sola istruzione ” print(“hello world”) ” (attenzione al print in minuscolo e non in maiuscolo come nella guida!)
- Eseguo il mio primo programma Hello Word : “python3 /home/faq400/hello.py” (anche qui attenzione a scrivere python3 in minuscolo!
- Primo passo fatto … vediamo se trovo qualcosa di pronto da testare …
- Vado su Github e trovo “Pyhon for IBM i example” del Club Seiden
- Provo a scaricare il progetto con git “git clone https://github.com/Club-Seiden/python-for-IBM-i-examples.git” … ma ho un problema di HTTPS (“fatal: Unable to find remote helper for ‘https’”)
- Litigo un po’ cercando di disabilitare il controllo della firma ma niente da fare …
- Clono allora il repository con questo comando, che funziona egregiamente ” git clone git://github.com/Club-Seiden/python-for-IBM-i-examples.git“
- Mi metto nella directory del servizio “active job dashboard” ( cd /home/faq400/python-for-IBM-i-examples/non-wheel/active-jobs-dashboard/ )
- Eseguo l’applicazione Python che mi genera un server http in attesa: ” python3 ./server.py “
- Provo l’applicazione sulla porta 3333 all’indirizzo ip del mio IBM i ( http://192.168.xxx.xxx:3333/)
- Si può fare!
C’è anche un video di Moammed Yusuf che spiega come leggere tabelle DB2 for i da Python… tutto direttamente da un accesso a PUB400.COM, quindi senza neanche installare niente sul proprio IBM i:
How to connect IBM i db2 using Python | yusy4code
iOSS-FAQ-004: Passaggio parametri da QSH con apostrofi(‘ single-quote) o virgolette(” double-quote)
Prendo spunto da una interessante discussione fatta su Midrange.com riguardo al passaggio parametri quando si ha a che fare con l’apostrofo (‘) o le doppie virgolette (“) dove John Yeung e Kevin Adler si scambiano interessanti idee al riguardo riprendendo alcuni commenti di Barbara Morris da DW.
Caso 1, passaggio parametri semplice … due parametri normali
QSH CMD('~/script1.sh param1 param2')
Caso 2, ho un terzo parametro con uno spazio in messo (‘my house’) … in questo caso possiamo utilizzare tranquillamente le virgolette (double quote) per delimitare il terzo parametro
QSH CMD('~/script1.sh param1 param2 "my house"')
Caso3, ho un quarto parametro che oltre agli spazi ha anche un apostrofo (maledetto genitivo sassone!) … in questo caso possiamo utilizzare un doppio apostrofo (double your single quote) utilizzandolo come se fosse un escape
QSH CMD('~/script1.sh param1 param2 "my house" "my dog''s house"')
Per capire meglio il caso 4 riportato qui sotto dobbiamo cercare di capire come funzionano gli escape quotes negli ambienti CL e Bourne Shells (lo shell di QSH), in CL si può usare solo il single-quote mentre in Bourne Shell si possono usare sia single-quote che double-quote. Questo significa che in ambiente QSH possiamo semplicemente utilizzare il single quote o il double quote dove ci risulta più semplice:
"This is John's apple." 'I said, "Can you hear me?"'
Oppure raddoppiare il single-quote o double-quote per utilizzare il nostro delimitatore dentro una stringa
'This Pascal string''contains two apostrophes''' "I said, ""Can you hear me?"""
Un altro modo è quello di usare il backslash come carattere di escape
'This Pascal string\'s contains two apostrophes\' ' "I said, \"Can you hear me?\" "
L’uso di questi escape potrebbe essere quindi fare al caso nostro quando vogliamo passare dei parametri: prendiamo questo esempio … la classica applicazione “hello world” node.js … che in questo caso particolare, presenta i parametri passati in una pagina HTML (*)
Ecco un esempio di passaggio parametri via QSH ad una applicazione Node.hs
QSH CMD('/QOpenSys/pkgs/bin/node /home/Opensource/nodejs01/testparms.js myfirstparm mysecondparm "my house" "my dog''s house" "he said \"Your dog''s house is very large\" "')
Il sorgente della applicazione testparms.js è scaricabile in questo Github-Gist https://gist.github.com/Faq400Git/44b0aa307e6eda78354a4227f905e53d
iOSS-FAQ-005: Return message da QSH
La shell script QSH ci permette di richiamare degli script in ambiente PASE da RPG o da CL, questo lo sappiamo … ma la cosa che non risulta semplice è quella di intercettare i returncode/returnmessage di QSH.
Ci sono diversi modi … uno è quello di catturare il messaggio QSH0005 (procedura terminata correttamente) tramite QIBM_CMD_ESCAPE_MESSAGE … come negli esempi di Midrange.com qui sotto riportato:
https://code.midrange.com/d5909d4cc2.html – Capturing QSH0005 error messages
https://code.midrange.com/999b8e2180.html – Retrieve status code from msg QSH0005
Vedi documentazione qui: https://www.ibm.com/support/pages/using-rcvmsg-and-monmsg-retrieve-qshell-messages – Using RCVMSG and MONMSG to Retrieve QSHELL Messages
Un secondo metodo è quello di deviare l’output di uscita di QSH ( QIBM_QSH_CMD_OUTPUT ) come descritto in questa guida IBM : https://media.techtarget.com/search400/downloads/Qshell_for_iSeries_ch2.pdf oppure in questo post di Bradley Stone su FieldExit : Calling QSH command from RPG
iOSS-FAQ-006: Gestire lo STDOUT di un lavoro QSH (non solo Node.js) in un file o nel Joblog del lavoro stesso
In fase di debug di un JOB QSH generalmente utilizziamo lo STDOUT per vedere i messaggi tipo console.log, ed è comodo… ma se il lavoro è un JOB schedulato le cose si complicano.
Tra le tante utility interessanti di Richard Schoen, nel suo repository Github, troviamo anche questa NodeOni che ci permette di sottomettere in batch un JOB che esegue un comando da QSH con reindirizzamento dello STDOUT nel Joblog, in un file, in uno spool file ecc … veramente comodo!
- NodeOni By Richard Schoen
- QshOni By Richard Schoen : Molto simile a NodeOni ma per un comando generico QSH e non solo Node.js
iOSS-FAQ-007: Come cambiare la Shell dell’ambiente PASE SSH
Se lavoriamo con l’Open Source in ambiente IBM i sappiamo che è molto più comodo connettersi con un terminale SSH (come Putty) piuttosto che lavorare con QSH da ambiente 5250 IBM i perché possiamo utilizzare differenti Shell del PASE, come BASH, che rendono il lavoro nettamente più produttivo.
Per settare la Shell di default possiamo lavorare sul nostro .profile delle /home/user oppure utilizzare le due tecniche qui di seguito:
- Imposto la Shell con una Stored Procedure SQL:
CALL QSYS2.SET_PASE_SHELL_INFO('*CURRENT', '/QOpenSys/pkgs/bin/bash')
2. Installo via yum una utility dedicata come chsh
yum install chsh
chsh -s /QOpenSys/usr/bin/ksh
or
chsg -s /QOpenSys/pkgs/bin/bash
Un ottimo articolo dal quale partire per capire le diverse shell disponibili per ambiente PASE è
Tech Tip: Be like a Turtle! di Jesse Gorzinski
iOSS-FAQ-008: Rational Rdi e Editor per sorgenti Python e Node.js
Se sei uno sviluppatore RPG o Cobol e utilizzi Rational Rdi per editare i tuoi sorgenti, troverai molto comodo anche gestire eventuali sorgenti Node.js o Python con la vista IFS di Rational Rdi.
Per default Rdi aprirà con il doppio click su questi tipi di file un generico editor di testo: è possibile andare nelle impostazioni (Finestra/Preferenze/Generale/Editor/Associazione file) ed impostare l’editor di default.
Ecco un esempio con Jython per aprire un .py Python
iOSS-FAQ-009: Chiamare un programma RPG da Python con iToolkit
C’è un ottimo post di Mike Larsen su IT Jungle : Guru: Calling RPG Programs From Python, Part 1
iOSS-FAQ-010: Node.js Web App on i – Updating records (By Andy Youens)
Ottimo post su PowerWire di Andy Youens , come aggiornare records con Node.js : A NodeJS Website on IBM i – Updating Records