Archivi autore: Valerio Guaglianone

Quando usare Claude Code?

In pratica la vera domanda qui è: dove Claude Code genera il maggior ritorno? Ecco una breve lista da considerare:

1. Risolvere problemi che consumerebbero giorni
Le regressioni difficili da riprodurre sono tra i problemi più costosi nello sviluppo software. Il classico test che fallisce in CI ma risulta sempre verde in locale può trasformarsi in una lunga caccia al colpevole.

In questi casi Claude Code può affiancarti nell’indagine: analizza log, segue i flussi di esecuzione, formula ipotesi e verifica rapidamente le possibili cause. Tu mantieni il controllo delle decisioni, ma il lavoro di esplorazione e verifica viene accelerato in modo significativo.

Spesso ciò che richiederebbe ore di analisi manuale emerge nel giro di pochi cicli di investigazione guidata.

2. Comprendere rapidamente codice scritto da altri
Entrare in un repository sconosciuto è una delle attività meno produttive e più frequenti nella vita di uno sviluppatore.

Che si tratti di un progetto ereditato, di un nuovo cliente o di un’applicazione interna poco documentata, ricostruire l’architettura richiede normalmente molto tempo.

Claude Code può sintetizzare la struttura del progetto, individuare gli entry point, spiegare i flussi applicativi principali, descrivere il sistema di autenticazione e mostrare come interagiscono i vari componenti.

In poche ore è possibile costruire una comprensione generale che altrimenti richiederebbe giorni di studio.

3. Rendere sicuri i refactoring più delicati
Molti team convivono con moduli legacy che funzionano ma che nessuno vuole modificare per paura di introdurre regressioni.

Un approccio efficace consiste nel partire dall’analisi della copertura esistente, identificare i casi mancanti e rafforzare la suite di test prima di intervenire sul codice.

Claude Code può assistere in entrambe le fasi: suggerisce nuovi scenari da verificare e supporta il refactoring mantenendo un feedback continuo tramite l’esecuzione dei test.

In questo modo anche interventi complessi diventano una sequenza di cambiamenti controllati e verificabili.

Claude Fable 5, Opus 4.8 oppure Sonnet 4.6: quale modello scegliere?

Negli ultimi mesi l’offerta di modelli AI è diventata sempre più ampia e sofisticata. Tra le soluzioni più interessanti troviamo Claude Fable 5 (non appena lo renderanno nuovamente disponibile), Claude Opus 4.8 e Claude Sonnet 4.6, tre modelli che si rivolgono a esigenze differenti ma che spesso vengono confrontati tra loro.

La domanda che molti professionisti si pongono è semplice: qual è il modello migliore?

La risposta, come spesso accade nel mondo dell’intelligenza artificiale, è che non esiste un vincitore assoluto. La scelta dipende dal tipo di attività da svolgere, dal budget disponibile e dal livello di complessità dei progetti.

Claude Fable 5: il massimo delle prestazioni su strada

Claude Fable 5 rappresenta il modello più avanzato della famiglia Claude. È stato progettato per affrontare attività complesse, mantenere il contesto per lunghi periodi e gestire workflow articolati che richiedono ragionamento approfondito.

Tra i suoi punti di forza troviamo:

* Eccellente gestione di contesti molto lunghi
* Capacità avanzata di ragionamento
* Ottime prestazioni nella programmazione software
* Elevata precisione nell’analisi di documenti complessi
* Maggiore affidabilità nei processi multi-step

Fable 5 è particolarmente indicato per grandi progetti di sviluppo software, ricerca avanzata, consulenza strategica e automazioni aziendali complesse. Il principale svantaggio è rappresentato dal costo, generalmente più elevato rispetto agli altri modelli, oltre a tempi di elaborazione leggermente superiori.

Aggiungere “Apri in Visual Studio Code” al menu contestuale di Windows

Come aggiungere “Apri in Visual Studio Code” al menu contestuale di Windows 10/11

Se utilizzi spesso Visual Studio Code, può essere utile aggiungere una voce personalizzata al menu contestuale di Windows per aprire rapidamente la cartella corrente direttamente nell’editor.
Questo risultato può essere ottenuto tramite una semplice modifica del Registro di sistema utilizzando un file .reg.

