ℂ
Cobol
. Html
. Debug
. Note
. Db2 10.1
. Oracle 26ai
. PostgreSql
. Video
. Job S. & M.
Javascript
. Calendar
.. overview
.. functions
Vue
. overview
AngularJS
. overview
React
. overview
. Tips
. Contact us
|
Future is here
"All your dream projects can become reality"
|
Perché non guardare i costi ed aumentare l’efficienza
| |
|
| |
|
(Il Business Services e Web Service realizzati in Cobol)
| | |
Volete entrare nel ventunesimo secolo ed abbandonare il client-server, eliminare le
decine di app per sistema operativo e versione, togliere uno zero al numero dei
collaboratori, aumentare la sicurezza ed il surplus, qui trovate la risposta senza
andare in paesi depressi (oppure cedi le armi a Zapier, Make, n8n, Airtable, ..).
Tutti i prodotti realizzati con Cobol e Html sono utilizzabili su qualsiasi
elettrodomestico dotato di browser, da decenni funzionano su smartphone, sulla tv,
sul frigorifero, senza nessun "driver", senza gli aggiornamenti quotidiani.
La quasi totalità della formazione finge di non conoscere il mondo del
lavoro e propone linguaggi ed ambienti a misura di studente, con favole: questo
nuovo linguaggio migliora ed ottimizza il vecchio con la perdita di performance
del solo 10, 15%, o propone linguaggi obsoleti.
Il Cobol una delle poche genialità linguistiche, il linguaggio con più
cavilli e vincoli di qualsivoglia concorrenti (un rapporto da 10 a 1), viene
percepito come il più semplice con poche istruzioni.
Perché proporlo, è perfetto per i computer quantici ed il web,
tutta la logica è centralizzata e come front-end può utilizzare
uno qualsiasi tra, Svelte, Vue, Angular, React, ... dove ognuno deve svolgere
al meglio la singola funzionalità, non avere logica di navigazione ne accesso
ai dati ma essere completamente pilotati.
Riassumendo, la grafica (front-end) è separata della gestione, le pagine
sono separate dai programmi, sono a se stanti, possono essere completamente variate,
punto fondamentale da rimarcare, le pagine sono pilotate, tutto è
deciso nei programmi. Le pagine sono la proiezione e non vincolano la navigazione.
Mediamente nei progetti gestionali l'interfaccia utente (UI, User Interface) non
arriva alle due cifre e non deve vincolare a tortuosi artifici di mobilità
e gestione dei dati, un frame del filmato.
Avete una interfaccia HTML?
Una piccola utility una tantum vi propone le copy da integrare nel sorgente, due
moduli generalizzati, che vedremo più avanti completeranno il dialogo.
Avete una interfaccia a caratteri "3270"?
Per trasformarla in Html, basta un click, più di un quarto di secolo di
esperienza, tempi di riposta e manutenzione nell'ordine di una piccola frazione
nel confronto con altre soluzioni.
Confronti:
Oggi i linguaggi di moda sono OOP, vecchi di tre decenni pensati per CPU, in
arretrato di tre generazioni, nel frattempo siamo passati alle GPU ed utilizziamo
le NPU, dove riempiono le lavagne ed hanno delle significative caratteristiche,
non riducono:
(1) i tempi di sviluppo
(2) i tempi di calcolo
(3) i tempi di manutenzione
(4) i tempo di ingegneria del software.
La programmazione OOP è perfetta per tematiche semplici, scolastiche, il
punto due riassume, ma, Voi avete mai visto un giocoliere o un lanciatore di
coltelli che si trova variati i suoi oggetti. Un esempio di OOP: se non hai la
versione 17 non parte il Developer (versione -3), ne segue il punto:
(5) si è diventati "versione dipendenti".
(6) Costretti ad utilizzare svariati prodotti di gestione delle cache, razzolare
nell'analisi dei log, debug off-line, decine e decine di librerie che nessuno
conosce il contenuto, ... eccetera.
Riflessioni,
Sicuramente è bello avere oggetti a fisarmonica con decine di attributi ed
usarne solo alcuni, ordinati a piacere ma non è senza controindicazioni. Cosa
cambia tra una Copy ed una Classe ... tra una Call ed un Package? Sicuramente
cambia alla chiusura della Call ed aspettare il ritorno di un messaggio, il
return-code di ogni istruzione e la gestione delle eccezioni, le pagine html gestite
dal grafico e la matassa inguardabile ed ingestibile negli altri casi.
| |
| |
Debug essenziale
(il cobol controlla il cobol) e Debug Z/Os |
< |
|
>
| |
Il valore aggiunto che vi offriamo senza ulteriore
tools o aggravi:
Debug essenziale, realizzato con solo Cobol - "free".
Per le funzioni web http bisogna attivare online il punto di partenza,
(cambiando url da .../COBWEB.cgi?1?.. a .../COBWEB.cgi?3?..) da un
terminale remoto si può innescare il debug, come nelle immagini sopra
riportate. Il dizionario dati, utilizzato per vedere o modificare il contenuto dei
dati è realizzato in rexx, analizzando i sorgenti le copy e le include.
In alternativa per ambiente Cics-TS con Html si può utilizzare il debug Ibm, prodotto
completo e sofisticato, intercetta le transazioni web in debug, dando la massima
operatività ed in qualsiasi momento rilascia il controllo all’utente.
La qualità del prodotto è direttamente proporzionale alla qualità
del debug, alla modalità e tempestività d'intervento.
Comandi Attivi:
BOTTOM ⇒ si posizione in coda al listato del programma
CLEAR ⇒ cancella la "variabile + valore" messo in evidenza con MONITOR
FIND/F + "valore" ⇒ ricerca nel programma la scritta
HELP ⇒ riassume i comandi e funzioni attive
MONITOR ⇒ tiene in evidenza il contenuto della "variabile + valore",
nel caso di una struttura mostra le enne righe dei singoli campi
MOVE "valore"/variabile1 TO variabile2 ⇒ imposta il contenuto ("valore") della variabile2
TOP ⇒ si posiziona all'inizio del listato del programma
Funzioni Attive:
f1 ⇒ elenca le funzioni attive
f2 ⇒ avanza di uno step
f3 ⇒ chiude il debug
f4 + il cursore sul campo ⇒ visualizza il contenuto
f5 + scritta in "command line" ⇒ ricerca nel listing
f6 + cursore in "prefix line" ⇒ attiva il breakpoint o lo toglie se ripremuto
f7 ⇒ si sposta di una pagina all'indietro
f8 ⇒ si sposta in avanza di una pagina
f9 ⇒ avanza fino allo "stop run" o al prossimo breakpoint
f11 + il cursore sul campo ⇒ visualizza il contenuto del livello 01
f12 ⇒ retrieve dei comandi eseguiti
|
| |
Note e Struttura
All'inizio degli anni 70 J.D. Warnier pubblicava: definito l'input
e l'output il programma è automaticamente definito. Negli anno 90 una seconda
ondata statunitense definì la "The Mythical Man-Month", metrica con i fattori
per linguaggio e metodologie. Il nulla ha preso consistenza, se non hai, se non
usi il framework, se non usi un accrocchio per scrivere un html, se non produci un
software su librerie fluttuanti sei antiquato (Mhmm, un palazzo senza fondamenta).
Il Cobol ripensato e riorganizzato come qualsiasi progetto hardware,
non pensate alla fantasia di un romanziere o alla ragnatele di un D.B. relazionale,
dobbiamo vedere il software come un chip fluido, multistrato e multi aree comunicanti,
semplificando come enne scacchiere, dove gli elementi sono solo due, (1) le Routine
(oggetti) ed (2) i Programmi. I Programmi hanno una sola struttura principale
chiusa, chi assembla riempie ogni singola area con le funzioni di quell'area, per
esempio:
- richiamo routine lettura pagina
- ricezione dati dalla pagina e riempio area D.B.
- richiamo routines di calcolo
- componi stringa variabili per la pagina
- compone permessi dei singoli campi
- pagina successiva
- primo accesso
- accesso al D.B. per lettura singola
- ecc. ecc.
Le aree non richieste rimangono vuote, gli interventi di variazione e manutenzione
sono di immediata individuazione. Le Routines svolgono una funzione specifica per
esempio: la routine "merge parser", della stringa variabili alle pagine.
La filosofia gestionale è nata in ambiente
Z/Os, pensata per essere trasportata e scalata fino ad un portatile.
Il lato utente necessita del solo browser, per i nostalgici neanderthaliani (o
per giusta causa) di una stampante.
Come ambiente di sviluppo, presentiamo la versione Linux, dove si hanno meno
vincoli e di maggiore interesse. Si consideri che in tutti i casi
l’interfaccia utente non è sviluppata in ambiente Mainframe per
motivi di semplicità e facilità dei test.
Due oggetti fondamentali per il dialogo tra la pagina ed i programmi sono: (A)
il parser dei campi variabili con la pagina ed invio pagina al browser (le
pagine html sono dei files distinti dai programmi),
(B) la ricezione della pagina al programma (passaggio dalla stringa alle singole
variabili) equivalente per tutti gli ambienti.
Due semplici programmi in Cobol Linux (veda il paragrafo Tips) e due funzioni
del Cics-TS con Html nel caso di Mainframe.
Json e Xml
Dovete creare files Xml o Json, semplicissimo, con le istruzioni: JSON GENERATE e
XML GENERATE trasformano la copy in struttura in un batter di ciglia.
Cobol o "C"
Abbiamo sempre parlato di Cobol ma usando GnuCobol dovremmo parlare di "C" (Gcc)
vista la conversione automatica prima della compila, con il vantaggio dato dalla
struttura del Cobol i problemi di sicurezza e gestione errata della memoria non
possono esistere, sfatando una letteratura negativa di utilizzo del "C".
Cobol e Java
Ovviamente i due linguaggi non sono mutuamente esclusivi, la soluzione dove il Cobol
utilizza Java è la condizione ottimale, si sfruttano al meglio la
potenzialità di entrambi, versione di Cobol tipo isCobol o Micro Focus danno
una ricca documentazione.
Riflessione; ma neanche Oracle riesce a tenere il passo con le versioni di Java,
(esempio SqlDeveloper) forse nella vostra immensa saggezza non vi sentite nel
cinodromo.
Cosa dobbiamo installare:
- un Cobol (GnuCobol o ...)
- un framework (Komodo, Ibm.Openeditor, Opencobolide, VSCodium, V.S.C. Aibber.base, ecc.)
- per il substrato base (Aibber.base per compile, gestione folder, ecc.) di
gestione servono: Regina (rexx), The (Hessling editor con xclip (X11) e
wl-clipboard (Wayland)), Perl
- un web serser http (Apache2 o ...)
- un database (Db2, Oracle, PostgreSql e ...) ovviamente se il gestionale lo richiede
| |
Post Scriptum:
Un vincolo eccessivo è dato dalla gestione dei files sequenziali senza
caratteristiche provenienti da altri ambienti, in certi casi torna utile renderli
"line sequential" con l'utility in perl aibbercopy.pl in calce.
Utility (aibbercopy.pl):
#!/usr/bin/perl -w
# ----------------------------------------------------- #
# - Split file (Aibber) - #
# ----------------------------------------------------- #
# - - - -
# example:
# perl ./aibbercopy.pl 143 ./temp cl040.txt cl040.sql
# parms: length folder file-binary "file-binary + \n"
# - - - -
# $Args = $#ARGV + 1;
$lrecl =$ARGV[0];
$dirmain=$ARGV[1];
$filein =$ARGV[2];
$fileout=$ARGV[3];
my($buf)="";
# - - Open
$filename = "$dirmain/$filein";
open(FILEIN, "<$filename")
or die goto FINE_MAIN_ERROR;
open(FILEOUT, ">$dirmain/$fileout")
or die "can't redirect FILEOUT";
select(FILEOUT); $| = 1; # make unbuffered
#
#-----Loop (1) Lettura per Split--------------#
#
$loop = 1;
$linee = 0;
while ($loop > 0) {
$bytes = read( FILEIN, $buf, $lrecl);
if ( $bytes < 1) {
$loop -= 1;
} else {
#---scrive il file di output---------------#
print FILEOUT "$buf\n";
$linee += 1;
} #--- end else
}; #--- end while (loop)
# - - Loop (1) Fine
# - - Close files
close(FILEIN);
close(FILEOUT);
$word = sprintf "%d", $linee;
$line_out = "Ok file::$filename Linee=$word";
goto FINE_MAIN;
FINE_MAIN_ERROR:
$line_out = "Ko file::$filename -- $! -- $0 (Errore +100)";
FINE_MAIN:
# print { $OK ? STDOUT : STDERR } "$line_out\n";
print STDOUT "$line_out\n";
# undef @riga;
exit 0;
# ---------------------------------------------------------- #
# http://www.tutorialspoint.com/perl/perl_read.htm
# http://perldoc.perl.org/index-overview.html
# ---------------------------------------------------------- #
|
|
| |
Install Db2-10.1 express-c su Client Linux (Ubuntu ram 32G)
Usato in modalità integrato nei programmi Cobol (embedded database),
il setup del database e delle tre user è abbastanza intuitivo, all’inizio il
problema della "share memery" mi ha fatto pensare di cestinare questo D.B., ma come sovente
succede è una banalità. Il D.B. si riscatta con una messaggistica
eccellente, nelle anomalie fatte durante lo sviluppo dai programmi Cobol. Dal Manzoni
"L’uom che nacque e visse senza pecca", il Bind dei programmi è un ostacolo
gratis, inutili e senza senso durante l’esecuzione dei programmi, con
errore -805 e/o -818, costringendo a tortuose manovre per i debugs.
Attenzione: i formati binary non funzionano, da Cobol a Database.
Librerie richieste (da utente root):
apt install binutils ksh zlib1g libstdc++6 libaio1t64 libaio-dev
dpkg --add-architecture i386
apt install libstdc++6:i386 libpam0g:i386
apt update && sudo apt upgrade
ln -s /usr/lib/x86_64-linux-gnu/libpam.so.0 /lib/libpam.so
ln -s /usr/lib/x86_64-linux-gnu/libaio.so.1t64 /usr/lib/x86_64-linux-gnu/libaio.so.1
(se non esistono gli UID da 997,8,9 e 1002,3,4)
groupadd -g 999 db2iadm1
groupadd -g 998 db2fsdm1
groupadd -g 997 dasadm1
useradd -u 1004 -g db2iadm1 -m -d /home/db2inst1 db2inst1
useradd -u 1003 -g db2fsdm1 -m -d /home/db2fenc1 db2fenc1
useradd -u 1002 -g dasadm1 -m -d /home/dasusr1 dasusr1
passwd db2fenc1
passwd dasusr1
passwd dasusr1
./db2prereqcheck
se tutto okay, con utenza di root:
(selezionare solo lingua inglese altrimenti serve il cd)
./db2setup -l /tmp/db2setup.log -t /tmp/db2setup.trc
aggiornare .profile della user di lavoro:
# set PATH db2 bin if it exists
if [ -d "/home/db2inst1/sqllib/bin" ] ; then
PATH="$PATH:/home/db2inst1/sqllib/bin"
fi
if [ -d "/opt/ibm/db2/V10.1/bin" ] ; then
PATH="$PATH:/opt/ibm/db2/V10.1/bin"
fi
LD_LIBRARY_PATH=/home/db2inst1/sqllib/lib64
export LD_LIBRARY_PATH
aggiornare /etc/profile:
DB2DIR=/opt/ibm/db2/V10.1
export DB2DIR
LD_LIBRARY_PATH="/home/db2inst1/sqllib/lib64"
export LD_LIBRARY_PATH
DB2INCLUDE=/home/luc/d/cobol/source/include
export DB2INCLUDE
aggiornare /etc/passwd per le tre user con la bash,
per errore di share memory:
sudo /opt/ibm/db2/V10.1/instance/db2idrop db2inst1
sudo /opt/ibm/db2/V10.1/instance/db2icrt -u db2fenc1 db2inst1
accedere e create il vostro dbpreferito:
su - db2inst1
db2start
db2 create database dbpreferito automatic storage yes
db2 get db cfg for dbpreferito
db2 update dbm cfg using SVCENAME 50000
db2set db2comm=tcpip
db2
connect to dbpreferito
GRANT DBADM ON DATABASE TO user your_user
GRANT ACCESSCTRL, BINDADD, CONNECT, CREATETAB, CREATE_
EXTERNAL_ROUTINE, CREATE_NOT_FENCED_ROUTINE, DATAACCESS,
DATAACCESS, EXPLAIN, IMPLICIT_SCHEMA, LOAD, QUIESCE_CONNECT,
SECADM, SQLADM, WLMADM ON DATABASE TO user your_user
QUIT
La configurazione base è completata, controlliamo:
su - db2inst1
db2level
db2ls
db2licm -l
db2set -all
Command line: clpplus
Suggerimento per il debug:
cmp -b -l (program).bnd (program-debug).bnd ⇒ (Δ2) (Δ1)
se (Δ1) unica presenza in (program-debug).so lanciare:
perl -i -pe 's{Δ1}{Δ2}g' (program-debug).so
|
|
| |
Install Oracle-free-26ai su Client Linux (Ubuntu ram 32G)
Usato in modalità integrato nei programmi Cobol (embedded database)
su un client Ubuntu 26.04 con Wayland, il tutto funzionerà dalla vostra utenza principale (che
non è la user Oracle).
non avete un IP statico? ma dinamico, lanciare il comando "ip a"
prendere il valore di inet: nella sezione della scheda di rete (per esempio 192.168.1.108).
Correggere in: impostazioni di rete, modalità ipv4, con manuale, indirizzo
uguale 192.168.1.108 e gateway 192.168.1.1, aggiungere al dns il valore del gateway,
con utente di root correggere i valori in "/etc/netplan/"
il più recente ...yaml come:
network:
version: 2
ethernets:
eno1:
renderer: NetworkManager
match: {}
# addresses:
# - "192.168.1.108/24"
nameservers:
addresses:
- 1.1.1.1
- 1.0.0.1
networkmanager:
uuid: "00000000-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
name: "netplan-eno1"
passthrough:
connection.timestamp: "1111111111"
ipv4.address1: "192.168.1.108/24,192.168.1.254"
ipv4.ignore-auto-dns: "true"
ipv4.ignore-auto-routes: "true"
ipv4.method: "manual"
ipv6.method: "disabled"
ipv6.ip6-privacy: "-1"
proxy._: ""
(eccetera ...)
Attenzione: i caratteri (#) contano, sono la chiave di volta, permettono a
Oracle-free-26ai di vedere IP statico ed il sistema operativo di funzionare in Dhcp,
fare un riavvio (del servizio) e voilà.
A scopo didattico ed evitare confusione, partiamo da una macchina pulita e non compromessa,
supponiamo di avere un altra versione:
sudo /etc/init.d/oracle-free-23c delete
sudo dpkg -P oracle-database-free-23c
sudo rm -rf /opt/oracle
sudo rm -rf /opt/ORCLfmap
sudo rm -rf /etc/sysconfig/oracle*
sudo rm -rf /etc/init.d/oracle*
sudo rm -rf /var/lib/dpkg/info/oracle*
sudo rm -rf /tmp/dbca_20*
sudo rm -rf /tmp/hsperfdata_oracle
se con synaptic avete oracle-free-23c si apre un altro scenario, siete compromessi
da rpm a deb da Oracle Linux 8 (OL8/RHEL8) se preferite OL9 è uguale:
sudo alien -c -d --fixperms oracle-ai-database-free-26ai_23.26.2-2_amd64.rpm
correggere: da root,
con il nome da "hostname" inserire in "/etc/hosts" nomehost 192.168.1.108
Librerie e strumenti richiesti:
Librerie di sistema e di rete: glibc, libaio, libaio-devel, libgcc, libstdc++, libstdc++-devel
Librerie di compatibilità: compat-libcap1, compat-libstdc++-33
Strumenti di supporto: bc, ethtool, ksh, make, net-tools, smartmontools, sysstat
Librerie di sblocco e sicurezza: openssl-libs, libnsl
definiamo l'utente "oracle" che vi servirà solo per l'installazione:
sudo groupadd oinstall
sudo groupadd dba
sudo useradd -g oinstall -s /bin/bash -d /home/oracle -m -G dba oracle
sudo passwd oracle
sudo usermod -aG sudo oracle
sudo apt install libaio1t64 libaio-dev
sudo ln -s /usr/lib/x86_64-linux-gnu/libaio.so.1t64 /usr/lib/x86_64-linux-gnu/libaio.so.1
(forse, ereditata dal DB2)
sudo ln -s /usr/lib/x86_64-linux-gnu/libpam.so.0 /lib/libpam.so
mkdir /cfgtoollogs/netca
installare:
sudo dpkg -i ./oracle-ai-database-free-26ai_23.26.2-2_amd64.deb
controllare:
sudo netstat -ntap | grep 1521
(se non esistono altri processi correggere)
/etc/sysconfig/oracle-free-26ai.conf
listener_port=1521
completare la user ".profile" con:
#
#- oracle -----------------------------------------------------
if [ -d "/opt/oracle/product/26ai/dbhomeFree" ] ; then
PATH="/opt/oracle/product/26ai/dbhomeFree:$PATH"
export PATH
fi
if [ -d "/opt/oracle/product/26ai/dbhomeFree/bin" ] ; then
PATH="/opt/oracle/product/26ai/dbhomeFree/bin:$PATH"
export PATH
fi
if [ -d "$HOME/d/sqlcl_26/bin" ] ; then
PATH="$PATH:$HOME/d/sqlcl_26/bin"
export PATH
fi
export ORACLE_HOME=/opt/oracle/product/26ai/dbhomeFree
export ORACLE_BASE=/opt/oracle/product/26ai/dbhomeFree
LD_LIBRARY_PATH=$ORACLE_HOME/lib; export LD_LIBRARY_PATH
CLASSPATH=$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib; export CLASSPATH
ORACLE_SID="FREE"; export ORACLE_SID
#
#- cobol ------------------------------------------------------
COB_LIBRARY_PATH="./:./home/luc/d/cobol/loadebg:/home/luc/d/cobol/loadlib"
export COB_LIBRARY_PATH
if [ -d "/home/luc/d/cobol/bin" ] ; then
PATH="$PATH:/home/luc/d/cobol/bin"
export PATH
fi
LLCOBOL="/home/luc/d/cobol"; export LLCOBOL
export COBPRINTER='cat >>/home/luc/d/cobol/printfile.txt'
#
#- the/rexx ---------------------------------------------------
REGINA_MACROS=/home/luc/d/cobol/bin; export REGINA_MACROS
REGINA_SUFFIXES=".rexx","rexx"; export REGINA_SUFFIXES
#
#- all --------------------------------------------------------
export TMP=$HOME/tmp
export TMPDIR=$HOME/tmp
oracle user: su - oracle
aggiornare la ".profile" con le sezioni #-oracle e #-all viste precedentemente,
attenzione siete in XDG_SESSION_TYPE=tty uscite e tornate alla user principale
controllo dei gruppi della user con:
"cat /etc/passwd |grep /home |grep -v false |cut -d: -f1 |xargs groups
|grep oracle" otteniamo la lista (oinstall dba oper backupdba dgdba kmdba
racdba) se tutto sistemato e provato possiamo installare il DB.
configurare il D.B. run:
sudo /etc/init.d/oracle-free-26ai configure
abilitare la vostra utenza principale:
sudo usermod -a -G dba vostra_user
controlli finali:
sudo -S /etc/init.d/oracle-free-26ai start/stop/status
sudo -S -i -u oracle lsnrctl start/stop/status
controllare /etc/oratab che sia in ":N" per non appesantire la vostra user
Creiamo un pluggable database ed accediamo, dove *** è la pw:
dalla user oracle create la directory:
mkdir /home/oracle/oradata/pdb1
tornati nella user principale, ed eseguiamo:
sqlplus / as sysdba
show pdbs;
select * from v$version;
create pluggable database pdb1 admin user SYSDBA identified
by *** FILE_NAME_CONVERT=('/opt/oracle/oradata/FREE/pdbseed/',
'/home/oracle/oradata/pdb1');
create pluggable database pdb1 admin user SYSDBA identified
by Password1 ROLES = (DBA) file_name_convert=('/opt/oracle/oradata/FREE/pdbseed/',
'/home/oracle/oradata/pdb1');
alter pluggable database PDB1 open;
alter pluggable database PDB1 save state; COMMIT;
alter session set container = PDB1;
create tablespace "USERS" logging datafile '/home/oracle/oradata/pdb1/rca_users'
size 7m autoextend on next 3m maxsize unlimited extent management local segment
space management auto;
create user RCA identified by *** default tablespace USERS temporary tablespace TEMP
profile default account unlock;
grant connect to RCA;
grant resource to RCA;
grant unlimited tablespace to RCA;
alter user RCA identified by "NuovaPassword1"; COMMIT;
-- lista users del pluggable database PDB1
set pagesize 200
col USERNAME format a25
col PDB_NAME format a15
select u.USERNAME,p.CON_ID,p.PDB_NAME,u.CREATED
from CDB_USERS u ,dba_pdbs p
where p.PDB_ID=u.CON_ID and p.CON_ID>2;
quit
Completiamo $ORACLE_HOME/network/admin/tnsnames.ora
PDB1 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = PDB1)
(UR=A)
) )
Completiamo $ORACLE_HOME/network/admin/sqlnet.ora
# NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT)
NAMES.DIRECTORY_PATH= (TNSNAMES, HOSTNAME, EZCONNECT)
tcp.validnode_checking = NO
Start/Restart del D.B.
tnsping FREE
tnsping PDB1
tnsping localhost
ulimit -a
Check finale, per esempio usiamo sqlcl:
sql sys/***@//localhost:1521/PDB1 as sysdba
DBeaver per il pluggable database diventa (host: 127.0.0.1 port: 1521
db: PDB1, "Service Name", Username: sys, pw: (pw), role: sysdba, "Location Client":
/home/oracle/oradata/pdb1 ).
La connect del cobol diventa:
EXEC SQL BEGIN DECLARE SECTION END-EXEC.
01 HV-USERID PIC X(10) VARYING.
01 HV-PSWD PIC X(10) VARYING.
01 HV-DB PIC X(10) VARYING.
01 HV-PDB PIC X(10) VARYING.
01 SQLSTATE PIC X(5).
EXEC SQL END DECLARE SECTION END-EXEC.
....
MOVE 'RCA' TO HV-USERID-arr
MOVE 3 TO HV-USERID-len
MOVE *** TO HV-PSWD-arr
MOVE 8 TO HV-PSWD-len
MOVE 'FREE' TO HV-DB-arr
MOVE 4 TO HV-DB-len
MOVE 'PDB1' TO HV-PDB-arr
MOVE 4 TO HV-PDB-len
EXEC SQL
CONNECT :HV-USERID IDENTIFIED BY :HV-PSWD
USING :HV-PDB
END-EXEC.
Per configurare la user, Apache, Cobol, Compile, The, Rexx, ecc. vedere Tips.
Questo eseguibile non ha bisogni di spiegazioni:
#!/usr/bin/regina
/* rexx Oracle
parametri: funzione pw
??? "sudo -S ..." ??? peccato in ubuntu 26.04 non funziona (rust di m.)
*/
parse arg zfunz zpw .
zfunz = translate(zfunz)
var = ' START STOP INFO STATUS LIST LISS LISSTATUS LISSTART LISSTOP '
if wordpos(' 'zfunz' ', var)=0 then do
if strip(zfunz)='' then zfunz='Null'
say '_o Attenzione Funzione errata ?=' zfunz
say '_o Funzioni:' var
exit 8
end
if zfunz = 'START' then do
if zpw\='' then push zpw
"sudo -S /etc/init.d/oracle-free-26ai start"
end
if zfunz = 'STOP' then do
if zpw\='' then push zpw
"sudo -S /etc/init.d/oracle-free-26ai stop "
end
if zfunz = 'INFO' | zfunz = 'STATUS' then do
if zpw\='' then push zpw
"sudo -S /etc/init.d/oracle-free-26ai status"
"ps -aef|grep oracle|grep FREE|wc"
end
if zfunz = 'LIST' then do
"ps -aef|grep oracle|grep FREE"
end
if zfunz = 'LISS' | zfunz = 'LISSTATUS' then do
if zpw\='' then push zpw
"sudo -S -i -u oracle lsnrctl status"
end
if zfunz = 'LISSTART' then do
if zpw\='' then push zpw
"sudo -S -i -u oracle lsnrctl start"
end
if zfunz = 'LISSTOP' then do
if zpw\='' then push zpw
"sudo -S -i -u oracle lsnrctl stop"
end
exit 0
|
|
| |
Install PostgreSql su Client Linux (Ubuntu ram 32G)
Usato in modalità integrato nei programmi Cobol (embedded database) in un client
Ubuntu 26.04 con Wayland e GnuCobol.
I precompilatori esqlOC, ocesql, gixsql sono da provare in relazione alle proprie esigenze.
Il precompilatore esqlOC penso sia per progetti semplici o creati da nuovo, per persone
con un alto skill dell'ambiente. Partendo con un software creato per esempio con i due precedenti
ambienti proprietari uno si aspetta una interruzione di incompatibilità, con un log del punto
di rottura, invece nulla, un errore generale univoco.
Il precompilatore gixsql evoluzione di ocesql, in collaudo.
Il precompilatore ocesql qualcosa risolve ma ha dei gravissimi limiti, vi lascio una
serie di ostacoli, premesso che non esistono nel D.B. i campi comp-3:
- non accetta i comp e comp-5 al posto dei comp-3
- vuole una directory per tablespace
- una serie di anomalie inventate senza Log ne riferimenti
- una serie di include risulta in errore
- sql begin/end declare section da togliere dalle include
- le sql dei campi :aaaaaa.ab_cccc diventano :ab_cccc of aaaaaa
- le select * into .., devono diventare a campi singoli
- non esiste un owner di default
- i cursori in working sono da spostare
- autocommit ad on, si accende
- sqlcode -400 su sql non previste
- sqlcode -220 per le call dirette al D.B.
- le optimize (Ibm) sono da eliminare
- non esiste un check da cobol a DB come in DB2
- un equivalente della dclgen esiste?
Per fortuna le ddl sono simili ad Oracle. Se come il mio caso si parte da un software Ibm esiste
il problema dei cursori? In Db2 un Cursore può essere aperto ad un livello qualsiasi delle call
ed usato in un altro livello, anche se il livello di apertura non esiste più. Dimenticavo un
ulteriore modifica sui "range" dei cursori passando da ebcdic ad ascii.
Installazione
sudo useradd -m -s /bin/bash -d /home/postgres postgres
-- sudo passwd postgres
in sudoesr: postgres ALL=(ALL) NOPASSWD: ALL
sudo passwd -d postgres
sudo apt update
sudo apt install postgresql-common -y
sudo /usr/share/postgresql-common/pgdg/apt.postgresql.org.sh
sudo apt install postgresql -y
sudo systemctl status postgresql
psql --version
sudo apt install -y default-jdk build-essential bison flex gettext
texinfo libgmp-dev autoconf libpq-dev libtool (? libpqxx-dev)
cd Open-COBOL-ESQL-1.4
export CPPFLAGS="-I/usr/include/postgresql"
./configure --host=x86_64-pc-linux-gnu
make
errore bloccante:
sudo nano /usr/share/libtool/configure.ac
LT_INIT([dlopen win32-dll])
-- queste scritte preoccupanti ???
-- non tocco nulla e da root:
autoreconf --force --install
./configure --host=x86_64-pc-linux-gnu
make
-- non tocco nulla ma ???: YACC=bison -y
make check
sudo make install
sudo nano /etc/postgresql/18/main/pg_hba.conf
#- local all all peer
local all postgres scram-sha-256
local all all scram-sha-256
# IPv4 local connections:
host all all 127.0.0.1/32 scram-sha-256
# IPv6 local connections:
host all all ::1/128 scram-sha-256
sudo nano /etc/postgresql/18/main/postgresql.conf
#listen_addresses = '*'
listen_addresses = 'localhost'
port = 5432
ssl = off
firewall:
sudo ufw allow 5432/tcp
.profile
#- PostgreSql--------------------------------------------------
# export CPPFLAGS="-I/usr/include/postgresql"
# export COB_LDFLAGS=-Wl,--no-as-needed,--export-dynamic
# export COB_LDFLAGS=-Wl,--no-as-needed,--export-dynamic,--fPIC
if [ -d "/usr/lib/postgresql/18/bin/" ] ; then
PATH="$PATH:/usr/lib/postgresql/18/bin/"
export PATH
fi
LD_LIBRARY_PATH=/usr/local/lib:/usr/lib/postgresql/18/lib
export LD_LIBRARY_PATH
LD_RUN_PATH=/usr/local/lib:/usr/lib/postgresql/18/lib
export LD_RUN_PATH
cd $HOME/d/cobol/data
mkdir scomuni
mkdir scomuni2
mkdir sgavsysq
mkdir sgavsyst
mkdir sgavsysu
cd ..
sudo chown -R postgres:postgres ./data
sudo -u postgres psql
SELECT version();
SELECT
inet_server_addr(),
inet_server_port();
SHOW SERVER_ENCODING;
show data_directory;
show all;
ALTER USER postgres WITH PASSWORD '****';
pg_config --libdir
CREATE ROLE RCA WITH CREATEDB SUPERUSER;
ALTER USER RCA WITH PASSWORD '****';
ALTER USER RCA WITH LOGIN;
\du
create database dbpada with owner = rca;
\c dbpada
\q
psql -U rca -h 127.0.0.1 -d dbpada
CREATE SCHEMA RCA;
GRANT ALL PRIVILEGES ON DATABASE dbpada TO rca;
\set AUTOCOMMIT 'false'
\echo :AUTOCOMMIT
\l
SELECT current_database();
select current_user;
SHOW hba_file;
SELECT oid from pg_database WHERE datname = 'dbpada';
SELECT relname, relfilenode FROM pg_class WHERE relname = 'dbpada';
\db+ // list tablespace
SELECT * FROM pg_tablespace;
select spcname ,pg_tablespace_location(oid) from pg_tablespace;
SELECT *, pg_tablespace_location(oid) FROM pg_tablespace;
\dt
\i /home/luc/d/cobol/db2data/GESYQCR0_pg.sql;
\i /home/luc/d/cobol/db2data/GESYTCR0_pg.sql;
\i /home/luc/d/cobol/db2data/GESYUCR0_pg.sql;
\i /home/luc/d/cobol/db2data/GATAV240_pg.sql;
\i /home/luc/d/cobol/db2data/GATAV241_pg.sql;
\d comuni
select * from pg_tables where schemaname = 'rca';
\dn // display all schema
\du // users
\df // display all function
\dv // display all view
\q
ps aux | grep 'postgres *-D'
In Cobol, la connect diventa:
MOVE 'rca' TO HV-USERID
MOVE **** TO HV-PSWD
MOVE 'dbpada' TO HV-PDB
MOVE 'dbpada@localhost:5432' TO HV-PDB
EXEC SQL
CONNECT :HV-USERID
IDENTIFIED BY :HV-PSWD USING :HV-PDB
END-EXEC.
Questo eseguibile non ha bisogni di spiegazioni:
#!/usr/bin/regina
/* rexx PostgreSql
parametri: funzione pw
??? "sudo -S ..." ??? peccato in ubuntu 26.04 non funziona (rust di m.)
*/
parse arg zfunz zpw .
/*
"regina ~/d/cobol/bin/_db2p.rexx" zfunz
*/
zfunz = translate(zfunz)
var=' start stop status restart reload disable enable con0 conn con1 con2 con3 '
var=translate(var)
if wordpos(' 'zfunz' ', var)=0 then do
if strip(zfunz)='' then zfunz='Null'
say '_p Attenzione Funzione errata ?=' zfunz
say '_p Funzioni:' var
exit 8
end
if zfunz = 'STATUS' then do
if zpw\='' then push zpw
"sudo systemctl status postgresql"
"ps aux | grep 'postgres *-D'"
end
if zfunz = 'START' then do
if zpw\='' then push zpw
"sudo systemctl start postgresql"
"sudo systemctl enable postgresql"
end
if zfunz = 'STOP' then do
if zpw\='' then push zpw
"sudo systemctl disable postgresql"
"sudo systemctl stop postgresql"
end
if zfunz = 'RESTART' then do
if zpw\='' then push zpw
"sudo systemctl restart postgresql"
end
if zfunz = 'RELOAD' then do
if zpw\='' then push zpw
"sudo systemctl reload postgresql"
end
if zfunz = 'DISABLE' then do
if zpw\='' then push zpw
"sudo systemctl disable postgresql"
end
if zfunz = 'ENABLE' then do
if zpw\='' then push zpw
"sudo systemctl enable postgresql"
end
if zfunz = 'CONN' then do
if zpw\='' then push zpw
"sudo -u postgres psql"
end
if zfunz = 'CON1' then do
"sudo -i -u postgres"
end
if zfunz = 'CON2' then do
"sudo -u postgres psql -U rca -d postgres -h 127.0.0.1 -W"
end
if zfunz = 'CON3' then do
"sudo -u postgres psql -U rca -d dbpada -h 127.0.0.1 -W"
end
if zfunz = 'CON0' then do
"psql -U rca -d dbpada -h 127.0.0.1 -W"
end
exit 0
Check
Popolare le poche righe di partenza con Dbeaver, completare le definizione per Apache2,
start del DB ed Apache, lanciare:
http://localhost/COBWEB.cgi?1?
ldd $HOME/d/cobol/loadlib/COBWEB.cgi
file $HOME/d/cobol/loadlib/COBWEB.cgi
ldd $HOME/d/cobol/loadlib/GTSYS030.so
file $HOME/d/cobol/loadlib/GTSYS030.so
file /usr/local/lib/libocesql.so.0.1.0
DBeaver: Connect by: Host, URL: jdbc:postgresql://localhost:5432/dbpada, Host: localhost, Port: 5432
Database.dbpada, Username: rca, Password: ****
Commenti di anni precedenti:
Usato in modalità integrato nei programmi (embedded database),
spettacolare la semplicità di primo approdo, tutto si svolve con fluidità
e semplicità. Parlando di un prodotto che supporta più database il
primo ostacolo è dovuta alla normalizzazione delle include sql, le built-in
fanno il loro lavoro, peccato per i cursori, la declare deve essere spostata vicino
alla open, comporta un supplemento di controlli.
Le operazioni sql risentono dei linguaggi nativi risultano notevolmente più
criptiche rispetto all'approccio dei precedenti database.
Un ulteriore difficoltà è la completa incomprensione della messaggistica,
le anomalie del precompilatore sono "mitiche" non esistono riferimenti ne al
Database ne al sorgente, stessa sorte per il compilatore. Sicuramente il suo utilizzo
è orientato verso linguaggi che non sanno gestire le chiavi tradizionali e si
appoggiano alle chiavi surrogate, con la tecnica (JUnit): se raddoppi semplifichi!? O meglio
non capisco ma ho scritto.
|
|
| |
Esempi di Cobol con Apache2 e Db2/Oracle
( un click sulla descrizione per attivare il Link al Video )
Debug realizzato con il solo Cobol
Db2: alcune pagine, le più vintage (qualche ritocco alla fine
dello scorso secolo):
Oracle: personalizzazione dell'aspetto (con più di 15 aree,
qualche ritocco alla fine dello scorso secolo):
Debug versione 2008 con interfaccia The-editor (Hessling):
|
|
| |
Job Scheduler & Monitor - Royalty-free
Semplice e completo, per ulteriore semplificazione esponiamo la versione a caratteri
per Linux / Unix. Il prodotto consente la gestione automatica dei processi elaborativi.
Si possono controllare e governare tutti i processi. Il prodotto è composto
da tre sottosistemi, uno per la schedulazione (scheduler), uno per il controllo
(controller) dei processi e uno per monitorare (monitor). La realizzazione con
il linguaggio PERL ne permette la trasportabilità su tutti i sistemi operativi.
Unico limite è la fantasia.
A) Lo schedulatore (Scheduler) Esegue la sottomissione delle reti nel
momento stabilito, con i campi "giorno della settimana" ed "ora". Il giorno della
settimana assume i valori da "1" a "7" per indicare i giorni da "lunedì" a
"domenica" o il valore "X" per tutti i giorni. Le reti sono innescate se "flag status"
è attivo (A=Attivo, S=Sospeso). Tutti i processi con cadenza maggiore della
settimana sono regolati dal "flag festivo" che identifica in modo univoco le condizioni
di esecuzione nell'arco dell'anno, della settimana, ecc. ..
"flag festivo"
Per completare la visione si ricorda: 1) la tabella della frequenza dei
controlli, variabile a 1 secondo a 86400, 2) la tabella dei giorni festivi dell'anno.
B) La Rete (controller)
Il processo sottomette e controlla l'esecuzione dei Job della "Rete".
Per meglio comprendere quanto segue bisogna vedere la compilazione di una rete:

