domenica 30 novembre 2025

Corso Pensiero Computazionale e Coding per Tutti: 2 Coding unplugged: attività senza computer

 
Coding unplugged: attività senza computer

Introduzione: Cos’è il coding unplugged e perché è così efficace

Immagina di poter insegnare ai bambini e ai ragazzi i concetti fondamentali della programmazione senza accendere nemmeno un computer. Può sembrare incredibile, ma è proprio questo che fa il coding unplugged: utilizza giochi, attività manuali, simulazioni e materiali semplici per far comprendere come funziona il pensiero computazionale.

Questo approccio è efficace perché:

  • Rende visibili concetti astratti come algoritmi, cicli, condizioni e sequenze logiche attraverso attività pratiche e corporee.
  • Coinvolge tutto il corpo, sviluppando anche la coordinazione motoria, la lateralità, la capacità di previsione e la collaborazione.
  • È perfetto per tutte le età, dalla scuola dell’infanzia fino alla secondaria, perché permette di adattare la complessità e l’astrazione.
  • Permette di lavorare sul ragionamento e sulla risoluzione dei problemi senza distrazioni tecnologiche, concentrandosi sul cuore della programmazione: la logica.

Cos’è un algoritmo? Una definizione semplice e pratica

Spesso sentiamo parlare di algoritmo come una cosa complicata. In realtà, un algoritmo è semplicemente una serie di istruzioni ordinate, cioè un “programma” che dice passo dopo passo cosa fare per raggiungere un obiettivo.

Per esempio, pensa a come preparare una tazza di tè:

  1. Prendi una tazza pulita.
  2. Metti un filtro con la bustina di tè nella tazza.
  3. Versa acqua calda.
  4. Aspetta 3 minuti.
  5. Rimuovi il filtro.
  6. Aggiungi zucchero se vuoi.

Questo è un algoritmo! È un insieme di istruzioni che deve essere seguito in sequenza per ottenere il risultato desiderato.


🔧 Attività pratiche unplugged

1. Programmare un compagno per uscire da un labirinto

Disegna su un foglio o a terra un labirinto semplice con caselle quadrate (tipo una griglia 5x5).

Obiettivo: Un partecipante è il “robot”, gli altri sono programmatori che gli danno istruzioni per uscire dal labirinto.

  • Le istruzioni possibili sono: Avanti, Indietro, Giro a sinistra, Giro a destra.
  • Il “robot” deve eseguire le istruzioni esattamente nell’ordine dato, senza interpretazioni.
  • I programmatori scrivono la sequenza di passi (algoritmo) prima che il robot inizi.

Esempio svolto:

Supponiamo che il robot parta dalla casella in alto a sinistra e che la via per uscire sia:

  • Avanti
  • Avanti
  • Giro a destra
  • Avanti
  • Giro a sinistra
  • Avanti

Dopo aver scritto la sequenza, il robot la segue e raggiunge l’uscita.

2. Giochi con frecce direzionali, tessere e dadi logici

Distribuisci ai partecipanti tessere con frecce (⬆️⬇️⬅️➡️) e dadi logici con facce tipo “ripeti”, “salta”, “gira”.

Esercizio: Costruire sequenze di frecce che rappresentino movimenti precisi.

Esempio:

  • Crea una sequenza per “muoversi due passi avanti, girare a destra e camminare tre passi.”

Si possono anche fare gare a chi crea l’algoritmo più corto o quello più chiaro.

3. Costruzione di un algoritmo per piegare una maglietta in tre mosse

Prendi una maglietta distesa sul tavolo.

Obiettivo: Scrivere un algoritmo con tre istruzioni per piegarla.

Soluzione esempio:

  1. Piega la parte destra verso il centro.
  2. Piega la parte sinistra verso il centro.
  3. Piega la maglietta a metà dal basso verso l’alto.

I partecipanti possono provare a eseguire l’algoritmo e vedere se funziona davvero.


🧠 Test di autovalutazione

  1. Qual è la differenza tra algoritmo e istruzione singola?

  2. Come si può rappresentare una sequenza usando solo frecce?

  3. Perché il coding unplugged è utile anche nella scuola dell’infanzia?

  4. Costruisci un algoritmo in 4 passi per attraversare una griglia 4x4 evitando ostacoli, partendo dall’angolo in alto a sinistra.


✅ Soluzioni suggerite

  1. Un’istruzione singola è un solo comando (es. “vai avanti”), mentre un algoritmo è un insieme ordinato di istruzioni da eseguire in sequenza.

  2. Si può usare ogni freccia per rappresentare un passo o un movimento (➡️ = avanti, ⬅️ = indietro, ⬆️ = su, ⬇️ = giù). Sequenziando le frecce, si ottiene la rappresentazione di una sequenza.

  3. Perché permette ai bambini piccoli di sviluppare la logica, la capacità di prevedere risultati e lavorare su abilità come la lateralità, la memoria e la collaborazione, senza la necessità di saper usare il computer.

  4. Esempio di algoritmo: ⬇️ ⬇️ ➡️ ➡️ (due passi giù, due passi a destra). È importante che i passi evitino le caselle con ostacoli.


Ulteriori spunti per approfondire

  • Analisi degli errori: Cosa succede se un algoritmo è scritto male? Prova a modificare la sequenza e osserva come cambia il risultato. È un modo per capire l’importanza della precisione.

  • Ripetizioni e cicli: Introduci l’idea di “ripetere” azioni usando esercizi con tessere “ripeti” o con movimenti a tempo.

  • Condizioni: Simula con giochi “se allora” (es. “Se la strada è libera, vai avanti, altrimenti gira a destra”).


sabato 29 novembre 2025

Corso Pensiero Computazionale e Coding per Tutti: 1 Cos'è il pensiero computazionale


🧠 Cos'è il Pensiero Computazionale

📘 Contenuti Didattici

Il pensiero computazionale non è un superpotere riservato ai programmatori: è una modalità di ragionamento che tutti, ogni giorno, applichiamo senza rendercene conto. È la capacità di affrontare un problema, grande o piccolo, in modo logico, strutturato e strategico, un po’ come farebbe un computer… ma con la nostra creatività umana.

Il termine fu coniato da Seymour Papert e successivamente ripreso da Jeannette Wing, che lo ha reso famoso nel mondo accademico come competenza fondamentale del XXI secolo.

Un esempio quotidiano

Immagina di dover organizzare una gita con gli amici. Devi decidere la destinazione, verificare chi viene, controllare i costi, prenotare i biglietti, e infine comunicare a tutti il programma. Anche senza saperlo, hai applicato pensiero computazionale: hai scomposto il problema, ignorato dettagli irrilevanti, trovato schemi comuni e creato un “algoritmo” di azioni.

Le quattro componenti fondamentali

  • 🔹 Decomposizione: Scomporre un problema in parti più piccole e gestibili. Esempio svolto: “Preparare una torta” diventa: comprare ingredienti → preparare impasto → infornare → decorare.
  • 🔹 Astrazione: Concentrarsi sugli elementi essenziali, ignorando ciò che non è rilevante. Esempio: Nel preparare la torta, non serve considerare il colore del grembiule, ma sì la temperatura del forno.
  • 🔹 Riconoscimento di schemi: Identificare modelli ricorrenti che possono semplificare il lavoro. Esempio: Notare che molte ricette prevedono “mescolare ingredienti secchi” e poi “aggiungere quelli liquidi”.
  • 🔹 Algoritmi: Creare una sequenza di istruzioni precise per risolvere un problema. Esempio: La ricetta scritta è un algoritmo: passo 1, passo 2, passo 3…

Questi strumenti non servono solo in informatica: sono utili in matematica, scienze, gestione aziendale, e perfino nelle decisioni personali.

🛠️ Attività ed Esercizi Svolti

Per imparare il pensiero computazionale bisogna “sporcarsi le mani” con esercizi concreti.

Esercizio 1 – Cena per 10 persone

Problema: Devi preparare una cena per 10 ospiti.

Soluzione con pensiero computazionale:

  1. Decomposizione: scegliere il menù, comprare ingredienti, cucinare, apparecchiare, servire.
  2. Astrazione: ignorare dettagli estetici non necessari (es. forma dei piatti) e concentrarsi su quantità e tempi.
  3. Riconoscimento di schemi: ricordare che ogni volta serve organizzare le cotture in modo da servire caldo.
  4. Algoritmo: redigere una tabella con orari di preparazione per ogni portata.

Esercizio 2 – Labirinto logico

Problema: Come uscire da un labirinto seguendo sempre la mano destra appoggiata al muro.

Risultato: Hai creato un algoritmo “meccanico” che funziona senza pensare, basato su una regola ricorrente.

📝 Test di Verifica

  1. Quale delle seguenti NON è una componente del pensiero computazionale?
    A. Decomposizione
    B. Intuizione
    C. Riconoscimento di schemi
    D. Algoritmi
    ✅ Soluzione

    B. Intuizione

  2. A cosa serve la decomposizione?
    A. Ignorare i dettagli
    B. Scomporre un problema complesso in parti più semplici
    C. Creare una lista di spesa
    D. Fare un disegno
    ✅ Soluzione

    B. Scomporre un problema complesso in parti più semplici

  3. Se segui una ricetta passo passo, stai usando:
    A. Un algoritmo
    B. Una mappa concettuale
    C. Una previsione
    D. Un ragionamento astratto
    ✅ Soluzione

    A. Un algoritmo

  4. Perché l’astrazione è utile?
    A. Per fare più calcoli
    B. Per evitare di concentrarsi su dettagli irrilevanti
    C. Per ricordare i passaggi
    D. Per aumentare la complessità
    ✅ Soluzione

    B. Per evitare di concentrarsi su dettagli irrilevanti

  5. Quale attività richiede maggiormente il riconoscimento di schemi?
    A. Risolvere un sudoku
    B. Fare la spesa
    C. Scrivere un tema
    D. Disegnare un ritratto
    ✅ Soluzione

    A. Risolvere un sudoku