Ecco il mio ad esempio:
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Directory\Background\shell\VSCode]
@=”Apri in Visual Studio Code”
“Icon”=”C:\\Users\\valerio.guaglianone\\AppData\\Local\\Programs\\Microsoft VS Code\\Code.exe”

[HKEY_CLASSES_ROOT\Directory\Background\shell\VSCode\command]
@=”\”C:\\Users\\valerio.guaglianone\\AppData\\Local\\Programs\\Microsoft VS Code\\Code.exe\” \”%V\”"

Come funziona
La configurazione crea una nuova voce nel menu che appare quando si fa clic con il tasto destro sullo sfondo di una cartella in Esplora file:
Apri in Visual Studio Code
Quando viene selezionata, Windows esegue il comando che avvia VS Code e apre automaticamente la directory corrente.

Le chiavi principali del file .reg
La chiave:
“`reg
[HKEY_CLASSES_ROOT\Directory\Background\shell\VSCode]
“`
registra una nuova voce nel menu contestuale delle cartelle.

Il valore:
“`reg
@=”Apri in Visual Studio Code”
“`
definisce il testo visualizzato all’utente.

L’attributo:
“`reg
“Icon”=”C:\\Users\\nomeutente\\AppData\\Local\\Programs\\Microsoft VS Code\\Code.exe”
“`
associa l’icona ufficiale di Visual Studio Code alla voce del menu.
Infine, la chiave:

“`reg
[HKEY_CLASSES_ROOT\Directory\Background\shell\VSCode\command]
“`
specifica il comando da eseguire:

“`reg
@=”\”C:\\Users\\nomeutente\\AppData\\Local\\Programs\\Microsoft VS Code\\Code.exe\” \”%V\”"
“`
dove `%V` rappresenta il percorso della cartella attualmente aperta.

vcode

Un’alternativa più portabile
Se VS Code è stato aggiunto al PATH di sistema, è possibile utilizzare direttamente il comando `Code.exe` senza dover specificare il percorso completo. In questo modo la configurazione diventa indipendente dall’utente e dalla posizione di installazione del programma.

Come rimuovere la personalizzazione
Nel caso in cui non sia più necessaria, è sufficiente eliminare la chiave del registro associata a `VSCode`, rimuovendo così la voce dal menu contestuale di Windows.

Conclusioni
Con poche righe di configurazione è possibile integrare Visual Studio Code direttamente nell’esperienza di navigazione di Windows, riducendo il numero di passaggi necessari per aprire rapidamente un progetto e migliorando la produttività durante lo sviluppo.

Colima…e adesso GUI!

Colima, è un progetto open source che permette di eseguire container Docker e Kubernetes su macOS (e anche Linux) in modo leggero e con configurazione minima. Nasce come alternativa più semplice e meno pesante a Docker Desktop.

In pratica, cosa fa
Colima crea una piccola VM Linux locale (ma il sizing è editabile in fase di creazione) e sopra di essa puo’ avviare diversi runtime per container:

  • Docker
  • containerd + nerdctl
  • Kubernetes tramite k3s
  • Incus/LXD per container di sistema e VM

L’obiettivo è offrire un ambiente di sviluppo containerizzato compatibile con gli strumenti Docker standard (docker, docker compose, kubectl) senza richiedere software commerciali o interfacce pesanti.

Caratteristiche principali

  • Compatibilità Docker completa: puoi usare i normali comandi Docker senza modifiche
  • Kubernetes integrato: un cluster locale si avvia con un solo comando
  • Leggero e veloce: consuma meno risorse rispetto a Docker Desktop
  • Supporto Apple Silicon: ottimizzato per Mac M1/M2/M3/M4
  • Gestione risorse: CPU, RAM e disco configurabili
  • Profili multipli: ambienti separati per progetti diversi
  • Supporto AI/GPU: sui Mac Apple Silicon può eseguire workload AI accelerati via GPU

Come si usa

Installazione tipica (usando brew):
brew install colima
Avvio:
colima start

Da quel momento Docker funziona normalmente:
quindi testiamo con un: docker run hello-world

