Archivi autore: Valerio Guaglianone

Integrare OpenAI (API) in un’applicazione Ruby

Integrare l’intelligenza artificiale in un’applicazione Ruby è oggi più semplice che mai grazie alle API di OpenAI. Con poche righe di codice è possibile aggiungere funzionalità come:

  • generazione di testo
  • assistenti conversazionali
  • generazione di immagini
  • trascrizione audio
  • moderazione dei contenuti

In questo articolo vedremo come integrare le API OpenAI in un’app Ruby, utilizzando la SDK ufficiale Ruby e le API più recenti.

Installazione della SDK OpenAI

Per iniziare è necessario installare la gem ufficiale OpenAI.

Nel file Gemfile:

gem "openai"

Poi installare le dipendenze:

bundle install

Configurare la API Key

Per autenticare le richieste è necessario impostare la variabile d’ambiente con la chiave API.

export OPENAI_API_KEY="your_api_key_here"

Nel codice Ruby possiamo inizializzare il client in questo modo:

require "openai"

client = OpenAI::Client.new(
  api_key: ENV["OPENAI_API_KEY"]
)

Ora l’applicazione è pronta per effettuare richieste all’API.

Generare testo con la Responses API

Il modo più moderno per interagire con i modelli OpenAI è la Responses API, che unifica le funzionalità di chat, completamento e tool usage.

Esempio:

response = client.responses.create(
  model: "gpt-4.1-mini",
  input: "Scrivi un breve riassunto su Ruby on Rails."
)

puts response.output_text

Il parametro model specifica quale modello utilizzare. Alcuni modelli comuni sono:

  • gpt-4.1
  • gpt-4.1-mini
  • gpt-4o
  • gpt-4o-mini

Questi modelli sono progettati per generare testo naturale, rispondere a domande e assistere nello sviluppo software.

Ruby 4.0: ecco tutte le novità principali

Il 25 dicembre del 2025 è stata rilasciata Ruby 4.0, una versione particolarmente significativa perché coincide con il 30° anniversario della prima release pubblica del linguaggio.

Questa nuova versione introduce miglioramenti importanti in termini di performance, parallelismo e strumenti per sviluppatori, mantenendo allo stesso tempo una buona compatibilità con le versioni precedenti.

Vediamo nel dettaglio le novità più rilevanti.

ZJIT: un nuovo compilatore Just-In-Time

Una delle novità più interessanti di Ruby 4.0 è ZJIT, un nuovo compilatore Just-In-Time sviluppato dallo stesso team che ha creato YJIT.

A differenza di YJIT, che utilizza una tecnica di compilazione basata su lazy basic block versioning, ZJIT segue un’architettura più tradizionale, pensata per essere:

  • più semplice da comprendere
  • più facile da mantenere
  • più accessibile ai contributi della community

Per attivarlo è possibile utilizzare il flag:

ruby --zjit my_script.rb

Attualmente ZJIT offre prestazioni migliori rispetto all’esecuzione interpretata, ma YJIT rimane la soluzione consigliata per ambienti di produzione. L’obiettivo di ZJIT è soprattutto creare una base solida per miglioramenti futuri del compilatore Ruby.

Ruby::Box: namespace isolati

Ruby 4.0 introduce anche Ruby::Box, una funzionalità sperimentale che permette di creare namespace isolati all’interno dello stesso processo Ruby.

Questo rende possibile caricare più versioni della stessa libreria contemporaneamente, riducendo i conflitti tra dipendenze.

La feature può essere abilitata tramite variabile d’ambiente:

RUBY_BOX=1

Esempio di utilizzo:

box1 = Ruby::Box.new
box1.require("some_gem", version: "1.0")

box2 = Ruby::Box.new
box2.require("some_gem", version: "2.0")

Tra i principali casi d’uso troviamo:

  • test di aggiornamenti di librerie
  • esecuzione di codice legacy insieme a dipendenze moderne
  • isolamento di codice di terze parti

Essendo una funzionalità sperimentale, l’API potrebbe evolversi nelle versioni future.

Nuova API per i Ractor

