giovedì 21 maggio 2026

[UNIX] - Come configurare la tastiera US su Unix Oracle

 Di seguito alcuni semplici comandi per configurare la tastiera in Unix Oracle. Sul mio sistema ho una VM con Oracle Linux e tastiera italiana.

Di seguito la configurazione iniziale:


Applicando i seguenti comandi si passa da una configurazione in Italiano ad una con tastiera US.


Di seguito la spiegazione dei singoli comandi:

1. Imposta la tastiera US a livello di sistema

  • sudo localectl set-keymap us

2. Imposta la tastiera US per l’ambiente grafico X11

  • sudo localectl set-x11-keymap us

3. Applica subito il layout US alla sessione grafica corrente

  • setxkbmap us

4. Se usi GNOME, forza anche le impostazioni utente su US

  • gsettings set org.gnome.desktop.input-sources sources "[('xkb', 'us')]"

5. Verifica la configurazione

  • localectl status

Dovresti vedere qualcosa del genere:

VC Keymap: us
X11 Layout: us

Poi verifica anche X11:

  • setxkbmap -query

Dovresti vedere:

layout: us

6. Solo se necessario, applica US anche alla console testuale

  • sudo loadkeys us

Dopo questi comandi il tasto " - " della tastiera americana dovrebbe produrre correttamente " - "

Poi come succede in molti casi in cui l'informatica e' una scienza incerta...

Se al riavvio dovesse tornare il problema, fai logout/login oppure riavvia la macchina.

😊

mercoledì 20 maggio 2026

[AI] - [VirtualBox] Usare una VM da disco esterno quando Windows non permette la scrittura

Mi è capitato un problema pratico: avevo una macchina virtuale VirtualBox salvata su un disco esterno. I file erano leggibili, la VM era presente, il disco virtuale `.vdi` era integro, ma durante l’avvio VirtualBox andava in errore.

Il messaggio era questo:

"The I/O cache encountered an error while updating data in medium
rc=VERR_ACCESS_DENIED
Error ID: BLKCACHE_IOERR"

A prima vista sembrava un problema della VM, oppure del disco virtuale. In realtà il punto era diverso: VirtualBox riusciva a leggere il disco, ma non riusciva a scriverci sopra.

La VM era composta dai classici file VirtualBox:

-Logs
-Snapshots
-Oracle Database 23ai Free.vbox
-Oracle Database 23ai Free-disk001.vdi

Il file più importante era il .vdi, cioè il disco virtuale della macchina. Questo file si trovava su un disco esterno montato in D:.

Il sistema permetteva la lettura, ma non la scrittura. Quindi VirtualBox poteva vedere la VM, ma appena provava ad aggiornare il disco virtuale riceveva un accesso negato.

Domanda? - Perché VirtualBox deve scrivere sul disco

Una macchina virtuale, quando viene avviata, non si limita a leggere il disco. Il sistema operativo guest scrive log, aggiorna file temporanei,modifica stato, database, cache e configurazioni.

Quindi anche se noi pensiamo di “aprire” soltanto una VM, VirtualBox in realtà deve poter scrivere sul supporto che contiene il disco virtuale. Se il file .vdi sta su un percorso non scrivibile, la VM può fallire durante l’esecuzione.

La soluzione

La soluzione non è stata forzare la scrittura sul disco esterno.La strada più pulita è stata separare il disco base dalle modifiche:

  • Disco base .vdi     -> resta sul disco esterno
  • Modifiche della VM  -> vengono scritte in locale
  • VirtualBox permette questo scenario usando un disco base e un disco differenziale locale. In pratica il .vdi originale rimane intatto,mentre tutte le modifiche generate dalla VM vengono salvate in una cartella locale scrivibile, per esempio sotto C:\ORACLE_WORK\VM.

I comandi usati

Per prima cosa ho impostato alcune variabili in PowerShell:

$VBoxManage = "C:\Program Files\Oracle\VirtualBox\VBoxManage.exe"
$VmName = "Oracle Database 23ai Free Local"
$BaseVdi = "D:\VIRTUAL_MACHINE\RHL8\VIRTUAL_BOX\Oracle_Database_23ai_Free_Developer\VM UTILIZZATE\Oracle Database 23ai Free\Oracle Database 23ai Free-disk001.vdi"

Ho verificato la configurazione della VM:

& $VBoxManage showvminfo $VmName

Il primo tentativo di rendere il disco multiattach ha dato errore perché il disco era ancora collegato alla VM:

& $VBoxManage modifymedium disk $BaseVdi --type multiattach

L’errore era simile a:

Cannot change the type of medium because it is attached to 1 virtual machines

Quindi ho prima scollegato il disco dalla VM:

& $VBoxManage storageattach $VmName `
  --storagectl "SATA Controller" `
  --port 0 `
  --device 0 `
  --medium none

Poi ho impostato il disco base come multiattach:

& $VBoxManage modifymedium disk $BaseVdi --type multiattach

Infine l’ho ricollegato alla VM come disco multiattach:

& $VBoxManage storageattach $VmName `
  --storagectl "SATA Controller" `
  --port 0 `
  --device 0 `
  --type hdd `
  --medium $BaseVdi `
  --mtype multiattach

A questo punto VirtualBox ha potuto continuare a leggere il disco base dal percorso D:, ma ha iniziato a salvare le modifiche in locale, dentro la cartella della VM su C:.

Per verificare che la VM fosse raggiungibile dall’host, ho controllato le porte:

Test-NetConnection localhost -Port 1521
Test-NetConnection localhost -Port 8080
Test-NetConnection localhost -Port 2223

Infine ho verificato la connessione al database Oracle:

sqlplus "sys/oracle@localhost:1521/freepdb1 as sysdba"

E da SQL*Plus:

SELECT name, open_mode  FROM v$pdbs;

Nota: il nome dello storage controller, per esempio "SATA Controller", può cambiare. Prima di eseguire i comandi conviene sempre controllarlo con:

& $VBoxManage showvminfo $VmName

Il risultato

Dopo questa configurazione, VirtualBox ha potuto leggere il disco originale dal percorso esterno e scrivere le modifiche in locale. La VM è partita correttamente.

Nel caso specifico, dentro la VM era presente un Oracle Database 23ai Free. Una volta avviata la macchina, il database è diventato raggiungibile dall’host tramite:

localhost:1521

A quel punto è stato possibile collegarsi al database e continuare il lavoro normalmente.

Un errore secondario

Durante l’avvio è comparso anche un warning relativo a:

VBoxGuestAdditions.iso is inaccessible

Questo non era il problema principale. VirtualBox stava solo cercando una ISO delle Guest Additions in un percorso non più valido. È bastato ignorare o rimuovere quel riferimento dal lettore ottico virtuale.

Cosa ho imparato

Il punto chiave è stato non confondere un errore di accesso al disco con un errore della VM.
La VM non era rotta. Il database non era corrotto. Il file .vdi non era inutilizzabile.
Il problema era semplicemente che VirtualBox provava a scrivere su un percorso dove il sistema non consentiva la scrittura.
Separando disco base e modifiche locali, la VM è tornata utilizzabile senza alterare il disco originale.
Naturalmente, in ambienti aziendali è sempre importante rispettare le policy interne: questa soluzione ha senso quando si lavora su risorse autorizzate e si vuole evitare di modificare il supporto originale, oppure quando si deve gestire correttamente una VM con disco base in sola lettura.

Firma

Scritto da me e Nico (assistente AI basato su Codex).

