[{"content":"In questo articolo provo a raccontare come ho sviluppato il mio primo gioco in Godot con il supporto dell\u0026rsquo;IA.\nRoots and Roads by Antonio Cos’è Godot? Godot è un game engine open source rilasciato sotto licenza MIT, la cui prima versione pubblica risale al 2014. Con Godot è possibile creare giochi in 2D e 3D per diverse piattaforme (Web, Windows, macOS, Android, iOS), e l\u0026rsquo;editor stesso funziona su Windows, macOS e Linux.\nScelte L\u0026rsquo;idea di creare un videogioco risale a qualche anno fa, ma non si era mai concretizzata fino a oggi. L\u0026rsquo;avvento dell\u0026rsquo;IA ha sicuramente contribuito in maniera sostanziale perché, nonostante il mio background da sviluppatore software, non avevo mai scritto una sola riga di codice in un game engine. Niente di presentabile, almeno!\nDal mio punto di vista, quindi, usare Godot e imparare GDScript (che riprende diverse caratteristiche di Python, che già conosco) era la scelta più ovvia, se non altro per riuscire a capire senza troppa fatica il codice generato dal mio fedele assistente artificiale. Il 2D e la pixel art, invece, sono stati scelti soprattutto perché non volevo creare niente di troppo complesso né di troppo difficile da pubblicare; ma ci arriveremo più avanti.\nDopo aver esplorato diverse idee, alcune delle quali sono ancora in cantiere, sono arrivato a un cosiddetto (o almeno così mi hanno detto! :D) \u0026ldquo;cozy\u0026rdquo; game, ovvero, come dice Wikipedia, un\nvideogioco progettato per offrire un\u0026rsquo;esperienza rilassante, a basso tasso di stress e priva di punizioni severe o competizione.\nEsattamente il tipo di gioco di cui avevo bisogno.\nSul perché abbia scelto di pubblicarlo su itch.io, beh, la risposta è piuttosto semplice: itch.io permette di pubblicare giochi come il mio in modo completamente gratuito! Sul perché abbia scelto di non monetizzarlo, beh, è solo il mio primissimo gioco: né alla prima build né adesso ho davvero idea di cosa significhi pubblicare un gioco a pagamento e, sinceramente, in questa fase non ho voglia di complicarmi la vita con la burocrazia fiscale italiana.\nClaude Code Inizialmente avevo deciso di procedere alla vecchia maniera, scrivendo il codice per conto mio e senza l\u0026rsquo;aiuto dell\u0026rsquo;IA.\nHo creato il progetto, ho realizzato un primo scorcio di \u0026ldquo;mondo\u0026rdquo; e definito l\u0026rsquo;autotiling, poi ho creato il player e l\u0026rsquo;ho animato.\nA quel punto mi sono reso conto di non avere ancora la più pallida idea di come funzionasse davvero il game loop, di come gestire i salvataggi e, cosa non meno importante, di come generare tutte le risorse grafiche di cui avevo bisogno (certo, su itch.io se ne trovano di gratuite, ma quanto tempo ci avrei messo? E avrei trovato tutto quello che mi serviva?).\nIn questo Claude mi è stato davvero utile. Non solo si è fatto carico di tutto il lavoro di scrittura del codice ma, grazie al server MCP di PixelLab, è anche riuscito a generare diverse risorse grafiche che altrimenti non avrei trovato.\nLa primissima iterazione con Claude è servita a definire il progetto (funzionalità e game loop in primis) e una roadmap: cosa fare subito e cosa lasciare per dopo, cosa mettere nella v1 e cosa invece poteva mancare, e così via. Una volta definito il \u0026ldquo;piano d\u0026rsquo;attacco\u0026rdquo;, è iniziato lo sviluppo vero e proprio, che si è distribuito su un periodo di circa un mese.\nL\u0026rsquo;IA non è stata fondamentale solo per scrivere il codice ma, soprattutto, per avere una visione d\u0026rsquo;insieme del gioco e per mantenere un certo livello di coerenza tra le mie varie richieste.\nIl gioco Il gioco inizia con il player che spawna in un punto casuale di una mappa generata proceduralmente. La mappa è tutta da sbloccare, un\u0026rsquo;area alla volta, e per farlo il player dovrà \u0026ldquo;sudare\u0026rdquo;: abbattere alberi e usare i tronchi ottenuti come moneta per \u0026ldquo;acquistare\u0026rdquo; nuove aree.\nSi parte quindi con una sorta di fase di tutorial, con una serie di obiettivi pensati apposta per insegnare le varie meccaniche del gioco.\nIl giocatore dovrà farmare legna e minerali (pietra, ferro, oro, cristalli) e otterrà una ricompensa per ciascun obiettivo raggiunto.\nPer il resto, preferisco non fare spoiler! :D\nCosa ho imparato? Prima di tutto, che creare un gioco anche semplice come il mio è già di per sé parecchio complicato ma, soprattutto, molto diverso dal creare software come ho sempre fatto. Il codice in sé non è complicatissimo, ma ci sono tantissime dinamiche che devo ancora capire a fondo, come ad esempio l\u0026rsquo;autotiling e come migliorarlo (perché sì, c\u0026rsquo;è qualcosa che non mi torna!). In generale spero di aver imparato abbastanza, soprattutto su come si lavora con Claude, per fare qualcosa di meglio in futuro, sia aggiornando questo gioco sia con quelli che eventualmente verranno.\n","permalink":"https://antoniomontemurro.com/it/posts/godot-roots-and-roads/","summary":"\u003cp\u003eIn questo articolo provo a raccontare come ho sviluppato il mio primo gioco in \u003cstrong\u003e\u003ca href=\"https://godotengine.org/\"\u003eGodot\u003c/a\u003e\u003c/strong\u003e con il supporto dell\u0026rsquo;IA.\u003c/p\u003e\n\u003cdiv class=\"itch-embed\"\u003e\n  \u003ciframe src=\"https://itch.io/embed/5101756?bg_color=321f23\u0026fg_color=f4e4c4\"\n    width=\"552\" height=\"167\" loading=\"lazy\" title=\"Roots and Roads by Antonio\"\u003e\n    \u003ca href=\"https://zaionmt.itch.io/roots-and-roads\"\u003eRoots and Roads by Antonio\u003c/a\u003e\n  \u003c/iframe\u003e\n\u003c/div\u003e\n\n\u003cp\u003e\u003cimg alt=\"logo_vertical_color_light.png\" loading=\"lazy\" src=\"/img/godot-roots-and-roads/logo_vertical_color_light.png\"\u003e\u003c/p\u003e\n\u003ch2 id=\"cosè-godot\"\u003eCos’è Godot?\u003c/h2\u003e\n\u003cp\u003eGodot è un \u003cstrong\u003e\u003ca href=\"https://it.wikipedia.org/wiki/Motore_grafico\"\u003egame engine\u003c/a\u003e\u003c/strong\u003e open source rilasciato sotto licenza \u003cstrong\u003e\u003ca href=\"https://it.wikipedia.org/wiki/Licenza_MIT\"\u003eMIT\u003c/a\u003e\u003c/strong\u003e, la cui prima versione pubblica risale al 2014.\nCon Godot è possibile creare giochi in 2D e 3D per diverse piattaforme (Web, Windows, macOS, Android, iOS), e l\u0026rsquo;editor stesso funziona su Windows, macOS e Linux.\u003c/p\u003e","title":"Godot - Roots \u0026 Roads"},{"content":"In questo articolo scoprirai cos’è YOLO e come utilizzarlo per analizzare un video, riconoscere e contare le persone presenti al suo interno. Vedremo come scrivere un semplice script in Python, configurabile, che consente di scegliere la sorgente video più adatta alle proprie esigenze.\nCos’è YOLO? YOLO (You Only Look Once) è un algoritmo di object detection in tempo reale basato su reti neurali.\nIn parole semplici, YOLO analizza ogni frame di un video (che sia un file o un flusso da webcam/IP camera) per identificare oggetti come persone, veicoli, animali e molto altro.\n🔗 Per un approfondimento su YOLO, puoi consultare questo link.\nCos’è OpenCV? OpenCV (Open Source Computer Vision Library) è una libreria open-source originariamente sviluppata da Intel, il cui scopo principale è facilitare l’elaborazione delle immagini e la computer vision.\nGrazie a OpenCV, possiamo elaborare un flusso video aggiungendo informazioni visive sugli oggetti riconosciuti, come ad esempio disegnare riquadri attorno alle persone rilevate da YOLO.\n🔗 Per maggiori dettagli su OpenCV, visita questo link.\nCos’è Python? Python è uno dei linguaggi di programmazione più diffusi al mondo. Semplice, potente e molto utilizzato nei settori del machine learning, della data analysis e dell’intelligenza artificiale.\n🔗 Abbiamo già parlato di Python in questo articolo.\nL’idea L’obiettivo di questo progetto è iniziare a esplorare il mondo dell’intelligenza artificiale in modo semplice e pratico, realizzando un primo esperimento concreto con YOLO e OpenCV.\nCosa serve Per questo progetto ho utilizzato\nPython 3.12.6 Yolo 8.3.169 OpenCV 4.12.0.88 GPU Nvidia GeForce RTX 3060TI Il codice Lo script è stato progettato per permettere all’utente di configurare i seguenti parametri:\nSelezione del modello YOLO da utilizzare Scelta della sorgente video (file locale, webcam, URL IP) Abilitazione o meno della GPU In base alle impostazioni scelte, possono cambiare le prestazioni e la fluidità del video risultante. Una volta configurati i parametri iniziali, lo script scarica automaticamente il modello YOLO richiesto.\nLa parte principale del codice è contenuta nel file cv_player.py.\nInizializzazione della finestra di output Vengono lette le dimensioni del flusso video:\nframe_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) E viene recuperato il numero di fotogrammi al secondo:\nframes_per_second = int(cap.get(cv2.CAP_PROP_FPS)) Analisi e tracciamento Per ogni frame letto, si esegue il riconoscimento:\nresults = model(img, stream=True, device=selected_device) Dai risultati è possibile individuare le coordinate per disegnare un box attorno agli oggetti rilevati. Inoltre, lo script utilizza la libreria deep_sort_realtime per assegnare a ogni persona rilevata un ID univoco, utile per il tracciamento nel tempo:\ntracker = DeepSort(max_age=frames_per_second) Visualizzazione Infine, viene aggiornato il frame con le informazioni rilevate:\ncvzone.putTextRect(img, f\u0026#39;ID: {track_id}\u0026#39;, (x1, max(30, y1 - 10)), scale=1, thickness=1) cvzone.putTextRect(img, f\u0026#34;Detected {len(unique_ids)} unique people\u0026#34;, (15, 25), scale=0.75, thickness=1) cv2.imshow(\u0026#34;main\u0026#34;, img) Conclusioni Questo è stato il mio primo esperimento con YOLO, OpenCV e il riconoscimento di oggetti tramite intelligenza artificiale.\nSpero in futuro di poter aggiungere ulteriori funzionalità a questo script, oppure crearne di nuovi per esplorare ancora più a fondo il mondo della computer vision.\n🔗 Per il codice completo puoi cliccare su questo link.\n💬 Hai suggerimenti o domande? Lascia pure un commento qui sotto!\n","permalink":"https://antoniomontemurro.com/it/posts/yolo-opencv-python-contare-persone/","summary":"\u003cp\u003eIn questo articolo scoprirai cos’è YOLO e come utilizzarlo per analizzare un video, riconoscere e contare le persone presenti al suo interno. Vedremo come scrivere un semplice script in Python, configurabile, che consente di scegliere la sorgente video più adatta alle proprie esigenze.\u003c/p\u003e\n\u003ch2 id=\"cosè-yolo\"\u003eCos’è YOLO?\u003c/h2\u003e\n\u003cp\u003eYOLO (You Only Look Once) è un algoritmo di \u003cstrong\u003eobject detection in tempo reale\u003c/strong\u003e basato su reti neurali.\u003cbr\u003e\nIn parole semplici, YOLO analizza ogni frame di un video (che sia un file o un flusso da webcam/IP camera) per identificare oggetti come persone, veicoli, animali e molto altro.\u003c/p\u003e","title":"Individuare e contare le persone con Yolo v8"},{"content":"In tutti i linguaggi di programmazione, uno degli aspetti più importanti è l’organizzazione e la leggibilità del codice. In Python, come in molti altri linguaggi, questo obiettivo si raggiunge anche attraverso l’uso delle funzioni.\nTutto il codice che scriviamo è, per convenzione, eseguito all’interno di una funzione principale, spesso chiamata main. Tuttavia, possiamo e dobbiamo suddividere il codice in più funzioni per semplificare la manutenzione e favorire il riuso.\nCosa sono le funzioni in Python? La definizione delle funzioni in Python avviene tramite la parola chiave def, seguita dal nome della funzione e dalle parentesi tonde. Esistono due tipi principali di funzioni:\nFunzioni con valore di ritorno Funzioni senza valore di ritorno Vediamole nel dettaglio.\nFunzioni con valore di ritorno Queste funzioni restituiscono un risultato al chiamante tramite la parola chiave return. Sono utili quando è necessario utilizzare il risultato di un’elaborazione.\ndef compare_x_and_y(x, y) -\u0026gt; bool: if x \u0026gt; y: return True else: return False Funzioni senza valore di ritorno Queste funzioni non restituiscono alcun valore. Vengono utilizzate per eseguire operazioni, come la stampa a video o la modifica di variabili globali, senza dover ritornare un risultato.\ndef print_even_numbers(numbers): for elem in numbers: if elem % 2 == 0: print(elem) Conclusioni In questo articolo abbiamo visto la definizione delle funzioni in Python, distinguendo tra funzioni con e senza valore di ritorno. Le funzioni sono uno strumento fondamentale per scrivere codice leggibile, riutilizzabile e più facile da testare.\nNei prossimi tutorial vedremo esempi più avanzati di utilizzo delle funzioni, inclusi parametri opzionali, funzioni annidate e lambda function.\nTrovi il link ai codici di esempio qui.\n","permalink":"https://antoniomontemurro.com/it/posts/funzioni-in-python/","summary":"\u003cp\u003eIn tutti i linguaggi di programmazione, uno degli aspetti più importanti è l’organizzazione e la leggibilità del codice. In Python, come in molti altri linguaggi, questo obiettivo si raggiunge anche attraverso l’uso delle funzioni.\u003c/p\u003e\n\u003cp\u003eTutto il codice che scriviamo è, per convenzione, eseguito all’interno di una funzione principale, spesso chiamata main. Tuttavia, possiamo e dobbiamo suddividere il codice in più funzioni per semplificare la manutenzione e favorire il riuso.\u003c/p\u003e\n\u003ch2 id=\"cosa-sono-le-funzioni-in-python\"\u003eCosa sono le funzioni in Python?\u003c/h2\u003e\n\u003cp\u003eLa \u003cstrong\u003edefinizione delle funzioni in Python\u003c/strong\u003e avviene tramite la parola chiave def, seguita dal nome della funzione e dalle parentesi tonde. Esistono due tipi principali di funzioni:\u003c/p\u003e","title":"Funzioni"},{"content":"In questo articolo scoprirai come leggere i dati della CIE – Carta d’identità elettronica da un punto di vista tecnico, utilizzando un lettore NFC compatibile e un’app sviluppata in .NET. Analizzeremo i protocolli utilizzati, i formati dei dati e un esempio pratico di implementazione.\nCos’è la CIE? Dal punto di vista informatico, la CIE è una smart card contactless conforme allo standard ICAO 9303, lo stesso impiegato nei passaporti elettronici. I dati vengono salvati principalmente in due modalità:\nNel chip NFC, suddivisi in Data Group (DG). Alcuni dei più rilevanti sono: DG1: dati anagrafici e MRZ DG2: fotografia DG11: dati personali come l’indirizzo DG3 / DG4: impronte digitali (ad accesso riservato) Nella MRZ (Machine Readable Zone), stampata sul retro della carta. MRZ e protocolli di accesso La MRZ è composta da tre righe OCR-B da 30 caratteri ciascuna. Questo blocco di testo serve come base per l’autenticazione tramite i protocolli:\nBAC (Basic Access Control) PACE (Password Authenticated Connection Establishment), più sicuro e moderno Il protocollo PACE utilizza il codice CAN stampato sulla carta per accedere in sicurezza ai DG1, DG2 e DG11.\nLettura della CIE con un lettore NFC Per leggere la CIE, è necessario un lettore NFC compatibile con le specifiche seguenti:\nSupporto ISO/IEC 14443 Tipo A e B (minimo 14443-4) Capacità di inviare/ricevere comandi APDU Compatibilità con PC/SC Supporto per i protocolli PACE, BAC, EAC Nel mio caso ho utilizzato un ACR1252U, un lettore economico ma adatto allo scopo.\nL’applicazione in .NET Per imparare .NET, ho realizzato una piccola app desktop che legge i dati della CIE e li invia via WebSocket a un’applicazione client, ad esempio una WebApp.\nL’idea nasce dall’esigenza di compilare automaticamente i dati anagrafici in un gestionale, evitando l’inserimento manuale.\nFunzionamento dell’app:\nSi avvia in background (non ha GUI) Si collega al lettore NFC Apre un server WebSocket su localhost:8080 Trasmette i dati letti dalla CIE in formato JSON al client connesso Codice: avvio dell’app e connessione WebSocket L’app non prevede una GUI quindi si avvia in background\nstatic void Main() { SetAppUserModelId(\u0026#34;Cie Reader\u0026#34;); Application.SetHighDpiMode(HighDpiMode.SystemAware); Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new TrayAppContext()); } Una volta avviata, crea una WebSocket e si connette al lettore NFC\nwebSocketServer = new WebSocketServer(); reader = new Reader(); Gestione lettura e parsing dei dati Le letture possono fallire a causa dell’hardware NFC. Per questo motivo è presente un sistema di retry. Quando la lettura ha successo, si istanzia la classe:\nC_CIE readDocument = new C_CIE(a); I dati sono serializzati nel formato TLV (Tag-Length-Value). Ecco alcuni tag usati per deserializzare:\npublic static readonly byte[] KEY_FULL_NAME = new byte[]{ 0x5F, 0x0E }; public static readonly byte[] KEY_BIRTH_ADDRESS = new byte[] { 0x5F, 0x11 }; public static readonly byte[] KEY_ADDRESS = new byte[] { 0x5F, 0x42 }; public static readonly byte[] KEY_CF = new byte[] { 0x5F, 0x10 }; public static readonly byte[] KEY_MRZ = new byte[] { 0x5F, 0x1F }; public static readonly byte[] KEY_DATE_ISSUE = new byte[] { 0x5F, 0x26 }; public static readonly byte[] KEY_DATE_EXPIRE = new byte[] { 0x5F, 0x24 }; public static readonly byte[] KEY_BIRTH_DATE = new byte[] { 0x5F, 0x57 }; Se alcuni dati non sono disponibili, è possibile recuperarli dalla MRZ, come ad esempio la data di nascita:\nstring[] lines = mrz.Split(\u0026#39;\\n\u0026#39;); string rawDate = lines[0].Substring(30, 6); string yearPrefix = rawDate.Substring(0, 2).CompareTo(\u0026#34;50\u0026#34;) \u0026gt;= 0 ? \u0026#34;19\u0026#34; : \u0026#34;20\u0026#34;; birthDate = yearPrefix + rawDate.Substring(0, 2) + \u0026#34;-\u0026#34; + rawDate.Substring(2, 2) + \u0026#34;-\u0026#34; + rawDate.Substring(4, 2); o la data di scadenza del documento\nstring[] lines = mrz.Split(\u0026#39;\\n\u0026#39;); string expiryRaw = lines[0].Substring(38, 6); // YYMMDD string yearPrefix = expiryRaw.Substring(0, 2).CompareTo(\u0026#34;50\u0026#34;) \u0026gt;= 0 ? \u0026#34;19\u0026#34; : \u0026#34;20\u0026#34;; dateExpire = expiryRaw.Substring(4,2) + \u0026#34;/\u0026#34; + expiryRaw.Substring(2, 2) + \u0026#34;/\u0026#34; + yearPrefix + expiryRaw.Substring(0,2); Invio dei dati via WebSocket L’app invia i dati letti dalla CIE a tutti i client connessi:\npublic async Task BroadcastMessageAsync(string message) { byte[] buffer = Encoding.UTF8.GetBytes(message); var tasks = _connectedSockets.Values .Where(s =\u0026gt; s.State == WebSocketState.Open) .Select(s =\u0026gt; s.SendAsync(new ArraySegment\u0026lt;byte\u0026gt;(buffer), WebSocketMessageType.Text, true, CancellationToken.None)); await Task.WhenAll(tasks); } L’elenco delle connessioni attive è gestito da:\nprivate readonly ConcurrentDictionary\u0026lt;Guid, WebSocket\u0026gt; _connectedSockets = new(); SDK utilizzato per la lettura CIE La logica di decrypt e lettura dati è stata realizzata grazie allo SDK open source messo a disposizione da IPZS – Istituto Poligrafico e Zecca dello Stato, disponibile su GitHub.\nLimiti attuali dell’applicazione Funziona solo con CIE v2.x Nessuna autenticazione sul canale WebSocket Configurazione hardcoded (localhost:8080) Nessuna interfaccia utente Tutti questi aspetti verranno affrontati in una versione futura.\nConclusione Sviluppare questa applicazione mi ha permesso di scoprire il mondo dello sviluppo desktop in .NET, che fino ad ora mi era completamente sconosciuto.\nIl progetto ha ampi margini di miglioramento, sia sul piano tecnico che funzionale.\nChiunque voglia contribuire o suggerire migliorie è il benvenuto sul mio GitHub!\n","permalink":"https://antoniomontemurro.com/it/posts/leggere-cie-in-dotnet/","summary":"\u003cp\u003eIn questo articolo scoprirai come leggere i dati della \u003cstrong\u003e\u003ca href=\"https://www.cartaidentita.interno.gov.it/la-carta/\"\u003eCIE – Carta d’identità elettronica\u003c/a\u003e\u003c/strong\u003e da un punto di vista tecnico, utilizzando un lettore NFC compatibile e un’app sviluppata in .NET. Analizzeremo i protocolli utilizzati, i formati dei dati e un esempio pratico di implementazione.\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"nfc_dotnet.webp\" loading=\"lazy\" src=\"/img/leggere-cie-in-dotnet/nfc_dotnet.webp\"\u003e\u003c/p\u003e\n\u003ch2 id=\"cosè-la-cie\"\u003eCos’è la CIE?\u003c/h2\u003e\n\u003cp\u003eDal punto di vista informatico, la \u003cstrong\u003eCIE\u003c/strong\u003e è una \u003cstrong\u003e\u003ca href=\"https://it.wikipedia.org/wiki/Smart_card\"\u003esmart card\u003c/a\u003e contactless\u003c/strong\u003e conforme allo standard \u003cstrong\u003eICAO 9303\u003c/strong\u003e, lo stesso impiegato nei passaporti elettronici. I dati vengono salvati principalmente in due modalità:\u003c/p\u003e","title":"Come leggere la CIE tramite NFC in .NET"},{"content":"Se stai leggendo questo articolo, probabilmente è la tua prima esperienza con Java e, in generale, con la programmazione. In questo articolo vedremo come installare l’SDK di Java, scegliere un IDE e scrivere un semplice programma per verificare che tutto funzioni correttamente.\nDopo aver discusso del perché Java possa essere un’ottima scelta sia per un neofita che per un programmatore esperto, vediamo ora come installare l’SDK di Java e scegliere l’IDE più adatto.\nInstallare Java Innanzitutto, a meno che tu non abbia esigenze specifiche, la cosa migliore da fare è visitare questo link e, nella sezione “Java Release Support Timeline”, individuare l’ultima versione LTS (Long Term Support).\nUna volta individuata la versione da scaricare, sarà sufficiente recarsi a questo link per scaricare l’SDK desiderato (vedremo tra poco come questa procedura possa essere gestita direttamente da IntelliJ).\nDopo aver installato l’SDK, per verificare che Java sia stato installato correttamente, apri il prompt dei comandi e digita:\njava --version Se il terminale risponde mostrando la versione di Java, l’installazione è completata.\nSe invece il terminale non dovesse riconoscere il comando, sarà necessario aggiungere l’SDK alle variabili di ambiente. Per farlo, ti suggerisco di seguire una guida specifica per il tuo sistema operativo.\nQuale IDE utilizzare? Ora che Java è installato, sorge spontanea la domanda: quale strumento usare per scrivere ed eseguire il codice?\nCos’è un IDE? Un IDE (Integrated Development Environment) è un’applicazione che fornisce strumenti utili per lo sviluppo software. Due strumenti fondamentali sono il debugger e l’IntelliSense:\nIntelliSense: Questa funzione di autocompletamento riduce il tempo di digitazione e minimizza gli errori di sintassi. Debugger: Utile per analizzare il codice, ti aiuta a individuare e risolvere errori di programmazione (bug). IntelliJ Esistono diversi IDE che supportano Java. Molti sono gratuiti, mentre altri offrono una versione base gratuita.\nNoi utilizzeremo IntelliJ, nella sua versione gratuita (Community Edition). Dopo averlo scaricato, avvia l’installazione e, quando ti verranno presentate alcune opzioni, ti consiglio di selezionarle tutte.\nUna volta installato, siamo pronti per scrivere il nostro primo programma in Java.\nHello World Non c’è nulla di più tipico, per uno sviluppatore, che iniziare con un programma “Hello World”.\nApri IntelliJ e accetta i termini d’uso al primo avvio. Se hai già altri IDE installati, IntelliJ potrebbe chiederti se importarne le configurazioni.\nClicca su “New Project”, dai un nome al progetto (per esempio helloWorld), scegli una cartella di destinazione e lascia le impostazioni predefinite. Clicca su “Create”.\nIntelliJ è un IDE piuttosto completo, quindi molto probabilmente creerà automaticamente tutto il necessario per il nostro “Hello World”.\nQualora così non fosse, o nel caso tu abbia scelto un IDE differente, di seguito trovi il codice da scrivere:\npublic class Main { public static void main(String[] args) { System.out.println(\u0026#34;Hello world!\u0026#34;); } } ","permalink":"https://antoniomontemurro.com/it/posts/installare-java-e-scegliere-ide/","summary":"\u003cp\u003eSe stai leggendo questo articolo, probabilmente è la tua prima esperienza con Java e, in generale, con la programmazione. In questo articolo vedremo come installare l’SDK di Java, scegliere un IDE e scrivere un semplice programma per verificare che tutto funzioni correttamente.\u003c/p\u003e\n\u003cp\u003eDopo aver \u003ca href=\"/it/posts/perche-imparare-java/\"\u003ediscusso del perché Java possa essere un’ottima scelta\u003c/a\u003e sia per un neofita che per un programmatore esperto, vediamo ora come installare l’SDK di Java e scegliere l’IDE più adatto.\u003c/p\u003e","title":"Installare Java e scelta dell’IDE"},{"content":"\nJava è un linguaggio di programmazione orientato agli oggetti (OOP), cosiddetto tipizzato, ovvero un linguaggio in cui i tipi delle variabili vengono specificati in modo statico direttamente nel codice sorgente.\nJava nasce nel 1992 alla Stanford University con il nome di “Oak”, per poi essere rinominato in “Java” a causa di problemi di copyright (fonte).\nIl principale punto di forza di Java è probabilmente la sua portabilità: può essere eseguito su piattaforme diverse senza modifiche al codice, caratteristica che lo rende estremamente versatile e ne ha favorito la vasta diffusione.\nVantaggi e caratteristiche Le principali caratteristiche di Java sono:\nFacilità di apprendimento: è uno dei linguaggi di programmazione più semplici da imparare. Portabilità e indipendenza: una volta scritto, il codice può essere eseguito su qualsiasi piattaforma dotata di Java Virtual Machine (JVM). Orientamento agli oggetti: Java segue il paradigma della programmazione orientata agli oggetti. Type safe: trattandosi di un linguaggio tipizzato, ogni variabile ha un tipo definito e non modificabile. Supporto continuo: Java viene costantemente aggiornato con nuove funzionalità e correzioni. Inizialmente le versioni uscivano ogni due anni; oggi viene rilasciata una nuova versione ogni sei mesi, e ogni tre anni una versione LTS (Long Term Support) con supporto esteso. Casi d’uso Grazie alla sua semplicità e versatilità, Java viene impiegato in moltissimi ambiti, tra cui:\nSviluppo software (applicazioni cloud e mobile) Big Data Sviluppo di videogiochi Perché imparare Java? La risposta più semplice potrebbe essere: “Perché no?”\nNel corso degli anni, Java ha conquistato un ruolo di primo piano nel mondo dello sviluppo software, come dimostrano anche i dati raccolti da GitHub (fonte).\nCome già accennato, Java ha una curva di apprendimento accessibile ed è multipiattaforma: consente cioè di sviluppare applicazioni compatibili con Windows, macOS e Linux senza dover creare versioni separate del codice.\nSe vuoi saperne di più, visita il sito ufficiale di Java o esplora la nostra sezione dedicata nel menù in alto.\n","permalink":"https://antoniomontemurro.com/it/posts/perche-imparare-java/","summary":"\u003cp\u003e\u003cimg alt=\"java_header.webp\" loading=\"lazy\" src=\"/img/perche-imparare-java/java_header.webp\"\u003e\u003c/p\u003e\n\u003cp\u003eJava è un linguaggio di programmazione orientato agli oggetti (OOP), cosiddetto \u003cem\u003etipizzato\u003c/em\u003e, ovvero un linguaggio in cui i tipi delle variabili vengono specificati in modo statico direttamente nel codice sorgente.\u003c/p\u003e\n\u003cp\u003eJava nasce nel 1992 alla Stanford University con il nome di “Oak”, per poi essere rinominato in “Java” a causa di problemi di copyright \u003ca href=\"https://it.wikipedia.org/wiki/Java_%28linguaggio_di_programmazione%29\"\u003e(fonte)\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eIl principale punto di forza di Java è probabilmente la sua \u003cstrong\u003eportabilità\u003c/strong\u003e: può essere eseguito su piattaforme diverse senza modifiche al codice, caratteristica che lo rende estremamente versatile e ne ha favorito la vasta diffusione.\u003c/p\u003e","title":"Cos’è Java e perché usarlo"},{"content":"In tutti i moderni linguaggi di programmazione, gli statement condizionali e i cicli sono fondamentali per due scopi principali:\nPrendere decisioni sulla base di valori dati o calcolati. Automatizzare operazioni ripetitive per evitare di riscrivere lo stesso codice. If…else Lo statement if...else permette di variare il normale flusso di esecuzione del codice valutando una determinata condizione.\nEcco un esempio:\nx = int(input(\u0026#34;Insert a number:\u0026#34;)) if x % 2 == 0: print(\u0026#34;Your number is even\u0026#34;) else: print(\u0026#34;Your number is odd\u0026#34;) Questo codice stamperà un messaggio diverso a seconda che il valore inserito dall’utente sia un numero pari o dispari.\nIn Python esiste anche una variante chiamata elif, che consente di concatenare più condizioni. Ecco un altro esempio:\nx = int(input(\u0026#34;\\n3Insert a number greater than 0:\u0026#34;)) if x == 0: print(\u0026#34;Invalid value!\u0026#34;) elif x \u0026gt; 0: print(\u0026#34;You inserted a positive number!\u0026#34;) else: print(\u0026#34;You inserted a negative number!\u0026#34;) Con questo codice possiamo verificare se il valore inserito dall’utente è diverso da 0 e, se lo è, determinarne la positività o negatività.\nCicli in Python Python supporta due tipi principali di cicli: for e while. Entrambi permettono di ripetere blocchi di codice senza riscriverlo, ma differiscono nel loro funzionamento logico:\nwhile: continua a eseguire il codice al suo interno finché una determinata condizione è valida. for: itera su una collezione di dati (come liste, tuple o stringhe) ed esegue il codice per ogni elemento della collezione. Ecco un paio di esempi:\nCiclo While print(\u0026#34;Printing all values from 10 down to 6...\u0026#34;) x = 10 while x \u0026gt; 5: print(x) x = x - 1 In questo esempio, il ciclo while stampa i numeri decrescenti a partire da 10 fino a quando il valore di x è maggiore di 5. A ogni iterazione, il valore di x viene ridotto di 1.\nCiclo For fruit_list = [\u0026#34;Apple\u0026#34;, \u0026#34;Banana\u0026#34;, \u0026#34;Coconut\u0026#34;, \u0026#34;Raspberry\u0026#34;, \u0026#34;Strawberry\u0026#34;] print(\u0026#34;Printing all elements in the list...\u0026#34;) for fruit in fruit_list: print(fruit) Questo esempio utilizza un ciclo for per iterare su una lista di frutta, stampando ciascun elemento.\nCombinare Cicli e If…else Possiamo combinare i cicli con gli statement condizionali if...else per creare logiche più complesse. In particolare, gli statement continue e break consentono di controllare il flusso di esecuzione del ciclo.\nEsempio con continue print(\u0026#34;Printing all elements in the list except for Banana...\u0026#34;) for fruit in fruit_list: if fruit == \u0026#34;Banana\u0026#34;: continue print(fruit) In questo caso, il ciclo stampa tutti gli elementi della lista di frutta, tranne “Banana”. Lo statement continue interrompe l’iterazione corrente e passa alla successiva.\nEsempio con break print(\u0026#34;Printing all numbers in the list. Break the loop if there is any non number element\u0026#34;) number_list = [1, 2, 3, \u0026#34;a\u0026#34;, 4, 5] for x in number_list: if type(x) is int: print(x) else: print(f\u0026#34;Found not number element: {x}\u0026#34;) print(\u0026#34;For Loop will be terminated immediately\u0026#34;) break Qui, il ciclo interrompe la sua esecuzione non appena trova un elemento che non è un numero. Lo statement break, a differenza di continue, termina definitivamente il ciclo e passa all’istruzione successiva nel programma.\nConclusioni Gli statement condizionali e i cicli sono strumenti essenziali per automatizzare operazioni e prendere decisioni nei programmi Python. Nei prossimi tutorial, esploreremo in dettaglio ulteriori utilizzi pratici.\nTrovi il link ai codici di esempio qui.\n","permalink":"https://antoniomontemurro.com/it/posts/control-flow-cicli-python/","summary":"\u003cp\u003eIn tutti i moderni linguaggi di programmazione, gli statement condizionali e i cicli sono fondamentali per due scopi principali:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003ePrendere decisioni sulla base di valori dati o calcolati.\u003c/li\u003e\n\u003cli\u003eAutomatizzare operazioni ripetitive per evitare di riscrivere lo stesso codice.\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"ifelse\"\u003eIf…else\u003c/h2\u003e\n\u003cp\u003eLo statement \u003ccode\u003eif...else\u003c/code\u003e permette di variare il normale flusso di esecuzione del codice valutando una determinata condizione.\u003c/p\u003e\n\u003cp\u003eEcco un esempio:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-python\" data-lang=\"python\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ex \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e int(input(\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;Insert a number:\u0026#34;\u003c/span\u003e))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003eif\u003c/span\u003e x \u003cspan style=\"color:#f92672\"\u003e%\u003c/span\u003e \u003cspan style=\"color:#ae81ff\"\u003e2\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e==\u003c/span\u003e \u003cspan style=\"color:#ae81ff\"\u003e0\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    print(\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;Your number is even\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003eelse\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    print(\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;Your number is odd\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eQuesto codice stamperà un messaggio diverso a seconda che il valore inserito dall’utente sia un numero pari o dispari.\u003c/p\u003e","title":"Control Flow e Cicli in Python"},{"content":"Il libro di David Epstein, Generalisti (Range: Why Generalists Triumph in a Specialized World), esplora una domanda fondamentale: in un mondo che sembra premiare la specializzazione, possono i generalisti avere successo? L’autore sostiene che sì, i generalisti – persone con una vasta gamma di esperienze e competenze – hanno un vantaggio in un’epoca caratterizzata da complessità e cambiamenti rapidi.\nEpstein contrappone due approcci distinti al successo: il metodo “Tiger Woods”, che privilegia la specializzazione precoce e focalizzata, e quello “Roger Federer”, che abbraccia una varietà di esperienze prima di trovare la propria vocazione. Utilizzando esempi tratti dallo sport, dalla scienza e dall’arte, Epstein dimostra che i generalisti tendono a eccellere in ambienti imprevedibili e interconnessi, grazie alla loro capacità di pensare in modo creativo e adattarsi rapidamente.\nUn punto forte del libro è la sua narrazione accessibile, ricca di aneddoti e di dati scientifici. Epstein sfida i lettori a ripensare il concetto di “successo” e a rivalutare l’importanza dell’esplorazione nella formazione personale e professionale. Tuttavia, alcune critiche potrebbero derivare dall’eccessiva enfasi sugli esempi aneddotici, che potrebbero non applicarsi universalmente.\nConclusione Generalisti è un libro stimolante, che offre un punto di vista rinfrescante sull’importanza della versatilità e dell’esplorazione. È una lettura altamente consigliata per chiunque cerchi di capire come prosperare in un mondo sempre più complesso.\n","permalink":"https://antoniomontemurro.com/it/libri/generalisti/","summary":"\u003cp\u003eIl libro di \u003ca href=\"https://en.wikipedia.org/wiki/David_Epstein_%28journalist%29\"\u003eDavid Epstein\u003c/a\u003e, \u003cem\u003eGeneralisti\u003c/em\u003e (\u003cem\u003eRange: Why Generalists Triumph in a Specialized World\u003c/em\u003e), esplora una domanda fondamentale: in un mondo che sembra premiare la specializzazione, possono i generalisti avere successo? L’autore sostiene che sì, i generalisti – persone con una vasta gamma di esperienze e competenze – hanno un vantaggio in un’epoca caratterizzata da complessità e cambiamenti rapidi.\u003c/p\u003e\n\u003cp\u003eEpstein contrappone due approcci distinti al successo: il metodo “Tiger Woods”, che privilegia la specializzazione precoce e focalizzata, e quello “Roger Federer”, che abbraccia una varietà di esperienze prima di trovare la propria vocazione. Utilizzando esempi tratti dallo sport, dalla scienza e dall’arte, Epstein dimostra che i generalisti tendono a eccellere in ambienti imprevedibili e interconnessi, grazie alla loro capacità di pensare in modo creativo e adattarsi rapidamente.\u003c/p\u003e","title":"Generalisti"},{"content":"Introduzione Nell’articolo precedente, abbiamo introdotto le basi di Spring Boot, creato un progetto base e sviluppato una semplice API. In questa seconda parte, collegheremo il progetto a un database, utilizzando PostgreSQL per la persistenza e la gestione dei dati.\nPostgreSQL PostgreSQL, nato nel 1985 come “post-ingres” grazie a Michael Stonebraker, è un’alternativa potente a database relazionali come MySQL. Una sua caratteristica unica è la possibilità di definire nuovi tipi di dati e utilizzare l’ereditarietà tra tipi. Maggiori dettagli sono disponibili sul sito ufficiale di PostgreSQL.\nConfigurazione di PostgreSQL in Spring Boot Installazione del Database Prima di proseguire, è necessario installare PostgreSQL. Questa guida offre istruzioni dettagliate per l’installazione.\nAggiungere le Dipendenze Aggiungiamo al file pom.xml le dipendenze necessarie:\n\u0026lt;dependency\u0026gt; \u0026lt;groupId\u0026gt;org.postgresql\u0026lt;/groupId\u0026gt; \u0026lt;artifactId\u0026gt;postgresql\u0026lt;/artifactId\u0026gt; \u0026lt;/dependency\u0026gt; \u0026lt;dependency\u0026gt; \u0026lt;groupId\u0026gt;org.springframework.boot\u0026lt;/groupId\u0026gt; \u0026lt;artifactId\u0026gt;spring-boot-starter-data-jpa\u0026lt;/artifactId\u0026gt; \u0026lt;/dependency\u0026gt; Queste dipendenze forniscono gli strumenti per interagire con il database e gestire le entità. Non è necessario indicare la versione del driver PostgreSQL: se ne occupa Spring Boot, scegliendone una compatibile. Se usi IntelliJ, ricorda di aggiornare il progetto per applicare le modifiche al pom.xml.\nConfigurare i Parametri di Connessione Nel file application.properties, configuriamo i parametri per collegare Spring Boot a PostgreSQL:\nspring.datasource.url=jdbc:postgresql://localhost:5432/NOME_DB spring.datasource.username=USERNAME spring.datasource.password=PASSWORD Non serve specificare il driver: Spring Boot lo ricava automaticamente dall’URL di connessione. Aggiungiamo anche:\nspring.jpa.hibernate.ddl-auto=update per permettere a Spring Boot di generare automaticamente lo schema delle entità di dominio.\nCreazione delle Entità di Dominio Creiamo un’entità di dominio rappresentante un utente.\nIn un nuovo package chiamato domain, creiamo il file User.java:\n@Entity @Table(name = \u0026#34;users\u0026#34;) public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String username; public User() {} public User(String username) { this.username = username; } // Getter e Setter } @Entity definisce questa classe come entità. @Table indica il nome della tabella sul database. Il nome “users” è specificato perché “user” è una parola riservata in PostgreSQL. @Id identifica la chiave primaria. @GeneratedValue permette a PostgreSQL di generare automaticamente un ID univoco. Repository I repository offrono i metodi necessari per le operazioni CRUD. Creiamo un’interfaccia UserRepository.java in un nuovo package chiamato repository:\n@Repository public interface UserRepository extends JpaRepository\u0026lt;User, Long\u0026gt; {} L’interfaccia estende JpaRepository, ereditando metodi per le operazioni CRUD.\nDTO Per creare o modificare un utente, il client invierà i dati nel body della richiesta in formato JSON, ad esempio {\u0026quot;username\u0026quot;: \u0026quot;user1\u0026quot;}. Per permettere a Spring di convertire automaticamente quel JSON in un oggetto Java, definiamo una classe che ne descrive la struttura: un DTO (Data Transfer Object).\nIn un nuovo package chiamato dto, creiamo il file UserRequest.java:\npublic class UserRequest { private String username; public UserRequest() {} public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } } Il nome dell’attributo deve corrispondere a quello del campo nel JSON. Senza un DTO, dichiarando il parametro semplicemente come String, Spring ci consegnerebbe l’intero body così com’è, graffe e virgolette comprese.\nController Creiamo ora il controller per gestire le operazioni sugli utenti. In UserController.java scriviamo:\n@RestController @RequestMapping(\u0026#34;/user\u0026#34;) public class UserController { private final UserRepository userRepository; public UserController(UserRepository userRepository) { this.userRepository = userRepository; } } Definire le CRUD Aggiungiamo i metodi per le CRUD:\n@PostMapping(value = \u0026#34;/register\u0026#34;) public ResponseEntity\u0026lt;User\u0026gt; register(@RequestBody UserRequest request) { User newUser = new User(request.getUsername()); userRepository.save(newUser); return ResponseEntity.ok(newUser); } @GetMapping(value = \u0026#34;\u0026#34;) public ResponseEntity\u0026lt;List\u0026lt;User\u0026gt;\u0026gt; getAll() { return ResponseEntity.ok(userRepository.findAll()); } @GetMapping(value = \u0026#34;/{userId}\u0026#34;) public ResponseEntity\u0026lt;User\u0026gt; getById(@PathVariable Long userId) { return userRepository.findById(userId) .map(ResponseEntity::ok) .orElse(ResponseEntity.notFound().build()); } @PutMapping(value = \u0026#34;/{userId}\u0026#34;) public ResponseEntity\u0026lt;User\u0026gt; updateById(@PathVariable Long userId, @RequestBody UserRequest request) { return userRepository.findById(userId).map(user -\u0026gt; { user.setUsername(request.getUsername()); userRepository.save(user); return ResponseEntity.ok(user); }).orElse(ResponseEntity.notFound().build()); } @DeleteMapping(value = \u0026#34;/{userId}\u0026#34;) public ResponseEntity\u0026lt;Void\u0026gt; deleteById(@PathVariable Long userId) { return userRepository.findById(userId).map(user -\u0026gt; { userRepository.delete(user); return ResponseEntity.ok().build(); }).orElse(ResponseEntity.notFound().build()); } Questi metodi consentono di registrare nuovi utenti, recuperare utenti per ID o tutti gli utenti, aggiornare e cancellare utenti. Nei metodi di registrazione e modifica, l’annotazione @RequestBody applicata a un parametro di tipo UserRequest indica a Spring di convertire il JSON ricevuto nel nostro DTO.\nTest delle API 1. Recupero della Lista Utenti\nMetodo: GET URL: localhost:8080/user Risposta: [] se il DB è vuoto. 2. Creazione Nuovo Utente\nMetodo: POST URL: localhost:8080/user/register Body: {\u0026quot;username\u0026quot;: \u0026quot;user1\u0026quot;} Risposta: {\u0026quot;id\u0026quot;: 1, \u0026quot;username\u0026quot;: \u0026quot;user1\u0026quot;} 3. Recupero Utente per ID\nMetodo: GET URL: localhost:8080/user/1 Risposta: {\u0026quot;id\u0026quot;: 1, \u0026quot;username\u0026quot;: \u0026quot;user1\u0026quot;} se l’ID esiste, altrimenti 404 Not Found. 4. Modifica Utente\nMetodo: PUT URL: localhost:8080/user/1 Body: {\u0026quot;username\u0026quot;: \u0026quot;user2\u0026quot;} Risposta: {\u0026quot;id\u0026quot;: 1, \u0026quot;username\u0026quot;: \u0026quot;user2\u0026quot;} 5. Cancellazione Utente\nMetodo: DELETE URL: localhost:8080/user/1 Risposta: 200 OK Conclusione In questa seconda parte, abbiamo esplorato come collegare un’applicazione Spring Boot a PostgreSQL e persistere i dati. Nella prossima parte, esamineremo come implementare un sistema di autenticazione con JWT Token e Spring Security.\nIl codice completo di questo esempio è disponibile a questo link.\n","permalink":"https://antoniomontemurro.com/it/posts/spring-framework-parte2/","summary":"\u003ch2 id=\"introduzione\"\u003eIntroduzione\u003c/h2\u003e\n\u003cp\u003eNell’articolo \u003ca href=\"/it/posts/spring-framework-parte1/\"\u003eprecedente\u003c/a\u003e, abbiamo introdotto le basi di Spring Boot, creato un progetto base e sviluppato una semplice API. In questa seconda parte, collegheremo il progetto a un database, utilizzando PostgreSQL per la persistenza e la gestione dei dati.\u003c/p\u003e\n\u003ch2 id=\"postgresql\"\u003ePostgreSQL\u003c/h2\u003e\n\u003cp\u003ePostgreSQL, nato nel 1985 come “post-ingres” grazie a Michael Stonebraker, è un’alternativa potente a database relazionali come MySQL. Una sua caratteristica unica è la possibilità di definire nuovi tipi di dati e utilizzare l’ereditarietà tra tipi. Maggiori dettagli sono disponibili sul \u003ca href=\"https://www.postgresql.org/about/\"\u003esito ufficiale\u003c/a\u003e di PostgreSQL.\u003c/p\u003e","title":"Spring Framework – Parte 2"},{"content":"In Python, come in ogni linguaggio di programmazione, sono disponibili diversi operatori per la manipolazione dei numeri, delle variabili logiche e per il confronto tra oggetti.\nOperatori Aritmetici Quelli più familiari per tutti sono sicuramente gli operatori matematici:\nSum: + Subtraction: - Multiplication: * Division: / oppure // Exponentiation: ** Mod: % Vediamo un esempio per ciascun operatore:\nprint(10 + 3) # Somma: 13 print(10 - 3) # Sottrazione: 7 print(10 * 3) # Moltiplicazione: 30 print(10 / 3) # Divisione: 3.3333... print(10 // 3) # Floor division: 3 print(10 ** 3) # Elevamento a potenza: 1000 print(10 % 3) # Modulo: 1 Tra questi, l’operatore //, chiamato “Floor Division”, merita una breve spiegazione: questo operatore arrotonda per difetto il risultato della divisione, eliminando la parte decimale.\nOperatori Di confronto Questi operatori sono utili per determinare la relazione tra due oggetti:\nUguale a: == Diverso da: != Minore di: \u0026lt; Maggiore di: \u0026gt; Minore o uguale a: \u0026lt;= Maggiore o uguale a: \u0026gt;= Il risultato di ognuno di questi operatori è di tipo booleano (True o False), indicando se la condizione è vera o falsa.\nVediamo un esempio per ciascun operatore:\nprint(10 == 3) # Equal to: False print(10 != 3) # Not equal to: True print(10 \u0026lt; 3) # Less than: False print(10 \u0026gt; 3) # Greater than: True print(10 \u0026lt;= 3) # Less than or equal to: False print(10 \u0026gt;= 3) # Greater than or equal to :True Operatori Logici Questi operatori saranno molto utili nei prossimi tutorial. Servono per combinare condizioni booleane:\nMoltiplicazione logica: and Somma logica: or Negazione logica: not Vediamo un esempio per ciascun operatore:\nprint(True and False) # Logical multiplication: False print(True or False) # Logical addition: True print(not True) # Logical negation: False Conclusioni Nei prossimi tutorial esploreremo più a fondo l’utilizzo di questi operatori, in particolare quelli logici, e vedremo come anche quelli aritmetici e di confronto possano essere applicati su oggetti non numerici.\nTrovi il link ai codici di esempio qui.\n","permalink":"https://antoniomontemurro.com/it/posts/operatori-python-aritmetici-confronto-logici/","summary":"\u003cp\u003eIn Python, come in ogni linguaggio di programmazione, sono disponibili diversi operatori per la manipolazione dei numeri, delle variabili logiche e per il confronto tra oggetti.\u003c/p\u003e\n\u003ch2 id=\"operatori-aritmetici\"\u003eOperatori Aritmetici\u003c/h2\u003e\n\u003cp\u003eQuelli più familiari per tutti sono sicuramente gli operatori matematici:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eSum: +\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eSubtraction: -\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eMultiplication: *\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eDivision: / oppure //\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eExponentiation: **\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eMod: %\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eVediamo un esempio per ciascun operatore:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-python\" data-lang=\"python\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#ae81ff\"\u003e10\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e+\u003c/span\u003e \u003cspan style=\"color:#ae81ff\"\u003e3\u003c/span\u003e)      \u003cspan style=\"color:#75715e\"\u003e# Somma: 13\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#ae81ff\"\u003e10\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e \u003cspan style=\"color:#ae81ff\"\u003e3\u003c/span\u003e)      \u003cspan style=\"color:#75715e\"\u003e# Sottrazione: 7\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#ae81ff\"\u003e10\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e*\u003c/span\u003e \u003cspan style=\"color:#ae81ff\"\u003e3\u003c/span\u003e)      \u003cspan style=\"color:#75715e\"\u003e# Moltiplicazione: 30\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#ae81ff\"\u003e10\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e/\u003c/span\u003e \u003cspan style=\"color:#ae81ff\"\u003e3\u003c/span\u003e)      \u003cspan style=\"color:#75715e\"\u003e# Divisione: 3.3333...\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#ae81ff\"\u003e10\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e//\u003c/span\u003e \u003cspan style=\"color:#ae81ff\"\u003e3\u003c/span\u003e)     \u003cspan style=\"color:#75715e\"\u003e# Floor division: 3\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#ae81ff\"\u003e10\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e**\u003c/span\u003e \u003cspan style=\"color:#ae81ff\"\u003e3\u003c/span\u003e)     \u003cspan style=\"color:#75715e\"\u003e# Elevamento a potenza: 1000\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#ae81ff\"\u003e10\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e%\u003c/span\u003e \u003cspan style=\"color:#ae81ff\"\u003e3\u003c/span\u003e)      \u003cspan style=\"color:#75715e\"\u003e# Modulo: 1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eTra questi, l’operatore //, chiamato “Floor Division”, merita una breve spiegazione: questo operatore arrotonda per difetto il risultato della divisione, eliminando la parte decimale.\u003c/p\u003e","title":"Operatori in Python: Aritmetici, di Confronto e Logici"},{"content":"Avete presente quando su un sito web c’è una sezione privata a cui si accede inserendo username e password? Avete mai notato che, in molti casi, una volta effettuato l’accesso, non viene più richiesto di inserire username e password per gli accessi successivi?\nNelle applicazioni web stateless, questo comportamento è implementabile utilizzando un token JWT. JWT è l’acronimo di JSON Web Token e rappresenta uno standard per lo scambio di dati, definito dalla RFC7519 del 2015.\nPer semplificare, grazie a un token JWT, un utente può comunicare a un’applicazione REST la propria identità senza dover inserire username e password ogni volta.\nStruttura del token Un token JWT è costituito da 3 componenti fondamentali:\nHeader: contiene informazioni sul tipo di token e sull’algoritmo di firma utilizzato Payload: contiene tutte le informazioni scambiate tra utente e applicazione. Signature: è la firma delle due sezioni precedenti, calcolata utilizzando una chiave segreta. Permette al server di verificare che il token non sia stato alterato. Token JWT: un esempio Per avere un’idea di com’è fatto un JWT, possiamo visitare il sito jwt.io. Qui possiamo vedere un esempio di token, la cui struttura è la seguente:\nHeader { \u0026#34;alg\u0026#34;: \u0026#34;HS256\u0026#34;, \u0026#34;typ\u0026#34;: \u0026#34;JWT\u0026#34; } Payload { \u0026#34;sub\u0026#34;: \u0026#34;1234567890\u0026#34;, \u0026#34;name\u0026#34;: \u0026#34;John Doe\u0026#34;, \u0026#34;iat\u0026#34;: 1516239022 } Signature HMACSHA256( base64UrlEncode(header) + \u0026#34;.\u0026#34; + base64UrlEncode(payload), your-256-bit-secret ) Il risultato è:\neyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c ed è possibile distinguere le 3 componenti perché sono separati da un “.” .\nPersonalizzare il Token JWT Il token JWT può essere personalizzato utilizzando i Claims. I Claims sono una mappa di valori che rappresentano informazioni utili per l’utilizzo dell’applicazione. Si inseriscono all’interno del Payload e contribuiscono alla dimensione finale del token.\nEcco un esempio di Payload personalizzato:\n{ \u0026#34;sub\u0026#34;: \u0026#34;johndoe@test.it\u0026#34;, \u0026#34;firstName\u0026#34;: \u0026#34;John\u0026#34;, \u0026#34;lastName\u0026#34;: \u0026#34;Doe\u0026#34;, \u0026#34;iat\u0026#34;: 1728830222, \u0026#34;exp\u0026#34;: 1728866222 } Il token risultante sarà:\neyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJqb2huZG9lQHRlc3QuaXQiLCJmaXJzdE5hbWUiOiJKb2huIiwibGFzdE5hbWUiOiJEb2UiLCJpYXQiOjE3Mjg4MzAyMjIsImV4cCI6MTcyODg2NjIyMn0.OYqR8KbYa0n6-Zrx1SQKXZAeX4a2iO6xZKrkC2_wLwQ Cosa non fare mai! Ora che abbiamo capito cos’è un token JWT e come personalizzarlo, vediamo cosa evitare. Ci sono molti errori comuni, ma ci concentreremo su uno dei più pericolosi.\nImmaginiamo di avere delle API protette da JWT, utilizzabili solo da utenti con un ruolo specifico. Il Payload del JWT di un amministratore potrebbe essere:\n{ \u0026#34;sub\u0026#34;: \u0026#34;johndoe@test.it\u0026#34;, \u0026#34;firstName\u0026#34;: \u0026#34;John\u0026#34;, \u0026#34;lastName\u0026#34;: \u0026#34;Doe\u0026#34;, \u0026#34;role\u0026#34;: \u0026#34;ADMIN\u0026#34;, \u0026#34;iat\u0026#34;: 1728830222, \u0026#34;exp\u0026#34;: 1728866222 } La nostra applicazione, ricevendo questo token, identificerebbe correttamente l’utente “John Doe” e gli concederebbe l’accesso alle API riservate agli amministratori.\nIl token è firmato, quindi nessuno può modificarne il contenuto senza che il server se ne accorga: se John Doe avesse il ruolo USER e lo cambiasse manualmente in ADMIN, la firma non corrisponderebbe più e il token verrebbe rifiutato (a patto che il server la verifichi davvero).\nL’errore è un altro: considerare il contenuto del token sempre attuale. La firma garantisce che i dati non sono stati alterati, non che siano ancora veri. Se a John Doe viene revocato il ruolo ADMIN, il token emesso in precedenza continua a dichiararlo amministratore fino alla scadenza.\nPer questo conviene:\nUsare scadenze brevi, così un dato non più valido ha vita corta. Per le operazioni più delicate, verificare ruolo e stato dell’utente con i dati presenti nel database dell’applicazione, invece di fidarsi del solo token. Non inserire nel Payload informazioni riservate: è codificato, non cifrato, e chiunque può leggerlo. Conclusione Il token JWT è uno standard molto diffuso per le autorizzazioni nelle applicazioni web. Per ulteriori approfondimenti, consulta questo link.\nE voi, avete mai utilizzato un Token JWT nelle vostre applicazioni? Fatecelo sapere lasciando un link nel form in basso.\n","permalink":"https://antoniomontemurro.com/it/posts/autenticazione-jwt/","summary":"\u003cp\u003eAvete presente quando su un sito web c’è una sezione privata a cui si accede inserendo username e password? Avete mai notato che, in molti casi, una volta effettuato l’accesso, non viene più richiesto di inserire username e password per gli accessi successivi?\u003c/p\u003e\n\u003cp\u003eNelle applicazioni web stateless, questo comportamento è implementabile utilizzando un token JWT. JWT è l’acronimo di JSON Web Token e rappresenta uno standard per lo scambio di dati, definito dalla RFC7519 del 2015.\u003c/p\u003e","title":"Autenticazione JWT"},{"content":"Cos’è un Framework Un Framework, semplificando, è un insieme di classi, librerie e strumenti predefiniti che forniscono una struttura di base per lo sviluppo di applicazioni software. L’uso di un Framework consente agli sviluppatori di evitare l’implementazione da zero di funzionalità di base, permettendo loro di concentrarsi sullo sviluppo di funzionalità specifiche e personalizzate per il progetto.\nSpring Spring è un framework open source per lo sviluppo di applicazioni Java. La prima versione del framework è stata distribuita nel 2003 da Rod Johnson ed è stata arricchita nel corso degli anni con una serie di estensioni.\nNel tempo, Spring si è guadagnato un ruolo di primo piano nello sviluppo di applicazioni Java, grazie anche a una comunità molto prolifica e alla vasta disponibilità di documentazione ed esempi pratici.\nIn questo articolo, vedremo come con Spring sia possibile creare un’applicazione di base per lo sviluppo di API. L’esempio sarà realizzato in Java e utilizzeremo SQL come database.\nWeb App con Spring Come accennato, il framework base di Spring è stato arricchito nel tempo con numerose funzionalità, creando di fatto una famiglia di framework. Utilizzando una o più di queste risorse, è possibile creare un web service in Java che implementa delle REST API, utilizzabili per la realizzazione di un sito web o di qualsiasi altra applicazione (ad esempio, un’app per Android/iOS).\nWeb Service Un web service è un software in grado di comunicare tramite il protocollo HTTP con qualsiasi applicazione, offrendo funzionalità appositamente implementate. Un esempio potrebbe essere un sito di previsioni meteorologiche: dietro l’interfaccia grafica che mostra la mappa del luogo di interesse, si nasconde un web service che elabora la richiesta dell’utente (ad esempio, la selezione di una località) e fornisce la previsione meteorologica basata sui dati a disposizione.\nRest API Quando si parla di API RESTful, non si fa riferimento a protocolli o standard, ma a una serie di regole universalmente condivise.\nLe principali caratteristiche che un’API deve avere per essere considerata RESTful sono:\nDevono esserci due attori, Client e Server, e delle risorse da condividere. La comunicazione tra Client e Server deve essere stateless. È possibile utilizzare strumenti di caching per migliorare la velocità delle interazioni tra Client e Server. Deve essere prevista un’interfaccia per uniformare le informazioni trasferite. Applicazione d’esempio Ora vedremo come realizzare un’applicazione di esempio basata su Spring, utilizzando il linguaggio Java. Successivamente, aggiungeremo la possibilità di salvare i dati in un database SQL e, infine, implementeremo un meccanismo di autenticazione utente.\nIniziamo visitando questo link per generare un progetto con le configurazioni di base per Java e Maven (o Gradle, a seconda delle preferenze).\nSebbene sia possibile configurare le dipendenze automaticamente, preferisco aggiungerle manualmente, come vedremo tra poco. Una volta settate tutte le opzioni, cliccando su Generate verrà scaricato uno zip contenente tutto il necessario per iniziare.\nAssicurati di avere tutto correttamente installato nel tuo ambiente di sviluppo. Aprendo il progetto appena scaricato con il tuo IDE preferito, potrai avviare l’applicazione, che, allo stato attuale, non farà ancora nulla.\nDipendenze Vediamo ora quali sono le dipendenze minime necessarie per realizzare il nostro web service. Il miglior posto dove cercare le dipendenze è mvnrepository.com .\nApriamo il file pom.xml e definiamo le dipendenze necessarie. La prima e probabilmente la più importante è:\n\u0026lt;dependency\u0026gt; \u0026lt;groupId\u0026gt;org.springframework.boot\u0026lt;/groupId\u0026gt; \u0026lt;artifactId\u0026gt;spring-boot-starter-web\u0026lt;/artifactId\u0026gt; \u0026lt;/dependency\u0026gt; Questa dipendenza va aggiunta all’interno del tag \u0026lt;dependencies\u0026gt;\u0026lt;/dependencies\u0026gt; .\nSe utilizzi IntelliJ, ogni volta che modifichi il file pom.xml, dovrai cliccare sull’icona apposita per applicare le modifiche:\nRiavviando l’applicazione, vedrai nel log delle righe simili a queste:\nTomcat started on port 8080 (http) with context path ‘/’ Started DemoApplication in X seconds (process running for Y) Questi log indicano che l’applicazione è avviata correttamente e in ascolto sulla porta di default 8080.\nCreazione della prima API Ora siamo pronti per creare la nostra prima API. Nella cartella dove si trova la classe main, crea un nuovo file chiamato DemoController. All’interno di questo file, inserisci il seguente codice:\n@RestController public class DemoController { @GetMapping public void demo() { System.out.println(\u0026#34;Hello World\u0026#34;); } } Riavvia l’applicazione e apri il browser all’indirizzo http://localhost:8080 . Vedrai “Hello World” stampato in console.\nAggiungere un Endpoint per risposte al Client Poiché stiamo creando delle API da utilizzare con altre applicazioni, vogliamo inviare una risposta a un client. Aggiungiamo quindi un nuovo endpoint::\n@GetMapping(value = \u0026#34;/test\u0026#34;) public ResponseEntity\u0026lt;String\u0026gt; test() { return ResponseEntity.ok(\u0026#34;Hello World\u0026#34;); } Visitando http://localhost:8080/test nel browser, vedrai la risposta “Hello World”.\nResponseEntity La ResponseEntity è la classe di default di Spring per rappresentare una risposta HTTP. Grazie a ResponseEntity, la risposta include uno Status Code, degli Header e un Body.\nRicevere Dati con le API Non sempre un’API serve a fornire dati; può anche riceverne. Aggiungiamo un endpoint che accetta un parametro dalla richiesta:\n@GetMapping(value = \u0026#34;/test1\u0026#34;) public ResponseEntity\u0026lt;String\u0026gt; test1(@RequestParam(\u0026#34;name\u0026#34;) String name) { String message = \u0026#34;Hello\u0026#34; + \u0026#34; \u0026#34; + name + \u0026#34;!\u0026#34;; return ResponseEntity.ok(message); } Ora, se apri http://localhost:8080/test1?name=John nel browser, vedrai “Hello John!”.\nPer dati più complessi, è necessario usare il body della richiesta. Aggiungiamo un nuovo endpoint:\n@PostMapping(value = \u0026#34;/test2\u0026#34;) public ResponseEntity\u0026lt;String\u0026gt; test2(@RequestBody String name) { String message = \u0026#34;Hello\u0026#34; + \u0026#34; \u0026#34; + name + \u0026#34;!\u0026#34;; return ResponseEntity.ok(message); } Per testare questa API, usa il terminale:\ncurl --request POST --header \u0026#34;Content-Type: text/plain\u0026#34; --data John http://localhost:8080/test2 Riceverai la risposta “Hello John!”.\nIn questo esempio il body è semplice testo: dichiarando il parametro come String, Spring ce lo consegna così com’è. Nella seconda parte vedremo come ricevere dati strutturati in formato JSON.\nConclusione In questa prima parte, abbiamo visto come inizializzare un progetto Spring per la creazione di un web service. Nella seconda parte, vedremo come interfacciare Spring con un database in modo da poter persistere i dati.\nIl codice completo di questo esempio è disponibile a questo link.\n","permalink":"https://antoniomontemurro.com/it/posts/spring-framework-parte1/","summary":"\u003ch2 id=\"cosè-un-framework\"\u003eCos’è un Framework\u003c/h2\u003e\n\u003cp\u003eUn Framework, semplificando, è un insieme di classi, librerie e strumenti predefiniti che forniscono una struttura di base per lo sviluppo di applicazioni software. L’uso di un Framework consente agli sviluppatori di evitare l’implementazione da zero di funzionalità di base, permettendo loro di concentrarsi sullo sviluppo di funzionalità specifiche e personalizzate per il progetto.\u003c/p\u003e\n\u003ch2 id=\"spring\"\u003eSpring\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"https://spring.io/\"\u003eSpring\u003c/a\u003e è un framework open source per lo sviluppo di applicazioni Java. La prima versione del framework è stata distribuita nel 2003 da Rod Johnson ed è stata arricchita nel corso degli anni con una serie di \u003ca href=\"https://spring.io/projects/spring-framework\"\u003eestensioni\u003c/a\u003e.\u003c/p\u003e","title":"Spring Framework – Parte 1"},{"content":"Come accennato in questo articolo, Python è un linguaggio a tipizzazione dinamica, il che significa che il tipo non viene dichiarato nel codice ma determinato durante l’esecuzione del programma, in base al valore assegnato. Tuttavia, ciò non significa che i tipi non esistano: ogni valore ha un tipo ben preciso.\nVediamo quindi i tipi di dati nativamente presenti in Python:\nStringhe: str Numeri: int, float, complex Sequenze: list, tuple Mappe: dict Sets: set, frozenset Boolean: bool Binary: bytes, bytearray, memoryview In Python, non è necessario specificare il tipo di una variabile durante la dichiarazione. Ciò consente a una variabile di contenere uno qualsiasi dei tipi sopra elencati. Inoltre, la stessa variabile può ricevere in qualsiasi momento un valore di tipo diverso: a cambiare non è il tipo del valore, che resta sempre lo stesso, ma il valore a cui la variabile fa riferimento.\nx = 1 # x fa riferimento a un int x = \u0026#34;uno\u0026#34; # ora x fa riferimento a una str Per ulteriori dettagli sui tipi di dati in Python, ti invitiamo a consultare la documentazione ufficiale.\nImpostare il tipo di dato Ecco alcuni esempi di come assegnare vari tipi di dati a una variabile:\nStringa: x = \u0026quot;Hello World\u0026quot; Numero: Int: x = 1 Float: x = 1.0 Complex: x = 1j Sequenze: List: x = [\u0026quot;Lunedì\u0026quot;, \u0026quot;Martedì\u0026quot;, ...] Tuple: x = (\u0026quot;Lunedì\u0026quot;, \u0026quot;Martedì\u0026quot;, ...) Mappe: x = {\u0026quot;chiave\u0026quot;: \u0026quot;valore\u0026quot;, \u0026quot;chiave\u0026quot;: \u0026quot;valore\u0026quot;, ...} Sets: Set: x = {\u0026quot;Lunedì\u0026quot;, \u0026quot;Martedì\u0026quot;, ...} FrozenSet: x = frozenset({\u0026quot;Lunedì\u0026quot;, \u0026quot;Martedì\u0026quot;, ...}) Boolean: x = True oppure x = False Binary: x = b\u0026quot;Hello World\u0026quot; Sequenze Vs Sets Poiché le sequenze e i set possono sembrare simili, vediamo le principali differenze tra queste due classi di dati:\nList: Il contenuto delle liste può essere eterogeneo, ammette duplicati ed è mutabile. Si può inizializzare con x = list() o x = [] Tuple: Il contenuto delle tuple può essere eterogeneo, ammette duplicati ed è immutabile. Si può inizializzare con x = tuple() o x = () Set: Il contenuto dei set può essere eterogeneo, non ammette duplicati ed è mutabile. Si può inizializzare con x = set() Esiste anche una versione immutabile che può essere inizializzata con x = frozenset() Mappe: Il contenuto di una mappa può essere eterogeneo, non ammette la duplicazione delle chiavi e il suo contenuto è mutabile. Si può inizializzare con x = dict() o x = {} Conclusioni Abbiamo esplorato una panoramica dei principali tipi di dati in Python. Nei prossimi articoli vedremo alcune applicazioni pratiche che ti aiuteranno a comprendere meglio il loro utilizzo e le loro peculiarità. Continua a seguirci per approfondire ulteriormente le tue competenze in Python!\n","permalink":"https://antoniomontemurro.com/it/posts/tipi-di-dati/","summary":"\u003cp\u003eCome accennato in \u003ca href=\"/it/posts/sintassi-base-in-python/\"\u003equesto articolo\u003c/a\u003e, Python è un linguaggio a tipizzazione dinamica, il che significa che il tipo non viene dichiarato nel codice ma determinato durante l’esecuzione del programma, in base al valore assegnato. Tuttavia, ciò non significa che i tipi non esistano: ogni valore ha un tipo ben preciso.\u003c/p\u003e\n\u003cp\u003eVediamo quindi i tipi di dati nativamente presenti in Python:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eStringhe\u003c/strong\u003e: \u003ccode\u003estr\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eNumeri\u003c/strong\u003e: \u003ccode\u003eint\u003c/code\u003e, \u003ccode\u003efloat\u003c/code\u003e, \u003ccode\u003ecomplex\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSequenze\u003c/strong\u003e: \u003ccode\u003elist\u003c/code\u003e, \u003ccode\u003etuple\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eMappe\u003c/strong\u003e: \u003ccode\u003edict\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSets\u003c/strong\u003e: \u003ccode\u003eset\u003c/code\u003e, \u003ccode\u003efrozenset\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eBoolean\u003c/strong\u003e: \u003ccode\u003ebool\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eBinary\u003c/strong\u003e: \u003ccode\u003ebytes\u003c/code\u003e, \u003ccode\u003ebytearray\u003c/code\u003e, \u003ccode\u003ememoryview\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eIn Python, non è necessario specificare il tipo di una variabile durante la dichiarazione. Ciò consente a una variabile di contenere uno qualsiasi dei tipi sopra elencati. Inoltre, la stessa variabile può ricevere in qualsiasi momento un valore di tipo diverso: a cambiare non è il tipo del valore, che resta sempre lo stesso, ma il valore a cui la variabile fa riferimento.\u003c/p\u003e","title":"Python – Tipi di dati"},{"content":"Cos’è Groovy Apache Groovy è un linguaggio di programmazione che si propone come alternativa al linguaggio Java, da cui eredita molte caratteristiche.\nGroovy è un linguaggio sia statico che dinamico, il che significa che può essere utilizzato sia come un classico linguaggio di programmazione (al pari di Java) sia come linguaggio di scripting (simile a Python).\nCome accennato, Groovy prende ispirazione da Java: ne adotta la sintassi e compila il suo codice in bytecode per essere eseguito dalla Java Virtual Machine (JVM).\nPer semplificare, si potrebbe definire Groovy come una sorta di “Java semplificato”. Tuttavia, vediamo più nel dettaglio le sue caratteristiche in comparazione con Java.\nGroovy Vs Java Come già detto, Groovy si ispira apertamente a Java (come indicato anche nella home page del sito ufficiale), ma semplifica alcuni aspetti, rendendo il linguaggio più facile da apprendere e migliorando l’efficienza dello sviluppatore\nVediamo ora le principali differenze a livello di sintassi, rimandando a esempi più avanzati nei paragrafi successivi:\nAccesso predefinito: L’accesso predefinito ai metodi e agli attributi di una classe è public, mentre in Java è private. Getters e Setters: A differenza di Java, non è richiesta la definizione esplicita dei metodi di accesso agli attributi, in quanto vengono generati automaticamente. Interpolazione delle stringhe: È possibile inserire variabili direttamente all’interno delle stringhe, cosa non permessa in Java. Tipizzazione: Groovy consente la tipizzazione opzionale delle variabili, con il tipo che viene dedotto a runtime. In Java, invece, è obbligatorio indicare il tipo di ciascuna variabile. // In Groovy def name = \u0026#34;John Doe\u0026#34; // In Java String name = \u0026#34;John Doe\u0026#34; Punto e Virgola: Non è necessario utilizzare il punto e virgola (;) per indicare la fine di un’istruzione. Esecuzione del programma: A differenza di Java non è richiesta la definizione di una classe principale Main per eseguire il programma, poiché ogni classe viene automaticamente wrappata da una classe chiamata Script. // Java public class Main { public static void main(String[] args) { System.out.println(\u0026#34;Ciao, mondo!\u0026#34;); } } // In Groovy println \u0026#34;Ciao, mondo!\u0026#34; Internamente groovy traduce lo script precedente in:\n// Traduzione Groovy class ScriptName extends groovy.lang.Script { @Override Object run() { println \u0026#34;Ciao, mondo!\u0026#34; } } Prestazioni Groovy è generalmente meno performante di Java, anche se negli anni è migliorato notevolmente sotto questo aspetto. La differenza principale deriva dalla “comodità” di Groovy, che semplifica il lavoro dello sviluppatore ma introduce un certo overhead.\nAlcuni fattori che contribuiscono a prestazioni inferiori rispetto a Java includono:\nTipizzazione dinamica: il tipo delle variabili viene determinato a runtime Compilazione dinaminca: Anche se Groovy può essere compilato staticamente (come Java), alcune funzionalità devono essere interpretate a runtime, aggiungendo overhead. Interpolazione delle stringhe: Il contenuto finale di una stringa viene determinato esclusivamente a runtime. Sintassi: Funzionalità come l’assenza di getter e setter espliciti introducono ulteriore overhead. Avvio del programma: L’inizializzazione dell’applicazione richiede più tempo, poiché Groovy deve gestire diverse funzionalità dinamiche, come l’interpolazione delle stringhe e la tipizzazione dinamica. Esempi Per un esempio completo, in questo link è disponibile un programma semplificato che mette in evidenza alcune delle principali differenze, sia basiche che avanzate, tra i due linguaggi.\nConclusione In conclusione, Groovy può essere considerato un ottimo strumento per migliorare l’efficienza dello sviluppatore, a patto che le performance del codice non siano di primaria importanza. Utilizzando Groovy, è possibile scrivere codice di qualità in meno tempo rispetto a Java, a scapito di prestazioni leggermente inferiori.\nAl contrario, nei casi in cui le performance siano essenziali, è consigliabile preferire Java.\n","permalink":"https://antoniomontemurro.com/it/posts/groovy/","summary":"\u003ch2 id=\"cosè-groovy\"\u003eCos’è Groovy\u003c/h2\u003e\n\u003cp\u003eApache Groovy è un linguaggio di programmazione che si propone come alternativa al linguaggio Java, da cui eredita molte caratteristiche.\u003cbr\u003e\nGroovy è un linguaggio sia statico che dinamico, il che significa che può essere utilizzato sia come un classico linguaggio di programmazione (al pari di Java) sia come linguaggio di scripting (simile a Python).\u003c/p\u003e\n\u003cp\u003eCome accennato, Groovy prende ispirazione da Java: ne adotta la sintassi e compila il suo codice in bytecode per essere eseguito dalla Java Virtual Machine (JVM).\u003cbr\u003e\nPer semplificare, si potrebbe definire Groovy come una sorta di “Java semplificato”. Tuttavia, vediamo più nel dettaglio le sue caratteristiche in comparazione con Java.\u003c/p\u003e","title":"Groovy"},{"content":"In qualsiasi attività che preveda la creazione di qualcosa, esiste la possibilità di voler apportare delle modifiche al proprio lavoro, solo per poi rendersi conto di aver commesso un errore, senza la possibilità di tornare indietro. Ed è proprio qui che i sistemi di controllo versione vengono in aiuto!\nSistema di Controllo versione Uno dei primi ostacoli che si incontra durante la crescita professionale in ambito informatico è proprio la gestione del codice e delle sue modifiche.\nImmagina di scrivere una funzione e, dopo ore di lavoro, decidi di modificare alcune parti, per poi renderti conto che le nuove modifiche non solo non funzionano, ma non erano nemmeno necessarie. Inoltre, il classico CTRL+Z potrebbe non essere sufficiente per tornare indietro di così tanto.\nÈ in situazioni come questa che l’utilizzo di uno strumento di controllo versione diventa fondamentale.\nUn sistema di controllo versione è un software che permette di gestire il codice sorgente. Con un sistema di controllo versione, è possibile:\nAvere più versioni dello stesso codice sorgente Passare da una versione all’altra Percorrere lo storico delle modifiche e ripristinare il codice a un certo punto del passato Tra i vari sistemi di controllo versione, probabilmente il più famoso e utilizzato è GIT.\nCreato da Linus Torvalds nel 2005, GIT è diventato uno degli strumenti fondamentali per ogni sviluppatore, subito dopo l’IDE.\nInstallazione di GIT Per installare GIT, basta visitare questo link e scaricare la versione adatta al tuo sistema operativo.\nPrincipali comandi di GIT Sebbene GIT sia integrato in quasi tutti i principali IDE, che forniscono interfacce grafiche comode per la gestione del controllo versione, GIT nasce come strumento da utilizzare tramite interfaccia a riga di comando.\nDi seguito, alcuni comandi utili per l’utilizzo quotidiano tramite linea di comando:\nConfigurare il proprio nome: git config --global user.name \u0026quot;NOME\u0026quot; Visualizzare il nome impostato: git config --global user.name Configurare la propria email: git config --global user.email \u0026quot;EMAIL\u0026quot; Visualizzare l’email impostata: git config --global user.email Inizializzare GIT nel percorso corrente: git init Visualizzare lo stato del repository: git status Se nel percorso corrente ci sono già dei file, il comando mostrerà un risultato simile a questo:\nA questo punto, puoi aggiungere uno o più file al repository:\nAggiungere un file specifico: git add FILE1.EXT FILE2.EXT ... Aggiungere tutti i file presenti nel percorso corrente: git add . COMMIT Dopo aver aggiunto i file a Git, è il momento di eseguire un commit, ovvero registrare le modifiche nel repository:\nCommit: git commit -m \u0026quot;COMMENTO\u0026quot; Visualizzare il commit appena eseguito: git log Visualizzare il commit su una singola riga: git log --oneline A questo punto, potrebbe capitare di essersi dimenticati di aggiungere un file. Per rimediare, basta aggiungere il file e lanciare il seguente comando per modificare il commit precedente:\nModifica commit: git commit --amend -a -m \u0026quot;COMMENTO\u0026quot; BRANCH Supponiamo di voler implementare una variante del codice, la quale si sviluppa in parallelo rispetto alla versione principale. In questi casi, si utilizzano i branch.\nCreazione nuovo branch: git branch \u0026quot;NOME_BRANCH_SENZA_SPAZI\u0026quot; Visualizzare branche esistenti: git branch Come già anticipato, è possibile spostarsi da un branch all’altro. Questo processo si chiama “switch” e può essere fatto verso un branch già esistente o creando un nuovo branch al momento dello switch:\nCambio di branch: git switch \u0026quot;NOME_BRANCH\u0026quot; Creazione di un nuovo branch e switch: git switch -c \u0026quot;NOME_BRANCH\u0026quot; Rinominare il branch attuale: git branch -m \u0026quot;NUOVO_NOME\u0026quot; Eliminazione del branch: git branch -d \u0026quot;NOME\u0026quot; Unire un branch al branch corrente: git merge \u0026quot;NOME_DEL_BRANCH\u0026quot; Nelle versioni precedenti di Git, si utilizzava il comando checkout al posto di switch, e l’opzione -b al posto di -c.\nSTASH Supponiamo ora di avere delle modifiche in corso, ma si presenti la necessità di lavorare su un altro branch. Poiché sarebbe una buona norma non fare commit di codice incompleto e non testato, possiamo salvare il nostro lavoro nello stash per recuperarlo successivamente.\nSalvare il lavoro corrente: git stash Ripristino dallo stash: git stash pop Lista di stash: git stash list Ripristino di uno specifico elemento dalla lista di stash: git stash apply stash@{ID} Rimozione di un elemento dallo stash: git stash drop stash@{ID} Eliminazione di tutti gli elementi: git stash clear RESTORE Un’altra funzionalità importantissima è quella che permette di ripristinare un file a uno stato specifico, a patto che le modifiche non siano state già committate:\nRipristino di un file allo stato nell’ultimo commit: git restore FILE-NAME.EXT Ripristino di un file allo stato in cui si trovava ad uno specifico commit: git restore --source CODICE_DEL_BRANCH FILE_NAME.EXT Se si desidera rimuovere un file dallo stage, si può utilizzare:\ngit restore --staged NOME_FILE.EXT RESET \u0026amp; REVERT Se si desidera eliminare un commit e tutto il lavoro associato, ci sono due opzioni:\nEliminare la commit salvando i file locali: git reset CODICE_DEL_BRANCH Eliminare la commit e i file locali: git reset --hard CODICE_DEL_BRANCH Eliminare il lavoro committato creando una nuova commit: git revert CODICE_DEL_BRANCH REBASE È possibile manipolare lo storico dei commit per nascondere, rinominare, unire o eliminare uno o più commit. Va sottolineato che queste operazioni sono estremamente delicate e vanno eseguite solo in casi eccezionali:\nComando base che apre un editor mostrando i commit più recenti: git rebase -i HEAD~x (x equivale al numero di commit che si voliono visualizzare) Se non occorre effettuare alcuna modifica (comportamento di default): pick CODICE_COMMIT MESSAGGIO_ORIGINALE Se si vuole modificare il messaggio di una commit: reword CODICE_COMMIT NUOVO_MESSAGGIO Modifica di una commit: edit CODICE_COMMIT NUOVO_MESSAGGIO; a questo punto occorrerà procedere con i seguenti comandi prima di continuare con il rebase: git add FILE.EXT FILE.EXT .. git commit --amend git rebase --continue Unire un commit con il precedente (il messaggio finale sarà quello della commit precedente): fixup CODICE_COMMIT Cancellazione di una commit: drop CODICE_COMMIT Supponiamo di avere i seguenti commit su cui intervenire:\nabcd – Aggiunta autenticazione jwt efgh – Aggiuno refresh token jwt ilmn – Aggiunto file README.md Se ci si rende conto che il terzo commit non era necessario e che nel secondo c’è un errore di battitura nel messaggio, i passi da seguire sono:\nApertura editor dei commit: git rebase -i HEAD~3 pick abcd Aggiunta autenticazione jwt pick efgh Aggiuno refresh token jwt pick ilmn Aggiunto file README.md Dovremo modificare la situazione nel modo seguente: pick abcd Aggiunta autenticazione jwt reword efgh Aggiunto refresh token jwt drop ilmn Aggiunto file README.md A questo punto, salvando il file, Git richiederà di inserire un nuovo messaggio per il commit modificato. Dopo averlo fatto, il rebase sarà completato.\nTAG Un tag è un’informazione aggiuntiva associata a un commit e viene generalmente utilizzato per identificare una versione particolarmente importante, come una milestone o una versione rilasciata in ambiente di produzione. Esistono due tipi di tag: i tag leggeri e quelli annotati.\nTag leggero: git tag v1.0.0 Tag annotato: git tag -a v1.0.0 -m \u0026quot;MESSAGGIO DEL TAG\u0026quot; Come per qualsiasi cosa, ovviamente, è possibile avere una lista dei tag esistenti o cancellarne uno o più:\nLista dei tag: git tag Eliminazione di un tag: git tag -d v1.0.0 I tag vengono poi inviati al repository o singolarmente o tutti in sieme:\nPush di un singolo tag: git push origin v1.0.0 Push di tutti i tag disponibili: git push origin --tags Conclusioni Quello che abbiamo visto è solo una piccola parte dei comandi e delle opzioni disponibili per Git. Se vuoi approfondire l’argomento, ti consiglio di visitare il sito ufficiale e consultare la documentazione, che puoi trovare qui.\n","permalink":"https://antoniomontemurro.com/it/posts/controllo-versione/","summary":"\u003cp\u003eIn qualsiasi attività che preveda la creazione di qualcosa, esiste la possibilità di voler apportare delle modifiche al proprio lavoro, solo per poi rendersi conto di aver commesso un errore, senza la possibilità di tornare indietro. Ed è proprio qui che i sistemi di controllo versione vengono in aiuto!\u003c/p\u003e\n\u003ch2 id=\"sistema-di-controllo-versione\"\u003eSistema di Controllo versione\u003c/h2\u003e\n\u003cp\u003eUno dei primi ostacoli che si incontra durante la crescita professionale in ambito informatico è proprio la gestione del codice e delle sue modifiche.\u003c/p\u003e","title":"Controllo Versione"},{"content":"Indentazione In Python, i vari blocchi di codice sono identificati attraverso l’uso dell’indentazione. L’indentazione consiste nel lasciare uno specifico numero di spazi prima di iniziare a scrivere il codice. Al variare del numero di spazi, cambia anche il blocco di appartenenza del codice scritto.\nPython non impone un numero fisso di spazi, ma richiede coerenza nella scelta: una volta deciso un certo numero di spazi per l’indentazione, questo non può essere cambiato all’interno dello stesso file.\nGeneralmente, si usa una singola tabulazione (tasto TAB) o 4 spazi consecutivi, con quest’ultimo metodo che è solitamente consigliato dalla comunità.\nCommenti Come in ogni linguaggio di programmazione, anche in Python è possibile utilizzare i commenti.\nI commenti sono molto utili per aggiungere informazioni al codice, rendendolo più comprensibile agli altri sviluppatori (o a noi stessi in futuro). Un commento è, di fatto, codice che non viene eseguito durante l’esecuzione del programma.\nI commenti su una singola riga si inseriscono con il carattere # seguito da uno spazio. Per i commenti che si estendono su più righe, si utilizzano tre coppie di virgolette \u0026quot;\u0026quot;\u0026quot;.\nprint(\u0026#34;Ciao Mondo\u0026#34;) # Questo è un commento breve # Anche questo è un commento breve \u0026#34;\u0026#34;\u0026#34; Questo è un commento più lungo ed articolato che può stare su più righe \u0026#34;\u0026#34;\u0026#34; Variabili Python è un linguaggio a tipizzazione dinamica, ovvero non richiede di specificare il tipo di una variabile al momento della dichiarazione. Il tipo di variabile viene determinato automaticamente durante l’esecuzione del programma in base al valore assegnato.\nx = 0 # Questa è una variabile con valore iniziale 0 Input e Output Ora che abbiamo visto come dichiarare una variabile, vediamo come assegnarle un valore e come stamparne il contenuto.\nx = 0 y = 0 input(\u0026#34;Inserisci il valore di x: \u0026#34;) input(\u0026#34;Inserisci il valore di y: \u0026#34;) print(f\u0026#34;Hai inserito {x} come valore di x e {y} come valore di y!\u0026#34;) A questo link trovi uno script molto semplice che mostra come sfruttare quanto appena imparato.\nRiepilogo Ora che abbiamo compreso cos’è Python, perché è uno strumento potente e versatile, e perché può essere estremamente utile impararne (almeno) le basi, abbiamo anche visto come dichiarare variabili e come assegnare e leggere i valori che contengono. Nel prossimo articolo approfondiremo i vari tipi impliciti di variabili, esploreremo i diversi tipi di dati con cui lavorare e impareremo come manipolarli per sfruttare appieno le potenzialità di Python.\n","permalink":"https://antoniomontemurro.com/it/posts/sintassi-base-in-python/","summary":"\u003ch2 id=\"indentazione\"\u003eIndentazione\u003c/h2\u003e\n\u003cp\u003eIn Python, i vari blocchi di codice sono identificati attraverso l’uso dell’indentazione. L’indentazione consiste nel lasciare uno specifico numero di spazi prima di iniziare a scrivere il codice. Al variare del numero di spazi, cambia anche il blocco di appartenenza del codice scritto.\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"identazione.jpg\" loading=\"lazy\" src=\"/img/sintassi-base-in-python/identazione.jpg\"\u003e\u003c/p\u003e\n\u003cp\u003ePython non impone un numero fisso di spazi, ma richiede coerenza nella scelta: una volta deciso un certo numero di spazi per l’indentazione, questo non può essere cambiato all’interno dello stesso file.\u003c/p\u003e","title":"Python – Sintassi di Base"},{"content":"Se stai leggendo questo articolo, probabilmente è la tua prima esperienza con Python e, in generale, con la programmazione. In questo articolo vedremo come installare Python, scegliere un IDE e scrivere un semplice programma per verificare che tutto funzioni correttamente.\nDopo aver discusso del perché Python possa essere un’ottima scelta sia per un neofita che per un programmatore esperto, vediamo ora come effettuare il setup di Python e scegliere l’IDE più adatto.\nInstallare Python Installare Python è molto semplice. Vai al sito ufficiale e scarica l’ultima versione ovvero quella che trovi evidenziata in alto nella sezione “Downloads”. Il sistema selezionerà automaticamente la versione compatibile con il tuo sistema operativo.\nA questo punto procedi pure con l’installazione facendo doppio click sul file appena scaricato. Per verificare che Python sia stato installato correttamente apri il prompt dei comandi e digita:\npython --version Se il terminale risponde mostrando la versione di Python, l’installazione è completata. Se invece il terminale non dovesse riconoscere il comando, sarà necessario aggiungere Python alle variabili di ambiente. Per farlo, ti suggerisco di seguire questa guida.\nQuale IDE utilizzare? Ora che Python è installato, sorge la domanda quale strumento usare per scrivere e eseguire il codice? Tecnicamente, non hai bisogno alcuno strumento specifico (su Windows, potresti anche usare il “Blocco note”) ma per scrivere codice professionale è meglio utilizzare un vero IDE.\nCos’è un IDE? Un IDE (Integrated Development Environment) è un’applicazione che fornisce strumenti utili per lo sviluppo software. Due strumenti fondamentali sono il debugger e l’intellisense.\nIntellisense: Questa funzione di autocompletamento delle istruzioni riduce il tempo di digitazione e minimizza errori di sintassi. Debugger: Utile per analizzare il codice, il debugger ti aiuta a individuare e risolvere errori di programmazione (bug). PyCharm Esistono diversi IDE che supportano Python. Molti sono gratuiti, mentre altri offrono una versione base gratuita. Noi utilizzeremo PyCharm nella sua versione gratuita. Dopo averlo scaricato, avvia l’installazione e, quando ti verranno presentate alcune opzioni, ti consiglio di selezionarle tutte.\nUna volta installato, siamo pronti per scrivere il nostro primo programma in Python.\nHello World Non c’è nulla di più tipico per uno sviluppatore che iniziare con un programma “Hello World”. Quindi, apri PyCharm e accetta i termini d’uso al primo avvio. Se hai già altri IDE installati, PyCharm potrebbe chiederti di importarne le configurazioni.\nClicca su “New Project”, dai un nome al progetto, per esempio “helloWorld”, scegli una cartella di destinazione e lascia le impostazioni predefinite. Clicca su “Create”.\nA questo punto, crea un nuovo file chiamato “main” e scrivi il seguente codice:\nprint(\u0026#34;Hello World\u0026#34;) Ora, clicca sul tasto “Play” in alto e vedrai il testo apparire nella console.\n","permalink":"https://antoniomontemurro.com/it/posts/setup-di-python-e-scelta-dellide/","summary":"\u003cp\u003eSe stai leggendo questo articolo, probabilmente è la tua prima esperienza con Python e, in generale, con la programmazione. In questo articolo vedremo come installare Python, scegliere un IDE e scrivere un semplice programma per verificare che tutto funzioni correttamente.\u003c/p\u003e\n\u003cp\u003eDopo aver \u003ca href=\"/it/posts/perche-imparare-python/\"\u003ediscusso del perché Python possa essere un’ottima scelta\u003c/a\u003e sia per un neofita che per un programmatore esperto, vediamo ora come effettuare il setup di Python e scegliere l’IDE più adatto.\u003c/p\u003e","title":"Installare Python e scelta dell’IDE"},{"content":"\nPython è un linguaggio di alto livello, creato dal matematico e informatico Guido Van Rossum nel 1991. Secondo Van Rossum, Python doveva essere un linguaggio semplice, comprensibile e facile da imparare per chiunque.\nQuesti aspetti hanno permesso a Python di diventare uno dei linguaggi più diffusi al mondo, soprattutto grazie alle sue applicazioni in ambiti moderni come l’intelligenza artificiale.\nVantaggi e Caratteristiche Le principali caratteristiche di Python sono:\nFacilità di apprendimento: è considerato uno dei linguaggi più semplici da imparare, anche per principianti.; Librerie: ha una vasta gamma di librerie che estendono le sue funzionalità, dalla manipolazione di immagini alla creazione di GUI e videogiochi; Orientato agli oggetti: supporta la programmazione orientata agli oggetti, con concetti come classi, oggetti ed ereditarietà, ecc. Codice pre-compilato: Anche se è interpretato, il suo codice viene pre-compilato in bytecode per migliorarne le prestazioni. Tipizzazione dinamica: Le variabili non sono tipizzate staticamente; il tipo viene determinato in fase di esecuzione, in base al valore assegnato. Multipiattaforma: Il codice può essere eseguito su Windows, macOS e Unix, anche se alcune librerie potrebbero non essere compatibili su tutte le piattaforme. Casi d’uso. Data la sua semplicità e versatilità, python, viene utilizzato nei contesti più disparati ovvero:\nSviluppo software (web e desktop) grazie a librerie e framework; Machine learning e Intelligenza Artificiale Data Science e Web Scraping Sviluppo di videogiochi Perché imparare Python? La risposta più semplice e banale sarebbe “Perché no?”!\nNegli ultimi anni, Python è diventato uno dei linguaggi più diffusi, come confermano i dati di GitHub. Indipendentemente dalla tua esperienza, imparare Python può arricchire il tuo set di competenze e renderti più competitivo nel mercato del lavoro.\nQuesto significa che a prescindere dalla tua preparazione/esperienza nel mondo della programmazione, se è tuo interesse essere competitivo nel mondo del lavoro, python può essere una skill addizionale per la quale valga la pena di investire il tuo tempo.\nSe vuoi saperne di più, visita il sito ufficiale o esplora la nostra sezione dedicata nel menù in alto.\n","permalink":"https://antoniomontemurro.com/it/posts/perche-imparare-python/","summary":"\u003cp\u003e\u003cimg alt=\"Logo-della-Python-1024x576.png\" loading=\"lazy\" src=\"/img/perche-imparare-python/Logo-della-Python-1024x576.png\"\u003e\u003c/p\u003e\n\u003cp\u003ePython è un linguaggio di alto livello, creato dal matematico e informatico Guido Van Rossum nel 1991. Secondo Van Rossum, Python doveva essere un linguaggio semplice, comprensibile e facile da imparare per chiunque.\u003c/p\u003e\n\u003cp\u003eQuesti aspetti hanno permesso a Python di diventare uno dei linguaggi più diffusi al mondo, soprattutto grazie alle sue applicazioni in ambiti moderni come l’intelligenza artificiale.\u003c/p\u003e\n\u003ch2 id=\"vantaggi-e-caratteristiche\"\u003eVantaggi e Caratteristiche\u003c/h2\u003e\n\u003cp\u003eLe principali caratteristiche di Python sono:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eFacilità di apprendimento: è considerato uno dei linguaggi più semplici da imparare, anche per principianti.;\u003c/li\u003e\n\u003cli\u003eLibrerie: ha una vasta gamma di librerie che estendono le sue funzionalità, dalla manipolazione di immagini alla creazione di GUI e videogiochi;\u003c/li\u003e\n\u003cli\u003eOrientato agli oggetti: supporta la programmazione orientata agli oggetti, con concetti come classi, oggetti ed ereditarietà, ecc.\u003c/li\u003e\n\u003cli\u003eCodice pre-compilato: Anche se è interpretato, il suo codice viene pre-compilato in bytecode per migliorarne le prestazioni.\u003c/li\u003e\n\u003cli\u003eTipizzazione dinamica: Le variabili non sono tipizzate staticamente; il tipo viene determinato in fase di esecuzione, in base al valore assegnato.\u003c/li\u003e\n\u003cli\u003eMultipiattaforma: Il codice può essere eseguito su Windows, macOS e Unix, anche se alcune librerie potrebbero non essere compatibili su tutte le piattaforme.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"casi-duso\"\u003eCasi d’uso.\u003c/h2\u003e\n\u003cp\u003eData la sua semplicità e versatilità, python, viene utilizzato nei contesti più disparati ovvero:\u003c/p\u003e","title":"Cos’è Python e perché usarlo"},{"content":"“The Pragmatic Programmer: Your Journey to Mastery” è un testo fondamentale per sviluppatori e ingegneri del software, scritto da Andrew Hunt e David Thomas.\nPubblicato nel 1999, il libro rimane rilevante e apprezzato per la sua visione pratica e per i suoi consigli sulla programmazione e sul problem solving. Il suo approccio pragmatico, come suggerisce il titolo, guida i lettori a diventare programmatori più efficaci, capaci di affrontare le complessità della programmazione moderna.\nGli argomenti trattati spaziano dalle tecniche di gestione del codice e delle risorse, fino ai suggerimenti su come affrontare il debugging e il testing.\nUn punto di forza del libro è la sua enfasi su abitudini e pratiche quotidiane che aiutano i programmatori a migliorare progressivamente.\nUno dei concetti centrali del libro è quello del “pragmatico”, ovvero la capacità di affrontare problemi complessi con un approccio flessibile e adattabile.\nGli autori insistono sulla necessità di mantenere una mentalità aperta e curiosa, pronta a imparare nuovi strumenti e tecnologie.\nTra i principi chiave c’è l’idea di “DRY” (Don’t Repeat Yourself), che invita a evitare la duplicazione del codice, e il concetto di “Code Orthogonality”, che sottolinea l’importanza di mantenere moduli indipendenti e modulari per favorire la manutenibilità del software.\nIl libro fornisce anche consigli utili su come migliorare la gestione del tempo e delle risorse, oltre che su come evitare il burnout, un problema comune nel settore tecnologico.\nIn conclusione, “The Pragmatic Programmer” è un’opera essenziale per chiunque voglia migliorare le proprie capacità di programmazione e abbracciare un approccio pratico e flessibile allo sviluppo software. I suoi insegnamenti vanno ben oltre le singole tecnologie o linguaggi di programmazione, offrendo principi universali che possono essere applicati in qualsiasi contesto lavorativo.\n","permalink":"https://antoniomontemurro.com/it/libri/pragmatic-programmer/","summary":"\u003cp\u003e\u003ca href=\"https://www.amazon.it/Pragmatic-Programmer-manovali-diventare-programmazione-ebook/dp/B07B4HZZNB/?_encoding=UTF8\u0026amp;pd_rd_w=Y9IOD\u0026amp;content-id=amzn1.sym.5a7cfaea-d03a-4f08-aa5b-2acc67a7f744\u0026amp;pf_rd_p=5a7cfaea-d03a-4f08-aa5b-2acc67a7f744\u0026amp;pf_rd_r=262-4118299-2575528\u0026amp;pd_rd_wg=36WPr\u0026amp;pd_rd_r=cfa2a386-5b6f-4967-a6b3-d57a901ba9bd\u0026amp;ref_=aufs_ap_sc_dsk\"\u003e“The Pragmatic Programmer: Your Journey to Mastery”\u003c/a\u003e è un testo fondamentale per sviluppatori e ingegneri del software, scritto da \u003ca href=\"https://en.wikipedia.org/wiki/Andy_Hunt_%28author%29\"\u003eAndrew Hunt\u003c/a\u003e e \u003ca href=\"https://en.wikipedia.org/wiki/David_Thomas\"\u003eDavid Thomas\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003ePubblicato nel 1999, il libro rimane rilevante e apprezzato per la sua visione pratica e per i suoi consigli sulla programmazione e sul problem solving. Il suo approccio pragmatico, come suggerisce il titolo, guida i lettori a diventare programmatori più efficaci, capaci di affrontare le complessità della programmazione moderna.\u003c/p\u003e","title":"Pragmatic Programmer"},{"content":"Pubblicato nel 2008, “Clean Code: A Handbook of Agile Software Craftsmanship” di Robert C. Martin, spesso noto come “Uncle Bob,” rappresenta un ottimo punto di riferimento per chiunque s’interroghi su quello che potrebbe essere un buon approccio alla scrittura di codice di qualità.\nIl libro è suddiviso in tre parti: principi, modelli e pratiche del codice pulito; casi studio applicativi; e regole per il clean code. Martin sottolinea l’importanza di scrivere codice non solo funzionante, ma anche leggibile e manutenibile. Il codice viene letto molto più spesso di quanto venga scritto, quindi la chiarezza è fondamentale.\nUno dei punti di forza di “Clean Code” è l’attenzione alla semplicità e concisione. Martin afferma che il codice deve essere comprensibile per chiunque lavori sul progetto, presente o futuro. Promuove nomi chiari per variabili e metodi, funzioni brevi e l’eliminazione della duplicazione.\nL’approccio pragmatico di Martin è supportato da numerosi esempi concreti, tratti dalla sua vasta esperienza nel campo dello sviluppo software. Questi esempi aiutano il lettore a vedere come i principi teorici possano essere applicati in situazioni reali, rendendo il libro non solo teorico, ma anche estremamente pratico. Tuttavia, il libro non è senza critiche. Alcuni lettori possono trovare che le regole di Martin siano troppo rigide o che non si applichino sempre a tutti i contesti di programmazione. Inoltre, alcune tecniche proposte possono sembrare eccessive o difficili da implementare in ambienti con codice legacy.\nIn conclusione, “Clean Code” è un’opera essenziale per chiunque desideri migliorare la qualità del proprio codice. Offre una guida chiara e dettagliata su come scrivere codice che non solo funziona, ma che può essere facilmente compreso e mantenuto. Pur non essendo privo di limiti, il libro rimane una risorsa inestimabile per sviluppatori di ogni livello, fornendo una visione completa su cosa significhi veramente scrivere codice pulito e mantenibile.\n","permalink":"https://antoniomontemurro.com/it/libri/clean-code/","summary":"\u003cp\u003ePubblicato nel 2008, “\u003ca href=\"https://www.amazon.it/gp/product/8850334389/ref=ppx_yo_dt_b_search_asin_title?ie=UTF8\u0026amp;psc=1\"\u003eClean Code: A Handbook of Agile Software Craftsmanship\u003c/a\u003e” di \u003ca href=\"https://it.wikipedia.org/wiki/Robert_Cecil_Martin\"\u003eRobert C. Martin\u003c/a\u003e, spesso noto come “Uncle Bob,” rappresenta un ottimo punto di riferimento per chiunque s’interroghi su quello che potrebbe essere un buon approccio alla scrittura di codice di qualità.\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"clean-code.jpg\" loading=\"lazy\" src=\"/img/clean-code/clean-code.jpg\"\u003e\u003c/p\u003e\n\u003cp\u003eIl libro è suddiviso in tre parti: principi, modelli e pratiche del codice pulito; casi studio applicativi; e regole per il clean code. Martin sottolinea l’importanza di scrivere codice non solo funzionante, ma anche leggibile e manutenibile. Il codice viene letto molto più spesso di quanto venga scritto, quindi la chiarezza è fondamentale.\u003c/p\u003e","title":"Clean Code"},{"content":"Il Mio Viaggio nel Mondo dello Sviluppo Inizia Qui Benvenuti su ThroughDev.com, un progetto che ho deciso di avviare per condividere con voi il mio viaggio nel mondo dello sviluppo software. Ma perché un altro blog sulla programmazione, vi chiederete? La risposta è semplice: questo è molto più di un blog. È il mio spazio personale per raccontare le sfide, le scoperte, e le soddisfazioni che si incontrano lungo il percorso di un developer, sia esso alle prime armi o un professionista navigato.\nPerché ThroughDev? La programmazione è un campo in continua evoluzione, e ogni giorno c’è qualcosa di nuovo da imparare. Ho creato ThroughDev non solo per documentare il mio progresso, ma anche per offrire un punto di riferimento a chi, come me, è appassionato di codice. Qui troverete tutorial che vanno dal livello base a quello avanzato, articoli di approfondimento su tecnologie emergenti, e riflessioni personali su ciò che significa essere uno sviluppatore nel mondo moderno.\nPer Chi è Questo Blog? Il mio obiettivo è che ThroughDev diventi una risorsa utile per tutti: dai curiosi che si affacciano per la prima volta al mondo della programmazione, ai junior developer in cerca di consigli pratici, fino ai professionisti che vogliono esplorare nuove tecnologie o trovare ispirazione per i propri progetti. Voglio creare una comunità in cui ognuno possa crescere e condividere il proprio sapere.\nCosa Aspettarsi Nei prossimi articoli, inizierò con alcuni tutorial su concetti fondamentali, esplorerò tecnologie interessanti, e vi porterò con me nelle mie esperienze di sviluppo. Sarà un viaggio entusiasmante, pieno di scoperte e, spero, di spunti utili per tutti voi.\nGrazie per essere qui all’inizio di questo percorso. Non vedo l’ora di vedere dove ci porterà!\n","permalink":"https://antoniomontemurro.com/it/posts/hello-dev/","summary":"\u003ch2 id=\"il-mio-viaggio-nel-mondo-dello-sviluppo-inizia-qui\"\u003eIl Mio Viaggio nel Mondo dello Sviluppo Inizia Qui\u003c/h2\u003e\n\u003cp\u003eBenvenuti su \u003cstrong\u003eThroughDev.com\u003c/strong\u003e, un progetto che ho deciso di avviare per condividere con voi il mio viaggio nel mondo dello sviluppo software. Ma perché un altro blog sulla programmazione, vi chiederete? La risposta è semplice: questo è molto più di un blog. È il mio spazio personale per raccontare le sfide, le scoperte, e le soddisfazioni che si incontrano lungo il percorso di un developer, sia esso alle prime armi o un professionista navigato.\u003c/p\u003e","title":"Hello dev!"},{"content":"Mi chiamo Antonio Montemurro e lavoro come sviluppatore software dal 2018.\nMi occupo principalmente di backend in Java, quasi sempre con Spring, e negli ultimi tempi sto approfondendo Vert.x. Nel corso degli anni ho lavorato anche con altre tecnologie: app native sia per Android sia per iOS, Flutter, React, Python e .NET. Sono esperienze che riflettono la curiosità di provare strumenti diversi.\nQuesto blog è a metà tra un diario personale e il racconto del mio percorso professionale. Qui raccolgo i progetti che sviluppo per conto mio, gli appunti su ciò che imparo e, di tanto in tanto, qualche libro che ritengo valga la pena leggere.\nMi trovi su GitHub e LinkedIn.\n","permalink":"https://antoniomontemurro.com/it/chi-sono/","summary":"\u003cp\u003eMi chiamo Antonio Montemurro e lavoro come sviluppatore software dal 2018.\u003c/p\u003e\n\u003cp\u003eMi occupo principalmente di backend in Java, quasi sempre con Spring, e negli ultimi tempi sto approfondendo Vert.x. Nel corso degli anni ho lavorato anche con altre tecnologie: app native sia per Android sia per iOS, Flutter, React, Python e .NET. Sono esperienze che riflettono la curiosità di provare strumenti diversi.\u003c/p\u003e\n\u003cp\u003eQuesto blog è a metà tra un diario personale e il racconto del mio percorso professionale. Qui raccolgo i \u003ca href=\"/it/categories/progetti/\"\u003eprogetti\u003c/a\u003e che sviluppo per conto mio, gli \u003ca href=\"/it/posts/\"\u003eappunti\u003c/a\u003e su ciò che imparo e, di tanto in tanto, qualche \u003ca href=\"/it/libri/\"\u003elibro\u003c/a\u003e che ritengo valga la pena leggere.\u003c/p\u003e","title":"Chi sono"}]