I Ractor, introdotti nelle versioni precedenti di Ruby per gestire il parallelismo reale, hanno ricevuto un importante aggiornamento.

Ruby 4.0 introduce Ractor::Port, un nuovo meccanismo per gestire la comunicazione tra ractor.

port = Ractor::Port.new

r = Ractor.new(port) do |p|
  p.send("Hello from Ractor!")
end

message = port.receive
puts message

Con questa modifica sono stati rimossi i metodi:

  • Ractor.yield
  • Ractor#take

Il nuovo modello si ispira alla comunicazione tra processi (IPC), rendendo l’API più coerente con i paradigmi di programmazione concorrente.

Miglioramenti alla sintassi del linguaggio

Ruby 4.0 introduce anche piccoli miglioramenti alla sintassi che possono migliorare la leggibilità del codice.

Ora è possibile iniziare una nuova riga con operatori logici come &&, ||, and e or.

result = condition_one
  && condition_two
  && condition_three

Questa possibilità rende più leggibili espressioni condizionali lunghe o complesse.

Come impedire che il MacBook si accenda automaticamente (macOS Sequoia e successivi)

Sui portatili Mac con chip Apple, il sistema si accende automaticamente quando apri il coperchio oppure colleghi l’alimentatore (lo trovo noioso e tremendo). Se preferite controllare manualmente l’avvio, da macOS Sequoia 15 in poi puoi disattivare questo comportamento tramite il Terminale.

Requisiti:

  • Mac con chip Apple (M1, M2, M3…)

  • macOS Sequoia 15 (o versione successiva)

Procedura:

  1. Apri Terminale (lo trovi in Applicazioni > Utility).

  2. Inserisci uno dei seguenti comandi:

  • Blocca l’avvio automatico in entrambi i casi (coperchio o alimentazione):
    sudo nvram BootPreference=%00

  • Blocca l’avvio solo all’apertura del coperchio:
    sudo nvram BootPreference=%01

  • Blocca l’avvio solo al collegamento dell’alimentatore:
    sudo nvram BootPreference=%02

  1. Inserisci la password di amministratore se richiesto (non verrà visualizzata).

Per ripristinare il comportamento predefinito:

sudo nvram -d BootPreference

Formattare le stringhe con f-string (Python 3.6+)

Questo è una novità rispetto al vecchio Python 3.6.x e, a mio parere, è il modo migliore per formattare una stringa. Non ci resta che scrivere una f prima della nostra stringa, e poi all’interno della stringa possiamo usare le parentesi graffe {} e le variabili di accesso.

Questo è molto più semplice e conciso rispetto alle vecchie regole di formattazione, ed è anche più veloce. Inoltre, possiamo scrivere espressioni nelle parentesi graffe che vengono valutate in fase di esecuzione.

Quindi qui per esempio vogliamo stampare il numero al quadrato della nostra variabile i, e possiamo semplicemente scrivere questa operazione nella nostra f-String.

Ecco i due esempi:

>>> nome = “Valerio”
>>> stringa = f”Ciao {nome}”
>>> print(stringa)
Ciao Valerio
>>> i = 10
>>> print(f”{i} quadrato è {i*i}”)
10 quadrato è 100

Wazuh l’open-source security platform per tutti

Wazuh è una piattaforma di sicurezza open source che mira ad aiutare le organizzazioni a monitorare e gestire gli incidenti di sicurezza, rilevare le minacce e garantire la conformità alle normative di sicurezza. Fornisce funzionalità per il rilevamento delle intrusioni, l’analisi dei log, il rilevamento delle vulnerabilità e l’intelligence sulle minacce. Originariamente derivato dal progetto OSSEC, Wazuh si è evoluto in una soluzione di sicurezza completa con funzionalità e miglioramenti aggiuntivi.

Funzionalità di Wazuh
Wazuh offre diverse funzionalità essenziali che lo rendono una piattaforma di sicurezza completa per le organizzazioni. Vediamole rapidamente di seguito.

Rilevamento e prevenzione delle intrusioni (IDS/IPS):