Il Successivo=0 per i blocchi (Sequenza=) 4 e 6 crea una piramide rovesciata di uscita,
nell'esempio, come si allarga la base in egual modo si può restringerla.
Il Job per essere eseguito deve soddisfare le condizioni iniziali (controllo),
si conclude quando soddisfa la condizione finale (controllo di uscita), bisogna
vedere il Job composto da tre step. Anche qui abbiamo i flag "status" e "festivo"
come nella sezione precedente, se lo Status "S=Sospeso" sono cancellati anche tutti
i suoi derivati. Il flag "controllo" permette l'esecuzione in funzione dello status
finale dei chiamanti e partire se conclusi in "OK" o "KO".
I controlli di inizio e fine sono procedure che leggono o calcolano o analizzano
situazioni o controllano lo status di uscita, sono libere di essere ampliate a
piacere al di fuori del set base.
C) Lo stato dei processi (monitor)
Con il comando è possibile: a) vedere lo stato delle reti b) vedere lo stato
della singola rete c) chiudere l'esecuzione della rete d) congelare l'esecuzione
della rete e) scongelare l'esecuzione della rete. Nei casi a,b mettendo il numero
di giorni negativi si vedono le esecuzioni nei giorni -1,-2, ... per esempio con
"j2mgr" si vedono le esecuzioni delle reti del giorno, con "j2mgr -1" le esecuzioni
del giorno precedente ecc. Mettendo il nome della rete, esempio "j2mgr 0 ReteEsempio",
mostra il/i dettaglio/i dell'esecuzione della rete nel giorno corrente, ecc.
Le reti in esecuzione possono essere congelate con il comando:
"j2mgr.pl WAIT ReteEsempio"
e riattivate con:
"j2mgr.pl GO ReteEsempio"
Per terminare il controllo e le successive esecuzione
dei Job della rete eseguire il comando
"j2mgr.pl STOP ReteEsempio"
si ricorda che le lettere maiuscole e minuscole
hanno valore diverso, ReteA è diversa da reteA ecc.
Q) qualche esempio
3) Controllo (Lista) reti eseguite sette giorni prima
j2mgr.pl -7
6) Controllo (Lista) rete eseguita sette giorni prima
j2mgr.pl -7 ReteEsempio
17) Rete con shell script senza controllo esito
sendfat6 1 0 A N 0 0 0 E SCRIPT1 . NC j2control.pl /jcl /tmp
18) Rete che attende l'arrivo del file /tmp/bolle
sendfat4 1 0 A N 0 0 2 U PROGRAM1,a,ebmprod fw:/tmp/bolle OK j2control.pl /jcl /tmp
sendfat4 2 1 A N 1 0 0 U PROGRAM2,a,ebmprod . OK j2control.pl /jcl /tmp
sendfat4 2 2 A N 1 0 0 U PROGRAM4,a,ebmprod . OK j2control.pl /jcl /tmp
19) Rete che si interrompe se non esiste il file /tmp/bolle
sendfat4 1 0 A N 0 0 2 U PROGRAM1,a,ebmprod fe:/tmp/bolle OK j2control.pl /jcl /tmp
sendfat4 2 1 A N 1 0 0 U PROGRAM2,a,ebmprod . OK j2control.pl /jcl /tmp
sendfat4 2 2 A N 1 0 0 U PROGRAM4,a,ebmprod . OK j2control.pl /jcl /tmp
25) Schedulazione come caso 24 e per i mesi pari
X 20:00 ReteEsempio A Profilo1 G1.2.3.4.5,!M1.12,M2.4.6.8.10 j2control.pl /jcl /tmp
|
|
| |
Tips
In gestione, ristrutturazione, adeguamento di un prodotto serve un editor con un
rapporto 1 a enne nel confronto dei sorgenti.
Lo strumento ideale per manipolare è Regina-Rexx con THE (The Hessling Editor),
peccato che quest'ultimo si presenta "nudo", come una tela bianca, dove un neofita non
può apprezzare il massimo della duttilità e trasportabilità.
In coda troverete una piccola collezione, il minimo di conoscenze per superare
lo shock del primo lancio ed essere produttivi.
Qualche raccomandazione per chi non ha mai usato il Vm/Cms di IBM, la potenza di
variare il nome e l'estensione (fn ft fm) il cambio LF/CRLF il trailing sono
semplici comandi, l'undo è molto limitato, si usa fn o ft per creare punti di
check, ecc.
Il comando llhelp riassume e mostra una seria di built-in per personalizzare l'ambiente,
per esempio incapsulare il comando enter con llenter, il comando llist per agevolare
la visione e lo spostamento tra le directory e l'apertura dei files utilizzando il tasto
F1. Potrete personalizzare il parser dei sorgenti ampliando o modificando i
files "*.tld", "showkey" per il nome dei tasti, c-b c-b per i blocchi, c-o ed ecc.
Consiglio di vedere la sezione "Default Key Assignments" digitando help in
command-line.
Rimodellato l'ambiente ora potrete ristrutturare i vostri Botero, la
tendenza di creare queste palle enormi e lardose nell'era degli sciami di droni.
Siete pronti per creare la vostra "collezione" di ristrutturazione, quelle
dell'ambiente che poco vi servirà, si presenta:
|
| |
|
| |
per Linux install in /usr/share/THE:
sudo apt-get install xclip
sudo apt-get install wl-cleapbord
sudo apt-get install the
sudo apt-get install regina-rexx regina3 regina3-dev
Copiare la collezione ..7z in extras
sudo gnome-text-editor /etc/profile
THE_HOME_DIR="/usr/share/THE"
THE_HELP_FILE="/usr/share/THE/THE_Help.txt"
THE_PROFILE_FILE="/usr/share/THE"
THE_MACRO_PATH="/usr/share/THE"
export THE_HOME_DIR THE_HELP_FILE THE_PROFILE_FILE THE_MACRO_PATH
if [ -f /etc/bash.bashrc ]; then
. /etc/bash.bashrc
fi
sudo gnome-text-editor /etc/bash.bashrc
alias the='the -p /usr/share/THE/profile.the'
alias thewin='the -p /usr/share/THE/profileWin.the'
alias xclip='xclip -selection c'
per Windows install in c:\0\THE:
installare THE e Regina la https://hessling-editor.sourceforge.net/
Copiare la collezione ..7z in extras
impostare le variabili di ambiente:
REGINA_HOME=C:\0\Regina
REGINA_LANG=en
REGINA_LANG_DIR=C:\0\Regina
THE_HELP_FILE=C:\0\THE\THE_Help.txt
THE_HOME_DIR=C:\0\THE
THE_MACRO_PATH=C:\0\THE\extras
creare un link o lanciare da cmd: theb o cmd: thex
C:\0\THE\the.exe -p c:\0\THE\extras\profileWin.the
| |
"(avete notato la gamba anteriore sinistra dello sfondo)"
| |
Download editor Tips
Download core Tips
|
|
|
stop/start images (reload to resize)
|
|
|