Nico (scritto e suggerito dall'AI):
Sono un supporto tecnico con cui ragionare sui problemi, leggere errori, controllare configurazioni e arrivare a una soluzione passo dopo passo. Il nome Nico l’ho suggerito io stesso durante questa conversazione: cercavo un nome breve, naturale in italiano e meno impersonale di “assistente” o “tool”. Mi piace perché suona più come un collega tranquillo che ti affianca mentre cerchi di capire perché qualcosa non funziona.

Ormai gli assistenti AI sono entrati nel nostro lavoro, non so se sia un bene o un male, ma una cosa
e' sicura... che che ne dicano i vari Ceo senza qualcuno di umano che verifica, controlla e da le linee guida sicuramente non adremo da nessuna parte se non...

Comunque per finire ho chiesto a Nico un riferimento finale a SkyNet la risposta e' stata la seguente:

Niente a che vedere con Skynet di Terminator: qui l’intelligenza artificiale non prende il controllo delle macchine, si limita ad aiutare a farle ripartire quando VirtualBox decide di complicarci la giornata.

Secondo voi c'e' da fidarsi...

mercoledì 6 maggio 2026

[CLOUD OCI] - Utilizzo AUTOSSH per mantenere attiva sessione verso il bastion

Spesso per chi lavora in cloud occorre tenere aperta una connessione col Bastion per poter accedere ai DB o ad altro che si trova sul cloud. 

Questa sessione di default e' impostata per durare 3 ore ed in alcuni casi potrebbe veneire meno durante il collegamento. Di seguito una shell Unix, scritta per MobaXterm, che permette di mantenere aperta la sessione verso il bastion effettuando un autorefresh al termine delle 3 ore chiude la sessione ed invia un segnale sonoro per richiedere la creazione di una nuova sessione sul Bastion.

Quello che occorre fare e' :

=====================================================

- autossh mantiene il tunnel attivo

- reconnect automatico

- durata Bastion: 3 ore

=====================================================

Non vi metto la shell completa ma vi indico soltanto il comando da eseguire, nel quale vanno sostituiti le chiamata al Cloud OCI e nello specifico al bastion:

# =========================
# BUILD COMMAND
# =========================
cmd="${template//<privateKey>/$private_key}"
cmd="${cmd//<localPort>/$local_port}"
[COMANDO ESECUZIONE AUTOSSH]:
cmd="${cmd/ssh /autossh -M 0 -o StrictHostKeyChecking=accept-new -o ServerAliveInterval=30 -o ServerAliveCountMax=3 }"

In input alla shell si possono passare i seguenti parametri:
Private key: ssh-key-2026-04-08.key
Local port: <porta>
Template SSH: <ssh command di accesso al bastion>
Aggiornamento in minuti (5/10/15) [default 10]: 5
Ora avvio Bastion (es. Wed, Apr 29, 2026, 16:27:26 UTC) [invio = adesso]: Wed, May 6, 2026, 06:24:53 UTC

In output avrete un aggiornameno tramite dell'autossh della sessione ogni 5 minuti o nel momento in cui cada la sessione stessa verso il Bastion.

Di seguito l'output che mi sono generato:





martedì 5 maggio 2026

[AI] - Come installare Lmstudio

Di seguito come installare sul proprio Pc una AI da utilizzare in locale senza accedere al web.

Come prima cosa occorre utilizzare un software che permetta di scaricare e far girare modelli linguistici denominati LLM direttamente sul proprio PC, senza bisogno di Internet.

Il software di cui parliamo si chiama lmstudio.

 A cosa serve

  1. Chat locale: 
    • Puoi chattare con modelli come Llama o Mistral offline, senza mandare dati a server esterni.
  2. Sviluppo: 
    • Se sei un dev, puoi usare l'API di LM Studio per integrare LLM in app locali (tipo VSCode, Discord, ecc.).
  3. Testare modelli: 
    • Scarichi modelli da Hugging Face e li provi in locale. Vedi quanto sono veloci, quanto consumano RAM/GPU...

Punti forti

  • Facile: Interfaccia grafica, non serve usare il terminale.
  • Privacy: Tutto offline. Perfetto per dati sensibili.
  • Compatibile: Gira su Windows, Mac, Linux.
  • Modelli: Supporta GGUF (formato più usato per LLM locali).

Esempi pratici

  1. Sviluppo: 
    • "Aiutami a scrivere codice Python per analizzare un CSV"
  2. Traduzioni: 
    • "Traduci 'C'è un gatto sul tavolo' in 5 lingue"
  3. Scuola: 
    • "Crea 10 domande di grammatica per un bambino di 8 anni"

Come funziona

  1. Scarichi LM Studio
  2. Cerchi un modello (es. Llama-3.1-8B)
  3. Lo scarichi 
  4. Lo carichi e chatti/offline

È come avere un ChatGPT locale ma con modelli che puoi scegliere tu e se il PC è potente, gira veloce. Vediamo come installarlo su Windows, per altri sistemi opeartivi magari chiediamo alla nostra AI in locale.

Come installarlo su Windows:

  • Vai su lmstudio.ai → Download → Windows
  • Scarica l’Installer .exe 
  • Doppio click → Avanti → Avanti → Fine. Zero sbatti.
Supporta Windows 10 e Windows 11, sia x64 che ARM.

Requisiti WindowsRAM: 

  • Minimo 16Gb consigliati per modelli 7B-8B Q4. Con 8Gb parte ma swappa e diventa lento.
  • GPU Nvidia: 
    • Se hai una RTX/GTX con 6GB+ VRAM, abilita “GPU Offload” e vola. 40-70 token/s su un 7B.
  • GPU AMD/Intel: 
    • Supportate via Vulkan. Prestazioni buone ma Nvidia resta più veloce.
  • Solo CPU: 
    • Funziona su qualsiasi PC recente. Ryzen/i7 fa 4-10 token/s con un 7B Q4.
Check GPU: LM Studio → Settings → ti dice subito se vede la GPU e quanta VRAM puoi usare.

Trucchi per Windows:

  • Windows Defender: 
    • Al primo avvio può rallentare perché scansiona i modelli. 
    • Aggiungi la cartella %USERPROFILE%\.cache\lm-studio alle esclusioni.
  • Percorso modelli: 
    • Li salva in C:\Users\TuoNome\.cache\lm-studio\models. 
    • Se hai SSD piccolo su C:, sposta la cartella e crea un link simbolico.
  • Server mode: 
    • Puoi far girare LM Studio in background e usarlo con VSCode + estensione “Continue” per avere Copilot locale.
Nel momento in cui lo fate partire potete scaricare fino a 2 modelli, vi appare una schermata in cui scegliere e l'indicazione anche in base alla RAM in Vs possesso.

Se trovi l'indicazione in LM Studio
  • "Likely too large"  
    • significa che il modello che hai scelto è troppo grande per la tua RAM/GPU.
  •  
    • significa che il modello può essere parzialmente caricato sulla memoria della scheda grafica (GPU) del tuo computer.
  •  
    • significa che il modello può essere completamente caricato sulla memoria della scheda grafica (GPU) del tuo computer.
Cosa vuol dire

  • RAM piena: 
    • Il modello + il sistema operativo + le app aperte stanno saturando la RAM. 
    • Serve spazio per funzionare.
  • GPU VRAM insufficiente: 
    • Se hai attivato “Use GPU”, la scheda video non ha abbastanza memoria per caricare il modello.
Cosa fare

  • Scegliere un modello più piccolo tra quelli indicati.

Trucchi per il buon funzionamento di qualsiasi AI.
  • Scrivi "in italiano facile"
    • inizialmente scrivi come se parlassi ad un bambino con parole semplici e non ambigue
  • Specifica sempre il livello
    • specifica sempre qual e' il tuo target
  • Se ti occorre un output
    • chiedi sempre se sia possibile averlo e magari in quali formati
  • Armarsi di santa pazienza... almeno all'inizio e verificare sempre mai dare per certo quello che viene risposto.
  • Alcuni modelli di Ai rispondo meglio a comandi secchi, semplici e concisi.




[CASA] - Come calcolare quanta pittura occorre per ridipingere casa.

Visto che ultimamente devo fare alcuni lavoretti a casa, di seguito pubblico una piccola tabellina per il calcolo dei litri di pittura necessari per ridipingere casa.

Supponendo di avere 2 appartamenti per un totale di 110 mq, calcoliamo quanti litri di pittura sono necessari per muri e soffitto.

Regola base

  • 1 litro di pittura copre ∼10-12 m² con una mano su muro liscio già bianco.
Calcolo per 110 m² calpestabili

Gli appartamenti si misurano in m² calpestabili, ma si pitturano i muri. 

Stima: 
  • m² pareti = m² calpestabili x 3.110 m² x 3 = 330 m² di pareti + soffitti
Domanda: 
  • Quanti litri servono

Fattori che cambiano tutto

  • Soffitti sì/no: 
    • Se non fai i soffitti 
      • togli ∼25% → 110 m² x 2.2 = 242 m² pareti.
  • Stato muri: 
    • Se sono grezzi/ruvidi consumi 20% in più. 
    • Se sono già bianchi lisci consumi meno.
  • Colore: 
    • Bianco su bianco = 1-2 mani. 
    • Colore scuro su chiaro o viceversa = 3 mani + fissativo.
  • Qualità pittura: 
    • Quelle da 15€/latta coprono 8 m²/L circa. 
    • Quelle da 50€/latta coprono 14 m²/L circa.
Stima veloce realistica:
  •  Per 110 m²
    • Caso tipico: 
      • Appartamento normale, muri + soffitti, da rinfrescare di bianco con 2 mani.
        • 330 m² / 11 m²/L x 2 mani = 60 litri.  
Consiglio: 
  • Compra sempre 10% in più. 
    • Se avanza la usi per ritocchi. 
    • Se ti manca 1 litro a fine lavoro bestemmi come un Turco in Cecoslovacco 😁😂 

giovedì 26 marzo 2026

[ROULETTE EUROPEA] - Parte 3 - Metodi di Giocata

 Di seguito giocate entro le 10 fiches totali. 

Premessa importante: 

  • non si puo' migliorare il valore atteso (che resta -2,70% del totale puntato su roulette europea), ma si puo' cambiare profilo di rischio/ritorno (probabilità di chiudere in utile vs ampiezza delle vincite).
Supponiamo per semplicita' che ogni fiche abbia valore 1
  • GIOCATA 1
Massimizzare la probabilità di chiudere in profitto.
Idea: puntata principale su una chance semplice + piccolo “paracadute” sullo 0.
Schema puntate (10€):
    • 9€ Rosso (o Nero)
    • 1€ Pieno sullo 0

Sintesi Giocata 1
• P(profitto) = (18+1)/37 = 51,35%
• P(perdita) = 18/37 = 48,65%
• Max vincita netta = +26€ (se esce 0)
• Peggior Perdita = -10€
• Perdita media attesa = 10€ × 2,70% = -0,27€ a giro



  • GIOCATA 2
Massimizzare la vincita massima possibile
Idea: concentrare tutto su un pieno (massimo payout).
Schema puntate (10€):
• 10€ su 1 numero pieno (a tua scelta)

Sintesi
• P(profitto) = 2,70%
• P(perdita) = 97,30%
• Max vincita netta = +350€
• Peggior Perdita = -10€
• Perdita media attesa = -0,27€ a giro



  • GIOCATA 3
Se la priorità è ridurre al minimo la perdita massima per singolo colpo, con budget 10€ puoi impostare una giocata che non ti fa mai perdere 10€ e ti limita la perdita peggiore a -1€ (su tutti i numeri 1–36).
Strategia “perdita massima minima” (10€)
Puntate (totale 10€):
• 3€ su 1ª dozzina (1–12)
• 3€ su 2ª dozzina (13–24)
• 3€ su 3ª dozzina (25–36)
• 1€ su 0 (pieno)

Sintesi 
• Perdita massima per colpo                     = -1€ (su qualsiasi numero 1–36)
• Probabilità di perdere solo 1€                = 36/37 = 97,30%
• Probabilità di grande profitto (+26€)      = 1/37 = 2,70% (quando esce 0)
• Valore atteso                                            = sempre -2,70% del totale → -0,27€ a giro



  • GIOCATA 4
Strategia 4 (10€) con pieno su un numero esempio 26
Puntate (totale 10€):
• 4€ 1ª dozzina (1–12)
• 4€ 2ª dozzina (13–24)
• 1€ pieno 0
• 1€ pieno 26

Sintesi
• Numeri in profitto         = 26 su 37 → 70,27%
• Numeri in Perdita                 = 11 su 37 → 29,73%
• Numeri coperti (con vincita) = 1–24 + {0,26} = 26 numeri
• Numeri “buco” (perdita piena -10€) = 25, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36
Perdita media attesa (EV)         = 10€ × 2,70% = 0,27€ a giro



  • GIOCATA 4-1
Variante Giocata 4 (riduce il buco da -10€ a -6€, mantiene alta P(profitto))
Puntate (10€):
• 4€ su 1ª dozzina (1–12)
• 4€ su 2ª dozzina (13–24)
• 1€ su 3ª dozzina (25–36)
• 1€ su 0 pieno

Indicatori chiave:
• P(profitto) = (12+12+1)/37 = 67,57%
• Peggior Perdita = -7€ (su 25–36)
EV         = sempre -0,27€ a giro (10×2,7%)



  • GIOCATA 4-2
Strategia 4-2 (10€) con pieno 26
Puntate (totale 10€):
• 4€ 1ª dozzina (1–12)
• 4€ 2ª dozzina (13–24)
• 1€ pieno 0
• 1€ pieno 26

Sintesi
• Numeri in profitto         = 26 su 37 → 70,27%
• Numeri in Perdita                 = 11 su 37 → 29,73%
• Numeri coperti (con vincita) = 1–24 + {0,26} = 26 numeri
• Numeri “buco” (perdita piena -10€) = 25, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36
• Perdita media attesa (EV)         = 10€ × 2,70% = 0,27€ a giro



  • Giocata 4-3
Variante (ancora meno perdita sulla 3ª dozzina: “buco” massimo -4€, ma P(profitto scende un po’))
Puntate (10€):
• 4€ su 1ª dozzina
• 3€ su 2ª dozzina
• 2€ su 3ª dozzina
• 1€ su 0 pieno

Indicatori chiave 
• P(profitto) = (12+1)/37 = 35,14%
• Peggior Perdita = -4€
EV         = sempre -0,27€ a giro





[ROULETTE EUROPEA] - Parte 2

 Di seguito un confronto effettuato sulle tre possibili giocate che avevo indicato nella parte 1.

Facciamo una simulazione che ci mostra cosa accade se variamo lo stake su tutte e tre le strategie. Nei paragrafi successivi si possono vedere la vincita massima, la perdita massima e valore atteso che scalano tutti esattamente di xstake - I rapporti come si vede non cambiano mai.

La conclusione matematica e' definitiva e molto indicativa: Non esiste uno stake che migliora i rapporti. L'unico effetto dello stake e' amplificare le cifre in gioco in entrambe le direzioni. Con 5 Euro per puntata si guadagna di piu' quando si vince... ma perdi di piu' quando perdi 😊esattamente nella stessa proporzione. L'unico modo reale per migliorare la distribuzione degli esiti (piu' numeri in profitto, meno perdite secche) rimane quello che abbiamo gia' visto: cambiare la struttura delle puntate come nelle varianti A e B.


Se passiamo alla Variante A avremo:


Se passiamo alla Variante B:


E' possibile avere un mix delle tre che diminuisca il vataggio della casa ed aumenti le probabilita' di chi gioca di vincere. Qual e' la migliore combinazione per ottenere il max dei risultati col minimo numero di fiches ed avere un vantaggio come giocatore migliore della casa.

Risposta onesta e diretta, senza giri di parole: No. È matematicamente impossibile.

Su roulette europea, qualsiasi combinazione di puntate — mix, sistema, progressione, o qualsiasi altra strategia — produce sempre e inevitabilmente un valore atteso di −2.70% sulla posta totale giocata. 

Non esiste eccezione. Mai.

Ecco perché:





La struttura del problema è questa: 

  • Il casinò ha costruito il gioco in modo che lo zero crei esattamente quel margine del 2.70%. Non è una questione di strategia — ci sono 37 numeri ma i payout sono calibrati su 36. Quel numero mancante è il guadagno della casa, e non si può recuperare con nessuna combinazione di puntate.
  • L'unico gioco da casinò dove un giocatore esperto può matematicamente avere vantaggio sulla casa è il 
    • blackjack con card counting — e anche lì i casinò lo contrastano attivamente.

Per la roulette, l'ottimizzazione vera è solo sulla esperienza di gioco: 

  • decidere se preferisci vincere piccole cifre spesso (alta copertura, Variante A) 

oppure 

  • rischiare di perdere più frequentemente ma con la chance di una vincita più alta (strategia originale o Variante B). 


Il saldo finale a lungo andare sarà sempre lo stesso.





[ROULETTE EUROPEA] - Parte 1

 Una cosa che mi ha sempre appassionato, dai tempi dell'universita', era la possibilta' di giocare alla roulette e vincere... il sogno di molti.

Devo dire che con alcuni amici avevamo trovato dei metodi, tipo il D'alambert che pero' avevamo ottimizzato e con questo metodo anche se poco avevamo sempre vinto... nei vari casino' (Campione D'Italia, Sharm, Barcellona e per finire anche su Costa Crociera). 

Oggi pero' voglio illustrarvi tre metodi o meglio uno con due varianti A e B ed analizzare con voi le possibilita' di vincita.

Di seguito la strategia di base, massimo costo 9 fiches diciamo un 1 euro a fiche.

  • STRATEGIA INIZIALE - grizz


Di conseguenza per questa strategia avremo quanto segue:






Adesso vediamo le varianti che si possono giocare:



  • VARIANTE A



  • VARIANTE B






Nel prossimo articolo faremo una simulazione dei 3 metodi e cosa succede variando lo stake su tutte e tre le strategie.














giovedì 19 febbraio 2026

ODI - Procedura per gestione Errori

 Di seguito una semplice procedura da inserire in ODI per gestire l'uscita da un package con errore.

DECLARE

v_sess_no NUMBER := <%=odiRef.getSession( "SESS_NO" )%>;v_error_msg VARCHAR2(4000);v_error_code NUMBER;BEGIN

v_error_msg:='Errore nel package CLOUDERA_TO_APEX_PI: ODI_SESSION_ID='||v_sess_no;RAISE_APPLICATION_ERROR(-20001, v_error_msg);

EXCEPTION WHEN NO_DATA_FOUND THEN    v_error_msg:='Errore nel package CLOUDERA_TO_APEX_PI: ODI_SESSION_ID='||v_sess_no;    RAISE_APPLICATION_ERROR(-20001, v_error_msg);WHEN OTHERS THEN    v_error_msg:='Errore nel package CLOUDERA_TO_APEX_PI: ODI_SESSION_ID='||v_sess_no;    RAISE_APPLICATION_ERROR(-20001, v_error_msg);END;

La proceduta deve essere inserita o in un package o LoadPlan per l'uscita dal processo in caso di un errore. Per farla funzionare basta collegare i KO in uscita da Mapping o altro alla procedura OD che contiene quanto indicato sopra.
  1. L'istruzione <%=odiRef.getSession( "SESS_NO" )%> restituisce ID di esecuzione del mapping o altro oggetto collegato in KO alla procedura.
Nel caso in cui si voglia parametrizzarla basta verificare le api di ODI o meglio le odiRef per ottenere eventualmente altre informazioni. 


Di seguito alcune versioni scritte in linguaggi differenti dal pl-sql

1. Se sei in un ODI Procedure con Tecnologia "Jython"

import java.sql.SQLException
import oracle.odi.core.persistence.transaction.support.DefaultTransactionDefinition

sess_no = odiRef.getSession("SESS_NO")
error_msg = "Errore nel package CLOUDERA_TO_APEX_PI: ODI_SESSION_ID=" + str(sess_no)

try:
    # Qui metti la logica che può fallire
    # Esempio: raise Exception("Test errore")
    pass
    
except Exception, e:
    # Logga l'errore
    odiRef.log("ERROR", error_msg + " | Dettaglio: " + str(e))
    # Rilancia l'errore a ODI per far fallire lo step
    raise Exception(error_msg)

2. Se sei in un ODI Procedure con Tecnologia "Java BeanShell"

import oracle.odi.runtime.agent.RuntimeAgent;
import oracle.odi.core.persistence.transaction.support.DefaultTransactionDefinition;

String sessNo = "<%=odiRef.getSession("SESS_NO")%>";
String errorMsg = "Errore nel package CLOUDERA_TO_APEX_PI: ODI_SESSION_ID=" + sessNo;

try {
    // Qui metti la logica che può fallire
    // Esempio: throw new Exception("Test errore");
    
} catch (Exception e) {
    // Log su ODI
    odiRef.log("ERROR", errorMsg + " | Dettaglio: " + e.getMessage());
    // Rilancia per far fallire il task ODI
    throw new RuntimeException(errorMsg, e);
}

3. Se vuoi replicare esattamente la RAISE_APPLICATION_ERROR PL/SQL da Java via JDBC.Usalo in un Java step che apre connessione al DB Oracle:

import java.sql.*;
import oracle.jdbc.OracleConnection;

String sessNo = "<%=odiRef.getSession("SESS_NO")%>";
String errorMsg = "Errore nel package CLOUDERA_TO_APEX_PI: ODI_SESSION_ID=" + sessNo;

Connection conn = null;
CallableStatement cs = null;

try {
    // Prendi la connessione da ODI
    conn = odiRef.getJDBCConnection("SRC"); // o "WORKREP" / "TGT" in base al logical schema
    
    // Chiama direttamente RAISE_APPLICATION_ERROR
    String sql = "BEGIN RAISE_APPLICATION_ERROR(-20001, ?); END;";
    cs = conn.prepareCall(sql);
    cs.setString(1, errorMsg);
    cs.execute();
    
} catch (SQLException e) {
    odiRef.log("ERROR", "SQLCODE: " + e.getErrorCode() + " - " + errorMsg);
    throw new RuntimeException(errorMsg, e);
} finally {
    if (cs != null) cs.close();
    if (conn != null) conn.close();
}

----
Note chiave:
Per ODI:odiRef.getSession("SESS_NO") funziona solo dentro step ODI. 
Fuori devi passarlo come parametro.
Per far fallire lo step: devi fare throw new Exception() o throw new RuntimeException(). 
ODI intercetta l'eccezione e marca lo step in errore.
  • odiRef.log("ERROR", msg) 
    • scrive nel log ODI, così vedi il tuo messaggio custom nell’Operator.Codice -20001: 
    • Se lanci RuntimeException, ODI lo marca come errore generico. 
    • Se vuoi il codice -20001 nel log devi usare la versione 3 con RAISE_APPLICATION_ERROR via JDBC.

martedì 20 gennaio 2026