Wazuh fornisce analisi in tempo reale di eventi e avvisi di sicurezza, consentendo alle organizzazioni di rilevare e rispondere ad attività sospette, tentativi di accesso non autorizzati, infezioni da malware e altre potenziali minacce alla sicurezza.

Analisi e monitoraggio dei log:

Wazuh raccoglie e analizza i log da varie fonti, inclusi log di sistema, log delle applicazioni, log di rete e log degli eventi di sicurezza. Fornisce gestione centralizzata dei log, correlazione e normalizzazione per aiutare a identificare incidenti di sicurezza e problemi operativi.

File Integrity Monitoring (FIM):

Wazuh monitora i file di sistema critici, le directory e le configurazioni per modifiche, alterazioni o manomissioni non autorizzate. Ciò aiuta le organizzazioni a rilevare potenziali violazioni della sicurezza, minacce interne o modifiche di sistema non autorizzate.

Rilevamento delle vulnerabilità:

Wazuh può eseguire valutazioni delle vulnerabilità e scansioni sugli host monitorati per identificare vulnerabilità della sicurezza, configurazioni errate e debolezze che potrebbero essere sfruttate dagli aggressori. Si integra con i database e i feed delle vulnerabilità per fornire informazioni aggiornate sulle vulnerabilità note.

Auditing della conformità alla sicurezza:

Wazuh aiuta le organizzazioni a garantire la conformità alle normative, agli standard e alle best practice del settore fornendo modelli di conformità predefiniti, policy e set di regole. Può generare report, avvisi e notifiche per informare le parti interessate sulle violazioni della conformità e sulla postura di sicurezza.

Come elencare tutti i nomi dei container Docker e i relativi IP

A volte orientarsi nella selva di IP presente, durante l’utilizzo di Docker, diventa davvero difficile. Il comando seguente creerà un comodo elenco con tutti i nomi dei contenitori Docker e i rispettivi IP. Per i contenitori che hanno più di un IP, il comando li stamperà sulla stessa riga del loro nome.

docker ps -q | xargs -n 1 docker inspect --format '{{ .Name }} {{range .NetworkSettings.Networks}} {{.IPAddress}}{{end}}' | sed 's#^/##';

Installare moduli Python, su Windows, senza i diritti di amministratore

Capita spesso di (dover) lavorare su macchine Windows, su cui non si disporre dei diritti di amministratore e di dover installare moduli/dipendenze Python per poter proseguire il proprio lavoro; ma se proviamo ad avviare il buon pip il risultato che otteniamo è un messaggio poco amichevole:

Non vogliamo disturbare chi gestisce “la giostra” e quindi dobbiamo risolverla in maniera indolore e rapida

come vedete, nella figura sopra, dalla lista manca il modulo anaconda; a noi serve e dunque ci basterà installarlo con il comando:

  • python -m pip install anaconda

ed eccolo apparire magicamente:

happy py-coding!

 

Creare automaticamente il file requirements.txt

Spesso si scarica del codice sorgente Python da github, oppure da altre sorgenti simili, e non si conosce come installare velocemente tutte le dipendenze necessarie per la sua esecuzione se non è presente un file requirements.txt creato dallo sviluppatore. Di norma lo si deve creare manualmente.

La domanda dunque è:
Data la directory del codice sorgente Python, lo sviluppatore,  può creare automaticamente il file requirements.txt per indicare i moduli usati/presenti nella sezione import di uno script?

ebbene si, il comando seguente crea il file requirements.txt che successivamente potrà essere usato, da altri utenti, per installare i moduli necessari all’esecuzione del codice Python.

  • pip3 freeze > requirements.txt # in Python3
  • pip freeze > requirements.txt # in Python2

ecco il risultato:

Una volta creato il file basterà includerlo nel repository del codice, in maniera tale che gli utilizzatori dello script potranno importare/installare tutte le dipendenze necessarie per lavorare velocemente.

Android oppure iOS?