Perché lo uso e dovresti usarlo?

  • evita i costi/licenze di Docker Desktop
  • è più “trasparente” e molto Unix-like
  • è molto apprezzato dagli sviluppatori Mac che vogliono un ambiente Docker minimale e leggero

Architettura tecnica
Colima si basa principalmente su tre elementi principali:

  1. Lima per la gestione della VM Linux;
  2. QEMU, oppure il framework di virtualizzazione Apple (vz);
  3. runtime come Docker o containerd

Caso d’uso tipici
È lo strumento ideale per:

  • sviluppo locale con Docker
  • test di microservizi
  • ambienti Kubernetes locali
  • sviluppo cloud-native su Mac
  • workload AI locali su Apple Silicon

Usandolo quotidianamente mi sono reso conto che non aveva una GUI e volendo evitare crampi, nello scrivere comandi da CLI, ho creato una GUI minimale in Python che potete scaricare. (.zip file)

Al momento funiona solo su macosx e richiede Colima e Tkinter per Python. Ecco un screenshot di esempio.

colima-gui.png

Guida pratica all’ottimizzazione dei Token su Claude

L’obiettivo di questa guida è fornire pratiche operative per ridurre il consumo di token e gestire in modo efficiente la context window nei modelli Claude.
Un uso consapevole del contesto è fondamentale per mantenere prestazioni elevate nei task complessi e contenere i costi computazionali.

1. Fase 1: Azioni Preliminari (Prima di Digitare)

L’ottimizzazione preventiva è il principale fattore di risparmio di token. Intervenire sulla qualità e struttura dell’input riduce significativamente l’overhead iniziale.

Conversione Strategica dei Formati

Caricare PDF “grezzi” può risultare inefficiente a causa di:

  • struttura interna complessa
  • metadati e layout
  • eventuale OCR

Quando possibile, è preferibile estrarre il testo e convertirlo in formato Markdown (.md) o testo semplice.

Formato Costo in Token (stima) Impatto sul contesto Efficienza
PDF (1 pagina) Variabile: da centinaia a diverse migliaia Medio–alto Bassa
Markdown / testo ~1 token ogni 3–4 caratteri Minimo Alta

Terraform, Bicep, PowerShell e Azure CLI…domande comuni

Quali sono le differenze chiave tra Bicep e Terraform?

Le differenze principali tra Bicep e Terraform risiedono nel loro ambito di applicazione, nel linguaggio utilizzato e nel modo in cui gestiscono lo stato dell’infrastruttura. Ecco un dettaglio delle distinzioni chiave:

  • Ambito e Portabilità: Bicep è uno strumento specifico per Azure (Azure-centric), progettato come un’alternativa più leggibile ai modelli ARM in formato JSON. Al contrario, Terraform è una soluzione multi-cloud e agnostica rispetto al cloud, che permette di gestire infrastrutture su diversi provider (come AWS o Google Cloud, oltre ad Azure) utilizzando un unico workflow coerente.
  • Linguaggio di Configurazione: Bicep utilizza un linguaggio specifico del dominio (DSL) che viene compilato in modelli ARM prima di essere eseguito da Azure. Terraform utilizza l’HashiCorp Configuration Language (HCL) per definire le risorse.
  • Gestione dello Stato: Una caratteristica distintiva di Terraform è la sua capacità di imporre la gestione dello stato dell’infrastruttura. Attraverso comandi come terraform plan e terraform apply, offre un approccio strutturato per monitorare e aggiornare le risorse esistenti. Bicep, d’altra parte, si affida al meccanismo di distribuzione sottostante di Azure Resource Manager (ARM), poiché i suoi script vengono trasformati in modelli ARM standard.
  • Casi d’Uso Ideali:
    • Bicep è la scelta preferita per i professionisti che lavorano esclusivamente o prevalentemente in ambienti Azure-centrici e desiderano una sintassi dichiarativa più semplice rispetto ai modelli JSON.
    • Terraform è preferito per ambienti multi-cloud e strategie di Infrastructure-as-Code (IaC) complesse, grazie alla sua modularità, riutilizzabilità e astrazione tramite estensioni dei provider.

In sintesi, mentre Bicep ottimizza l’esperienza nativa di Azure, Terraform offre la flessibilità necessaria per gestire infrastrutture eterogenee su scala globale.

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