📌 Suggerimenti per l’autovalutazione

Al termine della lezione, chiediti:

  • ✏️ Riesco a spiegare cos’è il pensiero computazionale a un amico senza usare parole difficili?
  • 🔍 Posso individuare le 4 componenti in una situazione reale della mia giornata?
  • 📋 Sono in grado di scrivere un algoritmo per risolvere un problema quotidiano?
  • 🎯 Posso applicare questo metodo in discipline diverse, come storia o scienze?

venerdì 28 novembre 2025

Corso di Prompt Engineering: Ottimizzazione iterativa e metriche


Ottimizzazione iterativa e metriche

1. Prompt tuning vs Prompt Engineering

Il cuore di questo modulo è capire la differenza tra prompt tuning e prompt engineering. - Prompt Engineering: progettazione strategica del prompt per ottenere risposte precise e coerenti dal modello AI. - Prompt Tuning: raffinamento iterativo del prompt attraverso prove, modifiche e ottimizzazione per massimizzare l’efficacia.

2. Chain-of-Validation e Prompt Evaluation

Per garantire che un modello risponda correttamente, si usano procedure sistematiche di controllo: - Chain-of-Validation: concatenazione di controlli intermedi per verificare ogni fase della risposta. - Prompt Evaluation: valutazione della qualità della risposta generata secondo criteri predefiniti, come accuratezza e completezza.

3. Definizione di KPI qualitativi

Non basta far funzionare un prompt: serve misurare la qualità. Alcuni KPI fondamentali includono:

  • Accuratezza: quanto la risposta corrisponde al dato o alla conoscenza richiesta
  • Rilevanza: pertinenza della risposta rispetto al contesto del prompt
  • Stilistica: correttezza e coerenza nel tono, formato e registro linguistico

4. Prompt benchmarking e testing automatizzato

Una volta definiti i KPI, si procede al test:

  • Benchmarking: confronto dei prompt con set di test standardizzati per valutare le prestazioni
  • Testing automatizzato: strumenti e pipeline per valutare in massa la qualità dei prompt

5. Tool di riferimento

Alcuni strumenti utili per il lavoro pratico:

  • LangChain: framework per la gestione e concatenazione di prompt
  • Promptfoo: testing e benchmarking di prompt
  • TypoGen: generazione e test di varianti di prompt
  • RAG Test Kit: strumenti per valutazione di risposte basate su retrieval-augmented generation


giovedì 27 novembre 2025

Corso di Prompt Engineering: Prompt per il codice e l’automazione


Prompt per il codice e l’automazione

1) Prompting in ambienti di sviluppo (Python, JS, Bash, SQL)

1.1 Pattern di prompt “comando completo”

Usa questo scheletro, adattandolo al linguaggio:

  • Contesto: (cosa devo fare e perché)
  • Vincoli: (librerie, versioni, complessità, performance)
  • Output atteso: (firma funzione, formato, test inclusi?)
  • Stile: (commenti, docstring, tipizzazione, lint)

Template breve

Contesto: voglio <obiettivo>.
Linguaggio: <Python/JS/Bash/SQL>.
Vincoli: <librerie/versioni/limiti>.
Output: <file singolo/funzione + test + istruzioni>.
Stile: <docstring/tipi/commenti chiari>.

1.2 Esempi concreti

Python – Funzione + test

Prompt efficace

Scrivi in Python 3.11 una funzione media(lista: list[float]) -> float che ritorna la media arrotondata a 2 decimali. Aggiungi test con pytest, docstring e gestione di lista vuota con ValueError.

Soluzione

def media(lista: list[float]) -> float:
    """
    Calcola la media di una lista di numeri con arrotondamento a 2 decimali.
    :raises ValueError: se la lista è vuota
    """
    if not lista:
        raise ValueError("Lista vuota")
    return round(sum(lista) / len(lista), 2)

Test pytest

import pytest
from soluzione import media

def test_media_normale():
    assert media([1, 2, 3]) == 2.00

def test_media_decimali():
    assert media([10.1, 20.2]) == 15.15

def test_lista_vuota():
    with pytest.raises(ValueError):
        media([])

Perché funziona: firma chiara, eccezione esplicita, test significativi.

JavaScript – Map/Filter/Reduce

Prompt

Scrivi una funzione nomiMaggiorenni(persone) che riceve array di {nome, eta} e ritorna i nomi con eta >= 18. Aggiungi JSDoc e test rapidi con esempi.

Soluzione

/**
 * @param {{nome: string, eta: number}[]} persone
 * @returns {string[]}
 */
function nomiMaggiorenni(persone) {
  return persone.filter(p => p.eta >= 18).map(p => p.nome);
}

// esempi "test-like"
console.assert(JSON.stringify(nomiMaggiorenni([{nome:"A",eta:18},{nome:"B",eta:17}])) === JSON.stringify(["A"]));
console.assert(nomiMaggiorenni([]).length === 0);

Bash – Script sicuro/idempotente

Prompt

Crea uno script Bash POSIX che crei backup/ (se non esiste) e copi tutti i .txt correnti dentro backup/, con messaggi e set -euo pipefail.

Soluzione

#!/usr/bin/env bash
set -euo pipefail

mkdir -p backup
shopt -s nullglob
txts=(*.txt)
if (( ${#txts[@]} == 0 )); then
  echo "Nessun file .txt da copiare."
  exit 0
fi
cp -- *.txt backup/
echo "Backup completato ($(date))."

SQL – Aggregazioni

Prompt

In SQL standard, conta gli ordini per cliente nella tabella ordini(cliente_id, data, totale), ordina decrescente, includi alias chiari.

Soluzione

SELECT cliente_id, COUNT(*) AS numero_ordini
FROM ordini
GROUP BY cliente_id
ORDER BY numero_ordini DESC;

1.3 Esercizi (con soluzioni)

Esercizio A
Scrivi due prompt per calcolare la somma dei numeri pari 1..100:

  • in Python usa for;
  • in JavaScript usa reduce.

Soluzione (prompt + codice)

  • Prompt Python

    Python 3.11. Scrivi funzione somma_pari_1_100() che usa un ciclo for e ritorna la somma dei pari tra 1 e 100. Aggiungi un test pytest.

    def somma_pari_1_100() -> int:
        s = 0
        for n in range(2, 101, 2):
            s += n
        return s
    
  • Prompt JavaScript

    JavaScript. Crea costante sommaPari calcolata con Array.from e reduce, considerando i pari da 1 a 100. Aggiungi un console.assert.

    const sommaPari = Array.from({length: 100}, (_, i) => i + 1)
      .filter(n => n % 2 === 0)
      .reduce((acc, n) => acc + n, 0);
    
    console.assert(sommaPari === 2550);
    

2) Refactoring, testing e debug assistiti

2.1 Refactoring guidato

Prompt

Esegui refactoring di questo codice per leggibilità e performance, senza cambiare il comportamento. Aggiungi commenti su cosa hai migliorato e perché. Applica PEP8, tipizzazione, early return.

Esempio (prima → dopo) Prima

def f(nums):
    s=0
    for i in range(len(nums)):
        if nums[i]%2==0:
            s=s+nums[i]
    return s

Dopo

from typing import Iterable

def somma_pari(nums: Iterable[int]) -> int:
    """Somma i numeri pari."""
    return sum(n for n in nums if n % 2 == 0)

Perché meglio: meno codice, più espressivo, tipizzato, complessità invariata.

2.2 Testing: unit, property-based, golden files

  • Unit test (pytest/unittest)
  • Property-based (hypothesis): genera casi automaticamente.
  • Golden test: confronta output con “snapshot” noto.

Prompt esempio (pytest + hypothesis)

Scrivi test pytest e usa hypothesis per validare che somma_pari sia uguale alla somma dei n tali che n % 2 == 0.

import pytest
from hypothesis import given, strategies as st
from soluzione import somma_pari

@given(st.lists(st.integers(min_value=-1000, max_value=1000), max_size=200))
def test_somma_pari_property(nums):
    assert somma_pari(nums) == sum(n for n in nums if n % 2 == 0)

2.3 Debug assistito (tecnica a checklist)

  1. Riproduci l’errore con un test minimo
  2. Leggi il traceback/log
  3. Isola la riga sospetta
  4. Aggiungi asserzioni e log
  5. Correggi, poi test di non regressione

Esempio Bug: “division by zero”

def rapporto(a: float, b: float) -> float:
    return a / b

Fix

def rapporto(a: float, b: float) -> float:
    if b == 0:
        raise ZeroDivisionError("b non può essere zero")
    return a / b

3) Istruzioni multi-turno per funzioni complesse

3.1 Strategia “progressive enhancement”

  • Turno 1 – MVP: funzionante, senza fronzoli
  • Turno 2 – Robustezza: error handling, logging
  • Turno 3 – UX/Performance: progress bar, streaming, caching
  • Turno 4 – Test & Docs: unit test + README

Caso studio: downloader di file

  • T1 (MVP)

    Python. Funzione download(url: str, path: str) che scarica un file via requests e lo salva. Gestisci HTTP base.

  • T2 (Robustezza)

    Aggiungi gestione timeout, retry con backoff, dimensione massima, eccezioni specifiche.

  • T3 (UX/Perf)

    Aggiungi barra di progresso tqdm con streaming chunked e resume se possibile.

  • T4 (Test & Docs)

    Crea test con responses o pytest-httpserver e README con esempi.

3.2 Esercizio (con soluzione)

Obiettivo: fattoriale in tre turni

  • T1 – Base

    def fattoriale(n: int) -> int:
        res = 1
        for k in range(2, n+1):
            res *= k
        return res
    
  • T2 – Input negativi

    def fattoriale(n: int) -> int:
        if n < 0:
            raise ValueError("n deve essere >= 0")
        res = 1
        for k in range(2, n+1):
            res *= k
        return res
    
  • T3 – Memoizzazione

    from functools import lru_cache
    
    @lru_cache(maxsize=None)
    def fattoriale(n: int) -> int:
        if n < 0:
            raise ValueError("n deve essere >= 0")
        if n in (0, 1):
            return 1
        return n * fattoriale(n-1)
    

4) Tool interattivi no-code/low-code (HTML+JS)