Il dibattito iOS versus Android è in corso da quando le due piattaforme sono state create, oltre un decennio fa. Premessa: non odio Android, ho uno smartphone Android-based; credo davvero che entrambe le piattaforme abbiano i loro punti di forza e di debolezza. La decisione su quale sia la scelta migliore per ognuno di noi è una decisione effettivamente personale. Le esigenze di tutti gli utenti, che usano degli smartphone, sono diverse; per cui ci si orienta in modo diverso secondo necessità. Appare evidente quindi che nessuno può dire che una piattaforma sia oggettivamente, ed esclusivamente, migliore dell’altra ma penso sia giusto sottolineare i punti di forza specifici che iOS offre rispetto ad Android.

Is-Android-Really-Better-Than-iOS

Bene, quindi iniziamo con quello che penso sia il motivo numero uno per cui le persone scelgono iOS/Apple rispetto Android. Sicuramente è l’esperienza d’uso che offre all’utente medio. Apple è eccezionale nel realizzare prodotti altamente tecnologici per persone non orientate alla tecnologia. E penso che il team di sviluppo di iOS faccia un lavoro fantastico nel mantenere le cose abbastanza semplici, tanto da consentire alle persone comuni di prendere un iPhone (o un iPad) senza essere intimiditi da un’interfaccia grafica eccessivamente complicata; piaga che affligge molti dispositivi Android.

Posso già sentire i fanatici di Android dire quanto stupidi dobbiamo essere tutti noi, utenti iPhone (Apple in generale), se non riusciamo a capire come funzioni Android. Si deve capire che non è una questione di essere stupidi oppure meno intelligenti degli altri.
Dipende dal fatto che alla gente piace usare prodotti convenienti dal punto di vista dell’usabilità. E se riescono a capire come iOS funziona, molto più velocemente di un dispositivo Android, potete scommetterci che vedranno quel prodotto come il più adeguato per loro e il meno frustrante da usare (anche se più caro). Inoltre, quasi tutti i produttori di smartphone possono applicare la propria skin personalizzata ad Android. Ciò significa che la sua interfaccia appare diversa a seconda dell’hardware su cui è in esecuzione o a seconda del vendor. Questa disomogeneità grafica, per la maggior parte delle persone, rende l’intero ecosistema ancora più contorto e confuso e non permette un’immediata familiarità d’uso. Una molteplicità di skin di Android, a volte molto diverse tra loro, diventano un incubo per le persone comuni che vogliono semplicemente usare qualcosa che funzioni facilmente (e sempre) in modo coerente

ONTAP 8.x e 9.x – Come leggere i log files via Clustershell

Nei sistemi ONTAP 8.x e ONTAP 9.x esistono più file di log. Se si intende esaminare i log di ONTAP il miglior posto in cui cercare è il registro EMS. L’Event Management System(o EMS) raccoglie, in pratica, tutti gli eventi notificati dal sistema operativo ONTAP (https://en.wikipedia.org/wiki/ONTAP).

L’EMS fornisce, inoltre, anche un meccanismo di filtraggio per una facile revisione. Gli eventi EMS possono essere visualizzati direttamente dalla clustershell; di seguito qualche comando utile:

  • event log show

Il comando presentato sopra mostra l’elenco degli ultimi eventi, possiamo anche scegliere di visualizzare gli eventi indicando un range temporale espresso in minuti, come ad esempio tutti gli eventi degli ultimi 15 minuti:

  • event log show -time >15m

Oppure, per essere ancora più precisi nella ricerca, possiamo indicare un periodo temporale ben preciso con:

  • event log show -time “2/1/2018 13:00:00″..”2/1/2018 14:00:00″

da notare che l’output parte dal valore indicato nella parte destra, cioè mostra gli eventi a partire dalle 14:00:00 in ordine decrescente.

Se, ad esempio, desiderassimo vedere solo tutti gli errori basterà invece indicare esplicitamente la severity corrispondente come segue:

  • event log show -severity ERROR

Le voci di severity utilizzabili, per questo livello di filtraggio, sono le seguenti:

  1.       emergency
  2.       alter
  3.       critical
  4.       error
  5.       warning
  6.       notice
  7.       informational
  8.       debug