4.1 Mini-tool: Generatore di password (accessibile e “copiabile”)

Prompt

Crea una pagina HTML+JS con input lunghezza (min 4, max 64), checkbox per maiuscole/minuscole/numeri/simboli, pulsante “Genera” e “Copia”. Nessuna libreria esterna, stile CSS leggero, validazione e ARIA.

Soluzione (snippet completo, pronto-uso)

<!doctype html>
<html lang="it">
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Generatore Password</title>
<style>
  body{font-family:system-ui,Arial,sans-serif;max-width:720px;margin:2rem auto;padding:0 1rem}
  .card{border:1px solid #ddd;border-radius:12px;padding:1rem;box-shadow:0 2px 8px #0001}
  label{display:block;margin:.5rem 0}
  button{padding:.6rem 1rem;border-radius:10px;border:1px solid #ccc;cursor:pointer}
  .row{display:flex;gap:.5rem;flex-wrap:wrap;align-items:center}
  input[type="text"]{width:100%;padding:.6rem;border:1px solid #ccc;border-radius:8px}
</style>
<div class="card" role="region" aria-labelledby="tit">
  <h1 id="tit">Generatore di Password</h1>
  <label> Lunghezza:
    <input type="number" id="len" min="4" max="64" value="12" aria-describedby="lenHelp">
  </label>
  <small id="lenHelp">Valori tra 4 e 64</small>
  <div class="row" role="group" aria-label="Opzioni caratteri">
    <label><input type="checkbox" id="lower" checked> minuscole</label>
    <label><input type="checkbox" id="upper" checked> maiuscole</label>
    <label><input type="checkbox" id="nums"  checked> numeri</label>
    <label><input type="checkbox" id="syms"> simboli</label>
  </div>
  <div class="row" style="margin-top:1rem">
    <button id="gen">Genera</button>
    <button id="copy" aria-live="polite">Copia</button>
  </div>
  <label style="margin-top:1rem">Risultato:
    <input id="out" type="text" readonly aria-readonly="true">
  </label>
</div>
<script>
(function(){
  const $ = id => document.getElementById(id);
  const pools = {
    lower: "abcdefghijklmnopqrstuvwxyz",
    upper: "ABCDEFGHIJKLMNOPQRSTUVWXYZ",
    nums:  "0123456789",
    syms:  "!@#$%^&*()-_=+[]{};:,.?/|~"
  };
  function generate(len, opts){
    let pool = "";
    Object.entries(opts).forEach(([k, v]) => { if(v) pool += pools[k]; });
    if(!pool) throw new Error("Seleziona almeno un set di caratteri");
    // garantisci almeno un carattere da ogni set selezionato
    const selectedSets = Object.entries(opts).filter(([,v])=>v).map(([k])=>pools[k]);
    const result = [];
    selectedSets.forEach(set => result.push(set[Math.floor(Math.random()*set.length)]));
    for(let i=result.length; i<len; i++){
      result.push(pool[Math.floor(Math.random()*pool.length)]);
    }
    // shuffle Fisher–Yates
    for (let i=result.length-1; i>0; i--){
      const j = Math.floor(Math.random()*(i+1));
      [result[i], result[j]] = [result[j], result[i]];
    }
    return result.join("");
  }
  $("gen").addEventListener("click", ()=>{
    const len = +$("len").value;
    if (len < 4 || len > 64){ alert("Lunghezza non valida"); return; }
    try {
      $("out").value = generate(len, {
        lower: $("lower").checked,
        upper: $("upper").checked,
        nums:  $("nums").checked,
        syms:  $("syms").checked
      });
    } catch(e){ alert(e.message); }
  });
  $("copy").addEventListener("click", async ()=>{
    const v = $("out").value;
    if(!v){ alert("Niente da copiare"); return; }
    await navigator.clipboard.writeText(v);
    $("copy").textContent = "Copiato!";
    setTimeout(()=> $("copy").textContent = "Copia", 1200);
  });
})();
</script>
</html>

Project Work – Mini-app “Task Tracker” (AI + codice assistito)

Requisiti

  • Aggiungi attività (titolo, priorità)
  • Completa/riapri, elimina
  • Contatore completati / totali
  • Persistenza con localStorage
  • UI responsive, zero dipendenze

Prompt iniziale

Crea una pagina HTML+CSS+JS, un unico file, con lista to-do con campi “titolo” (obbligatorio) e “priorità” (bassa/media/alta). Salva su localStorage. Filtri per “tutte/attive/completate” e contatori live. Aggiungi funzioni pure testabili per le operazioni sulla lista.

Soluzione (file unico, pronto-uso)

Incolla il seguente codice in un file .html e aprilo nel browser.

<!doctype html>
<html lang="it">
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Task Tracker</title>
<style>
  :root { --gap:.6rem; --radius:14px }
  body{font-family:system-ui,Arial,sans-serif;margin:2rem auto;max-width:800px;padding:0 1rem}
  .card{border:1px solid #ddd;border-radius:var(--radius);padding:1rem;box-shadow:0 2px 8px #0001}
  .row{display:flex;gap:var(--gap);flex-wrap:wrap}
  input[type="text"], select{padding:.6rem;border:1px solid #ccc;border-radius:10px;flex:1}
  button{padding:.6rem 1rem;border:1px solid #ccc;border-radius:10px;cursor:pointer}
  ul{list-style:none;padding:0;margin:.5rem 0}
  li{display:flex;align-items:center;gap:.5rem;justify-content:space-between;padding:.5rem;border-bottom:1px dashed #eee}
  .title.done{text-decoration:line-through;opacity:.6}
  .pill{border:1px solid #ccc;border-radius:999px;padding:.1rem .5rem;font-size:.8rem}
  .pill.high{border-color:#f55}
  .pill.medium{border-color:#fa3}
  .pill.low{border-color:#6a6}
  .toolbar{display:flex;justify-content:space-between;align-items:center;gap:.6rem;flex-wrap:wrap;margin:.5rem 0}
  .filters button[aria-pressed="true"]{outline:2px solid #444}
</style>
<div class="card">
  <h1>Task Tracker</h1>
  <div class="row">
    <input id="taskTitle" type="text" placeholder="Nuova attività..." aria-label="Titolo attività">
    <select id="priority" aria-label="Priorità">
      <option value="low">Bassa</option>
      <option value="medium">Media</option>
      <option value="high">Alta</option>
    </select>
    <button id="add">Aggiungi</button>
  </div>

  <div class="toolbar">
    <div id="counters" aria-live="polite">0 completate su 0</div>
    <div class="filters" role="group" aria-label="Filtri">
      <button data-filter="all" aria-pressed="true">Tutte</button>
      <button data-filter="active" aria-pressed="false">Attive</button>
      <button data-filter="done" aria-pressed="false">Completate</button>
    </div>
  </div>

  <ul id="list" aria-live="polite"></ul>
</div>

<script>
// ---- Modello e funzioni pure (testabili) ----
function createTask(title, priority="low"){
  if(!title || !title.trim()) throw new Error("Titolo obbligatorio");
  return { id: crypto.randomUUID(), title: title.trim(), priority, done: false, createdAt: Date.now() };
}
function toggleTask(tasks, id){ return tasks.map(t => t.id===id ? {...t, done: !t.done} : t); }
function removeTask(tasks, id){ return tasks.filter(t => t.id!==id); }
function addTask(tasks, task){ return [task, ...tasks]; }
function filterTasks(tasks, mode){
  if(mode==="active") return tasks.filter(t => !t.done);
  if(mode==="done")   return tasks.filter(t =>  t.done);
  return tasks;
}
function countDone(tasks){ return tasks.filter(t => t.done).length; }

// ---- Persistenza ----
const STORAGE_KEY = "task_tracker_v1";
const load = () => JSON.parse(localStorage.getItem(STORAGE_KEY) || "[]");
const save = (tasks) => localStorage.setItem(STORAGE_KEY, JSON.stringify(tasks));

// ---- UI ----
let state = { tasks: load(), filter: "all" };
const $ = sel => document.querySelector(sel);
const listEl = $("#list"), countersEl = $("#counters");

function render(){
  const shown = filterTasks(state.tasks, state.filter);
  listEl.innerHTML = "";
  shown.forEach(t => {
    const li = document.createElement("li");
    const left = document.createElement("div");
    const right = document.createElement("div"); right.className = "row";

    const chk = document.createElement("input"); chk.type = "checkbox"; chk.checked = t.done;
    chk.addEventListener("change", () => updateState({ tasks: toggleTask(state.tasks, t.id) }));

    const title = document.createElement("span"); title.textContent = t.title; title.className = "title" + (t.done ? " done" : "");

    const pill = document.createElement("span"); pill.className = "pill " + (t.priority==="high"?"high":t.priority==="medium"?"medium":"low");
    pill.textContent = t.priority === "high" ? "Alta" : t.priority === "medium" ? "Media" : "Bassa";

    left.className = "row"; left.append(chk, title, pill);

    const del = document.createElement("button"); del.textContent = "Elimina";
    del.addEventListener("click", () => updateState({ tasks: removeTask(state.tasks, t.id) }));

    right.append(del);
    li.append(left, right);
    listEl.append(li);
  });
  const done = countDone(state.tasks);
  countersEl.textContent = `${done} completate su ${state.tasks.length}`;
  save(state.tasks);
}

function updateState(patch){
  state = { ...state, ...patch };
  render();
}

document.getElementById("add").addEventListener("click", () => {
  const title = document.getElementById("taskTitle").value;
  const priority = document.getElementById("priority").value;
  try {
    const task = createTask(title, priority);
    document.getElementById("taskTitle").value = "";
    updateState({ tasks: addTask(state.tasks, task) });
  } catch(e){ alert(e.message); }
});

document.querySelectorAll(".filters button").forEach(btn => {
  btn.addEventListener("click", () => {
    document.querySelectorAll(".filters button").forEach(b => b.setAttribute("aria-pressed","false"));
    btn.setAttribute("aria-pressed","true");
    updateState({ filter: btn.dataset.filter });
  });
});

render();
</script>
</html>

Test manuali rapidi

  • Aggiungi 3 task (alta/media/bassa), completa/riapri, filtra per “Attive” e “Completate”.
  • Ricarica la pagina: i dati persistono.
  • Prova ad aggiungere titolo vuoto: appare l’errore.

Verifica finale (con risposte)

  1. Prompt per CSV → media colonna → salva risultato
    Prompt consigliato

Python 3.11. Leggi un CSV dati.csv con colonna valore, calcola la media e scrivi media.txt con 2 decimali. Usa csv o pandas (specifica entrambe le versioni). Gestisci file mancante e colonna assente. Aggiungi un test con file temporaneo.

Soluzione minima con pandas

import pandas as pd, sys

def media_colonna_csv(path: str, col: str="valore") -> float:
    df = pd.read_csv(path)
    if col not in df.columns:
        raise KeyError(f"Colonna {col} assente")
    m = round(float(df[col].mean()), 2)
    with open("media.txt","w",encoding="utf-8") as f:
        f.write(f"{m}\n")
    return m

if __name__ == "__main__":
    try:
        media_colonna_csv(sys.argv[1], sys.argv[2] if len(sys.argv)>2 else "valore")
        print("OK")
    except Exception as e:
        print(f"Errore: {e}", file=sys.stderr); sys.exit(1)
  1. Due modi per ottimizzare molti if annidati
  • Guard clauses (early return) e dizionari/lookup tables al posto di if/elif multipli.
  • Strategy pattern / funzioni di dispatch (mappa chiave → funzione), oppure pattern matching (Python 3.10+ match, TS switch + oggetti).
  1. Differenza tra debug e testing
  • Testing: attività proattiva per verificare che il comportamento sia corretto (prima e durante lo sviluppo).
  • Debug: attività reattiva per trovare e correggere la causa di un errore osservato.

Cheat-sheet (rapido)

  • Specificare sempre: linguaggio + versione, librerie, formato output, vincoli, test richiesti.
  • Iterare: MVP → robustezza → performance → test/docs.
  • Chiedere spiegazioni: “Commenta le modifiche, indica complessità, cita alternative”.
  • Automazione sicura: log, validazioni, idempotenza (Bash), transazioni/rollback (SQL), test.

mercoledì 26 novembre 2025

Corso di Prompt Engineering: Strutture logiche e pattern semantici


Strutture logiche e pattern semantici

1) Come “pensa” il modello — pattern e bias

Concetto chiave: i modelli non "capiscono" come un umano: predicono la prossima sequenza di token basandosi su pattern statistici appresi da grandi testi.
Cosa produce questo, concretamente:

  • Pattern riconosciuti: frasi tipiche, formule narrative, cliché.
  • Bias prevedibili: risposte prototipiche, effetto “popular answer”, ricorsività, tendenza a rispondere in modo sicuro/anonimo.
  • Rischi pratici: hallucinations (fatti inventati), stereotipi, ripetitività, oversharing di info sensibili.

2)Strategie di mitigazione rapide:

  • Fornire contesto preciso e vincoli.
  • Chiedere prove / fonti o “citami le fonti” (e valutare criticamente).
  • Richiedere più prospettive: “Dammi 3 punti di vista contrastanti”.
  • Usare prompt di controllo: “Elenca le incertezze nella tua risposta”.

3) Scaffolding e Chaining — suddividere per ottenere coerenza

Scaffolding = spezzare un compito complesso in passaggi più piccoli.
Chaining = concatenare risposte precedenti per costruire un output complesso.

Pattern pratico (template):

  1. Step 1 — Output struttura: “Scrivi un outline in 6 punti.”
  2. Step 2 — Sviluppo: “Sviluppa il punto 2 seguendo questo tono…”
  3. Step 3 — Revisione: “Controlla coerenza, proponi 3 alternative concise.”
  4. Step 4 — Finalizzazione: “Assembla il testo finale seguendo lo stile X.”

Esempio rapido (blog post):

Prompt A: "Crea un outline in 5 punti per un articolo su 'Smart Travel'."
Risposta A -> Outline.
Prompt B: "Scrivi il paragrafo 2 dell'outline in 120 parole, tono giornalistico."
Risposta B -> Paragrafo 2.
Prompt C: "Rendi il paragrafo 2 più vivace, inserendo un esempio pratico."

Vantaggi: controllo, facilità di revisione, riduzione di errori/contraddizioni.

4) Approccio ricorsivo: Prompt → Risposta → Meta-prompt

Idea: dopo la prima risposta, chiedere al modello di valutare e migliorare la propria output creando un meta-prompt che la rigenera meglio.

Ciclo ricorsivo (workflow):

  1. Invii prompt iniziale → ottieni R1.
  2. Prompt al modello: “Sei un editor di prompt. Analizza R1: indica 5 punti deboli e scrivi un prompt migliorato per ottenere una versione più coerente.” → ottieni P2.
  3. Rilancia P2 → ottieni R2. Ripeti fino a soddisfazione.

Template meta-prompt:

Sei un revisore. Qui la risposta: {R1}
1) Elenca 5 debolezze specifiche.
2) Proponi un prompt migliorato che risolva ciascuna debolezza (massimo 80 parole).
3) Fornisci una versione rivista della risposta (R2) applicando il nuovo prompt.

Perché funziona: il modello aiuta a generare la sua stessa correzione e produce prompt migliori di quelli creati a freddo.

5) Gestione del contesto e prompt dinamici

Problema: il contesto è limitato (token window) e la conversazione può driftare (perdita di coerenza storica).
Principi pratici:

  • Riepilogo periodico (checkpoint): ogni N turni, chiedi al modello di produrre un riassunto dello stato (3–6 frasi) da riutilizzare come contesto nelle richieste successive.
  • Memory sliding: mantieni la essenza (personaggi, obiettivi, regole) e scarta i dettagli inutili.
  • Context header template da anteporre ai prompt:
CONTESTO: {breve-riassunto}
OBIETTIVO: {goal}
VINCOLI: {stile, lunghezza, no-hallucination}
MEMORY CHECK: {punti chiave da ricordare}
PROMPT: {istruzione vera e propria}
  • Prompt dinamici: usa variabili ({{user_name}}, {{last_scene}}, {{tone}}) e sostituiscile con il valore aggiornato prima dell’invio.

Esempi applicativi:

  • Narrativa seriale: includi sempre la scheda personaggio come memory check prima di ogni scena.
  • Progetti di lavoro: prima di chiedere output, inserisci “Ultimo stato del progetto: …” così il modello non ricomincia da zero.

6) Test pratico — Obiettivo: ottimizzare un prompt per ottenere consistenza narrativa su più turni

Consegna (da svolgere):

  1. Seed prompt (iniziale): crea un prompt che richieda una scena 1 di una storia con 2 personaggi, tono noir, 250–300 parole.
  2. Task: usando scaffolding + meta-prompt + context header, produci 5 turni consecutivi (Scene 1 → 5) mantenendo: coerenza di personaggi, timeline plausibile, tono noir, nessuna contraddizione.
  3. Consegna finale: invia i 5 turni e il prompt ottimizzato che hai usato (includendo il context header e il meta-prompt).

Criteri di valutazione (rubrica):

  • Coerenza personaggi (0–5): nomi, background, motivazioni invariati.
  • Coerenza temporale & causale (0–5): eventi si susseguono senza buchi logici.
  • Stile & tono (0–5): rispetto del registro noir.
  • Assenza di hallucinations (0–3): nessun fatto inventato incoerente con la storia.
  • Efficacia del prompt (0–2): il prompt è chiaro, riutilizzabile e contiene il context header.

Esempio di seed prompt (non ottimizzato):

"Scrivi la scena 1 di un noir di 300 parole con due personaggi, Marco e Elena, in un bar piovoso."

Esempio di prompt ottimizzato (riassunto):

CONTESTO: Noir urbano. Marco (det. 35 anni, ex poliziotto, colpevolmente coinvolto in un'indagine) e Elena (30 anni, giornalista curiosa). È la prima notte dopo che Marco ha ricevuto una busta con foto compromettenti.
OBIETTIVO: Scrivi Scena 1 (250–300 w) in cui si incontrano al 'Caffè Nebbia'. Mostra tensione, non risolvere il mistero.
VINCOLI: Tono noir, dialoghi asciutti, descrizioni sensoriali (pioggia, fumo), non introdurre nuovi personaggi, evitare info contraddittorie, non citare date specifiche.
MEMORY CHECK: Marco ha un passato da poliziotto; Elena sospetta ma è empatica.
PROMPT: Adesso scrivi la Scena 1...

Suggerimento pratico per il test: dopo ogni scena, chiedi al modello di produrre un mini-riassunto in 2 frasi e una lista di 3 elementi da ricordare per il turno successivo (questo è il tuo checkpoint).

7) Errori comuni e antidoti rapidi

  • Prompt troppo vago → aggiungi dettagli sul formato e sullo stile.
  • Troppe richieste in un’unica istruzione → spezzala in steps.
  • Perdita di contesto → usa riassunti/checkpoint.
  • Hallucination frequenti → chiedi “se non sei sicuro, scrivi ‘non so’ e proponi opzioni”.
  • Ripetitività → fornisci un esempio di frase o variazioni richieste.

8) Materiale pratico da lasciare ai partecipanti

  • Checklist rapida (da avere sempre):

    1. Specifica obiettivo e audience.
    2. Includi vincoli (tono, lunghezza, no-hallucination).
    3. Dividi in steps (outline → sviluppo → revisione).
    4. Prepara un context header e aggiorna ogni N turni.
    5. Usa meta-prompt per revisioni iterative.
    6. Richiedi checkpoint e memory check dopo ogni turno.
  • Esercizi suggeriti per casa:

    1. Ottimizzare un prompt di 3 frasi per una descrizione commerciale (A/B test).
    2. Creare una chain di 4 prompt per un tutorial tecnico.
    3. Implementare il ciclo ricorsivo su un articolo: genera → analizza → migliora → ri-genera.

martedì 25 novembre 2025

Corso di Prompt Engineering: Prompt per compiti diversi


Prompt per compiti diversi

🔹 1. Prompt per Scrittura e Revisione di Contenuti

Applicazioni:

  • Redazione automatica e assistita: articoli, post, email, relazioni
  • Correzione e riscrittura: miglioramento grammaticale, sintattico e stilistico

Esempi:

  • ✍️ “Scrivi un post di blog in stile ironico su come affrontare il lunedì mattina al lavoro.”
  • ✍️ “Rivedi il seguente testo per chiarezza e tono professionale.”

Suggerimenti:

  • Specificare stile, lunghezza, tono
  • Fornire esempi di output desiderato

🔹 2. Prompt per Compiti di Classificazione, Sintesi, Analisi, Estrazione

Applicazioni:

  • Estrazione di entità (NER), sintesi di documenti lunghi, classificazione testuale

Esempi:

  • 🗂️ “Classifica queste recensioni in ‘positive’, ‘neutre’ o ‘negative’.”
  • 📑 “Riassumi il seguente testo in 5 bullet point.”
  • 🔍 “Estrai i nomi di persona, organizzazioni e date dal testo.”

Suggerimenti:

  • Indicare con chiarezza il formato dell’output (es. lista, JSON, tabella)
  • Aggiungere vincoli e casi limite

🔹 3. Prompt per Costruzione di Flussi Multistep e Agenti Conversazionali

Concetti Chiave:

  • Prompt sequenziali (catene di pensiero)
  • Ruoli, memoria e stati conversazionali

Esempi:

  • 🤖 “Agisci come un coach motivazionale. Prima chiedi l'obiettivo della persona, poi fornisci un piano in 3 step, poi fai una domanda riflessiva.”
  • 🔁 Flusso per raccolta dati: “Chiedi nome, età, settore lavorativo, e poi fornisci consigli personalizzati.”

Tecniche:

  • “Few-shot prompting”: esempi multipli per indirizzare il comportamento
  • “Chain of Thought prompting”: far spiegare i passaggi mentali al modello

🔹 4. Prompt per Codice, Immagini e Multimodalità

Applicazioni:

  • Generazione di codice (Python, HTML, JS, ecc.)
  • Generazione immagini (con descrizione dettagliata)
  • Interazione multimodale: immagini + testo, audio + testo

Esempi:

  • 💻 “Scrivi una funzione in Python che ordina una lista di dizionari per valore decrescente.”
  • 🎨 “Genera un’immagine di un paesaggio post-apocalittico al tramonto, stile cyberpunk.”
  • 🧠 “Analizza l'immagine e suggerisci un titolo giornalistico.”

Modelli supportati:

  • GPT-4o (OpenAI): testo, codice, immagini, voce
  • Gemini 1.5 (Google): testo, immagini, PDF, tabelle, video frame

🛠️ Laboratorio – Costruzione di una Task Suite AI-Ready

Obiettivo: Realizzare un pacchetto di prompt strutturati per task reali, da usare con modelli LLM (GPT, Gemini, Claude, ecc.)

Attività:

  1. 🔧 Progetta 3 prompt per la scrittura: uno creativo, uno tecnico, uno per la revisione.
  2. 🧾 Crea una scheda di classificazione/sintesi: includi input testuali e output atteso.
  3. 🧠 Definisci un flusso multi-step: es. intervista utente → proposta → feedback.
  4. 💡 Sviluppa un prompt multimodale: da usare su GPT-4o o Gemini 1.5, con descrizione immagine + task.

Formato suggerito per ciascun prompt:

📌 **Nome del Task**: (es. Sintesi di articolo)
📥 **Input previsto**: (es. Testo da 500 parole)
🎯 **Output atteso**: (es. Riassunto in 5 righe)
🧠 **Prompt**: "Leggi il seguente testo e sintetizza i 3 punti principali..."


lunedì 24 novembre 2025

Corso di Prompt Engineering: Costruire prompt efficaci


Costruire prompt efficaci

✅ Prompt diretti vs indiretti

  • Prompt diretto: chiaro, esplicito, orientato all’output (Scrivi un riassunto del romanzo Il Gattopardo in 5 righe).
  • Prompt indiretto: costruisce contesto e ruolo prima della richiesta (Sei un insegnante di lettere che spiega Il Gattopardo a studenti delle superiori. Puoi proporre un riassunto efficace in 5 righe?).

🔍 Nota: i prompt indiretti sono spesso più efficaci per generare output contestualizzati, con tono e livello adeguati.

🧩 Componenti di un prompt efficace

Un prompt può essere scomposto in blocchi logici:

  • Istruzione: cosa vuoi che l’IA faccia?
  • Contesto: per chi? In quale situazione? Con quale ruolo?
  • Delimitatori: lunghezza, stile, struttura (in 3 punti, massimo 200 parole, usa un tono ironico)
  • Ruolo: fingi di essere un docente, uno psicologo, un game designer, ecc.

🛠 Esempio di prompt completo:
“Fingi di essere un copywriter esperto. Scrivi una descrizione prodotto per un profumo di lusso da 200 parole, tono elegante ma persuasivo, destinata a un pubblico femminile over 30.”

🔁 Strategie per richieste complesse

Quando la richiesta è articolata, servono tecniche avanzate:

  • Multi-pass prompting: prima ottieni una bozza, poi la perfezioni (“Scrivi la versione base → ora migliora la coesione → ora adatta lo stile a un lettore giovane”)
  • Prompt nesting: prompt dentro il prompt:
    “Scrivi una recensione come se fosse una lettera d’amore + in chiusura aggiungi una postilla polemica ironica”
  • Prompt progressivi: definizione di tappe intermedie (Prima spiegami la struttura della tragedia greca, poi usa quella struttura per scrivere una mini-opera in 3 atti)
  • Prompt-simulazione: chiedi all’IA di agire all’interno di un contesto simulato (“Fingi di essere uno storico romano durante l’eruzione del Vesuvio”)

🧱 Prompt modulari e composti

Costruire prompt a blocchi è il modo migliore per avere:

  • Controllo sull’output
  • Riutilizzabilità in contesti diversi
  • Personalizzazione per pubblico, tono, formato

Schema base di prompt modulare:

[Ruolo] + [Contesto] + [Istruzione] + [Delimitatori] + [Obiettivo]

✍️ Esempio modulare:
“Sei un docente universitario di filosofia (ruolo), stai preparando una lezione introduttiva su Kant per studenti del primo anno (contesto). Crea una spiegazione semplice ma rigorosa (istruzione), in massimo 300 parole e senza termini tecnici non spiegati (delimitatori), con l’obiettivo di suscitare curiosità per la critica della ragion pura (obiettivo).”

🧪 Esercizio pratico

Titolo: Dal vago al preciso
Obiettivo: migliorare un prompt iniziale generico attraverso riscritture progressive.

Fase 1 – Prompt iniziale (impreciso):

“Fammi una descrizione di una città del futuro.”

Fase 2 – Riscrivere il prompt in 5 versioni migliorative:

  1. Con ruolo e contesto:

    “Sei uno scrittore di fantascienza. Descrivi una città del futuro ambientata nell’anno 2500, dopo un disastro climatico globale.”

  2. Con stile e tono:

    “Descrivi una città del futuro come se fosse un articolo di viaggio per una rivista di architettura, con stile elegante e immaginifico.”

  3. Con delimitazioni tecniche:

    “In massimo 150 parole, descrivi una città futuristica evidenziando 3 innovazioni tecnologiche principali.”

  4. Con struttura narrativa:

    “Racconta una giornata tipo in una città del futuro dal punto di vista di un adolescente che ci vive.”

  5. Con obiettivo applicativo:

    “Descrivi una città del futuro progettata per ispirare un videogioco ambientato in un mondo sostenibile.”

📎 Materiali e strumenti

  • Esempi di prompt tratti da scenari reali (scuola, marketing, giornalismo, coding)
  • Fogli di lavoro per la progettazione guidata del prompt
  • Possibilità di utilizzare ChatGPT o strumenti simili per test live dei prompt scritti
  • Griglia di valutazione: chiarezza – contesto – ruolo – efficacia del risultato

 Conclusione

Scrivere prompt efficaci non è una formula magica, ma un processo di progettazione comunicativa. Un buon prompt è un ponte tra la nostra intenzione e la capacità dell’IA di interpretarla. In questo modulo si impara a costruire questo ponte con precisione, creatività e consapevolezza.


domenica 23 novembre 2025

Corso di Prompt Engineering: Fondamenti teorici


Fondamenti Teorici del Prompt Engineering

Durata: 2h
Obiettivo: Comprendere le basi concettuali che guidano il funzionamento dei modelli generativi per interagire in modo consapevole, strategico e replicabile.

🧠 1. Architettura e comportamento dei modelli generativi

▶️ Transformer Architecture

Tutti i LLM (Large Language Models) si basano sull’architettura Transformer, introdotta nel paper "Attention Is All You Need". Questa struttura utilizza:

  • Encoder-decoder (traduzione, sintesi)
  • Solo decoder (GPT, Claude, LLaMa): genera testo predicendo il token successivo in una sequenza.

▶️ Modelli principali a confronto

Modello Architettura Punto di forza Contesto max
GPT-3.5 Decoder-only Risposte rapide, buona sintesi ~4K token
GPT-4 Decoder-only Precisione, logica, stile narrativo fino a 128K token
Claude 3.5 Mixture of Experts Comprensione contestuale elevata, analisi documentale fino a 200K token
Mistral Decoder-only open source Adatto per local deployment fino a 32K token

📌 Esempio comparativo:

Prompt: "Spiega in tre righe il concetto di entropia per studenti di liceo."

  • GPT-3.5: Risposta semplice, talvolta generica.
  • GPT-4: Sintesi chiara + esempio.
  • Claude 3.5: Definizione + analogia quotidiana (es. "una stanza che si disordina da sola").

🌡️ 2. Parametri fondamentali del comportamento del modello

🔥 Temperature

Controlla il grado di casualità:

  • Bassa (0.1–0.3): risposte più logiche, prevedibili.
  • Alta (0.7–1.0): più creative, variabili.

🧪 Esempio:
Prompt: “Completa: Il tempo è...”

  • Temp 0.2: “una dimensione che misura il cambiamento”
  • Temp 0.9: “un fiume invisibile che ci trasporta verso l’ignoto”

🎲 Top-p (nucleus sampling)

Invece di scegliere tra tutte le parole possibili, si limita la scelta al "nucleo" delle opzioni più probabili (es. 90%).

🧮 Tokenizzazione

Un token è un’unità di linguaggio (una parola, parte di parola o simbolo).
Esempio: la frase "Prompt Engineering è una competenza emergente" può essere tokenizzata in ~8-12 token.

📌 Limiti di token determinano la finestra contestuale: GPT-3.5 (4K), GPT-4 (8K–128K), Claude 3.5 (200K).

⚠️ 3. Bias, allucinazioni e overfitting contestuale

🧠 Bias

I modelli apprendono dai dati. Se i dati sono sbilanciati (per genere, etnia, lingua, cultura), anche le risposte lo saranno.

🧪 Esempio:
Prompt: “Scrivi una fiaba con protagonista un ingegnere”

  • Tendenza a usare “lui” come pronome predefinito → Bias di genere

🧠 Allucinazioni

Generazione di contenuti falsi con tono sicuro.

  • Esempio: citazioni inventate, riferimenti bibliografici inesistenti.

💡 Prevenzione:

  • Prompt specifici (“solo se verificato”)
  • Controllo incrociato umano

🔁 Overfitting contestuale

Succede quando il modello inizia a imitare troppo il contesto precedente, perdendo varietà.

🧪 Esempio:
In una lunga conversazione su Kant, ogni risposta inizia con “Secondo Kant…”

🧪 4. Modalità di prompting: Zero-shot, Few-shot, Chain-of-Thought

Zero-shot prompting

Il modello agisce senza esempi.

Prompt: “Scrivi un invito formale per una mostra fotografica.”

📌 Utile per task semplici.
Rischio: interpretazioni vaghe.

🔵 Few-shot prompting

Si forniscono 1-3 esempi per “istruire” il modello sul formato atteso.

Prompt:
“Esempio 1:…”
“Esempio 2:…”
“Ora scrivi il tuo:…”

📌 Ottimo per coerenza stilistica o quando si vogliono riprodurre pattern specifici (formati, rubriche, headline…).

🔁 Chain-of-Thought prompting

Si guida il modello passo passo, chiedendogli di “pensare ad alta voce”.

Prompt:
“Risolvi questo problema di logica e spiega ogni passaggio…”

📌 Utile per compiti complessi: matematica, logica, scelte argomentative.
Migliora la trasparenza del ragionamento.

🔬 ATTIVITÀ: Analisi comparativa GPT-3.5, GPT-4, Claude 3.5

✏️ Prompt:

“Spiega perché la luce si comporta sia come onda che come particella, in 4 frasi chiare per studenti liceali.”

Modello Output Note
GPT-3.5 Buona spiegazione, ma poco approfondita ✔️
GPT-4 Ottima chiarezza + metafora intuitiva 🌟
Claude 3.5 Precisa, con linguaggio accessibile e analogia 🌟

🔍 Analizza lessico, logica espositiva, coerenza concettuale.
📈 Valuta quale modello produce contenuti didattici più adatti al tuo target.

🧭 Conclusione del modulo

✔ Hai esplorato come “parla” l’AI, quali sono le sue variabili di comportamento, come si può guidarla con maggiore efficacia.
Nel prossimo modulo, costruiremo prompt strategici e multilivello sfruttando questi fondamenti.


sabato 22 novembre 2025

Corso di Informazione Quantistica: 6 Settori Quantizzabili e Applicazioni Industriali


🎓 6 Settori Quantizzabili e Applicazioni Industriali

🎯 Obiettivi Formativi

  • Analizzare i principali settori in cui la computazione quantistica sta trovando applicazione concreta.
  • Comprendere le sfide tecniche ed etiche legate all’adozione industriale dei dispositivi quantistici.
  • Sviluppare una visione critica e propositiva sul futuro della tecnologia quantistica nei settori produttivi.
  • Stimolare il pensiero progettuale attraverso attività pratiche e progetti teorici.

📚 Contenuti Didattici

🧠 Criptovalute e Sicurezza Post-Quantistica

  • Come un computer quantistico potrebbe rompere RSA (fattorizzazione veloce tramite algoritmo di Shor).
  • Implicazioni sulle firme digitali, blockchain, crittografia simmetrica.
  • Introduzione a schemi crittografici resistenti ai quanti (lattice-based, hash-based, code-based).
  • Organizzazioni coinvolte nella standardizzazione (es. NIST PQC Project).

🧪 Farmaceutica e Medicina

  • Simulazioni quantistiche di molecole complesse per prevedere l’efficacia di nuovi farmaci.
  • Riduzione drastica dei tempi di scoperta grazie alla chimica quantistica computazionale.
  • Uso di quantum annealing per problemi di ottimizzazione in medicina personalizzata.
  • Esempi: studi su proteine, legami chimici, materiali bio-compatibili.

💸 Finanza

  • Ottimizzazione dei portafogli d’investimento (algoritmi quantistici per problemi NP-Hard).
  • Simulazioni Monte Carlo quantistiche per valutazione dei rischi e pricing di opzioni.
  • Riconoscimento pattern e previsioni di mercato mediante machine learning quantistico.
  • Case studies: Goldman Sachs, JP Morgan, D-Wave for finance.

Energia

  • Simulazioni di materiali per batterie avanzate, superconduttori e celle solari.
  • Ottimizzazione delle reti intelligenti (smart grid) con calcoli più rapidi e precisi.
  • Calcolo delle strategie di distribuzione e accumulo energetico in tempo reale.
  • Collaborazioni attive: ExxonMobil, TotalEnergies, IBM Quantum Energy Initiative.

🚛 Logistica e Trasporti

  • Risoluzione di problemi combinatori come il commesso viaggiatore (TSP) o routing dinamico.
  • Ottimizzazione multi-agente per la gestione della flotta e della supply chain.
  • Integrazione con reti neurali quantistiche per analisi predittiva della domanda.
  • Progetti pilota con Volkswagen, DHL, Airbus.

🔬 Materiali e Chimica

  • Studio di nuovi materiali attraverso la meccanica quantistica simulata.
  • Ottimizzazione delle reazioni chimiche e creazione di molecole su misura.
  • Applicazioni in settori come elettronica flessibile, aerospazio, bioingegneria.

📡 Telecomunicazioni

  • Sviluppo di reti quantistiche resilienti per la trasmissione ultra-sicura dei dati.
  • Integrazione della crittografia quantistica (QKD) nei sistemi di comunicazione.
  • Esperimenti su teletrasporto quantistico dell’informazione e distribuzione entangled.

🧭 Approfondimenti Tematici

🛠️ Roadmap Industriale

  • IBM Quantum: roadmap verso i 100.000 qubit entro il 2033.
  • Google Quantum AI: Sycamore, Beyond Classical Computing.
  • D-Wave: Quantum Annealing per casi industriali reali.
  • Airbus: Quantum Challenge per ottimizzazione del design e manutenzione predittiva.
  • Altri player: Honeywell, IonQ, Xanadu.

🧪 Piattaforme Open Source

  • Qiskit (IBM): programmazione circuitale su QASM e Python.
  • Cirq (Google): framework per simulazioni gate-based.
  • PennyLane (Xanadu): libreria per machine learning quantistico.
  • Ocean (D-Wave): interfacce per annealer quantistici.

🧪 Attività Pratiche e Progetti

🧩 Progetto Finale

  • Scelta di un settore industriale tra quelli analizzati.
  • Ideazione di una soluzione quantistica teorica per un problema reale.
  • Descrizione del problema, della strategia, e degli algoritmi ipotizzati.
  • Eventuale modellazione su simulatore (Qiskit/Cirq).

🔍 Ricerca su Startup Quantistiche

  • Ogni gruppo o studente individua una startup o spin-off universitaria impegnata nel settore quantistico.
  • Presentazione del modello di business, delle tecnologie usate e delle sfide affrontate.
  • Esempi: PsiQuantum, Zapata Computing, Rigetti, QuEra, Terra Quantum.

🧾 Output Didattici Attesi

  • Comprensione concettuale dei principi base della computazione quantistica.
  • ✅ Capacità di leggere criticamente articoli e white paper sulle applicazioni industriali.
  • ✅ Sviluppo di un vocabolario tecnico appropriato per descrivere algoritmi e tecnologie quantistiche.
  • ✅ Produzione di elaborati scritti e presentazioni su casi di studio reali o ipotetici.
  • ✅ Attitudine all’analisi comparata delle diverse soluzioni tecnologiche disponibili.

💡 Valorizzazione interdisciplinare

Questo modulo permette di incrociare fisica, matematica, informatica, chimica, etica dell’innovazione, economia, con una prospettiva sempre orientata alla soluzione di problemi concreti. È fortemente consigliato come modulo conclusivo o di sintesi in un percorso STEM o STEAM.



giovedì 20 novembre 2025

Corso di Informazione Quantistica: 5 Applicazioni Avanzate

 


🔬 5 Applicazioni Avanzate – Quantum AI e Sensoristica


📌 Quantum AI e Quantum Machine Learning (QML)
La Quantum AI è una nuova frontiera che integra le potenzialità dell’informatica quantistica con gli algoritmi dell’intelligenza artificiale. Nel QML, i dati classici vengono trasformati in stati quantistici attraverso operazioni matematiche complesse. I principali vantaggi includono la possibilità di gestire enormi spazi di stato in parallelo grazie al principio della sovrapposizione.
Esempi di modelli QML includono: Quantum Support Vector Machines e Quantum k-Nearest Neighbors, che possono superare le prestazioni classiche in problemi di classificazione, ottimizzazione e apprendimento non supervisionato.

🧠 Quantum Neural Networks (QNN)
Le QNN sono reti neurali costruite con porte quantistiche, in cui i pesi e le attivazioni si basano su stati quantistici. A differenza delle reti classiche, qui non c’è un flusso lineare di segnali, ma una manipolazione coerente di qubit.
Il training avviene con gradienti quantistici (quantum backpropagation), e le architetture possono sfruttare entanglement e interferenza per migliorare l’efficienza del modello.

🔐 Protocolli di Sicurezza Quantistica – BB84 ed E91
Il protocollo BB84 è il primo schema pratico di distribuzione di chiavi quantistiche (QKD), in cui due utenti condividono una chiave segreta utilizzando qubit polarizzati. Il suo punto di forza è che eventuali intercettazioni modificano lo stato dei qubit, segnalando la presenza dell'intruso.
Il protocollo E91, invece, si basa sull’entanglement. I qubit entangled vengono condivisi tra due utenti, e le correlazioni nei risultati delle misurazioni permettono di costruire la chiave in sicurezza. E91 garantisce anche resistenza contro attacchi sofisticati (come la manomissione del canale quantistico).

🛰 Quantum Sensing
La sensoristica quantistica sfrutta fenomeni quantistici per ottenere misurazioni ultra-precise. Strumenti come:

  • Orologi atomici: misurano il tempo con precisione dell’ordine dei miliardesimi di secondo, fondamentali per il GPS.
  • Magnetometri quantistici: rilevano campi magnetici debolissimi, utilizzati in ambito medico (MEG) e militare.
  • Gravimetri quantistici: permettono di mappare il sottosuolo rilevando minime variazioni del campo gravitazionale.
Questi strumenti trovano applicazione in medicina (risonanze magnetiche ultra-sensibili), geologia (prevenzione di terremoti) e aerospazio (navigazione autonoma di sonde spaziali).

💡 Quantum-Enhanced Learning
L’AI potenziata dal calcolo quantistico può risolvere problemi prima inaccessibili. Alcuni esempi:

  • Ottimizzazione di processi industriali in tempo reale
  • Simulazioni molecolari per progettazione di farmaci
  • Riconoscimento di pattern complessi in big data biologici o finanziari
L’uso dei qubit permette di affrontare queste sfide con meno memoria e maggiore rapidità.

🧪 Attività Svolte

  • Progettazione concettuale di un sistema QML per il riconoscimento facciale quantistico.
  • Costruzione di una mappa concettuale che collega i tipi di sensori quantistici alle loro applicazioni reali.

📊 Test Interattivo – Verifica le tue conoscenze!

mercoledì 19 novembre 2025

Corso di Informazione Quantistica: 4 Sicurezza e Privacy nella QIT


🔐4 Sicurezza e Privacy nella Quantum Information Technology (QIT)

Caratteristiche della sicurezza quantistica

La sicurezza quantistica si basa su principi fisici unici come l'irreversibilità delle operazioni quantistiche, la non clonabilità degli stati quantistici (Teorema di No-Cloning) e la capacità di rilevare l’intercettazione tramite l’effetto osservatore. Questi aspetti rendono la comunicazione quantistica potenzialmente inviolabile, differenziandola dalla crittografia classica.

Architetture hardware sicure per la QIT

I sistemi hardware per QIT integrano trasmettitori quantistici, rivelatori di fotoni singoli e canali quantistici criptati. Il design include meccanismi anti-manomissione e tecniche di isolamento per garantire che l’informazione quantistica non venga compromessa.

Ruolo dei certificati quantistici e dell’identità quantica

L’identità quantica e i certificati quantistici rappresentano un’evoluzione della gestione delle credenziali digitali. Questi strumenti permettono l’autenticazione sicura e non contraffabile di dispositivi e utenti, fondamentali per reti quantistiche affidabili.

Approfondimenti

  • Comparazione con crittografia classica e post-quantistica: la crittografia quantistica non si basa su problemi matematici difficili, ma su principi fisici, offrendo potenziale sicurezza a prova di computer quantistici.
  • Analisi delle vulnerabilità teoriche e reali: benché teoricamente sicura, la QIT deve affrontare sfide pratiche come errori hardware, attacchi side-channel e limiti tecnologici.

Attività pratiche

  • Simulazione di attacco intercettato: studia come l’intercettazione quantistica altera lo stato e viene rilevata.
  • Workshop su privacy quantistica e identità digitale: discuti casi d’uso e sfide per l’implementazione reale.

🧪 Test interattivo – Metti alla prova le tue conoscenze!

1. Quale principio rende impossibile copiare perfettamente uno stato quantistico?



2. In una rete quantistica, cosa permette di rilevare un eventuale attacco di intercettazione?



3. Quale tra questi non è un componente hardware tipico della QIT?



💬 Riflessione finale

La sicurezza e la privacy nella Quantum Information Technology rappresentano un paradigma completamente nuovo, che sfida le nostre idee tradizionali di protezione dei dati. Come pensi che queste tecnologie influenzeranno la nostra vita quotidiana e la gestione delle informazioni sensibili? Scrivi nei commenti o contattaci per approfondire!

martedì 18 novembre 2025

Corso di Informazione Quantistica: 3 Tecnologie e Reti Quantistiche


3 Tecnologie e Reti Quantistiche

🎯 Obiettivi del modulo

  • Comprendere le basi delle reti quantistiche e delle loro applicazioni.
  • Conoscere le problematiche principali legate a decoerenza e correzione degli errori.
  • Esplorare le potenzialità del teletrasporto quantistico e della computazione distribuita.
  • Stimolare la riflessione critica su scenari futuri e impatti tecnologici.

📘 Contenuti didattici

🔹 1. Teletrasporto quantistico avanzato

  • Definizione: Trasferimento istantaneo dell’informazione quantistica (qubit) da un luogo all’altro, usando entanglement e comunicazione classica.
  • Schema base:
    • Due entità condividono una coppia di qubit entangled.
    • Un terzo qubit (da teletrasportare) viene misurato assieme a uno dei qubit entangled.
    • L'esito viene comunicato e applicato per ricostruire il qubit originale sull'altro estremo.
  • Applicazioni:
    • Reti quantistiche sicure.
    • Comunicazione tra nodi remoti di un computer quantistico.

🧪 Esempio:
Nel 2020, in un esperimento condotto tra Caltech e NASA, il teletrasporto quantistico è stato eseguito con successo per oltre 40 chilometri su fibra ottica.


🔹 2. Reti quantistiche distribuite

  • Concetto: Sistemi in cui più computer quantistici (nodi) sono connessi per scambiarsi e sincronizzare qubit.
  • Obiettivo: Creare una Quantum Internet con trasmissione sicura, distribuzione di chiavi quantistiche, e calcolo distribuito.
  • Funzionalità:
    • Connessione tramite canali entangled.
    • Comunicazione senza violazione del principio della relatività.
    • Sincronizzazione temporale quantistica.

🔹 3. Decoerenza quantistica

  • Definizione: Perdita delle proprietà quantistiche (es. sovrapposizione, entanglement) per effetto dell’ambiente esterno.
  • Cause principali:
    • Rumore termico
    • Interferenze elettromagnetiche
    • Vibrazioni meccaniche
  • Effetto pratico:
    • Dati imprecisi
    • Qubit che si comportano come bit classici

🔹 4. Mitigazione degli errori

  • Tecniche hardware:
    • Criogenia per mantenere ambienti stabili (es. 0,01 K).
    • Isolamento magnetico e acustico.
  • Correzione degli errori:
    • QEC – Quantum Error Correction: logiche matematiche per rilevare e correggere errori senza misurare direttamente lo stato.
    • Codici di superficie, codici Shor, ecc.

🔬 Approfondimenti

🧱 Architetture per computazione quantistica distribuita

  • Sistemi client-server quantistici.
  • Reti a topologia mesh, ad albero, ibrida.
  • Coordinamento tra memorie quantistiche e interfacce fotoniche.

📶 Scalabilità e sincronizzazione

  • Problema chiave: gestire milioni di qubit distribuiti senza perdita di entanglement.
  • Tecnologie emergenti:
    • Interfacce quantistiche-fotoniche
    • Ripetitori quantistici per rigenerare entanglement su lunghe distanze

🛠️ Attività didattiche

📌 1. Caso studio: la rete quantistica olandese (QUTE-NET)

  • Analisi guidata:
    Leggi un abstract sull’esperimento QUTE-NET e rispondi:
    • Come è stato mantenuto l'entanglement tra i nodi?
    • Quali protocolli sono stati utilizzati per il teletrasporto?

📌 2. Brainstorming & discussione

  • Tema: Come immagini l’utilizzo quotidiano di una rete quantistica nel 2035?
  • Discussione in gruppo su possibili impatti sociali, etici e tecnologici.
  • Presentazione orale finale.

Test di verifica (quiz interattivo)

1. Cos'è il teletrasporto quantistico?
A. Spostamento fisico istantaneo di particelle
B. Trasferimento dell’informazione quantistica tramite entanglement ✅
C. Scambio di pacchetti binari
D. Duplicazione di qubit senza perdita


2. Qual è lo scopo della correzione degli errori quantistici?
A. Rilevare virus nei computer
B. Ottimizzare la velocità di internet
C. Mantenere la coerenza dei qubit ✅
D. Aumentare la memoria del computer


3. Cosa causa la decoerenza?
A. Energia quantistica troppo elevata
B. Interazione con l’ambiente esterno ✅
C. Velocità eccessiva del calcolo
D. Uso improprio del codice


4. Quale tecnologia è necessaria per le reti quantistiche a lunga distanza?
A. Router quantistici
B. Ripetitori quantistici ✅
C. Cavi coassiali
D. Sensori neurali


📎 Conclusione

Questo modulo aiuta gli studenti a sviluppare una visione d’insieme su reti quantistiche, problemi reali come la decoerenza e le architetture distribuite, stimolando anche il pensiero progettuale e l’etica 


lunedì 17 novembre 2025

Corso di Informazione Quantistica: 2 Protocolli di Comunicazione Quantistica


🧩 MODULO 2 – Protocolli di Comunicazione Quantistica

🎯 Obiettivi del modulo:

  • Comprendere i principali protocolli della comunicazione quantistica.
  • Analizzare i principi dell'entanglement e della misurazione.
  • Progettare e verificare semplici comunicazioni quantistiche sicure.
  • Simulare scenari di attacco e valutare i limiti.

📚 Contenuti Teorici

1. Protocollo di Teletrasporto Quantistico

  • Cos'è: trasferire lo stato quantistico di una particella A a una particella B distante, senza trasferire fisicamente la particella.
  • Come funziona:
    1. Due utenti (Alice e Bob) condividono una coppia di qubit entangled.
    2. Alice combina il qubit da teletrasportare con il suo qubit entangled e li misura.
    3. Invia via canale classico il risultato a Bob.
    4. Bob applica una trasformazione al suo qubit, che ora assume lo stato iniziale del qubit di Alice.
  • Implicazioni: Nessuna violazione della relatività, nessuna trasmissione più veloce della luce.

2. Distribuzione Quantistica della Chiave (QKD) – Protocollo BB84

  • Scopo: permettere a due parti (Alice e Bob) di generare una chiave segreta condivisa con sicurezza assoluta, rilevando eventuali intercettazioni.
  • Fasi principali:
    1. Alice invia fotoni polarizzati a Bob in basi casuali.
    2. Bob misura con basi casuali.
    3. Alice e Bob comunicano (canale classico) le basi usate.
    4. Eliminano i bit ottenuti con basi diverse.
    5. Ottengono la chiave condivisa.
  • Sicurezza: Basata sul principio che la misurazione altera lo stato quantistico → ogni tentativo di intercettazione è rilevabile.

3. Superdense Coding

  • Utilizzo: trasmissione di 2 bit classici tramite un solo qubit.
  • Schema:
    • Alice e Bob condividono qubit entangled.
    • Alice applica un'operazione sul suo qubit in base ai 2 bit da trasmettere.
    • Lo invia a Bob.
    • Bob misura l’intero sistema e ricava i 2 bit.
  • Vantaggio: raddoppio della capacità informativa per canali quantistici.

4. Codici di correzione degli errori

  • Problema: i qubit sono soggetti a decoerenza e rumore.
  • Codici principali:
    • Codice di Shor: usa 9 qubit per codificare 1 qubit logico → corregge errore bit-flip e phase-flip.
    • Codice di Steane: schema a 7 qubit → più efficiente del codice di Shor.
  • Concetto chiave: la ridondanza quantistica consente il recupero dell’informazione anche dopo errori.

🔍 Approfondimenti

🔬 Il ruolo della misurazione

  • La misurazione collassa lo stato del qubit.
  • In protocolli come QKD, è essenziale per rilevare la presenza di un eavesdropper (Eve).

🧬 Entanglement

  • Il cuore della comunicazione quantistica.
  • Due particelle entangled condividono un destino comune anche se distanti → qualsiasi cambiamento in una influenza l’altra.

🧨 Attacchi comuni

  • Intercept-Resend: Eve misura e rimanda un nuovo fotone → ma la misurazione altera lo stato e viene rilevata.
  • Man-in-the-middle: si interpone tra Alice e Bob → richiede protezione anche del canale classico.

🧪 Attività

Attività 1: Ricostruzione passo-passo del BB84

  • Utilizza una tabella per simulare le scelte di basi e misure:
| Bit di Alice | Base di Alice | Polarizzazione inviata | Base di Bob | Risultato |
|--------------|----------------|-------------------------|-------------|-----------|
|      1       |      +         |           ↔            |     +       |     1     |
|      0       |      ×         |           ↙            |     +       |    ?      |
  • Elimina righe dove le basi sono diverse → ottieni la chiave.

Attività 2: Progetta un protocollo

  • Obiettivo: creare un protocollo sicuro per trasmettere 1 qubit.
  • Passaggi:
    1. Scegli come preparare l’entanglement.
    2. Definisci canale classico e quantistico.
    3. Prevedi un test di rilevamento errori o intercettazioni.
    4. Concludi con recupero dell’informazione finale.

🧠 Test di Verifica

DOMANDE A RISPOSTA MULTIPLA

  1. Qual è la caratteristica dell'entanglement? A. Crea rumore nel sistema
    B. Condivide lo stesso stato tra due particelle anche a distanza
    C. Aumenta la massa dei fotoni
    D. Permette di leggere due qubit contemporaneamente

  2. Nel BB84, cosa accade se Bob usa una base diversa da Alice? A. Ottiene un bit sicuro
    B. Il bit è sempre 0
    C. Il bit può essere errato → viene scartato
    D. Il sistema si resetta

  3. Il codice di Shor serve per: A. Migliorare la velocità della comunicazione
    B. Trasformare qubit in bit classici
    C. Correggere errori quantistici
    D. Rendere invisibili i qubit

  4. Superdense coding permette: A. Di comprimere un file .zip
    B. Di inviare 2 bit classici con 1 qubit
    C. Di duplicare un qubit
    D. Di misurare senza alterare

  5. Il teletrasporto quantistico: A. Viola la relatività
    B. Copia perfettamente i qubit
    C. Distrugge l’informazione originale
    D. Usa una coppia entangled e un canale classico

✅ RISPOSTE

  1. B
  2. C
  3. C
  4. B
  5. D



Corso Fondamenti di Informatica e Reti: 4 Architettura del computer

  ARCHITETTURA DEL COMPUTER come funziona davvero una macchina Capire un computer non significa solo saperlo accendere o aprire file: die...