<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Python on Melabit</title>
    <link>https://static.233.196.69.159.clients.your-server.de/it/tags/python/</link>
    <description>Recent content in Python on Melabit</description>
    <generator>Hugo</generator>
    <language>it</language>
    <lastBuildDate>Mon, 16 Mar 2026 18:00:00 +0000</lastBuildDate>
    <atom:link href="https://static.233.196.69.159.clients.your-server.de/it/tags/python/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Antigravity: l&#39;LLM lo fa meglio</title>
      <link>https://static.233.196.69.159.clients.your-server.de/it/2026/03/16/antigravity-l-llm-lo-fa-meglio/</link>
      <pubDate>Mon, 16 Mar 2026 18:00:00 +0000</pubDate>
      <guid>https://static.233.196.69.159.clients.your-server.de/it/2026/03/16/antigravity-l-llm-lo-fa-meglio/</guid>
      <description>&lt;p&gt;Nelle ultime settimane ho scritto delle mie esperienze con Antigravity, o meglio con gli &lt;em&gt;agenti&lt;/em&gt; (più o meno) &lt;em&gt;intelligenti&lt;/em&gt; integrati in questo editor. I risultati sono stati contrastanti: a volte &lt;a href=&#34;https://melabit.com/it/2026/01/21/sorpresa-antigravity/&#34;&gt;gli agenti si sono dimostrati molto efficaci&lt;/a&gt;, alleviando con precisione alcuni compiti complessi o ripetitivi, in altri casi &lt;a href=&#34;https://melabit.com/it/2026/02/16/antigravity-dalla-sorpresa-al-dubbio/&#34;&gt;non hanno combinato niente di buono&lt;/a&gt; facendo solo perdere una montagna di tempo.&lt;/p&gt;&#xA;&lt;h4 id=&#34;programmare-male-con-lllm&#34;&gt;Programmare male con l&amp;rsquo;LLM&lt;/h4&gt;&#xA;&lt;p&gt;Fra tutti gli impieghi più o meno utili degli LLM, uno dei più controversi è l&amp;rsquo;idea che chiunque possa usare un LLM per programmare, anche quando di programmazione non se ne sa una cippa. È il cosidetto &lt;em&gt;vibe coding&lt;/em&gt;, un concetto che si può &lt;a href=&#34;https://x.com/karpathy/status/1886192184808149383&#34;&gt;riassumere così&lt;/a&gt;: &amp;ldquo;vedo cose, dico cose, copio e incollo cose, e nella maggior parte dei casi funziona&amp;rdquo;. Non è una citazione da &lt;a href=&#34;https://www.youtube.com/watch?v=-w9EBTB8a3Y&#34;&gt;Nanni Moretti&lt;/a&gt;, lo dice Andrej Karpathy, uno dei fondatori di OpenAI.&lt;/p&gt;&#xA;&lt;p&gt;Ora, mettendo da parte le tante questioni relative alla sicurezza, alla manutenibilità di codice prodotto senza sapere bene cosa fa, alla &lt;a href=&#34;https://taylorandfrancis.com/knowledge/Engineering_and_technology/Engineering_support_and_special_topics/Regression_to_the_mean/&#34;&gt;deriva verso la media&lt;/a&gt; che implica che la qualità del codice prodotto dall&amp;rsquo;IA tenderà inevitabilmente a crollare, basta sperimentare un po&amp;rsquo; in prima persona, anche con progetti semplici, per accorgersi che l&amp;rsquo;idea del &lt;em&gt;coding per tutti&lt;/em&gt; non funziona, e che se vuoi ottenere qualcosa di buono dall&amp;rsquo;IA devi sapere bene cosa vuoi e come lo vuoi.&lt;/p&gt;&#xA;&lt;p&gt;Ci ho provato io stesso a fare &lt;em&gt;vibe coding&lt;/em&gt;: ho chiesto a Gemini di &lt;a href=&#34;https://melabit.com/it/2026/03/04/antigravity-un-driver-scritto-dall-ia/&#34;&gt;scrivere un driver per una videocamera Arducam&lt;/a&gt;, spiegandogli solo le cose indispensabili a aspettando che facesse tutto da solo.&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#xA;&lt;p&gt;Questo approccio però non ha funzionato. Ci sono volute ore ed ore di lavoro, di errori, di risposte inconcludenti, di correzioni e di consigli per raggiungere un risultato accettabile.&lt;/p&gt;&#xA;&lt;p&gt;E questo solo perché a un certo punto ho buttato alle ortiche l&amp;rsquo;idea di far fare tutto a Gemini e gli ho dato dei consigli su come procedere. Senza quelli sarebbe stato solo un sacco di tempo buttato via inutilmente.&lt;/p&gt;&#xA;&lt;div style = &#34;border-style: solid; border-width: 0px 0px 0px 12px; border-color: #03a87c; background-color: #defef6; padding: 1em; color:black; font-size:100%;&#34;&gt;&#xA;&lt;p&gt;Anche &lt;a href=&#34;https://emeralit-muloblog.statichost.page/&#34;&gt;Mimmo&lt;/a&gt; ha provato, in modo del tutto indipendente da me, a far scrivere a &lt;a href=&#34;https://lumo.proton.me&#34;&gt;Lumo&lt;/a&gt; un programma in Micropython per gestire la mia Arducam Mini 5MP Plus con il Pico. E anche Lumo, che è senza dubbio uno dei migliori chatbot in circolazione, non ce l&amp;rsquo;ha fatta da solo.&lt;/p&gt;&#xA;&lt;/div&gt;&#xA;&lt;/br&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2026-03-16-antigravity-l-llm-lo-fa-meglio/Gemini_Generated_Image_jb08gsjb08gsjb08.jpg&#34; alt=&#34;&#34;&gt;&#xA;&amp;ndash; &lt;em&gt;Immagine generata da &lt;a href=&#34;https://gemini.google.com&#34;&gt;Google Gemini&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;h4 id=&#34;programmare-meglio-con-lo-stesso-llm&#34;&gt;Programmare meglio con lo stesso LLM&lt;/h4&gt;&#xA;&lt;p&gt;Tutto questo però non significa che un LLM non possa essere prezioso quando si programma, basta solo usarlo come si deve. Bisogna spiegargli per filo e per segno cosa deve fare, mettergli a disposizione tutto il materiale che gli serve per lavorare, e piazzargli dei paletti entro cui deve muoversi.&lt;/p&gt;&#xA;&lt;p&gt;In poche parole, bisogna trattarlo come un tesista o una stagista, con poca esperienza ma tanta voglia di imparare.&lt;/p&gt;&#xA;&lt;p&gt;Sono bastati infatti due prompt scritti con criterio, il primo che definiva la struttura delle directory del progetto e istruiva l&amp;rsquo;agente ad usare fin dall&amp;rsquo;inizio &lt;code&gt;git&lt;/code&gt; per il controllo di versione del codice e &lt;code&gt;uv&lt;/code&gt; per installare i pacchetti Python che gli sarebbero potuti servire,&lt;/p&gt;&#xA;&#xA;&lt;details class=&#34;question&#34; open&gt;&#xA;    &lt;summary class=&#34;question&#34;&gt;&#xA;        Prompt&#xA;    &lt;/summary&gt;&#xA;    &lt;div class=&#34;question&#34;&gt;&#xA;        &#xA;    &#xA;    &lt;p&gt;Start a new project and name it &lt;code&gt;project13-pico-camera5mp-reprise&lt;/code&gt;.&lt;/p&gt;&#xA;    &lt;p&gt;Read the &lt;code&gt;AGENTS.md&lt;/code&gt; file that defines your basic behaviour.&lt;/p&gt;&#xA;    &lt;p&gt;Create a new directory with this name and initialize an empty &lt;code&gt;git&lt;/code&gt; repository using &lt;code&gt;git init&lt;/code&gt;&#xA;    Use &lt;code&gt;uv&lt;/code&gt; for managing Python packages.&#xA;    All the code must stay in the &lt;code&gt;code&lt;/code&gt; directory, with no subdirectories within it.&#xA;    This project does not need a &lt;code&gt;data&lt;/code&gt; directory and the &lt;code&gt;output&lt;/code&gt; directory must be renamed as &lt;code&gt;images&lt;/code&gt;.&lt;/p&gt;&#xA;    &#xA;&#xA;&lt;div&gt;&#xA;&lt;/details&gt;&#xA;&#xA;&lt;p&gt;e il secondo che conteneva tutto quello che mi è venuto in mente per aiutarlo a lavorare,&lt;/p&gt;&#xA;&#xA;&lt;details class=&#34;question&#34; open&gt;&#xA;    &lt;summary class=&#34;question&#34;&gt;&#xA;        Prompt&#xA;    &lt;/summary&gt;&#xA;    &lt;div class=&#34;question&#34;&gt;&#xA;        &#xA;    &#xA;    &lt;p&gt;I have a Rasperry Pi Pico 2W connected to a Arducam 5MP Plus OV5642 Mini Module Camera Shield (&lt;a href=&#34;https://www.arducam.com/arducam-5mp-plus-spi-cam-arduino-ov5642.html%29&#34;&gt;https://www.arducam.com/arducam-5mp-plus-spi-cam-arduino-ov5642.html)&lt;/a&gt;.&lt;/p&gt;&#xA;    &lt;p&gt;I have connected the camera to the Pico using the standard layout found in the documentation:&lt;/p&gt;&#xA;    &lt;table&gt;&#xA;      &lt;thead&gt;&#xA;          &lt;tr&gt;&#xA;              &lt;th&gt;Camera&lt;/th&gt;&#xA;              &lt;th&gt;CS&lt;/th&gt;&#xA;              &lt;th&gt;MOSI&lt;/th&gt;&#xA;              &lt;th&gt;MISO&lt;/th&gt;&#xA;              &lt;th&gt;SCK&lt;/th&gt;&#xA;              &lt;th&gt;GND&lt;/th&gt;&#xA;              &lt;th&gt;VCC&lt;/th&gt;&#xA;              &lt;th&gt;SDA&lt;/th&gt;&#xA;              &lt;th&gt;SCL&lt;/th&gt;&#xA;          &lt;/tr&gt;&#xA;      &lt;/thead&gt;&#xA;      &lt;tbody&gt;&#xA;          &lt;tr&gt;&#xA;              &lt;td&gt;Pico&lt;/td&gt;&#xA;              &lt;td&gt;GP5&lt;/td&gt;&#xA;              &lt;td&gt;GP3&lt;/td&gt;&#xA;              &lt;td&gt;GP4&lt;/td&gt;&#xA;              &lt;td&gt;GP2&lt;/td&gt;&#xA;              &lt;td&gt;GND&lt;/td&gt;&#xA;              &lt;td&gt;3V3&lt;/td&gt;&#xA;              &lt;td&gt;GP8&lt;/td&gt;&#xA;              &lt;td&gt;GP9&lt;/td&gt;&#xA;          &lt;/tr&gt;&#xA;      &lt;/tbody&gt;&#xA;    &lt;/table&gt;&#xA;    &lt;p&gt;The main documentation for the camera can be found at these links:&lt;/p&gt;&#xA;    &lt;ul&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;https://docs.arducam.com/Arduino-SPI-camera/Legacy-SPI-camera/Introduction/&#34;&gt;https://docs.arducam.com/Arduino-SPI-camera/Legacy-SPI-camera/Introduction/&lt;/a&gt;&lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;https://docs.arducam.com/Arduino-SPI-camera/Legacy-SPI-camera/Hardware/Arducam-Shield-Mini-5MP-Plus/&#34;&gt;https://docs.arducam.com/Arduino-SPI-camera/Legacy-SPI-camera/Hardware/Arducam-Shield-Mini-5MP-Plus/&lt;/a&gt;&lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;https://docs.arducam.com/Arduino-SPI-camera/Legacy-SPI-camera/Software/Quick-Start-Guide/&#34;&gt;https://docs.arducam.com/Arduino-SPI-camera/Legacy-SPI-camera/Software/Quick-Start-Guide/&lt;/a&gt;&lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;https://docs.arducam.com/Arduino-SPI-camera/Legacy-SPI-camera/Pico/Camera-Module/SPI-Camera/&#34;&gt;https://docs.arducam.com/Arduino-SPI-camera/Legacy-SPI-camera/Pico/Camera-Module/SPI-Camera/&lt;/a&gt;&lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;https://www.uctronics.com/download/Image_Sensor/OV5642_DS.pdf&#34;&gt;https://www.uctronics.com/download/Image_Sensor/OV5642_DS.pdf&lt;/a&gt;&lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;https://blog.arducam.com/downloads/shields/ArduCAM_Camera_Shield_Software_Application_Note.pdf&#34;&gt;https://blog.arducam.com/downloads/shields/ArduCAM_Camera_Shield_Software_Application_Note.pdf&lt;/a&gt;&lt;/li&gt;&#xA;    &lt;li&gt;&lt;a href=&#34;https://www.uctronics.com/download/Amazon/B0067-B0068-Pico.pdf&#34;&gt;https://www.uctronics.com/download/Amazon/B0067-B0068-Pico.pdf&lt;/a&gt;&lt;/li&gt;&#xA;    &lt;/ul&gt;&#xA;    &lt;p&gt;The code to drive this camera with the Pico is written in C (i.e., for Arduino) and CircuitPython, and can be found here: &lt;a href=&#34;https://github.com/ArduCAM/PICO_SPI_CAM&#34;&gt;https://github.com/ArduCAM/PICO_SPI_CAM&lt;/a&gt;. You can download all the files you need from this repository.&#xA;    In particular, the files for CircuitPython are in the &lt;code&gt;Python&lt;/code&gt; directory:&lt;/p&gt;&#xA;    &lt;ul&gt;&#xA;    &lt;li&gt;&lt;code&gt;Arducam.py&lt;/code&gt;, which contains the functions to drive the camera,&lt;/li&gt;&#xA;    &lt;li&gt;&lt;code&gt;OV5642_reg.py&lt;/code&gt; which, as far as I have understood, defines the resolutions  allowed  when taking pictures, and&lt;/li&gt;&#xA;    &lt;li&gt;&lt;code&gt;boot.py&lt;/code&gt; , but I don&amp;rsquo;t know what it does.&#xA;    In the same directory there is also the script &lt;code&gt;ArduCAM_Mini_5MP_Plus_VideoStreaming.py&lt;/code&gt; which sends the video captured by the camera to a Windows application and that is of no use here.&lt;/li&gt;&#xA;    &lt;/ul&gt;&#xA;    &lt;p&gt;Please write a basic CircuitPython script that uses the functions defined in &lt;code&gt;Arducam.py&lt;/code&gt; to test that the camera works and can take photos.&lt;/p&gt;&#xA;    &#xA;&#xA;&lt;div&gt;&#xA;&lt;/details&gt;&#xA;&#xA;&lt;p&gt;per permettere a &lt;code&gt;Gemini 3 Flash&lt;/code&gt; di generare rapidamente uno script in CircuitPython che gira direttamente sul Pico e che fa tutto quello che gli è stato chiesto.&lt;/p&gt;&#xA;&lt;p&gt;In verità, la primissima versione dello script non funzionava, ma è bastato a Gemini modificare una sola riga del driver &lt;code&gt;Arducam.py&lt;/code&gt; fornito dal produttore per mettere tutto a posto (ha tolto uno zero al valore della frequenza).&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://static.233.196.69.159.clients.your-server.de/img/2026-03-16-antigravity-l-llm-lo-fa-meglio/one-line-diff.png&#34;&gt;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2026-03-16-antigravity-l-llm-lo-fa-meglio/one-line-diff.png&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&#xA;&amp;ndash; &lt;em&gt;La linea evidenziata in azzurro indica l&amp;rsquo;unica modifica effettuata da Gemini al file &lt;code&gt;Arducam.py&lt;/code&gt;; a sinistra il file originale, a destra quello modificato da Gemini.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;Tutti gli altri file forniti dal produttore sono rimasti intatti.&lt;/p&gt;&#xA;&lt;p&gt;Alla prova dei fatti, il driver del produttore funzionava benissimo con il Pico e Gemini si è limitato ad imparare ad usarlo per scrivere lo script che cattura l&amp;rsquo;immagine direttamente dal microcontroller (una cosa che con un po&amp;rsquo; di pazienza avrei potuto fare anch&amp;rsquo;io).&lt;/p&gt;&#xA;&lt;h4 id=&#34;guidare-lllm-o-lasciarlo-fare-da-solo&#34;&gt;Guidare l&amp;rsquo;LLM o lasciarlo fare da solo?&lt;/h4&gt;&#xA;&lt;p&gt;La differenza rispetto al &lt;em&gt;vibe coding&lt;/em&gt; della &lt;a href=&#34;https://melabit.com/it/2026/03/04/antigravity-un-driver-scritto-dall-ia/&#34;&gt;volta scorsa&lt;/a&gt; è abissale.&lt;/p&gt;&#xA;&lt;p&gt;In quel caso Gemini aveva lavorato furiosamente per ore, combinando dei tali casini da costringermi a riavviare per ben due volte il Mac. E nel frattempo si era convinto (e mi aveva convinto) che il driver &lt;code&gt;Arducam.py&lt;/code&gt; fosse incompatibile con Il Pico e l&amp;rsquo;aveva riscritto da zero, buttando via una libreria essenziale per interloquire con la videocamera (quella indicata dalla freccia rossa),&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://static.233.196.69.159.clients.your-server.de/img/2026-03-16-antigravity-l-llm-lo-fa-meglio/diff-libraries.png&#34;&gt;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2026-03-16-antigravity-l-llm-lo-fa-meglio/diff-libraries.png&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&#xA;&amp;ndash; &lt;em&gt;Modifiche alle prime righe del file &lt;code&gt;Arducam.py&lt;/code&gt;; a sinistra il file originale, a destra come appare lo stesso file dopo le modifiche di Gemini. La freccia indica una libreria importante che viene rimossa di peso da Gemini.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;e togliendo senza nessun motivo, e senza nemmeno un guadagno reale in termini di efficienza o di funzionalità (anzi!), la maggior parte delle funzioni definite nello stesso file (si noti nell&amp;rsquo;immagine qui sotto la differenza nella lunghezza del codice originale, a sinistra, rispetto a quello modificato, a destra).&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://static.233.196.69.159.clients.your-server.de/img/2026-03-16-antigravity-l-llm-lo-fa-meglio/diff-file-length.png&#34;&gt;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2026-03-16-antigravity-l-llm-lo-fa-meglio/diff-file-length.png&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&#xA;&amp;ndash; &lt;em&gt;Modifiche al file &lt;code&gt;Arducam.py&lt;/code&gt;. I rettangoli rossi mettono in evidenza la differenza fra il numero di righe del codice originale (a sinistra) e di quello modificato da Gemini (a destra).&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;E non contento di tutto ciò, aveva pure stravolto il file &lt;code&gt;OV5642_reg.py&lt;/code&gt; contenente i dati di configurazione della videocamera, adducendo dei presunti problemi di memoria. Problemi che evidentemente non esistevano, visto che in questo secondo esperimento tutto è filato liscio usando il file originale del produttore.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://static.233.196.69.159.clients.your-server.de/img/2026-03-16-antigravity-l-llm-lo-fa-meglio/diff-registers.png&#34;&gt;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2026-03-16-antigravity-l-llm-lo-fa-meglio/diff-registers.png&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&#xA;&amp;ndash; &lt;em&gt;Modifiche al file &lt;code&gt;OV5642_reg.py&lt;/code&gt;, contenente i dati di configurazione della videocamera. La configurazione originale (a sinistra) è stata totalmente stravolta da Gemini (a destra).&lt;/em&gt;&lt;/p&gt;&#xA;&lt;h4 id=&#34;e-arduino&#34;&gt;E Arduino?&lt;/h4&gt;&#xA;&lt;p&gt;Arrivato a questo punto era inevitabile che chiedessi a Gemini di generare anche il driver per Arduino, usando le stesse informazioni che gli avevo già fornito per CircuitPython.&lt;/p&gt;&#xA;&lt;p&gt;Questa volta Gemini ha penato di più, ma soprattutto perché gli avevo imposto di effettuare solo delle modifiche minime alle librerie originali Arducam. Un vincolo che questa volta era impossibile da soddisfare, perché queste librerie non supportano nativamente il Raspberry Pi Pico.&lt;/p&gt;&#xA;&#xA;&lt;details class=&#34;answer&#34; open&gt;&#xA;    &lt;summary class=&#34;answer&#34;&gt;&#xA;        Risposta&#xA;    &lt;/summary&gt;&#xA;    &lt;div class=&#34;answer&#34;&gt;&#xA;        &#xA;    &#xA;    &lt;strong&gt;Researching Arducam Library Compatibility&lt;/strong&gt;&#xA;    I&amp;rsquo;ve thoroughly inspected both the original &lt;code&gt;ArduCAM&lt;/code&gt; library and the &lt;code&gt;Arducam_mini&lt;/code&gt; library. Neither version contains native support for the RP2040/RP2350 (Pico) architecture. Specifically, both libraries are missing the necessary definitions for &lt;code&gt;regtype&lt;/code&gt;, &lt;code&gt;regsize&lt;/code&gt;, &lt;code&gt;cbi&lt;/code&gt;, and &lt;code&gt;sbi&lt;/code&gt; for this platform, which is the root cause of the compilation errors.&#xA;&#xA;&lt;div&gt;&#xA;&lt;/details&gt;&#xA;&#xA;&lt;p&gt;Una volta allentato questo vincolo le cose sono filate lisce e in poco tempo anche il driver modificato &lt;em&gt;ad hoc&lt;/em&gt; per il Pico ed il relativo programma di acquisizione delle immagini erano pronti.&lt;/p&gt;&#xA;&lt;h4 id=&#34;gratis-o-a-pagamento&#34;&gt;Gratis o a pagamento?&lt;/h4&gt;&#xA;&lt;p&gt;C&amp;rsquo;è chi sostiene che &lt;a href=&#34;https://www.oneusefulthing.org/p/a-guide-to-which-ai-to-use-in-the&#34;&gt;i modelli a pagamento sono molto meglio di quelli gratuiti&lt;/a&gt;. Di conseguenza, i miei problemi con il &lt;em&gt;vibe coding&lt;/em&gt; sarebbero scomparsi se avessi pagato per usare Gemini o Claude.&lt;/p&gt;&#xA;&lt;p&gt;Non è proprio così. Nel corso delle prove ho usato prevalentemente la versione gratuita di Gemini, proprio per verificare cosa succedeva all&amp;rsquo;utente non professionale che voleva provare a giocare un po&amp;rsquo; con questi strumenti. Ma quando finivano i token sono passato alla versione a pagamento di Gemini fornita dall&amp;rsquo;università, e non ho mai notato differenze significative. Su Claude non posso dire niente, perché dover pagare 200 dollari al mese per usarlo in modo serio non ha senso per chi, come il sottoscritto, non è un programmatore professionista.&lt;/p&gt;&#xA;&lt;p&gt;Ho notato però che Claude Opus e Claude Sonnet si sono sempre dimostrati molto più bravi di Gemini a risolvere i problemi che si presentavano nel corso dello sviluppo del codice. Ma poiché li ho utilizzati sempre a lavoro inoltrato, potrebbero solo essere stati facilitati da quello che Gemini aveva già fatto.&lt;/p&gt;&#xA;&lt;h4 id=&#34;conclusioni&#34;&gt;Conclusioni&lt;/h4&gt;&#xA;&lt;p&gt;È inutile dire che sia questo esperimento che &lt;a href=&#34;https://melabit.com/it/2026/03/04/antigravity-un-driver-scritto-dall-ia/&#34;&gt;quello precedente&lt;/a&gt; non hanno nulla di &lt;em&gt;scientifico&lt;/em&gt;. Per essere tale, dovrei almeno utilizzare tipi diversi di microcontroller e di moduli collegati, stabilire un set di prompt ben definito e misurare in qualche modo come cambia la risposta dell&amp;rsquo;agente di turno al variare delle condizioni sperimentali.&lt;/p&gt;&#xA;&lt;p&gt;Ma nonostante questo, l&amp;rsquo;esperimento ha un pregio: è &lt;em&gt;riproducibile&lt;/em&gt;. Chiunque, con una spesa ridotta, può provare a ripeterlo usando lo stesso hardware e gli stessi prompt, in modo do verificare di persona se quello che ho trovato io è corretto o no.&lt;sup id=&#34;fnref:3&#34;&gt;&lt;a href=&#34;#fn:3&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;3&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#xA;&lt;p&gt;Una cosa che gli apostoli del &lt;em&gt;vibe coding&lt;/em&gt; da decine di milioni di letture evitano sempre accuratamente di proporre. I loro articoli sono pieni di certezze e di previsioni roboanti, ma mancano sempre di fornire il sia pur minimo appiglio che permetta di verificare i loro &lt;em&gt;claim&lt;/em&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Nessuno, oggi, può ancora negare che gli LLM possano essere di grande aiuto durante la programmazione, ma è difficile credere che riescano davvero a farlo senza nessun intervento umano. E questo almeno finché gli apostoli di cui sopra non si degneranno di fornirci dati chiari e ripetibili a supporto delle loro affermazioni.&lt;/p&gt;&#xA;&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;&#xA;&lt;hr&gt;&#xA;&lt;ol&gt;&#xA;&lt;li id=&#34;fn:1&#34;&gt;&#xA;&lt;p&gt;Pur sapendo qualcosa di programmazione, non avevo la minima idea di come si potesse sviluppare un driver e non avevo nessuna voglia di passare dei giorni a studiare come si fa.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:2&#34;&gt;&#xA;&lt;p&gt;Tecnicamente questo file è una libreria di funzioni, ma i microcontroller non hanno un sistema operativo e quindi queste funzioni accedono direttamente all&amp;rsquo;hardware, proprio come fanno i &lt;em&gt;driver&lt;/em&gt; che controllano i componenti di un computer. Di conseguenza, in questo caso i termini &lt;em&gt;libreria&lt;/em&gt; e &lt;em&gt;driver&lt;/em&gt; sono interscambiabili.&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:3&#34;&gt;&#xA;&lt;p&gt;Dico &lt;em&gt;spesa ridotta&lt;/em&gt; ma ormai la penuria di componenti elettronici ha fatto impazzire i prezzi del Pico e ancor di più della Arducam Mini 5MP Plus. Quest&amp;rsquo;ultima, dai 40 euro di pochi mesi fa ora si trova su Amazon o AliExpress a più del triplo. Per fortuna alcuni rivenditori mantengono (almeno per ora) dei prezzi più onesti.&amp;#160;&lt;a href=&#34;#fnref:3&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/div&gt;&#xA;</description>
    </item>
    <item>
      <title>Antigravity: un driver scritto dall&#39;IA</title>
      <link>https://static.233.196.69.159.clients.your-server.de/it/2026/03/04/antigravity-un-driver-scritto-dall-ia/</link>
      <pubDate>Wed, 04 Mar 2026 18:00:00 +0000</pubDate>
      <guid>https://static.233.196.69.159.clients.your-server.de/it/2026/03/04/antigravity-un-driver-scritto-dall-ia/</guid>
      <description>&lt;p&gt;Fra tutti i modelli di Raspberry Pi e di Arduino con cui al momento passo la giornata, il mio preferito è senza dubbio il &lt;a href=&#34;https://www.raspberrypi.com/products/raspberry-pi-pico/&#34;&gt;Raspberry Pi Pico&lt;/a&gt;, un &lt;a href=&#34;https://en.wikipedia.org/wiki/Microcontroller&#34;&gt;microcontrollore&lt;/a&gt; piccolo ma potente, in grado di essere programmato non solo in C/C++ tramite l&amp;rsquo;IDE di Arduino, ma anche in &lt;a href=&#34;https://www.raspberrypi.com/documentation/microcontrollers/micropython.html&#34;&gt;MicroPython&lt;/a&gt; e &lt;a href=&#34;https://learn.adafruit.com/getting-started-with-raspberry-pi-pico-circuitpython/&#34;&gt;CircuitPython&lt;/a&gt;, due versioni diverse (e concorrenti) di Python specifiche per i microcontrollori.&lt;/p&gt;&#xA;&lt;p&gt;A differenza degli altri modelli di Raspberry Pi, il Pico non dispone di una &lt;a href=&#34;https://en.wikipedia.org/wiki/Camera_Serial_Interface&#34;&gt;connessione dedicata&lt;/a&gt; alla videocamera, ma può utilizzare quelle con &lt;a href=&#34;https://en.wikipedia.org/wiki/Serial_Peripheral_Interface&#34;&gt;interfaccia SPI&lt;/a&gt;,&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; come ad esempio la &lt;a href=&#34;https://www.arducam.com/arducam-5mp-plus-spi-cam-arduino-ov5642.html&#34;&gt;Arducam Mini 5MP Plus&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;In teoria non dovrebbe essere un lavoro difficile. Dopo aver dato una occhiata alla &lt;a href=&#34;https://docs.arducam.com/Arduino-SPI-camera/Legacy-SPI-camera/Pico/Camera-Module/SPI-Camera/#1introduction&#34;&gt;documentazione ufficiale&lt;/a&gt;, si tratta solo di collegare la videocamera al Pico, scaricare il driver e i programmi di test dal &lt;a href=&#34;https://github.com/ArduCAM/PICO_SPI_CAM&#34;&gt;repository GitHub del produttore&lt;/a&gt;, copiarli sul Pico dopo aver installato la versione di Python supportata, e infine provare a scattare qualche foto.&lt;/p&gt;&#xA;&lt;p&gt;Non avrei potuto sbagliarmi di più.&lt;/p&gt;&#xA;&lt;h4 id=&#34;ci-vuole-un-driver&#34;&gt;Ci vuole un driver&lt;/h4&gt;&#xA;&lt;p&gt;Gli unici due programmi di di test disponibili, uno per Arduino e l&amp;rsquo;altro per CircuitPython, prevedevano  di utilizzare Windows per visualizzare il video prodotto dalla videocamera, una cosa insolita dato che la stragrande maggioranza di chi lavora con questi dispositivi usa Linux o macOS. CircuitPython, poi, è meno diffuso di MicroPython, e io avrei preferito usare quest&amp;rsquo;ultimo per compatibilità con gli altri componenti già collegati al Pico.&lt;/p&gt;&#xA;&lt;p&gt;Con un po&amp;rsquo; di pazienza, e avendo a disposizione un programma che insegna ad usare le funzioni principali per gestire il dispositivo, si può provare a tradurre il codice CircuitPython in MicroPython (e viceversa),&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt; ma in questo caso non c&amp;rsquo;era nulla del genere a disposizione.&lt;/p&gt;&#xA;&lt;p&gt;Altra guide trovate sul web sembravano promettenti, ma alla prova dei fatti non funzionavano. L&amp;rsquo;unica opzione rimasta era quella di bypassare i &lt;em&gt;tool&lt;/em&gt; ufficiali e di scriversi da solo un driver per la videocamera.&lt;/p&gt;&#xA;&lt;p&gt;Una parola!&lt;/p&gt;&#xA;&lt;p&gt;Io so come scrivere il codice per risolvere una equazione differenziale o per analizzare dei dati di misura. Me la cavo anche con la programmazione di microcontrollori ed affini per catturare i dati dei sensori collegati. Ma qui si tratta di ben altro. Si tratta di studiare nei dettagli come funziona a basso livello la comunicazione fra il Pico e la videocamera. Un lavoro da ingegneri specializzati, che scrivono i driver che poi permettono a noi &lt;em&gt;umani&lt;/em&gt; di eseguire operazioni complesso come scattare una foto con poche righe di codice Python.&lt;/p&gt;&#xA;&lt;p&gt;E allora perché non mettere al lavoro uno degli agenti integrati in Antigravity per fargli fare quello che io non sono capace di fare?&lt;/p&gt;&#xA;&lt;div style = &#34;border-style: solid; border-width: 0px 0px 0px 12px; border-color: #03a87c; background-color: #defef6; padding: 1em; color:black; font-size:100%;&#34;&gt;&#xA;&lt;p&gt;Non sarei stato obbligato ad usare Antigravity, anche Claude Code, Google Gemini, Deepseek o uno degli altri mille LLM che abbiamo a disposizione avrebbe potuto tranquillamente lavorarci su. Ma, &lt;a href=&#34;https://melabit.com/it/2026/01/21/sorpresa-antigravity/&#34;&gt;come ho già scritto&lt;/a&gt;, usare uno degli agenti integrati in Antigravity permette di lavorare direttamente nell&amp;rsquo;editor e di accedere al sistema operativo sottostante, una vantaggio enorme quando si deve provare e riprovare mille volte il codice prodotto.&lt;/p&gt;&#xA;&lt;/div&gt;&#xA;&lt;/br&gt;&#xA;&lt;h4 id=&#34;lia-al-lavoro&#34;&gt;L&amp;rsquo;IA al lavoro&lt;/h4&gt;&#xA;&lt;p&gt;Quando si leggono tanti articoli entusiastici sul &lt;em&gt;vibe coding&lt;/em&gt;, ovvero sullo sviluppo del software eseguito dall&amp;rsquo;intelligenza artificiale senza nessun intervento o quasi da parte del programmatore umano, sembra tutto facile (tanto per citarne qualcuno, &lt;a href=&#34;https://shumer.dev/something-big-is-happening&#34;&gt;questo&lt;/a&gt; articolo che ha avuto milionate di letture oppure &lt;a href=&#34;https://www.oneusefulthing.org/p/claude-code-and-what-comes-next&#34;&gt;questo&lt;/a&gt; senza dimenticare il &lt;em&gt;tweet&lt;/em&gt; che ha &lt;a href=&#34;https://x.com/karpathy/status/1886192184808149383&#34;&gt;iniziato tutto&lt;/a&gt;).&lt;sup id=&#34;fnref:3&#34;&gt;&lt;a href=&#34;#fn:3&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;3&lt;/a&gt;&lt;/sup&gt; In sostanza, scrivi due-tre righe chiedendo all&amp;rsquo;LLM o all&amp;rsquo;&lt;em&gt;agente&lt;/em&gt; di turno di fare questo o quello, te ne vai a pranzo o a fare una passeggiata e quando torni è tutto pronto.&lt;sup id=&#34;fnref:4&#34;&gt;&lt;a href=&#34;#fn:4&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;4&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#xA;&lt;p&gt;Proviamo per una volta a fare lo stesso con Gemini, dandogli solo le informazioni essenziali e verificando cosa riesce a fare davvero. In questo caso queste informazioni si riducono al link alla pagina web della videocamera e a una tabella che descrive come sono collegati i pin della videocamera al Pico (sono più di tre righe, lo so, ma io sono prolisso).&lt;/p&gt;&#xA;&#xA;&lt;details class=&#34;question&#34; open&gt;&#xA;    &lt;summary class=&#34;question&#34;&gt;&#xA;        Prompt&#xA;    &lt;/summary&gt;&#xA;    &lt;div class=&#34;question&#34;&gt;&#xA;        &#xA;    &#xA;    &lt;p&gt;I have a Rasperry Pi Pico 2W connected to a Arducam 5MP Plus OV5642 Mini Module Camera Shield (&lt;a href=&#34;https://www.arducam.com/arducam-5mp-plus-spi-cam-arduino-ov5642.html%29&#34;&gt;https://www.arducam.com/arducam-5mp-plus-spi-cam-arduino-ov5642.html)&lt;/a&gt;. I have connected the camera to the Pico using the standard layout found in the documentation:&lt;/p&gt;&#xA;    &lt;table&gt;&#xA;    &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;        &lt;td&gt;Camera&lt;/th&gt;&#xA;        &lt;td&gt;CS&lt;/th&gt;&#xA;        &lt;td&gt;MOSI&lt;/th&gt;&#xA;        &lt;td&gt;MISO&lt;/th&gt;&#xA;        &lt;td&gt;SCK&lt;/th&gt;&#xA;        &lt;td&gt;GND&lt;/th&gt;&#xA;        &lt;td&gt;VCC&lt;/th&gt;&#xA;        &lt;td&gt;SDA&lt;/th&gt;&#xA;        &lt;td&gt;SCL&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;        &lt;td&gt;Pico&lt;/td&gt;&#xA;        &lt;td&gt;GP5&lt;/td&gt;&#xA;        &lt;td&gt;GP3&lt;/td&gt;&#xA;        &lt;td&gt;GP4&lt;/td&gt;&#xA;        &lt;td&gt;GP2&lt;/td&gt;&#xA;        &lt;td&gt;GND&lt;/td&gt;&#xA;        &lt;td&gt;3V3&lt;/td&gt;&#xA;        &lt;td&gt;GP8&lt;/td&gt;&#xA;        &lt;td&gt;GP9&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;    &lt;/tbody&gt;&#xA;    &lt;/table&gt;&#xA;    &lt;p&gt;Please write a basic Micropython code to test that everything is right and that the camera can take photos&lt;/p&gt;&#xA;    &#xA;&#xA;&lt;div&gt;&#xA;&lt;/details&gt;&#xA;&#xA;&lt;p&gt;Gemini ci lavora su furiosamente, tira fuori codice MicroPython che non funziona, si ingegna a correggerlo in base ai miei suggerimenti e finisce sempre per fare nuovi errori (dico sempre &lt;code&gt;Gemini&lt;/code&gt; per semplicità, ma sono passato anche a &lt;code&gt;Gemini 3.1 Pro&lt;/code&gt;, &lt;code&gt;Claude Opus 4.6&lt;/code&gt; e &lt;code&gt;Claude Sonnet 4.6&lt;/code&gt; via via che finivano i token).&lt;/p&gt;&#xA;&lt;p&gt;A un certo punto, non sapendo più che pesci prendere, Gemini ipotizza anche che ci sia un problema hardware, come un collegamento sbagliato o una videocamera difettosa (ma interrogando i singoli pin della videocamera è facile verificare che tutto funziona correttamente).&lt;/p&gt;&#xA;&lt;p&gt;Dopo ore ed ore di lavoro e dato che con MicroPython non riesce a combinare niente di buono, gli chiedo di passare ad Arduino, che è una piattaforma software più matura. Ci vogliono altre ore di lavoro ma alla fine, testardamente, ce la fa, e quella qui sotto è la prima immagine in assoluto scattata con il codice Arduino generato da Gemini (l&amp;rsquo;immagine originale era al contrario e io mi sono limitato a ruotarla di 180°).&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://static.233.196.69.159.clients.your-server.de/img/2026-03-04-antigravity-un-driver-scritto-dall-ia/capture.jpeg&#34;&gt;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2026-03-04-antigravity-un-driver-scritto-dall-ia/capture_small.jpeg&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Va detto che subito dopo faccio un errore gravissimo che mi, anzi &lt;em&gt;ci&lt;/em&gt;, costringe a rifare tutto da capo. Ma questo è argomento di un&amp;rsquo;altra storia.&lt;/p&gt;&#xA;&lt;h4 id=&#34;epilogo&#34;&gt;Epilogo&lt;/h4&gt;&#xA;&lt;p&gt;Una volta generato un programma funzionante in Arduino, chiedo a Gemini di rifare tutto per CircuitPython. Anche questo &lt;em&gt;port&lt;/em&gt; richiede parecchie ore di lavoro, inframmezzate da un paio di riavvi forzati del Mac che, dopo qualche &lt;em&gt;bug&lt;/em&gt; di troppo, è stato obbligato a disabilitare la comunicazione fra le porte USB e il Pico.&lt;/p&gt;&#xA;&lt;p&gt;In teoria dovrei ripetere il ciclo per la terza volta con MicroPython. Ma l&amp;rsquo;idea di perdere chissà quanto altro tempo a guardare Gemini che lavora mi fa venire i brividi e lascio perdere, almeno per ora.&lt;/p&gt;&#xA;&lt;h4 id=&#34;conclusioni&#34;&gt;Conclusioni&lt;/h4&gt;&#xA;&lt;p&gt;Non so cosa usano quelli che scrivono gli infiniti articoli che proclamano che chiunque, anche se non sa un tubo di programmazione, può farsi scrivere dall&amp;rsquo;IA in poco tempo un programma perfettamente funzionante.&lt;/p&gt;&#xA;&lt;p&gt;Anche se di programmazione ne so qualcosa, a me è successo solo per gli esperimenti più semplici descritti nei due &lt;a href=&#34;https://melabit.com/it/2026/01/21/sorpresa-antigravity/&#34;&gt;articoli&lt;/a&gt; &lt;a href=&#34;https://melabit.com/it/2026/02/16/antigravity-dalla-sorpresa-al-dubbio/&#34;&gt;precedenti&lt;/a&gt;. E men che meno è successo in questo caso. Va detto, però, che sono in &lt;a href=&#34;https://vladimir.varank.in/notes/2026/02/freebsd-brcmfmac/&#34;&gt;buona compagnia&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2026-03-04-antigravity-un-driver-scritto-dall-ia/Gemini_Generated_Image_attiipattiipatti.jpg&#34; alt=&#34;&#34;&gt;&#xA;&amp;ndash; &lt;em&gt;Immagine generata da &lt;a href=&#34;https://gemini.google.com&#34;&gt;Google Gemini&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;È vero, seguendo alla lettera i dettami del &lt;em&gt;vibe coding&lt;/em&gt;, qui non ho scritto nemmeno una riga di codice e ho fatto eseguire a Gemini perfino i comandi di Terminale che potrei scrivere ad occhi chiusi. Ma è altrettanto vero che se non avessi dialogato di continuo con l&amp;rsquo;agente, se non lo avessi guidato passo passo, se non avessi corretto i suoi tanti tanti errori, a volte davvero banali, Gemini non sarebbe andato da nessuna parte.&lt;/p&gt;&#xA;&lt;p&gt;E ci sono volute molte ore di lavoro ininterrotto, fin troppe ore secondo me, per ottenere qualcosa di utilizzabile.&lt;/p&gt;&#xA;&lt;p&gt;Altro che programmazione rapida ed intuitiva. Altro che codice basato sulle &lt;a href=&#34;https://www.youtube.com/watch?v=apBWI6xrbLY&#34;&gt;buone vibrazioni&lt;/a&gt; stile anni &amp;lsquo;60. Altro che programmazione &lt;em&gt;for dummies&lt;/em&gt;!&lt;sup id=&#34;fnref:5&#34;&gt;&lt;a href=&#34;#fn:5&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;5&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#xA;&lt;p&gt;Se non ti rimbocchi le maniche e non ti dai da fare in prima persona con il codice, anche quello prodotto da un &lt;em&gt;agente&lt;/em&gt; più o meno intelligente, non vai da nessuna parte. Sarebbe bello essere smentito.&lt;/p&gt;&#xA;&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;&#xA;&lt;hr&gt;&#xA;&lt;ol&gt;&#xA;&lt;li id=&#34;fn:1&#34;&gt;&#xA;&lt;p&gt;L&amp;rsquo;interfaccia SPI (Serial Peripheral Interface) è una interfaccia di comunicazione seriale, molto utilizzata per collegare un microcontrollore (&lt;em&gt;master&lt;/em&gt;) ad uno o più dispositivi periferici (&lt;em&gt;slave&lt;/em&gt;) in modo veloce ed affidabile.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:2&#34;&gt;&#xA;&lt;p&gt;Mentre scrivevo l&amp;rsquo;articolo ho trovato &lt;a href=&#34;https://www.youtube.com/watch?v=l254lxm78I4&#34;&gt;questo video&lt;/a&gt;, che spiega come mescolare  nello stesso script codice MicroPython e CircuitPython. Se funzionasse anche in casi più complicati di accendere e spegnere un LED sarebbe davvero una svolta.&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:3&#34;&gt;&#xA;&lt;p&gt;Sarà un caso che sono sempre post lunghissimi ma senza mai uno straccio di prova, un prompt, qualche brano di codice, dei link a supporto delle tante affermazioni non verificate e non verificabili?&amp;#160;&lt;a href=&#34;#fnref:3&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:4&#34;&gt;&#xA;&lt;p&gt;Mai nessuno, da vero nerd, dice che va a fare un po&amp;rsquo; di sesso.&amp;#160;&lt;a href=&#34;#fnref:4&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:5&#34;&gt;&#xA;&lt;p&gt;Dal titolo di una famosa serie di &lt;a href=&#34;https://en.wikipedia.org/wiki/For_Dummies&#34;&gt;guide introduttive&lt;/a&gt; agli argomenti più svariati, che spaziavano da come usare il DOS a come giocare a scacchi.&amp;#160;&lt;a href=&#34;#fnref:5&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/div&gt;&#xA;</description>
    </item>
    <item>
      <title>Swift contro Python, ovvero mele contro pere</title>
      <link>https://static.233.196.69.159.clients.your-server.de/it/2022/10/03/swift-contro-python-ovvero-mele-contro-pere/</link>
      <pubDate>Mon, 03 Oct 2022 06:00:00 +0000</pubDate>
      <guid>https://static.233.196.69.159.clients.your-server.de/it/2022/10/03/swift-contro-python-ovvero-mele-contro-pere/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2022-10-03-swift-contro-python-ovvero-mele-contro-pere/martina-leuderalbert-i-GgDz7KQz4-unsplash.jpg&#34; alt=&#34;&#34;&gt;&#xA;&amp;ndash; &lt;em&gt;Fonte: &lt;a href=&#34;https://unsplash.com/@tinaleuderalbert&#34;&gt;Martina Leuderalbert&lt;/a&gt; su &lt;a href=&#34;https://unsplash.com&#34;&gt;Unsplash&lt;/a&gt;&lt;/em&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Alle elementari la maestra mi aveva insegnato a non sommare le mele con le pere, cioè a non mettere insieme (o paragonare) cose e fatti molto diversi fra loro. Non ha quindi senso sommare 3 litri di acqua con 5 chilogrammi di farina o chiedersi se 40 metri sono più o meglio di 20 secondi.&lt;/p&gt;&#xA;&lt;p&gt;Quello che diceva la mia maestra lo dicono, sono sicuro, le maestre di tutto il mondo, ma c&amp;rsquo;è sempre qualcuno assente a queste lezioni.&lt;/p&gt;&#xA;&lt;h4 id=&#34;il-golia-della-programmazione-moderna&#34;&gt;Il Golia della programmazione moderna&lt;/h4&gt;&#xA;&lt;p&gt;Uno di questi è stato di sicuro Ari Joury che, nonostante il suo dottorato in fisica delle particelle, non si è fatto scrupoli a pubblicare su Medium questo &lt;a href=&#34;https://medium.com/geekculture/swift-was-poised-to-replace-python-then-it-tanked-3e6c11740ba6&#34;&gt;Swift was poised to replace Python. Then it tanked&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Cosa dice l’articolo? Che nel mondo del machine learning i linguaggi di programmazione più usati sono Matlab, R, Julia e soprattutto Python. Quest’ultimo, nato originariamente per sviluppare dei piccoli &lt;em&gt;script&lt;/em&gt; senza troppe pretese, è diventato oggi un vero &lt;em&gt;&amp;ldquo;Golia della programmazione moderna”&lt;/em&gt;, tanto da essere usato estensivamente da aziende come Dropbox, Instagram e Pinterest per i loro servizi online.&lt;/p&gt;&#xA;&lt;p&gt;Grazie alla disponibilità di librerie come TensorFlow o PyTorch (nonché, aggiungo io, di librerie di base come Pandas o NumPy), Python è diventato anche il linguaggio di elezione di chi si occupa di machine learning e di analisi dei dati.&lt;/p&gt;&#xA;&lt;p&gt;La crescita di Python sembra bloccata da un paio di anni, ma la sua enorme diffusione lo farà rimanere comunque un attore centrale anche nel prossimo futuro.&lt;/p&gt;&#xA;&lt;h4 id=&#34;entra-in-scena-swift&#34;&gt;Entra in scena Swift&lt;/h4&gt;&#xA;&lt;p&gt;Fin qui tutto vero e condivisibile. Magari si potrebbe eccepire qualcosina sull&amp;rsquo;importanza di R nell&amp;rsquo;ambito dell&amp;rsquo;analisi dei dati, ma non voglio essere puntiglioso.&lt;/p&gt;&#xA;&lt;p&gt;Il guaio è che se uno si limita a scrivere queste cose non se lo fila nessuno, chi vorrà mai leggere l&amp;rsquo;ennesimo articolo generico sulle virtù di Python per il machine learning (e non) o su &lt;a href=&#34;https://towardsdatascience.com/why-python-is-not-the-programming-language-of-the-future-30ddc5339b66&#34;&gt;quale linguaggio&lt;/a&gt; è destinato a soppiantarlo?&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; Ci vuole un colpo d&amp;rsquo;ala.&lt;/p&gt;&#xA;&lt;p&gt;Per fortuna c&amp;rsquo;è sempre Apple che, come il nero, va bene su tutto e, soprattutto, garantisce sempre un bel po&amp;rsquo; di click. E allora perché non mettere in mezzo Swift?&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.apple.com/swift&#34;&gt;Swift&lt;/a&gt; è un linguaggio di programmazione sviluppato da Apple con l&amp;rsquo;obiettivo specifico di sostituire &lt;a href=&#34;https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/ObjectiveC/Introduction/introObjectiveC.html&#34;&gt;Objective-C&lt;/a&gt; come linguaggio di elezione per lo sviluppo delle applicazioni per iOS e per macOS. Swift è facile da imparare e la sua sintassi leggibile ricalca quella di Python, è vero, così come quella di Julia e di tanti altri linguaggi di programmazione moderni.&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#xA;&lt;p&gt;Swift però non ha mai preteso di essere, come &lt;a href=&#34;https://medium.com/geekculture/swift-was-poised-to-replace-python-then-it-tanked-3e6c11740ba6&#34;&gt;sostiene il nostro Ari&lt;/a&gt;, il nuovo &lt;em&gt;&amp;ldquo;Re della Programmazione&amp;rdquo;&lt;/em&gt;. Ad Apple non interessa posizionare Swift come uno strumento di programmazione &lt;em&gt;general purpose&lt;/em&gt;, le interessa solo che venga usato per programmare le applicazioni per i suoi sistemi operativi. Del resto, il fatto che manchi di una versione per Windows taglia fuori una fetta così importante di potenziali utenti da rendere impossibile a priori una pretesa tanto assurda.&lt;/p&gt;&#xA;&lt;p&gt;A maggior ragione Swift non ha mai preteso di essere il nuovo strumento principe per il machine learning, come il buon Ari sotto sotto ci vuole far intendere. È vero che Google ha provato a &lt;a href=&#34;https://tensorflow.org/swift&#34;&gt;supportare Swift&lt;/a&gt; all&amp;rsquo;interno di TensorFlow (di cui Google è il principale sviluppatore), ma questo esperimento, come succede con tanti altri prodotti dell&amp;rsquo;azienda di Mountain View, è stato interrotto nel 2021. È ragionevole pensare, infatti, che chi sviluppa in Swift preferisce usare gli &lt;a href=&#34;https://developer.apple.com/machine-learning&#34;&gt;strumenti per il machine learning integrati&lt;/a&gt; in macOS/iOS piuttosto che prodotti di terze parti.&lt;/p&gt;&#xA;&lt;h4 id=&#34;io-sono-più-popolare-di-te&#34;&gt;Io sono più popolare di te&lt;/h4&gt;&#xA;&lt;p&gt;Ma la cosa più sconcertante è pretendere di confrontare la popolarità (o meno) dei linguaggi di programmazione utilizzando una metrica fasulla come la percentuale di domande poste ogni mese su StackOverflow relativamente ad uno o ad un altro linguaggio. In base a questa percentuale, la &lt;a href=&#34;https://insights.stackoverflow.com/trends?tags=python%2Cswift&#34;&gt;popolarità di Python&lt;/a&gt; è cresciuta costantemente fino alla fine del 2020, per poi stabilizzarsi al 16% del totale delle domande su StackOverflow, mentre &lt;a href=&#34;https://insights.stackoverflow.com/trends?tags=python%2Cswift&#34;&gt;quella di Swift&lt;/a&gt; dopo aver raggiunto un massimo del 3% è in declino e ora si aggira nei dintorni dell&#39;1.5%.&lt;/p&gt;&#xA;&lt;p&gt;Perché è una metrica fasulla? Perché finché siamo sui grandi numeri e confrontiamo la &lt;a href=&#34;https://insights.stackoverflow.com/trends?tags=python%2Cjavascript&#34;&gt;popolarità di Python con quella di JavaScript&lt;/a&gt; può anche avere senso basarsi sul numero di domande poste su StackOverflow per valutarne la diffusione.&lt;/p&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2022-10-03-swift-contro-python-ovvero-mele-contro-pere/stack-overflow-python-javascript.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;Ma se buttiamo nel calderone anche la terna &lt;a href=&#34;https://insights.stackoverflow.com/trends?tags=python%2Cjavascript%2Cjava%2Chtml%2Ccss%2Cphp&#34;&gt;HTML, CSS e PHP&lt;/a&gt;, che sono ancora oggi tre strumenti fondamentali per chi fa sviluppo web, troviamo che questi ultimi sono in costante declino, senza però che la decadenza (su StackOverflow) di PHP venga compensata da un incremento corrispondente nell&amp;rsquo;interesse verso JavaScript.&lt;/p&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2022-10-03-swift-contro-python-ovvero-mele-contro-pere/stack-overflow-python-javascript-html-css-php.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;Anche &lt;a href=&#34;https://insights.stackoverflow.com/trends?tags=wordpress&#34;&gt;Wordpress&lt;/a&gt;, che piaccia o non piaccia sta dietro il 40% dei siti web, secondo la metrica di StackOverflow sarebbe in calo. Idem per &lt;a href=&#34;https://insights.stackoverflow.com/trends?tags=mysql&#34;&gt;MySQL&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;E allora la spiegazione può essere un&amp;rsquo;altra: più che la diffusione, le domande su StackOverflow ci fanno vedere la complessità del linguaggio e la qualità della sua documentazione: HTML, CSS e PHP (o Wordpress e MySQL) sono prodotti ben assestati, per loro esistono ottime guide sul web che ne spiegano diffusamente i segreti. Di conseguenza non è necessario cercare risposte più o meno occasionali su StackOverflow, e comunque quelle che ci sono già bastano ed avanzano.&lt;/p&gt;&#xA;&lt;p&gt;Python e JavaScript, al contrario, hanno una sintassi di base piuttosto semplice ma per essere usati al meglio hanno bisogno di un gran numero di librerie aggiuntive, che sono spesso più complesse del linguaggio base e che vengono aggiornate ed espanse di continuo. La documentazione relativa non tiene sempre il passo dello sviluppo, per cui il modo migliore per imparare ad usare al meglio le centinaia e centinaia di API disponibili è quello di rivolgersi a qualche esperto su StackOverflow, spingendo così in alto la &lt;em&gt;popolarità&lt;/em&gt; dei due linguaggi.&lt;sup id=&#34;fnref:3&#34;&gt;&lt;a href=&#34;#fn:3&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;3&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#xA;&lt;p&gt;Secondo la logica basata sul numero di domande su StackOverflow anche &lt;a href=&#34;https://insights.stackoverflow.com/trends?tags=c%2Cc%2B%2B&#34;&gt;C e C++&lt;/a&gt;, i linguaggi usati per la programmazione di sistema (e non) su Linux e Windows, sarebbero in declino, e lo stesso succede a &lt;a href=&#34;https://insights.stackoverflow.com/trends?tags=algorithm%2Carchitecture%2Cclass%2Cdatabase&#34;&gt;concetti di base&lt;/a&gt; come &lt;em&gt;algoritmo&lt;/em&gt;, &lt;em&gt;architettura&lt;/em&gt;, &lt;em&gt;classe&lt;/em&gt; o &lt;em&gt;database&lt;/em&gt;. Ma  sono in declino perché c&amp;rsquo;è davvero poco interesse o solo perché anche per loro c&amp;rsquo;è abbondanza di documentazione di ottimo livello, senza doversi ridurre a porre sempre delle nuove domande su StackOverflow?&lt;/p&gt;&#xA;&lt;p style=&#34;border-style:solid; border-color:lightblue; background-color:lightyellow; padding:1em;&#34;&gt;Nel mio piccolo lo faccio anch&#39;io: quando programmo in R uso pochissimo StackOverflow, perché posso usare l&#39;ottimo help in linea di RStudio e perché la documentazione che accompagna le librerie aggiuntive di R è centralizzata sul [CRAN](https://cran.r-project.org/) (_The Comprehensive R Archive Network_) ed è di altissima qualità. E quando tutto questo non basta, posso trovare decine di siti e di blog che spiegano benissimo gli aspetti più ostici del linguaggio. Quando passo a Python (un linguaggio che, sia chiaro, mi piace parecchio), StackOverflow diventa quasi una necessità, perché la frammentazione e la mancanza di sistema di gestione centralizzata delle librerie di Python rendono molto più complicato trovare documentazione aggiornata di qualità.&#xA;&lt;/p&gt;&#xA;&lt;h4 id=&#34;decaduto-o-semplice&#34;&gt;Decaduto o semplice?&lt;/h4&gt;&#xA;&lt;p&gt;Swift è un linguaggio semplice con una ottima &lt;a href=&#34;https://www.swift.org/documentation/&#34;&gt;documentazione ufficiale&lt;/a&gt;, un eccellente strumento di apprendimento del linguaggio (e non solo) come &lt;a href=&#34;https://www.apple.com/it/swift/playgrounds/&#34;&gt;Swift Playgrounds&lt;/a&gt; e un numero relativemente ridotto di &lt;a href=&#34;https://codersera.com/blog/open-source-swift-libraries/&#34;&gt;librerie aggiuntive&lt;/a&gt;, c&amp;rsquo;è davvero bisogno di passare un sacco di tempo su StackOverflow per usarlo al meglio?&lt;/p&gt;&#xA;&lt;p&gt;Guardando il grafico relativo al numero di domande relative a Swift ci si accorge che i picchi di interesse corrispondono alle date di presentazione della versione 1.0 (giugno 2014) e al rilascio delle versioni 2.0 (settembre 2015), 3.0  (settembre 2016) e 5.0 (marzo 2019) e, come è naturale, dopo ogni presentazione l&amp;rsquo;interesse tende a decadere, proprio perché per usare il linguaggio c&amp;rsquo;è davvero poco da chiedere su StackOverflow.&lt;/p&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2022-10-03-swift-contro-python-ovvero-mele-contro-pere/stack-overflow-swift.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;A supporto di questa tesi c&amp;rsquo;è il risultato di &lt;a href=&#34;https://data.stackexchange.com/stackoverflow/query/edit/1649394&#34;&gt;questa semplice query SQL&lt;/a&gt;, con la quale ho provato a calcolare il numero di domande poste su StackOverflow ogni anno. Di SQL ne so pochissimo per cui dovete prendere i risultati con le pinze, ma sembra che il numero di domande su StackOverflow sia in progressiva diminuzione, da un massimo di 2.2 milioni di domande nel 2016 a 1.6 milioni nel 2021.&lt;/p&gt;&#xA;&lt;p&gt;Una volta raggiunta una base di conoscenza sufficientemente ampia non ha molto senso porre sempre delle nuove domande (che su StackOverflow sono fortemente scoraggiate) ma ci si può limitare ad utilizzare il materiale già esistente. Questo almeno per le tecnologie più stabili, come possono essere HTML, CCS, PHP, Wordpress, MySQL&amp;hellip; oppure Swift. Quando invece abbiamo a che fare con strumenti in rapidissima evoluzione, come Python o JavaScript, StackOverflow diventa davvero il modo migliore per imparare.&lt;/p&gt;&#xA;&lt;h4 id=&#34;conclusioni&#34;&gt;Conclusioni&lt;/h4&gt;&#xA;&lt;p&gt;C&amp;rsquo;è bisogno di dilungarsi ancora? Non credo, dico solo che basarsi su ipotesi fantasiose o metriche poco affidabili per ipotizzare &lt;a href=&#34;https://medium.com/geekculture/swift-was-poised-to-replace-python-then-it-tanked-3e6c11740ba6&#34;&gt;scenari catastrofici&lt;/a&gt; per Swift (o, al contrario, &lt;a href=&#34;https://towardsdatascience.com/bye-bye-python-hello-julia-9230bff0df62&#34;&gt;scenari entusiasmanti&lt;/a&gt; per Julia&lt;sup id=&#34;fnref:4&#34;&gt;&lt;a href=&#34;#fn:4&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;4&lt;/a&gt;&lt;/sup&gt;) mi pare francamente &lt;a href=&#34;https://xkcd.com/558/&#34;&gt;insensato&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2022-10-03-swift-contro-python-ovvero-mele-contro-pere/dt140323.jpg&#34; alt=&#34;&#34;&gt;&#xA;&amp;ndash; &lt;em&gt;Fonte: &lt;a href=&#34;https://dilbert.com/strip/2014-03-23&#34;&gt;Dilbert&lt;/a&gt; di Scott Adams&lt;/em&gt;.&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Capo: Non si possono confrontare mele e arance.&lt;/p&gt;&#xA;&lt;p&gt;Dilbert: È chiaramente sbagliato, perché li hai appena confrontati e dichiarati diversi.&lt;/p&gt;&#xA;&lt;p&gt;Wally: Mele e arance sono entrambi alimenti che crescono sugli alberi. Sarebbe assolutamente valido confrontarli dal punto di vista nutrizionale.&lt;/p&gt;&#xA;&lt;p&gt;Dilbert: Ho notato che molte delle cose che escono dalla tua bocca non hanno senso.&lt;/p&gt;&#xA;&lt;p&gt;Capo: Parli come mia moglie.&lt;/p&gt;&#xA;&lt;p&gt;Wally: Non puoi paragonare tua moglie al tuo subordinato. Sono mele e arance.&lt;/p&gt;&#xA;&lt;p&gt;Capo: Cosa sta succedendo qui?&lt;/p&gt;&#xA;&lt;p&gt;Wally: Non lo so, ma non lo paragonerei a lavoro.&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;&#xA;&lt;hr&gt;&#xA;&lt;ol&gt;&#xA;&lt;li id=&#34;fn:1&#34;&gt;&#xA;&lt;p&gt;Ari sembra avere le idee un po&amp;rsquo; confuse sul futuro di Python, dato che su Medium ha anche pubblicato &lt;a href=&#34;https://towardsdatascience.com/why-python-is-not-the-programming-language-of-the-future-30ddc5339b66&#34;&gt;Why Python is not the programming language of the future&lt;/a&gt;, oppure &lt;a href=&#34;https://towardsdatascience.com/bye-bye-python-hello-julia-9230bff0df62&#34;&gt;Bye-bye Python. Hello Julia!&lt;/a&gt; e perfino &lt;a href=&#34;https://levelup.gitconnected.com/why-tensorflow-for-python-is-dying-a-slow-death-ba4dafcb37e6&#34;&gt;Why TensorFlow for Python is dying a slow death&lt;/a&gt;.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:2&#34;&gt;&#xA;&lt;p&gt;E non è un caso, perché alla base di tutti questi linguaggi c&amp;rsquo;è sempre il buon vecchio &lt;a href=&#34;https://time.com/69316/basic/&#34;&gt;BASIC&lt;/a&gt;, il primo linguaggio di programmazione davvero per tutti, che è stato il linguaggio di base dei computer personali degli anni &amp;lsquo;80 su cui si sono fatti le ossa tutti i grandi nomi dell&amp;rsquo;informatica di quegli anni.&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:3&#34;&gt;&#xA;&lt;p&gt;Le sole domande sulla libreria &lt;code&gt;pandas&lt;/code&gt; di Python (una libreria fondamentale per chi usa Python per l&amp;rsquo;analisi dei dati) &lt;a href=&#34;https://insights.stackoverflow.com/trends?tags=pandas&#34;&gt;assommano al 3%&lt;/a&gt; del totale, le principali librerie per il machine learning (TensorFlow, Keras, PyTorch, scikit-learn, OpenCV, NLTK) fanno &lt;a href=&#34;https://insights.stackoverflow.com/trends?tags=tensorflow%2Ckeras%2Cpytorch%2Cscikit-learn%2Copencv%2Cnltk&#34;&gt;un altro 2%&lt;/a&gt;, mentre quelle su &lt;code&gt;Django&lt;/code&gt; e &lt;code&gt;Flask&lt;/code&gt; (le principali librerie Python per lo sviluppo di applicazioni per il web) sono quasi &lt;a href=&#34;https://insights.stackoverflow.com/trends?tags=django%2Cflask&#34;&gt;al 2.5%&lt;/a&gt; del totale generale. Chiaramente queste domande vengono anche conteggiate come domande relative a Python.&amp;#160;&lt;a href=&#34;#fnref:3&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:4&#34;&gt;&#xA;&lt;p&gt;Perché sì, &lt;a href=&#34;https://insights.stackoverflow.com/trends?tags=julia&#34;&gt;l&amp;rsquo;interesse per Julia&lt;/a&gt; sembra essere in aumento su StackOverflow, ma parliamo di non più dello 0.16% (1/10 dei valori di Swift) e anche in questo caso i picchi corrispondono al rilascio delle varie versioni del linguaggio.&amp;#160;&lt;a href=&#34;#fnref:4&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/div&gt;&#xA;</description>
    </item>
    <item>
      <title>JuliaCon 2021</title>
      <link>https://static.233.196.69.159.clients.your-server.de/it/2021/07/23/juliacon-2021/</link>
      <pubDate>Fri, 23 Jul 2021 12:00:00 +0000</pubDate>
      <guid>https://static.233.196.69.159.clients.your-server.de/it/2021/07/23/juliacon-2021/</guid>
      <description>&lt;p&gt;Julia è l&amp;rsquo;ultimo arrivato fra i linguaggi di programmazione scientifici, che ambisce a combinare la velocità del Fortran con la semplicità sintattica e l&amp;rsquo;interattività di Python.&lt;/p&gt;&#xA;&lt;p&gt;Un&amp;rsquo;altra particolarità molto interessante di Julia è il supporto nativo agli &lt;em&gt;ambienti&lt;/em&gt;: ciascun progetto scritto in Julia può avere un suo ambiente specifico, contenente il compilatore,&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; le librerie e gli eventuali package aggiuntivi necessari, nelle versioni che garantiscono il perfetto funzionamento del progetto. La gestione degli ambienti è ancora oggi una delle principali debolezze di Python, averli integrati direttamente nel linguaggio di programmazione dovrebbe rendere più semplice la scrittura di &lt;a href=&#34;https://rescience.github.io/&#34;&gt;codice &lt;em&gt;riproducibile&lt;/em&gt;&lt;/a&gt;, il Santo Graal del software scientifico odierno.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2021-07-23-juliacon-2021/world_2800.png&#34; alt=&#34;&#34;&gt;&#xA;&amp;ndash; &lt;em&gt;Fonte: &lt;a href=&#34;https://juliacon.org/2021&#34;&gt;JuliaCon 2021&lt;/a&gt;&lt;/em&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Perché parlo di Julia? Perché la settimana prossima inizia il &lt;a href=&#34;https://juliacon.org/2021&#34;&gt;JuliaCon 2021&lt;/a&gt;, un&amp;rsquo;ottima occasione per iniziare a conoscere questo interessante linguaggio di programmazione. La &lt;a href=&#34;https://juliacon.org/2021/tickets/&#34;&gt;registrazione&lt;/a&gt; è gratuita per cui non ci sono rischi, nemmeno per il portafoglio.&lt;/p&gt;&#xA;&lt;p&gt;In attesa dell&amp;rsquo;inizio della Conferenza, si stanno tenendo dei &lt;a href=&#34;https://juliacon.org/2021/workshops/&#34;&gt;workshop preliminari&lt;/a&gt; molto interessanti che possono già essere visti su YouTube (o potranno essere visti in diretta nei prossimi giorni), senza nemmeno la necessità di installare l&amp;rsquo;ennesimo sistema di videoconferenza. Per quanto mi riguarda, finito il post mi guarderò &lt;a href=&#34;https://www.youtube.com/watch?v=IlPoU5Yr2QI&#34;&gt;Statistics with Julia from the ground up&lt;/a&gt;, mentre lunedì mi aspetta &lt;a href=&#34;https://www.youtube.com/watch?v=W_ExvidyESg&#34;&gt;Introduction to Bayesian Data Analysis&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Per chi preferisce leggere, consiglio questo articolo generale del sempre bravissimo Jeffrey Perkel, &lt;a href=&#34;https://www.nature.com/articles/d41586-019-02310-3&#34;&gt;Julia: come for the syntax, stay for the speed&lt;/a&gt;, e questo post su Towards Data Science, &lt;a href=&#34;https://towardsdatascience.com/bye-bye-python-hello-julia-9230bff0df62&#34;&gt;Bye-bye Python. Hello Julia!&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Buona visione (o buona lettura)!&lt;/p&gt;&#xA;&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;&#xA;&lt;hr&gt;&#xA;&lt;ol&gt;&#xA;&lt;li id=&#34;fn:1&#34;&gt;&#xA;&lt;p&gt;Julia è un linguaggio compilato ma funziona anche in modo interattivo.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/div&gt;&#xA;</description>
    </item>
    <item>
      <title>Python, il Visual Basic del XXI secolo?</title>
      <link>https://static.233.196.69.159.clients.your-server.de/it/2021/04/19/python-il-visual-basic-del-xxi-secolo/</link>
      <pubDate>Mon, 19 Apr 2021 06:00:00 +0000</pubDate>
      <guid>https://static.233.196.69.159.clients.your-server.de/it/2021/04/19/python-il-visual-basic-del-xxi-secolo/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2021-04-19-python-il-visual-basic-del-xxi-secolo/visual-basic-10-for-windows.png&#34; alt=&#34;&#34;&gt;&lt;br&gt;&#xA;&amp;ndash; &lt;em&gt;Microsoft Visual Basic 1.0 per Windows 3.0 (e versioni successive)&lt;/em&gt;. Fonte: &lt;a href=&#34;https://winworldpc.com/product/microsoft-visual-bas/10&#34;&gt;WinWorld&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Ho appena letto l&amp;rsquo;articolo &lt;em&gt;&lt;a href=&#34;https://medium.com/young-coder/is-python-the-spiritual-successor-to-visual-basic-5b211be55bc2&#34;&gt;Is Python the Spiritual Successor to Visual Basic?&lt;/a&gt;&lt;/em&gt; di &lt;a href=&#34;https://medium.com/@prosetech&#34;&gt;Matthew MacDonald&lt;/a&gt; e non potrei essere più d&amp;rsquo;accordo, tanto più che ho fatto esattamente lo stesso percorso, Visual Basic nei primi anni &amp;lsquo;90 e Python (assieme ad R) oggi.&lt;/p&gt;&#xA;&lt;hr style = &#34;border: none; &#xA;            border-top: 3px double #333; &#xA;            color: #333; &#xA;            overflow: visible; &#xA;            height: 5px; &#xA;            width: 50%; &#xA;            margin-left: auto; &#xA;            margin-right: auto;&#34;&#xA;&gt;&#xA;&#xA;&lt;p&gt;&lt;strong&gt;Visual Basic&lt;/strong&gt; è stato un linguaggio davvero rivoluzionario, il primo che permetteva di aggiungere in modo semplice una interfaccia grafica ai programmi scritti in BASIC, un linguaggio di programmazione ben noto a tutti coloro che avevano vissuto la stagione degli &lt;em&gt;home computer&lt;/em&gt; come il Commodore 64 o lo Spectrum.&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#xA;&lt;p&gt;A me, abituato ad usare il Fortran o uno dei vari linguaggi &lt;a href=&#34;https://issuu.com/adpware/docs/mc070/80&#34;&gt;Turbo-qualcosa e Quick-qualcosa&lt;/a&gt; che all&amp;rsquo;epoca spopolavano, Visual Basic sembrò all&amp;rsquo;inizio come una ventata di aria fresca e lo usai subito per un &lt;a href=&#34;http://rescience.github.io/bibliography/Maggi_2020.html&#34;&gt;progetto&lt;/a&gt; a cui tenevo moltissimo (e che merita di essere raccontato più in dettaglio).&lt;/p&gt;&#xA;&lt;p&gt;Ma dopo questa prima volta lo abbandonai senza remore, non solo perché nel frattempo avevo scoperto la potenza di UNIX e Windows era diventato improvvisamente troppo stretto per le mie esigenze, ma soprattutto perché avevo cozzato contro uno dei problemi più seri del linguaggio (almeno per me), l&amp;rsquo;incompatibilità fra le varie versioni, che impediva di eseguire il codice sviluppato per Visual Basic 1.0 già nella versione successiva della piattaforma di sviluppo. Ma dato che Microsoft già allora era maestra nel mettere i bastoni fra le ruote dei suoi utenti, nemmeno la compatibilità fra il Visual Basic 1.0 per Windows e la versione corrispondente per DOS era garantita al 100% (e questo era proprio il mio caso).&lt;/p&gt;&#xA;&lt;p&gt;Non sapevo ancora nulla di &lt;em&gt;free software&lt;/em&gt; o di &lt;em&gt;open source&lt;/em&gt;, ma l&amp;rsquo;idea di dover dipendere dai capricci di una azienda di software mi sembrava già allora incomprensibile.&lt;/p&gt;&#xA;&lt;p&gt;Visual Basic è considerato un prodotto Microsoft, ma in realtà è l&amp;rsquo;adattamento di un linguaggio di programmazione visuale per Windows 3.x, &lt;a href=&#34;https://www.computer.org/csdl/magazine/an/2020/04/09263263/1oReOkHdXQQ&#34;&gt;sviluppato in proprio da Alan Cooper&lt;/a&gt; (che lo aveva chiamato &lt;em&gt;Ruby&lt;/em&gt;). L&amp;rsquo;idea originale di Cooper era di creare uno strumento con cui costruire con facilità delle interfacce grafiche che aiutassero gli utenti ad utilizzare al meglio il nuovo sistema operativo, interfacce che potevano essere diversificate in base al livello di esperienza di chi le usava.&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt; Tramite dei buoni agganci Alan Cooper riuscì a presentare il proprio prodotto a Bill Gates, che ne rimase entusiasta e decise immediatamente di acquistarne i diritti. Ruby però finì subito in un limbo, ostaggio delle strategie aziendali e delle rivalità fra i diversi gruppi di sviluppatori, per essere associato solo in un secondo momento al QBasic, il vecchio interprete Basic della Microsoft, diventando così il Visual Basic che conosciamo.&lt;/p&gt;&#xA;&lt;p&gt;L&amp;rsquo;ambizioso obiettivo iniziale si ridusse così alla semplice riproposizione di un vecchio linguaggio di programmazione in una forma graficamente più accattivante. Alan Cooper sarà quindi anche considerato il &lt;em&gt;&lt;a href=&#34;https://yourstory.com/2017/06/techie-tuesdays-alan-cooper&#34;&gt;padre del Visual Basic&lt;/a&gt;&lt;/em&gt;, ma la sua idea originale ha ben poco a che fare con il prodotto finale!&lt;/p&gt;&#xA;&lt;p&gt;Date le premesse non ci si può stupire che Visual Basic abbia avuto una vita travagliata e relativamente breve, descritta con grande abbondanza di dettagli nell&amp;rsquo;articolo &lt;a href=&#34;https://socket3.wordpress.com/2016/09/12/visual-basic-early-beginnings/&#34;&gt;Visual Basic: Early Beginnings&lt;/a&gt;, pubblicato in uno dei blog più interessanti in assoluto sulla storia del Personal Computer.&lt;/p&gt;&#xA;&lt;hr style = &#34;border: none; &#xA;            border-top: 3px double #333; &#xA;            color: #333; &#xA;            overflow: visible; &#xA;            height: 5px; &#xA;            width: 50%; &#xA;            margin-left: auto; &#xA;            margin-right: auto;&#34;&#xA;&gt;&#xA;&#xA;&lt;p&gt;&lt;strong&gt;Python&lt;/strong&gt; oggi è uno dei linguaggi di programmazione più popolari, e con buona ragione. Python e Visual Basic sono praticamente coetanei: il primo ha &lt;a href=&#34;https://www.theregister.com/2021/02/20/python_at_30/&#34;&gt;festeggiato trent&amp;rsquo;anni&lt;/a&gt; a febbraio di quest&amp;rsquo;anno,&lt;sup id=&#34;fnref:3&#34;&gt;&lt;a href=&#34;#fn:3&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;3&lt;/a&gt;&lt;/sup&gt; mentre Visual Basic è stato pubblicato pochi mesi dopo, a maggio del 1991.&lt;/p&gt;&#xA;&lt;p&gt;Ma Python, a differenza del Visual Basic, dopo una partenza lenta ha conosciuto negli ultimi anni un successo travolgente dovuto, a mio avviso, a due aspetti fondamentali del linguaggio:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;Leggibilità&lt;/strong&gt;. Python non è infarcito di parentesi e di segni di interpunzione come JavaScript, C/C++ o Java, e questo lo rende molto più leggibile dei linguaggi concorrenti. Se per un programmatore esperto questo può essere un dettaglio di poco conto, di sicuro aiuta i neofiti ad avvicinarsi al linguaggio. Anche il fatto che le istruzioni contenute all&amp;rsquo;interno dei cicli &lt;code&gt;for&lt;/code&gt; e &lt;code&gt;while&lt;/code&gt; o delle istruzioni condizionali &lt;code&gt;if&lt;/code&gt; debbano essere &lt;a href=&#34;https://www.html.it/pag/39741/indentazione/&#34;&gt;indentate&lt;/a&gt; rispetto al resto del codice contribuisce moltissimo alla sua leggibilità, perché permette di afferrare &amp;ldquo;ad occhio&amp;rdquo; la struttura del programma. Questa caratteristica obbliga anche a rispettare una certa disciplina nella scrittura del codice (se non si rispetta la giusta indentazione il codice, anche se corretto dal punto di vista sintattico, si rifiuta di funzionare), che è sempre una cosa positiva quando si programma.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;Flessibilità&lt;/strong&gt;. Si può programmare in Python utilizzando indifferentemente un approccio &lt;em&gt;procedurale&lt;/em&gt;, ad &lt;em&gt;oggetti&lt;/em&gt; o &lt;em&gt;funzionale&lt;/em&gt;, riuscendo spesso a mescolare senza troppi problemi i diversi metodi di programmazione all&amp;rsquo;interno dello stesso programma. Il linguaggio quindi si adatta facilmente alle abitudini dei singoli programmatori e consente di far evolvere il codice in base alle esigenze del momento. È abbastanza usuale, almeno per i programmatori &lt;em&gt;dilettanti&lt;/em&gt; come me, cominciare a scrivere un programma in Python buttando giù le idee alla bell&amp;rsquo;e meglio, per passare solo in un secondo momento ad organizzare le parti principali in funzioni autonome, arrivando magari a creare una struttura di classi e metodi o a spingersi verso le asprezze della programmazione funzionale (in cui dati e funzioni diventano un tutto unico) quando serve un approccio più robusto.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;La flessibilità del linguaggio viene sfruttata all&amp;rsquo;estremo dalle interfacce a &lt;em&gt;notebook&lt;/em&gt; come &lt;a href=&#34;https://jupyter.org&#34;&gt;Jupyter&lt;/a&gt;, che consentono di costruire dei veri e propri documenti programmabili, dove le parti di testo che descrivono il problema o i dettagli di funzionamento del codice si mescolano alle istruzioni Python e perfino ai dati e agli stessi risultati delle elaborazioni, dando all&amp;rsquo;utente la possibilità di sperimentare in modo interattivo e di eseguire il codice in modo non lineare (una pratica non sempre raccomandabile, ma che se tenuta sotto controllo è molto comoda).&lt;/p&gt;&#xA;&lt;p&gt;Jupyter può essere &lt;a href=&#34;https://jupyter.org/try&#34;&gt;utilizzato direttamente dal web&lt;/a&gt;, senza installare nulla sulla proprio computer e senza dover gestire le mille dipendenze dei pacchetti di terze parti che permettono a Python di essere usato in settori diversissimi, che spaziano dalle analisi scientifiche alla finanza o all&amp;rsquo;arte. Bisogna ammettere che la gestione dei pacchetti esterni è l&amp;rsquo;aspetto più complesso del linguaggio ed anche la sua principale debolezza, e che ancora oggi non esiste uno strumento universale per farlo.&lt;/p&gt;&#xA;&lt;p&gt;Grazie a &lt;a href=&#34;https://colab.research.google.com/notebooks/intro.ipynb&#34;&gt;Colab di Google&lt;/a&gt; si può persino utilizzare una GPU (e in certi casi persino una TPU) per velocizzare i programmi su Jupyter, una cosa fantascientifica fino a pochissimi anni fa.&lt;/p&gt;&#xA;&lt;p&gt;Sul fronte opposto, Python è in grado di girare anche su microcomputer da poche decine di euro, come le varie incarnazioni del &lt;a href=&#34;https://www.raspberrypi.org/products/raspberry-pi-4-model-b/&#34;&gt;Raspberry Pi&lt;/a&gt;, e perfino su alcuni microcontroller, come il recentissimo &lt;a href=&#34;https://www.raspberrypi.org/products/raspberry-pi-pico/&#34;&gt;Raspberry Pi Pico&lt;/a&gt;, dei veri e propri computer ridotti all&amp;rsquo;osso.&lt;/p&gt;&#xA;&lt;p&gt;Dal Visual Basic per Windows al Python di oggi se ne è fatta di strada!&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2021-04-19-python-il-visual-basic-del-xxi-secolo/6kxdp8u3k2c61.png&#34; alt=&#34;&#34;&gt;&lt;br&gt;&#xA;&amp;ndash; &lt;em&gt;Immagine generata da un testo mediante le reti neurali BigGAN e CLIP&lt;/em&gt;. Fonte: &lt;a href=&#34;https://www.reddit.com/r/MachineLearning/comments/kzr4mg/p_the_big_sleep_texttoimage_generation_using/&#34;&gt;Reddit&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2021-04-19-python-il-visual-basic-del-xxi-secolo/a-cityscape-in-the-style-of-mondrian-under-a-bright-sun.png&#34; alt=&#34;&#34;&gt;&lt;br&gt;&#xA;&amp;ndash; &lt;em&gt;Immagine generata da un testo mediante le reti neurali BigGAN e CLIP&lt;/em&gt;. Fonte: Sabino Maggi.&lt;/p&gt;&#xA;&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;&#xA;&lt;hr&gt;&#xA;&lt;ol&gt;&#xA;&lt;li id=&#34;fn:1&#34;&gt;&#xA;&lt;p&gt;Prima del Visual Basic mi viene in mente solo &lt;a href=&#34;https://it.wikipedia.org/wiki/LabVIEW&#34;&gt;LabView&lt;/a&gt; (sviluppato originariamente per MacOS), che però era un linguaggio iper-specializzato (e iper-costoso!) per la gestione della strumentazione elettronica di misura (e per l&amp;rsquo;automazione industriale in generale) e l&amp;rsquo;analisi dei dati acquisiti.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:2&#34;&gt;&#xA;&lt;p&gt;LabView (ancora!) perseguiva lo stesso scopo (e lo fa tuttora) nell&amp;rsquo;ambito, ben più ristretto, dell&amp;rsquo;automazione industriale.&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:3&#34;&gt;&#xA;&lt;p&gt;Il codice originale di Python &lt;a href=&#34;https://github.com/smontanaro/python-0.9.1&#34;&gt;si trova qui&lt;/a&gt;, adattato in modo che possa essere ancora compilato sulle macchine moderne.&amp;#160;&lt;a href=&#34;#fnref:3&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/div&gt;&#xA;</description>
    </item>
    <item>
      <title>Imparare Python</title>
      <link>https://static.233.196.69.159.clients.your-server.de/it/2020/02/16/imparare-python/</link>
      <pubDate>Sun, 16 Feb 2020 06:00:00 +0000</pubDate>
      <guid>https://static.233.196.69.159.clients.your-server.de/it/2020/02/16/imparare-python/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;https://melabit.files.wordpress.com/2020/02/david-clode-4_ltr48nbyq-unsplash-1.jpg&#34; alt=&#34;&#34;&gt;&lt;br&gt;&#xA;&amp;ndash; &lt;em&gt;Fonte: &lt;a href=&#34;https://unsplash.com/@davidclode&#34;&gt;David Clode&lt;/a&gt; su &lt;a href=&#34;https://unsplash.com&#34;&gt;Unsplash&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;Di strumenti per imparare ad usare Python ce ne sono a iosa. Fra libri e corsi online come &lt;a href=&#34;http://greenteapress.com/thinkpython/html/index.html&#34;&gt;Think Python: How to Think Like a Computer Scientist&lt;/a&gt; e la relativa &lt;a href=&#34;https://runestone.academy/runestone/books/published/thinkcspy/index.html&#34;&gt;edizione interattiva&lt;/a&gt;, i più tradizionali &lt;a href=&#34;https://www.fullstackpython.com/&#34;&gt;Full Stack Python&lt;/a&gt; e &lt;a href=&#34;https://anandology.com/python-practice-book/index.html&#34;&gt;Python Practice Book&lt;/a&gt;, o il corso online del MIT &lt;a href=&#34;https://www.edx.org/course/introduction-to-computer-science-and-programming-7&#34;&gt;Introduction to Computer Science and Programming Using Python&lt;/a&gt;, c&amp;rsquo;è solo l&amp;rsquo;imbarazzo della scelta.&lt;/p&gt;&#xA;&lt;p&gt;E poi, quando si inizia a masticare i rudimenti del linguaggio, c&amp;rsquo;è il favoloso &lt;a href=&#34;http://pythontutor.com/&#34;&gt;Python Tutor&lt;/a&gt;, che mostra in modo interattivo quello che succede quando si esegue ogni singola linea di codice.&lt;/p&gt;&#xA;&lt;p&gt;Senza dimenticare &lt;a href=&#34;https://realpython.com/&#34;&gt;Real Python&lt;/a&gt;, che negli ultimi anni è diventato il sito di riferimento per il programmatore in Python, pieno di tutorial scritti benissimo, utili sia per il programmatore alle prime armi che per il professionista scafato che passa le giornate (e spesso anche le notti) davanti al monitor del computer. Il professionista non può farsi farsi sfuggire anche &lt;a href=&#34;https://www.thepythoncorner.com/&#34;&gt;The Python Corner&lt;/a&gt;, un sito scritto in inglese (come tutti gli altri citati qui) ma italiano al 100%, e nemmeno &lt;a href=&#34;https://realpython.com/products/python-tricks-book/&#34;&gt;Python Tricks: The Book&lt;/a&gt;, un libro pieno di trucchi fantastici, indispensabili per utilizzare Python al pieno delle sue potenzialità.&lt;/p&gt;&#xA;&lt;p&gt;Insomma, per imparare Python non c&amp;rsquo;è che l&amp;rsquo;imbarazzo della scelta.&lt;/p&gt;&#xA;&lt;hr style = &#34;border: none; &#xA;            border-top: 3px double #333; &#xA;            color: #333; &#xA;            overflow: visible; &#xA;            height: 5px; &#xA;            width: 50%; &#xA;            margin-left: auto; &#xA;            margin-right: auto;&#34;&#xA;&gt;&#xA;&#xA;&lt;p&gt;Ma la chicca me la sono lasciata per ultimo. Perché c&amp;rsquo;è &lt;a href=&#34;https://twitter.com/chris_swenson/status/1225836060938125313&#34;&gt;chi non si accontenta&lt;/a&gt; di tutto questo ben di Dio e tanto fa che &lt;a href=&#34;https://www.zdnet.com/article/python-programming-language-now-you-can-take-nsas-free-course-for-beginners/&#34;&gt;riesce ad avere accesso&lt;/a&gt; al corso di Python utilizzato internamente dalla NSA, l&amp;rsquo;agenzia USA che si occupa della raccolta e dell&amp;rsquo;elaborazione di dati e informazioni da tutto il mondo, nonché della sicurezza delle reti di comunicazione degli Stati Uniti. Evidentemente anche alla NSA pensano che Python sia un linguaggio di programmazione molto ben fatto, e ora anche noi comuni cittadini possiamo renderci conto di come l&amp;rsquo;insegnano, scaricando il &lt;a href=&#34;https://archive.org/details/comp3321&#34;&gt;corso introduttivo alla programmazione in Python&lt;/a&gt; scritto dai loro stessi insegnanti.&lt;/p&gt;&#xA;&lt;p&gt;Non so voi, ma io sono curioso di dargli una occhiata. E poi è bello sapere che c&amp;rsquo;è in giro qualcuno molto più tignoso di me!&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>Script per tutti i giorni: semplici modifiche alle stringhe di testo</title>
      <link>https://static.233.196.69.159.clients.your-server.de/it/2018/11/23/script-per-tutti-i-giorni-semplici-modifiche-alle-stringhe-di-testo/</link>
      <pubDate>Fri, 23 Nov 2018 18:00:00 +0000</pubDate>
      <guid>https://static.233.196.69.159.clients.your-server.de/it/2018/11/23/script-per-tutti-i-giorni-semplici-modifiche-alle-stringhe-di-testo/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;https://farm3.staticflickr.com/2472/3797070188_ece79b25b3_b.jpg&#34; alt=&#34;&#34;&gt;&#xA;&amp;ndash; Foto: &lt;a href=&#34;https://www.flickr.com/photos/telwink/&#34;&gt;telwink&lt;/a&gt; su Flickr.&lt;/p&gt;&#xA;&lt;p&gt;Succede più spesso di quanto mi renda conto. Devo rinominare dei file, modificare un testo o fare altri pasticci con i miei documenti. Potrei usare una delle tante applicazioni &lt;em&gt;ad hoc&lt;/em&gt; fatte per fare &lt;em&gt;proprio quello&lt;/em&gt;. Ma perché perdere tempo ad installare ed imparare ad usare l&amp;rsquo;ennesima applicazione se con il Terminale posso fare prima (e meglio)?&lt;/p&gt;&#xA;&lt;p&gt;Basta qualche comando ben piazzato nel Terminale, a volte qualche piccolo script in &lt;code&gt;bash&lt;/code&gt; o in &lt;code&gt;python&lt;/code&gt;, e si possono fare cose bellissime con poco sforzo.&lt;/p&gt;&#xA;&lt;p&gt;E una volta fatte, perché tenerli per se e non condividerli, magari proprio qui? L&amp;rsquo;impulso iniziale me l&amp;rsquo;ha dato Federico &amp;ldquo;frix&amp;rdquo; Morchio durante una discussione sul canale &lt;a href=&#34;https://goedel.slack.com&#34;&gt;Goedel&lt;/a&gt; di &lt;a href=&#34;https://slack.com/&#34;&gt;Slack&lt;/a&gt; gestito dal sempre ottimo &lt;a href=&#34;http://macintelligence.org/&#34;&gt;Lucio Bragagnolo&lt;/a&gt; (aka&amp;hellip; oops, &lt;a href=&#34;http://blog.terminologiaetc.it/2017/12/18/significato-abbreviazione-inglese-aka/&#34;&gt;noto anche come&lt;/a&gt; Lux, Loox e tanti altri alias).&lt;/p&gt;&#xA;&lt;p&gt;Attenzione! Questo e i futuri post sull&amp;rsquo;argomento &lt;strong&gt;non saranno&lt;/strong&gt; delle introduzioni a &lt;code&gt;bash&lt;/code&gt;, a &lt;code&gt;python&lt;/code&gt;, al Terminale di macOS (tendo sempre a dimenticare che non si chiama più OS X!), per quelle ci sono un sacco di ottime guide in rete. Chi vuole fare in fretta può iniziare leggendo la mia piccola guida a &lt;code&gt;bash&lt;/code&gt; di qualche anno fa, &lt;a href=&#34;https://melabit.wordpress.com/2014/11/06/script-di-shell-in-os-x/&#34;&gt;Script di shell in OS X&lt;/a&gt; e magari anche &lt;a href=&#34;https://melabit.wordpress.com/2016/12/18/compleanno-con-permessi/&#34;&gt;Compleanno con permessi&lt;/a&gt;, la ripresa di un vecchio post sull&amp;rsquo;ormai defunto &lt;a href=&#34;https://web.archive.org/web/20120102191652/http://www.macworld.it/ping&#34;&gt;Ping&lt;/a&gt; che di fatto mi ha fatto iniziare l&amp;rsquo;esperienza di blogger.&lt;/p&gt;&#xA;&lt;p&gt;Cominciamo con un antipasto veloce, una cosa apparentemente inutile (o quasi), ma che serve a dare una idea delle potenzialità di &lt;code&gt;bash&lt;/code&gt; e di come, partendo da un&amp;rsquo;idea semplice, si possa trasformarla a poco a poco in qualcosa di più pratico e adatto ad un uso quotidiano.&lt;/p&gt;&#xA;&lt;h4 id=&#34;manipolare-i-nomi-dei-file&#34;&gt;Manipolare i nomi dei file&lt;/h4&gt;&#xA;&lt;p&gt;La prima cosa che faccio quando inizio a scrivere un nuovo post è creare un file Markdown con i &lt;em&gt;metadati&lt;/em&gt; (titolo, data di pubblicazione, categoria e tag, chi usa Jekyll o Octopress sa di cosa parlo), a cui assegno un nome temporaneo. Una volta deciso il titolo definitivo, rinomino il file in un modo più razionale, in modo che possa ritrovarlo facilmente.&lt;/p&gt;&#xA;&lt;p&gt;Per farlo seguo la &lt;a href=&#34;https://jekyllrb.com/docs/posts/&#34;&gt;convenzione sui nomi dei file&lt;/a&gt; di Jekyll,&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; secondo la quale il nome del file deve essere scritto come &lt;code&gt;YYYY-MM-DD-titolo-del-post.md&lt;/code&gt;, dove &lt;code&gt;YYYY&lt;/code&gt; indica l&amp;rsquo;anno, &lt;code&gt;MM&lt;/code&gt; il mese e &lt;code&gt;DD&lt;/code&gt; il giorno di pubblicazione (espressi rispettivamente con quattro e due cifre) e parole e numeri vanno separati con un trattino invece che con uno spazio. Sembra una cosa inutilmente complicata, ma permette di tenere ordinati i file in base alla data anche quando se ne modifica il contenuto in un secondo tempo. E comunque, evitare di utilizzare gli spazi nei nomi dei file è ancora oggi la cosa più razionale da fare nei sistemi basati su Unix come macOS.&lt;/p&gt;&#xA;&lt;p&gt;Per la data non ci sono problemi, nei metadati è già scritta nel formato &lt;em&gt;giusto&lt;/em&gt;, per cui è sufficiente copiarla ed incollarla direttamente nel nome del file tramite il Finder. Ma il titolo? Potrei usare il Finder anche per il titolo, inserendolo dopo la data nel nome del file e sostituendo a mano gli spazi con i trattini. Però è facile sbagliare, soprattutto quando il titolo è lungo. Ancora più facile è non essere consistenti, usando ogni volta una forma leggermente diversa e mandando a pallino i vantaggi dati dall&amp;rsquo;utilizzare nomi di file ben definiti.&lt;/p&gt;&#xA;&lt;p&gt;E poi, vuoi mettere il divertimento di farlo fare a &lt;code&gt;bash&lt;/code&gt;?&lt;/p&gt;&#xA;&lt;h4 id=&#34;un-pezzo-alla-volta&#34;&gt;Un pezzo alla volta&lt;/h4&gt;&#xA;&lt;p&gt;Prendiamo come esempio il titolo di un &lt;a href=&#34;https://melabit.wordpress.com/2018/01/20/la-privacy-al-tempo-dell-internet-of-things-gran-finale/&#34;&gt;post&lt;/a&gt; di qualche mese fa, &amp;ldquo;La privacy al tempo dell&amp;rsquo;Internet of Things: gran finale&amp;rdquo;. Per trasformare il titolo originale in una sequenza di parole separate da trattini è sufficiente lanciare il Terminale ed eseguire il comando&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ echo &amp;quot;La privacy al tempo dell&#39;Internet of Things: gran finale&amp;quot; | sed &amp;quot;s/ /-/g&amp;quot;&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;dove &lt;code&gt;echo&lt;/code&gt; scrive la stringa nel Terminale e la invia tramite il &lt;code&gt;|&lt;/code&gt; (&lt;em&gt;pipe&lt;/em&gt;) a &lt;code&gt;sed&lt;/code&gt;, che si occupa di cercare tutti gli spazi e di sostituirli con un trattino, ottenendo&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;La-privacy-al-tempo-dell&#39;Internet-of-Things:-gran-finale&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Non male, ma ci sono due o tre cosette da sistemare.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Problema numero 1 (banale)&lt;/strong&gt;. Il formato di Jekyll prevede implicitamente che il nome del file sia scritto tutto in minuscolo. Personalmente trovo che questa forma sia più gradevole, ma è anche utile a semplificare e a rendere univoco l&amp;rsquo;ordinamento dei file (una fissazione, lo so, ma quando si maneggiano tantissimi file ogni giorno diventa una cosa fondamentale per lavorare meglio). Si può fare così&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ echo &amp;quot;La privacy al tempo dell&#39;Internet of Things: gran finale&amp;quot; | tr &amp;quot;[:upper:]&amp;quot; &amp;quot;[:lower:]&amp;quot;&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;dove &lt;code&gt;tr&lt;/code&gt; trasforma i caratteri maiuscoli (&lt;code&gt;[:upper:]&lt;/code&gt;) in minuscoli (&lt;code&gt;[:lower:]&lt;/code&gt;), ottenendo&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;la privacy al tempo dell&#39;internet of things: gran finale&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;&lt;em&gt;Domanda #1: cosa succede se nel comando precedente si usa &lt;code&gt;tr &amp;quot;[:lower:]&amp;quot; &amp;quot;[:upper:]&amp;quot;&lt;/code&gt;?&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Problema numero 2 (importante)&lt;/strong&gt;. Nei nomi dei file è preferibile usare solo lettere non accentate, numeri e alcuni caratteri di separazione: trattino, underscore e (se proprio dobbiamo) spazio. Se possibile è meglio evitare di usare il punto, che normalmente serve per separare il nome del file vero e proprio dall&amp;rsquo;estensione (caratteristica che è stata usata parecchio per distribuire file contenti virus ma che apparivano legittimi). Tutto gli altri caratteri devono essere rigorosamente evitati, perché spesso hanno significati speciali per il sistema operativo e creano solo guai.&lt;/p&gt;&#xA;&lt;p&gt;Per togliere la punteggiatura possiamo usare la stessa tecnica di sopra,&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ echo &amp;quot;La privacy al tempo dell&#39;Internet of Things: gran finale&amp;quot; | sed &amp;quot;s/[[:punct:]]//g&amp;quot;&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;dove in questo caso &lt;code&gt;sed&lt;/code&gt; cerca tutti i caratteri di punteggiatura (&lt;code&gt;[[:punct:]]&lt;/code&gt;) e li sostituisce con&amp;hellip; niente (cioè li toglie), ottenendo in uscita&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;La privacy al tempo dellInternet of Things gran finale&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;&lt;strong&gt;Problema numero 3 (specifico)&lt;/strong&gt;. Il comando di prima rimuove anche gli apostrofi (che è sempre bene evitare di mettere nei nomi dei file, perché potrebbero dare problemi su sistemi operativi meno &lt;em&gt;liberali&lt;/em&gt; di macOS).&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt; Piuttosto che buttarli via, è preferibile però sostituirli con un trattino, usando ancora una volta &lt;code&gt;sed&lt;/code&gt;&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ echo &amp;quot;La privacy al tempo dell&#39;Internet of Things: gran finale&amp;quot; | sed &amp;quot;s/&#39;/-/g&amp;quot;&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;che da in uscita&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;La privacy al tempo dell-Internet of Things: gran finale&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;h4 id=&#34;mettiamo-tutto-insieme&#34;&gt;Mettiamo tutto insieme&lt;/h4&gt;&#xA;&lt;p&gt;Usare &lt;code&gt;bash&lt;/code&gt; (o qualunque altra shell di Unix) è un po&amp;rsquo; come usare il Lego dove, mettendo insieme dei piccoli mattoncini di forme e colori diversi, si può costruire una portaerei (o quasi). Con &lt;code&gt;bash&lt;/code&gt; si prendono dei semplici comandi come quelli visti prima, si mettono nell&amp;rsquo;ordine giusto, si collega l&amp;rsquo;output di un comando con l&amp;rsquo;input di quello successivo tramite il &lt;code&gt;|&lt;/code&gt; (&lt;em&gt;pipe&lt;/em&gt;), e alla fine si riescono a fare delle cose anche piuttosto sofisticate.&lt;/p&gt;&#xA;&lt;p&gt;In questo caso, il comando&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ echo &amp;quot;La privacy al tempo dell&#39;Internet of Things: gran finale&amp;quot; | tr &amp;quot;[:upper:]&amp;quot; &amp;quot;[:lower:]&amp;quot; | sed &amp;quot;s/&#39;/ /g&amp;quot; | sed &amp;quot;s/[[:punct:]]//g&amp;quot; | sed &amp;quot;s/ /-/g&amp;quot;&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;genera la stringa&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;la-privacy-al-tempo-dell-internet-of-things-gran-finale&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;pronta per essere utilizzata come nome del file.&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;Domanda #2: Cosa succede se cambio l&amp;rsquo;ordine dei comandi? Perché questo è l&amp;rsquo;ordine migliore per convertire un titolo nel formato desiderato?&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;Domanda #3: Perché nel primo &lt;code&gt;sed&lt;/code&gt; questa volta ho sostituito l&amp;rsquo;apostrofo &lt;code&gt;&#39;&lt;/code&gt; con uno spazio (mentre nella descrizione del problema numero 3 avevo usato un trattino)?&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;Chi ha avuto la pazienza di leggere fin qui, si starà chiedendo che senso abbia complicarsi la vita con il Terminale e con &lt;code&gt;bash&lt;/code&gt;, quando è molto più veloce modificare il titolo a mano nel Finder.&lt;/p&gt;&#xA;&lt;p&gt;Tutto vero, ma è altrettanto vero che il post è stato più che altro una scusa per introdurre due comandi come &lt;code&gt;sed&lt;/code&gt; e &lt;code&gt;tr&lt;/code&gt;, molto utili ma anche molto poco conosciuti. E poi, partendo da questa base si possono costruire delle cose molto più utili, ma questo lo vedremo la prossima volta.&lt;/p&gt;&#xA;&lt;h5 id=&#34;revisioni&#34;&gt;Revisioni&lt;/h5&gt;&#xA;&lt;p&gt;&lt;strong&gt;3-12-2018&lt;/strong&gt;: Corretta una incongruenza nel testo originale, nel quale veniva usato una volta &lt;code&gt;sed&lt;/code&gt; e un&amp;rsquo;altra &lt;code&gt;tr&lt;/code&gt; per rimuovere i caratteri di punteggiatura.&lt;/p&gt;&#xA;&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;&#xA;&lt;hr&gt;&#xA;&lt;ol&gt;&#xA;&lt;li id=&#34;fn:1&#34;&gt;&#xA;&lt;p&gt;Che poi è praticamente la stessa convenzione che usa Wordpress per generare i nomi dei post.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:2&#34;&gt;&#xA;&lt;p&gt;La gestione generale dei caratteri accentati nei nomi dei file è un problema molto più complesso, che è meglio rimandare ad un post specifico sull&amp;rsquo;argomento, ammesso che ci sia interesse per l&amp;rsquo;argomento.&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/div&gt;&#xA;</description>
    </item>
    <item>
      <title>La settimana di Python</title>
      <link>https://static.233.196.69.159.clients.your-server.de/it/2015/10/13/la-settimana-di-python/</link>
      <pubDate>Tue, 13 Oct 2015 18:00:00 +0000</pubDate>
      <guid>https://static.233.196.69.159.clients.your-server.de/it/2015/10/13/la-settimana-di-python/</guid>
      <description>&lt;p&gt;La solita &lt;a href=&#34;https://www.packtpub.com/&#34;&gt;Packt&lt;/a&gt; sta celebrando da ieri la &lt;a href=&#34;https://www.packtpub.com/packt/offers/pythonweek&#34;&gt;settimana di Python&lt;/a&gt;, nel corso della quale offrirà uno sconto del 20% sui suoi libri su Python e un &lt;a href=&#34;https://www.packtpub.com/packt/offers/free-learning&#34;&gt;volume gratuito al giorno&lt;/a&gt; sull&amp;rsquo;argomento.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.python.org/&#34;&gt;Python&lt;/a&gt; è a mio modesto parere il linguaggio di programmazone più interessante che ci sia in giro, facile da imparare ma anche veloce, potente ed estensibile.&#xA;Un aspetto non trascurabile è che può essere utilizzato sia in modo procedurale, come il Fortran o il C, che nella più moderna modalità ad oggetti (e perfino in modo misto), rendendo più semplice padroneggiare i concetti, piuttisto astrusi a dire il vero, della programmazione orientata agli oggetti.&lt;/p&gt;&#xA;&lt;p&gt;Non voglio fare sempre pubblicità a Packt, ma trovo molto lungimirante la sua politica di offrire gratis tanti volumi stimolanti e che coprono uno spettro di interessi molto vasto. Prendi quelli gratis ma prima o poi qualcuno lo compri pure.&lt;/p&gt;&#xA;&lt;p&gt;Mi sembra una occasione da non farsi sfuggire.&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>Setacciare numeri con il serpente (parte 2)</title>
      <link>https://static.233.196.69.159.clients.your-server.de/it/2014/12/15/setacciare-numeri-con-il-serpente-parte-2/</link>
      <pubDate>Mon, 15 Dec 2014 06:00:00 +0000</pubDate>
      <guid>https://static.233.196.69.159.clients.your-server.de/it/2014/12/15/setacciare-numeri-con-il-serpente-parte-2/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;Caught me crawlin&amp;rsquo;, baby, Crawlin&amp;rsquo; &amp;lsquo;round your door,&lt;br&gt;&#xA;Seein&amp;rsquo; everything I want, I&amp;rsquo;m gonna crawl on your floor.&lt;br&gt;&#xA;&amp;ndash; &lt;em&gt;The Doors, Crawlin&amp;rsquo; King Snake&lt;/em&gt;.&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;&#xA;      &lt;iframe allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&#34; allowfullscreen=&#34;allowfullscreen&#34; loading=&#34;eager&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; src=&#34;https://www.youtube.com/embed/Z-ffGKXtvGE?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; title=&#34;YouTube video&#34;&gt;&lt;/iframe&gt;&#xA;    &lt;/div&gt;&#xA;&#xA;&lt;p&gt;Nel post di qualche mese fa, &lt;a href=&#34;http://melabit.wordpress.com/2014/09/29/setacciare-numeri-con-il-serpente/&#34;&gt;Setacciare numeri con il serpente&lt;/a&gt;, avevo preso lo spunto da un semplice programma che calcolava i numeri primi mediante il famoso &lt;a href=&#34;http://it.wikipedia.org/wiki/Crivello_di_Eratostene&#34;&gt;Crivello di Eratostene&lt;/a&gt;, traducendo il programma dal BASIC originale in Python, che considero il linguaggio di programmazione più interessante, oggi.&lt;/p&gt;&#xA;&lt;p&gt;Nella traduzione in Python avevo cercato di lasciare il più possibile inalterato il codice originale, aggiungendo solo alcune righe per mostrare i risultati del calcolo, righe che mancavano del tutto nel programma BASIC di partenza.&lt;/p&gt;&#xA;&lt;p&gt;Questa volta voglio rendere il codice più &lt;em&gt;moderno&lt;/em&gt; e facile da usare, facendo anche in modo che l&amp;rsquo;output del programma sia più immediatamente comprensibile.&lt;/p&gt;&#xA;&lt;p&gt;Ecco quindi la versione rivista del programma in Python per il calcolo dei numeri primi. Poiché questo non vuole essere un corso di Python, ma solo una introduzione generale alla bellezza ed alle potenzialità del linguaggio, non entrerò negli aspetti specifici del codice, che possono essere approfonditi utilizzando i link forniti nella bibliografia.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;from&lt;/span&gt; math &lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; sqrt, ceil&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;num_max &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;256&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;root &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; int(ceil(sqrt(num_max)))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;flags &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; {}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; num &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; range(&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, num_max &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    flags[num] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;P&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; num &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; range(&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;, root):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; flags[num] &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;P&amp;#34;&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; mult &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; range(num&lt;span style=&#34;color:#f92672&#34;&gt;**&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;, num_max &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, num):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            flags[mult] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;-&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Sieve of Eratosthenes between 1 and &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;%d&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt; (PYTHON-style): true/false map&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;%&lt;/span&gt;(num_max))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;print flags&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;print&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Sieve of Eratosthenes between 1 and &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;%d&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt; (PYTHON-style): prime numbers&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;%&lt;/span&gt;(num_max))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; key,val &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; flags&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;items():&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; val &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;P&amp;#34;&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        print key,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        print &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;-&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Per provare il programma si può copiare il codice in un editor di testo (i soliti TextWrangler, TextMate, Atom, Brackets o editor analoghi), salvarlo sul disco rigido come &amp;ldquo;sieve_v2.py&amp;rdquo;, ed eseguirlo dal Terminale con il comando&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ python sieve_v2.py&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Nella versione originale, prima di ogni esecuzione bisogna inserire a mano nel codice del programma &lt;em&gt;sia&lt;/em&gt; il massimo numero intero fino a cui calcolare la lista dei numeri primi (&lt;code&gt;num_max&lt;/code&gt;) &lt;em&gt;sia&lt;/em&gt; la sua radice quadrata (&lt;code&gt;root&lt;/code&gt;), arrotondata al primo intero più grande.&lt;/p&gt;&#xA;&lt;p&gt;Ma i due numeri sono collegati, perché non far fare questi calcoli al computer?&lt;/p&gt;&#xA;&lt;p&gt;Per svolgere le operazioni matematiche il Python ha bisogno di caricare esplicitamente la libreria esterna &lt;code&gt;math&lt;/code&gt;. Questo meccanismo serve per rendere il più compatto possibile il codice di base dell&amp;rsquo;interprete Python, aumentandone potenza e capacità di svolgere operazioni particolari solo in caso di effettiva necessità.&lt;/p&gt;&#xA;&lt;p&gt;Alla riga 1 viene quindi caricata la libreria matematica &lt;code&gt;math&lt;/code&gt;, importando solo le funzioni che ci servono veramente, la radice quadrata (&lt;code&gt;sqrt&lt;/code&gt;) e quella che effettua l&amp;rsquo;arrotondamento all&amp;rsquo;intero superiore (&lt;code&gt;ceil&lt;/code&gt;) (per caricare l&amp;rsquo;intera libreria matematica, basta trasformare la riga 1 in &lt;code&gt;import math&lt;/code&gt;).&lt;/p&gt;&#xA;&lt;p&gt;Queste funzioni vengono usate alla riga 3, che deve essere letta dall&amp;rsquo;interno all&amp;rsquo;esterno. Per prima cosa si calcola la radice quadrata di &lt;code&gt;num_max&lt;/code&gt; e il risultato è un numero con la virgola (&lt;code&gt;float&lt;/code&gt; in Python). La funzione &lt;code&gt;ceil()&lt;/code&gt; lo approssima al primo numero intero maggiore o uguale alla radice quadrata, lasciandolo però in formato di numero con la virgola. Infine &lt;code&gt;int()&lt;/code&gt; converte il risultato in un &lt;em&gt;vero&lt;/em&gt; numero intero.&lt;/p&gt;&#xA;&lt;p&gt;Avrei anche potuto scrivere questa riga in modo più esplicito&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;...&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;temp1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; sqrt(num_max)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;temp2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; int(temp1)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;root &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; int(temp2)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;...&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;introducendo due variabili &lt;em&gt;temporanee&lt;/em&gt;, &lt;code&gt;temp1&lt;/code&gt; e &lt;code&gt;temp2&lt;/code&gt;, che servono solo a memorizzare i risultati intermedi di calcolo, ma credo che questa forma sia persino meno comprensibile di quella originale.&lt;/p&gt;&#xA;&lt;p&gt;Nella riga 5 la variabile &lt;code&gt;flags&lt;/code&gt;, che nel codice originale è una variabile di tipo &lt;a href=&#34;http://www.python.it/doc/Howtothink/Howtothink-html-it/chap08.htm&#34;&gt;lista&lt;/a&gt;, cioè una serie ordinata di valori identificati da un indice numerico (un &lt;code&gt;array&lt;/code&gt; in C) viene trasformata in un &lt;a href=&#34;http://www.python.it/doc/Howtothink/Howtothink-html-it/chap10.htm&#34;&gt;dizionario&lt;/a&gt;, un tipo di dati (detto anche &lt;code&gt;array associativo&lt;/code&gt;) molto utile e caratteristico del Python e di (pochi) altri linguaggi.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;...&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;flags &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; {}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; num &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; range(&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, num_max &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    flags[num] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;P&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;...&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Il vantaggio di usare un dizionario rispetto ad una lista sta nel fatto che gli elementi di un dizionario possono essere identificati da indici costituiti non solo da numeri interi ma anche da stringhe.&#xA;Questo tipo di dati equivale quindi ad una lista non ordinata di dati, in cui ogni elemento di un dizionario è identificato da una chiave (&lt;code&gt;key&lt;/code&gt;) e dal valore (&lt;code&gt;val&lt;/code&gt;) corrispondente.&lt;/p&gt;&#xA;&lt;p&gt;In questo caso particolare gli indici sono costituiti dai numeri interi da 1 fino a &lt;code&gt;num_max&lt;/code&gt;, e a ciascuno elemento del dizionario viene inizialmente associato un valore costituito dalla stringa &amp;ldquo;P&amp;rdquo;.&lt;/p&gt;&#xA;&lt;p&gt;Il resto del codice è quasi immutato, a parte il fatto che ogni volta che l&amp;rsquo;algoritmo determina che il numero in esame non è primo, impone il valore dell&amp;rsquo;elemento corrispondente del dizionario alla stringa &amp;ldquo;-&amp;rdquo;, invece che al valore logico &lt;code&gt;False&lt;/code&gt; com&amp;rsquo;era in origine (riga 13).&lt;/p&gt;&#xA;&lt;p&gt;La lista finale dei numeri primi viene stampata in due modi diversi. Nel primo (riga 16), la stampa della variabile dizionario &lt;code&gt;flags&lt;/code&gt; mostra automaticamente la chiave (il numero intero) e la stringa associata (&amp;ldquo;P&amp;rdquo; se è primo, &amp;ldquo;-&amp;rdquo; altrimenti).&lt;/p&gt;&#xA;&lt;p&gt;[caption id=&amp;ldquo;attachment_1305&amp;rdquo; align=&amp;ldquo;aligncenter&amp;rdquo; width=&amp;ldquo;605&amp;rdquo;]&lt;img src=&#34;https://melabit.files.wordpress.com/2014/12/sieve_v2.png?w=605&#34; alt=&#34;Output della versione rivista del programma in Python per il calcolo dei numeri primi.&#34; width=&#34;605&#34; height=&#34;375&#34; class=&#34;size-large wp-image-1305&#34; /&gt; Output della versione rivista del programma in Python per il calcolo dei numeri primi.[/caption]&lt;/p&gt;&#xA;&lt;p&gt;Nel secondo, viene usato un metodo standard per accedere ai dizionari in Python&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; key,val &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; flags&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;items():&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;con il quale si può accedere alle singole coppie chiave e valore di ciascun elemento di un dizionario (riga 20).&lt;/p&gt;&#xA;&lt;h4 id=&#34;qualè-il-più-veloce&#34;&gt;Qual&amp;rsquo;è il più veloce?&lt;/h4&gt;&#xA;&lt;p&gt;Ma è più veloce usare una lista o un dizionario? Per scoprirlo, misuriamo il tempo di esecuzione delle due versioni del codice Python, la &lt;a href=&#34;http://melabit.wordpress.com/2014/09/29/setacciare-numeri-con-il-serpente/&#34;&gt;versione originale&lt;/a&gt;  &lt;code&gt;sieve.py&lt;/code&gt; e la versione modificata mostrata sopra &lt;code&gt;sieve_v2.py&lt;/code&gt;, per valori crescenti di &lt;code&gt;num_max&lt;/code&gt;. Per evitare di influenzare le misure è consigliabile cancellare (o commentare) la sezione finale del codice contenente i comandi di stampa dei risultati, comandi molto più lenti rispetto al codice di calcolo vero e proprio.&lt;/p&gt;&#xA;&lt;p&gt;Con il mio iMac del 2008 ottengo i risultati mostrati nella tabella seguente&lt;/p&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th style=&#34;text-align: right&#34;&gt;num_max&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: right&#34;&gt;sieve.py&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: right&#34;&gt;sieve_v2.py&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: right&#34;&gt;10.000&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: right&#34;&gt;0.048&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: right&#34;&gt;0.038&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: right&#34;&gt;1.000.000&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: right&#34;&gt;0.852&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: right&#34;&gt;1.018&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: right&#34;&gt;4.000.000&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: right&#34;&gt;3.650&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: right&#34;&gt;4.215&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: right&#34;&gt;9.000.000&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: right&#34;&gt;8.171&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: right&#34;&gt;9.574&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: right&#34;&gt;16.000.000&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: right&#34;&gt;14.676&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: right&#34;&gt;19.142&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: right&#34;&gt;25.000.000&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: right&#34;&gt;23.311&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: right&#34;&gt;30.104&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;(chi fosse interessato può scaricare &lt;a href=&#34;http://melabit.files.wordpress.com/2014/12/sieve.xlsx&#34;&gt;da questo link&lt;/a&gt; un foglio elettronico in formato Excel contenente una versione estesa della tabella con il relativo grafico).&lt;/p&gt;&#xA;&lt;p&gt;I dati mostrano che in Python una lista è più veloce di un dizionario ma che la differenza non è comunque particolarmente significativa, almeno nei casi normali.&#xA;Per gestire un dizionario, infatti, il Python deve  eseguire una serie di processi di sistema che finiscono per incidere sempre di più sul tempo totale di esecuzione del programma, al crescere del numero massimo entro il quale calcolare i numeri primi.&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#xA;&lt;p&gt;Guardando la tabella (o il grafico Excel) si nota che con entrambi i programmi i tempi di calcolo crescono linearmente all&amp;rsquo;aumentare del valore massimo da calcolare. Tecnicamente si dice che l&amp;rsquo;&lt;a href=&#34;http://www.cs.dartmouth.edu/~dwagn/research/ordernotation.html&#34;&gt;algoritmo utilizzato è di ordine O(n)&lt;/a&gt;, dove &lt;code&gt;n&lt;/code&gt; indica in modo simbolico il valore massimo da raggiungere nel corso del calcolo.&lt;/p&gt;&#xA;&lt;p&gt;Una crescita lineare del tempo di calcolo con &lt;code&gt;n&lt;/code&gt; è un caso quasi ideale. Nella maggior parte dei casi i tempi di calcolo aumentano molto più rapidamente all&amp;rsquo;aumentare di &lt;code&gt;n&lt;/code&gt;. Non è un caso quindi che la ricerca di metodi di calcolo sempre più efficienti sia uno dei campi più fecondi della matematica applicata e dell&amp;rsquo;informatica (che sono oggi più o meno la stessa cosa).&lt;/p&gt;&#xA;&lt;h4 id=&#34;bibliografia&#34;&gt;Bibliografia&lt;/h4&gt;&#xA;&lt;p&gt;La migliore introduzione a Python è senza dubbio &lt;a href=&#34;http://openbookproject.net/thinkcs/python/english2e/&#34;&gt;How to Think Like a Computer Scientist: Learning with Python&lt;/a&gt; (è preferibile usare la seconda edizione per Python 2.x).&lt;/p&gt;&#xA;&lt;p&gt;Ne esiste anche una versione nella nostra lingua, &lt;a href=&#34;http://www.python.it/doc/Howtothink/Howtothink-html-it/index.htm&#34;&gt;Pensare da informatico: Imparare con Python&lt;/a&gt;, disponibile sul &lt;a href=&#34;http://www.python.it&#34;&gt;sito ufficiale italiano di Python&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Mi piacciono anche &lt;a href=&#34;http://learnpythonthehardway.org/&#34;&gt;Learn Python The Hard Way&lt;/a&gt; e il wiki &lt;a href=&#34;https://github.com/thehackerwithin/PyTrieste/wiki&#34;&gt;PyTrieste&lt;/a&gt;, che ha il vantaggio di essere relativamente sintetico.&lt;/p&gt;&#xA;&lt;p&gt;Uno strumento utilissimo è l&amp;rsquo;&lt;a href=&#34;http://www.pythontutor.com/&#34;&gt;Online Python Tutor&lt;/a&gt; perché permette di osservare cosa succede veramente quando si esegue il codice Python che abbiamo scritto. Imperdibile.&lt;/p&gt;&#xA;&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;&#xA;&lt;hr&gt;&#xA;&lt;ol&gt;&#xA;&lt;li id=&#34;fn:1&#34;&gt;&#xA;&lt;p&gt;Quanto detto è evidente dai dati della tabella Excel, dove, per le due versioni del programma, è elencato il tempo di calcolo vero e proprio (colonna &amp;ldquo;user&amp;rdquo;), il tempo impiegato ad eseguire i processi del sistema operativo (colonna &amp;ldquo;sys&amp;rdquo;) e la somma dei due tempi (colonna &amp;ldquo;user+sys&amp;rdquo;). I valori della colonna &amp;ldquo;user&amp;rdquo; sono abbastanza simili nelle due versioni del programma (cerchi aperti), mentre l&amp;rsquo;incremento progressivo dell&amp;rsquo;incidenza dei processi di sistema determina una divergenza crescente nel tempo totale di calcolo all&amp;rsquo;aumentare di &lt;code&gt;num_max&lt;/code&gt; fra le due versioni del programma (cerchi chiusi).&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/div&gt;&#xA;</description>
    </item>
    <item>
      <title>Setacciare numeri con il serpente</title>
      <link>https://static.233.196.69.159.clients.your-server.de/it/2014/09/29/setacciare-numeri-con-il-serpente/</link>
      <pubDate>Mon, 29 Sep 2014 06:00:00 +0000</pubDate>
      <guid>https://static.233.196.69.159.clients.your-server.de/it/2014/09/29/setacciare-numeri-con-il-serpente/</guid>
      <description>&lt;p&gt;Anche se ho una collezione molto ampia di &lt;a href=&#34;http://atariage.com/forums/topic/167235-byte-magazine/&#34;&gt;scansioni in pdf&lt;/a&gt; di vecchi numeri di &lt;a href=&#34;http://vintagecomputer.com/history-of-byte-magazine.html&#34;&gt;BYTE Magazine&lt;/a&gt;, mi piace ogni tanto leggere qualche fascicolo preso in prestito dalla biblioteca dell&amp;rsquo;Istituto (del resto qualche tempo fa li ho salvati da una fine stile &lt;a href=&#34;http://it.wikipedia.org/wiki/Fahrenheit_451&#34;&gt;Fahrenheit 451&lt;/a&gt;).&lt;/p&gt;&#xA;&lt;p&gt;Nonostante la mia passione per la tecnologia, infatti, ci sono dei casi in cui preferisco ancora l&amp;rsquo;analogico al digitale. Fra cui ci sono i libri e le riviste.&lt;/p&gt;&#xA;&lt;p&gt;Sfogliando un numero di BYTE dell&#39;89 dedicato a Unix, mi ha incuriosito una lettera sul famoso &lt;a href=&#34;http://it.wikipedia.org/wiki/Crivello_di_Eratostene&#34;&gt;Crivello di Eratostene&lt;/a&gt;, un algoritmo per calcolare i &lt;a href=&#34;http://it.wikipedia.org/wiki/Numero_primo&#34;&gt;numeri primi&lt;/a&gt; che ha più di 2200 anni. L&amp;rsquo;algoritmo funziona come un &lt;em&gt;setaccio&lt;/em&gt; (da cui il nome): elimina uno dopo l&amp;rsquo;altro i numeri composti lasciando alla fine soltanto i numeri primi.&lt;/p&gt;&#xA;&lt;p&gt;La lettera su BYTE introduceva all&amp;rsquo;&lt;a href=&#34;http://www.algorithmist.com/index.php/Prime_Sieve_of_Eratosthenes&#34;&gt;algoritmo &lt;em&gt;standard&lt;/em&gt;&lt;/a&gt; e ad una ottimizzazione ben nota, con la quale era possibile velocizzare il calcolo dei numeri primi senza complicarne più di tanto l&amp;rsquo;implementazione in &lt;a href=&#34;http://en.wikipedia.org/wiki/BASIC&#34;&gt;BASIC&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Il BASIC è stato il linguaggio di programmazione più popolare degli anni&#xA;80, gli anni della rivoluzione del personal computer. A quei tempi il BASIC era usato per interagire con il computer stesso &amp;ndash; ne costituiva di fatto il sistema operativo vero e proprio &amp;ndash; ed ha contribuito a formare le prime generazioni di programmatori che sviluppavano software per il nascente mondo dell&amp;rsquo;informatica personale. Non è un caso che sia la Apple che la Microsoft abbiano basato i primi prodotti proprio sul BASIC [1,2].&lt;/p&gt;&#xA;&lt;p&gt;Il listato originale in BASIC è mostrato qui sotto, in una forma (spero) più leggibile rispetto a quanto consentito dall&amp;rsquo;impaginazione di BYTE (oltre che dall&amp;rsquo;abitudine di quei tempi di compattare all&amp;rsquo;estremo i programmi per ridurre il più possibile l&amp;rsquo;occupazione della memoria). Il programma determina i numeri primi da 1 fino al valore impostato nella variabile &lt;code&gt;max&lt;/code&gt;. Per usarlo, bisogna anche impostare il valore di &lt;code&gt;root&lt;/code&gt; alla radice quadrata di &lt;code&gt;max&lt;/code&gt; (arrotondata ad un numero intero).&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;max=8192&#xA;root=90&#xA;DIM flags (max)&#xA;&#xA;FOR num=1 TO max&#xA;&#x9;flags(num)=TRUE&#xA;NEXT num&#xA;&#xA;FOR num=2 TO root&#xA;&#x9;IF flags (num) THEN&#xA;&#x9;&#x9;FOR mult=num*num TO max STEP num&#xA;&#x9;&#x9;&#x9;flags(mult)=FALSE&#xA;&#x9;&#x9;NEXT&#xA;&#x9;END IF&#xA;NEXT num&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Appena ho visto il programma ho pensato che sarebbe stato immediato tradurlo in &lt;a href=&#34;https://www.python.org/&#34;&gt;Python&lt;/a&gt;, un linguaggio che mi piace moltissimo e che considero il migliore compromesso fra potenza e facilità d&amp;rsquo;uso. Python può essere usato a più livelli, da &lt;a href=&#34;http://en.wikipedia.org/wiki/Procedural_programming&#34;&gt;linguaggio puramente procedurale&lt;/a&gt; fino a &lt;a href=&#34;http://www.codeproject.com/Articles/22769/Introduction-to-Object-Oriented-Programming-Concep&#34;&gt;linguaggio orientato agli oggetti&lt;/a&gt;, e quindi si presta bene ad essere usato per imparare i fondamenti delle programmazione.&lt;/p&gt;&#xA;&lt;p&gt;Nella prima traduzione in Python ho lasciato il più possibile inalterato il codice originale. Le piccole differenze sono dovute alle particolarità sintattiche dei due linguaggi. In Python esiste la funzione &lt;code&gt;max()&lt;/code&gt; e non si può usare lo stesso nome per una variabile, gli indici degli array iniziano da 0 e la funzione &lt;code&gt;range(0, N)&lt;/code&gt; crea una lista di numeri interi da &lt;code&gt;0&lt;/code&gt; fino a &lt;code&gt;N-1&lt;/code&gt;, e non fino ad &lt;code&gt;N&lt;/code&gt; come sarebbe immediato pensare.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;num_max &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;256&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;root &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;16&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;flags &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; []&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; num &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; range(&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;, num_max &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    flags&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;append(&lt;span style=&#34;color:#66d9ef&#34;&gt;True&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; num &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; range(&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;, root):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; flags[num] &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;True&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; mult &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; range(num&lt;span style=&#34;color:#f92672&#34;&gt;**&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;, num_max &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, num):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            flags[mult] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;False&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Sieve of Eratosthenes between 1 and &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;%d&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt; (BYTE-style): true/false map&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;%&lt;/span&gt;(num_max))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;print flags[&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;:num_max &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;print&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Sieve of Eratosthenes between 1 and &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;%d&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt; (BYTE-style): prime numbers&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;%&lt;/span&gt;(num_max))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; num &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; range(&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, num_max &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; flags[num] &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;True&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        print num,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        print &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;-&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Alla fine ho aggiunto il codice per stampare i risultati del calcolo, mostrando prima il contenuto &lt;em&gt;grezzo&lt;/em&gt; dell&amp;rsquo;array (o meglio della &lt;code&gt;lista&lt;/code&gt;) usato per determinare se ciascun numero è primo o meno, e poi convertendo l&amp;rsquo;output in una forma più leggibile.&lt;/p&gt;&#xA;&lt;p&gt;Per provare il programma, basta copiare il codice in un editor di testo (come i soliti TextWrangler, TextMate, Atom, Brackets, o analoghi), salvarlo sul disco rigido con un nome qualsiasi (diciamo &amp;ldquo;sieve.py&amp;rdquo;), ed eseguirlo dal Terminale con il comando&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ python sieve.py&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;[caption id=&amp;ldquo;attachment_1305&amp;rdquo; align=&amp;ldquo;aligncenter&amp;rdquo; width=&amp;ldquo;605&amp;rdquo;]&lt;img src=&#34;http://melabit.files.wordpress.com/2014/09/sieve.png?w=605&#34; alt=&#34;Output delle traduzione in Python del programma originale in BASIC per il calcolo dei numeri primi.&#34; width=&#34;605&#34; height=&#34;375&#34; class=&#34;size-large wp-image-1305&#34; /&gt; Output della traduzione in Python del programma originale in BASIC per il calcolo dei numeri primi.[/caption]&lt;/p&gt;&#xA;&lt;p&gt;Si può provare a misurare il tempo di esecuzione del programma impostando la variabile &lt;code&gt;num_max&lt;/code&gt; ad un valore relativamente grande (e ricordando di modificare anche il valore di &lt;code&gt;root&lt;/code&gt;, che deve essere la radice quadrata di &lt;code&gt;num_max&lt;/code&gt;).&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ time python ./sieve.py&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Per evitare di influenzare la misura è bene cancellare (o commentare) la sezione del codice contenente i comandi di stampa dei risultati, che sono molto lenti rispetto al puro codice di calcolo.&lt;/p&gt;&#xA;&lt;p&gt;Il mio iMac del 2008 impiega 0.025 secondi per calcolare i numeri primi fino a 10.000, e ben 22.5 secondi per arrivare fino a 25.000.000.&lt;/p&gt;&#xA;&lt;p&gt;Ma di questo parleremo più diffusamente un&amp;rsquo;altra volta.&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;[1] Il primo software prodotto dalla Micro-Soft di Bill Gates e Paul Allen fu proprio un &lt;a href=&#34;http://startup.nmnaturalhistory.org/gallery/notesViewer.php?ii=75_4&amp;amp;p=00&#34;&gt;interprete BASIC&lt;/a&gt; per l&amp;rsquo;&lt;a href=&#34;http://en.wikipedia.org/wiki/Altair_8800&#34;&gt;Altair 8800&lt;/a&gt;, il primo microcomputer personale in assoluto. La storia è raccontata nel bel libro di Paul Freiberger e Michael Swaine, &amp;ldquo;Fire in the Valley: The Making of the Personal Computer&amp;rdquo;, McGraw-Hill, 2000, ed è riassunta molto bene &lt;a href=&#34;http://it.wikipedia.org/wiki/Altair_BASIC&#34;&gt;in questa pagina su Wikipedia&lt;/a&gt; (per una volta la versione in italiano di un articolo è allo stesso livello di quella originale).&lt;/p&gt;&#xA;&lt;p&gt;[2] Steve Wozniak, la mente geniale della Apple degli inizi, &lt;a href=&#34;http://archive.org/stream/byte-magazine-1984-12/1984_12_BYTE_09-13_Communications#page/n461/mode/2up&#34;&gt;scrisse da zero&lt;/a&gt; un &lt;a href=&#34;http://gizmodo.com/how-steve-wozniak-wrote-basic-for-the-original-apple-fr-1570573636&#34;&gt;interprete BASIC per l&amp;rsquo;Apple I e II&lt;/a&gt;, che diventò il più diffuso interprete BASIC degli anni &amp;lsquo;80, un vero riferimento a cui tutti gli altri interpreti BASIC cercavano di ispirarsi.&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>I limiti di Wordpress.com: generatori di siti web statici</title>
      <link>https://static.233.196.69.159.clients.your-server.de/it/2014/08/09/i-limiti-di-wordpress-com-generatori-di-siti-web-statici/</link>
      <pubDate>Sat, 09 Aug 2014 06:00:00 +0000</pubDate>
      <guid>https://static.233.196.69.159.clients.your-server.de/it/2014/08/09/i-limiti-di-wordpress-com-generatori-di-siti-web-statici/</guid>
      <description>&lt;p&gt;Come ho già scritto qualche giorno fa, ci sono letteralmente decine di &lt;a href=&#34;http://melabit.wordpress.com/2014/08/06/i-limiti-di-wordpress-com-una-nuova-piattaforma-per-il-blog/&#34;&gt;generatori di siti web statici&lt;/a&gt;, quasi quante sono le distribuzioni di Linux. Io nei miei bookmark ne ho una trentina.&lt;/p&gt;&#xA;&lt;p&gt;Come orientarsi in questa moltitudine?&lt;/p&gt;&#xA;&lt;p&gt;Per le distribuzioni di Linux esiste &lt;a href=&#34;http://distrowatch.com&#34;&gt;Distrowatch&lt;/a&gt;, un sito popolarissimo che cerca di classificarle tutte. Analogamente, esistono almeno due siti che cercano di elencare tutti i generatori di siti web statici: &lt;a href=&#34;https://www.staticgen.com/&#34;&gt;StaticGen&lt;/a&gt; e &lt;a href=&#34;http://staticsitegenerators.net/&#34;&gt;Static Site Generators&lt;/a&gt;.&#xA;L&amp;rsquo;approccio dei due è totalmente diverso anche se le informazioni riportate sono praticamente le stesse.&lt;/p&gt;&#xA;&lt;p&gt;Il primo ordina di default i generatori di siti statici in base alla popolarità, ma si possono applicare vari filtri basati sul linguaggio di programmazione, la valutazione degli utenti e persino gli &lt;em&gt;issue&lt;/em&gt;, i problemi riscontrati dagli utenti.&lt;/p&gt;&#xA;&lt;p&gt;L&amp;rsquo;altro è apparentemente una tabella ordinata alfabeticamente (in questo momento elenca ben 289 sistemi diversi!), ma cliccando sulle intestazioni si può ordinarla in base al linguaggio di programmazione, alla valutazione degli utenti o alla data in cui il sistema è stato aggiornato per l&amp;rsquo;ultima volta.&#xA;Quest&amp;rsquo;ultima è una informazione utilissima, se un sistema non è aggiornato da anni non vale la pena perderci tempo.&lt;/p&gt;&#xA;&lt;p&gt;Provando ad applicare un po&amp;rsquo; di filtri si copre che esiste perfino un generatore, &lt;a href=&#34;https://github.com/moebiuseye/skf&#34;&gt;StatiKiss Framework&lt;/a&gt;, basato su &lt;a href=&#34;http://www.gnu.org/software/bash/&#34;&gt;Bash&lt;/a&gt;, ma &lt;a href=&#34;http://skf.jeannedhack.org/&#34;&gt;il sito web ufficiale&lt;/a&gt; contenente la documentazione non risponde. In realtà esisteva un&amp;rsquo;altro sistema interessante basato su Bash, &lt;a href=&#34;http://nanoblogger.sourceforge.net/&#34;&gt;NanoBlogger&lt;/a&gt;, il cui sviluppo  è stato però sospeso all&amp;rsquo;inizio del 2013. Evidentemente Bash non va bene per sviluppare siti web.&lt;/p&gt;&#xA;&lt;p&gt;Si può trovare anche &lt;a href=&#34;https://github.com/nuex/zodiac&#34;&gt;Zodiac&lt;/a&gt;, un generatore di siti statici scritto in &lt;a href=&#34;http://en.wikipedia.org/wiki/AWK&#34;&gt;AWK&lt;/a&gt;, un linguaggio perfetto per la manipolazione di file di testo, sviluppato fra gli altri da &lt;a href=&#34;http://www.cs.princeton.edu/~bwk/&#34;&gt;Brian Kernighan&lt;/a&gt;, uno dei padri di Unix e del linguaggio C. A leggere il README Zodiac sembra semplice da usare, supporta markdown e la struttura delle directory in cui sono organizzati i documenti utilizzati per generare il sito è ragionevole.&#xA;Ma purtroppo la popolarità di Zodiac è scarsa, scarsissima. Si potrebbe di certo usare per un progetto personale e soprattutto per imparare, ma è impensabile volere sostituire Wordpress con qualcosa come Zodiac. A chi rivolgersi, dove cercare aiuto e documentazione se si volesse fare qualcosa di non previsto dal programmatore, ad esempio gestire un sistema di commenti?&lt;/p&gt;&#xA;&lt;p&gt;Fra i generatori di siti web statici ci sono persino due sistemi scritti in &lt;a href=&#34;http://www.microsoft.com/net&#34;&gt;.NET&lt;/a&gt;. Ma vogliamo farci veramente del male?&lt;/p&gt;&#xA;&lt;p&gt;Ma lasciamo perdere le curiosità. Quali sono invece i &lt;em&gt;top player&lt;/em&gt;? Quali sono i sistemi più popolari, più diffusi e, si spera, più affidabili? Facile, il primo in assoluto è &lt;a href=&#34;http://jekyllrb.com/&#34;&gt;Jekyll&lt;/a&gt;, un generatore sviluppato in &lt;a href=&#34;https://www.ruby-lang.org/en/&#34;&gt;Ruby&lt;/a&gt;, un linguaggio di programmazione che è più o meno la risposta giapponese a Python, molto diffuso per sviluppare applicazioni web.&#xA;Seguono &lt;a href=&#34;http://octopress.org/&#34;&gt;Octopress&lt;/a&gt; (un derivato &lt;em&gt;semplificato&lt;/em&gt; di Jekyll, il cui sviluppo però è fermo dal 2011), &lt;a href=&#34;http://blog.getpelican.com/&#34;&gt;Pelican&lt;/a&gt; in Python, &lt;a href=&#34;http://middlemanapp.com/&#34;&gt;Middleman&lt;/a&gt; ancora in Ruby e &lt;a href=&#34;http://hexo.io/&#34;&gt;Hexo&lt;/a&gt; in JavaScript.&lt;/p&gt;&#xA;&lt;p&gt;Ci sono comunque altri generatori interessanti, alcuni con nomi veramente curiosi, &lt;a href=&#34;http://ruhoh.com/&#34;&gt;Ruhoh&lt;/a&gt;, &lt;a href=&#34;http://hugo.spf13.com/&#34;&gt;Hugo&lt;/a&gt;, &lt;a href=&#34;http://picocms.org/&#34;&gt;Pico&lt;/a&gt;, &lt;a href=&#34;http://calepin.co/&#34;&gt;Calepin&lt;/a&gt;,  &lt;a href=&#34;http://www.droppages.com/&#34;&gt;DropPages&lt;/a&gt;, &lt;a href=&#34;https://pancake.io/&#34;&gt;Pancake&lt;/a&gt;, &lt;a href=&#34;http://anchorcms.com/&#34;&gt;Anchor CMS&lt;/a&gt;, &lt;a href=&#34;http://ringce.com/hyde&#34;&gt;Hyde&lt;/a&gt;, &lt;a href=&#34;https://sculpin.io/&#34;&gt;Sculpin&lt;/a&gt;, &lt;a href=&#34;http://www.htmly.com/&#34;&gt;HTMLy&lt;/a&gt;,&lt;a href=&#34;http://dropplets.com/&#34;&gt;Dropplets&lt;/a&gt;, &lt;a href=&#34;http://www.steve.org.uk/Software/chronicle/&#34;&gt;Chronicle&lt;/a&gt;. Esiste persino il venerabile (ha quasi 10 anni!) &lt;a href=&#34;http://www.dir2web.it/&#34;&gt;Dir2web&lt;/a&gt;, l&amp;rsquo;unico prodotto italiano che conosca.&lt;/p&gt;&#xA;&lt;p&gt;Non mancato anche i prodotti a pagamento come &lt;a href=&#34;http://getkirby.com/&#34;&gt;Kirby&lt;/a&gt; e &lt;a href=&#34;http://statamic.com/&#34;&gt;Statamic&lt;/a&gt;. O come &lt;a href=&#34;http://cactusformac.com/&#34;&gt;Cactus&lt;/a&gt;, che è pure specifico per il solo Mac.&lt;/p&gt;&#xA;&lt;p&gt;Per questi ultimi no grazie, il web nasce e deve rimanere multipiattaforma, sistemi sviluppati per uno specifico sistema operativo non mi vanno bene &lt;em&gt;a priori&lt;/em&gt;. E trovo pure irragionevole cercare di vendere questi prodotti: se devo pagare per Statamic, quanto dovrei dare agli sviluppatori di Apache? Sei uno sviluppatore e vuoi guadagnarci? Distribuisci gratis il prodotto, dimostra nei fatti che è buono, fai in modo che diventi il più popolare possibile e poi vendi il supporto. Cercare di vendere software come questi, che subiscono la concorrenza di sistemi equivalenti, gratuiti e di qualità analoga se non migliore, è veramente sciocco.&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>L’ebook in offerta oggi</title>
      <link>https://static.233.196.69.159.clients.your-server.de/it/2014/02/04/lebook-in-offerta-oggi/</link>
      <pubDate>Tue, 04 Feb 2014 10:00:00 +0000</pubDate>
      <guid>https://static.233.196.69.159.clients.your-server.de/it/2014/02/04/lebook-in-offerta-oggi/</guid>
      <description>&lt;p&gt;Dopo alcuni giorni di stanca, oggi &lt;a href=&#34;http://www.packtpub.com/&#34;&gt;Packt Publishing&lt;/a&gt; offre un nuovo ebook allettante:&#xA;&lt;a href=&#34;https://app.packtpub.com&#34;&gt;wxPython 2.8 Application Development Cookbook&lt;/a&gt; di Cody Precord, pubblicato nel 2010.&lt;/p&gt;&#xA;&lt;p&gt;Python&amp;hellip; sempre Python&amp;hellip; Forse anche alla Packt lo considerano un grande strumento di sviluppo.&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>L&#39;ebook del 26 gennaio</title>
      <link>https://static.233.196.69.159.clients.your-server.de/it/2014/01/26/lebook-del-26-gennaio/</link>
      <pubDate>Sun, 26 Jan 2014 06:00:00 +0000</pubDate>
      <guid>https://static.233.196.69.159.clients.your-server.de/it/2014/01/26/lebook-del-26-gennaio/</guid>
      <description>&lt;p&gt;Ancora Python!&lt;/p&gt;&#xA;&lt;p&gt;Oggi &lt;a href=&#34;http://www.packtpub.com/&#34;&gt;Packt Publishing&lt;/a&gt; offre gratis l&amp;rsquo;ebook &lt;a href=&#34;https://app.packtpub.com&#34;&gt;Python 2.6 Graphics Cookbook&lt;/a&gt; di Mike Ohlson de Fine, pubblicato nel 2010. Mi ripeto lo so, ma anche questo è imperdibile.&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>L&#39;ebook del 23 gennaio</title>
      <link>https://static.233.196.69.159.clients.your-server.de/it/2014/01/23/lebook-del-23-gennaio/</link>
      <pubDate>Thu, 23 Jan 2014 06:00:00 +0000</pubDate>
      <guid>https://static.233.196.69.159.clients.your-server.de/it/2014/01/23/lebook-del-23-gennaio/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://melabit.files.wordpress.com/2014/01/ebook-del-23-01-2014.png&#34;&gt;&lt;img src=&#34;http://melabit.files.wordpress.com/2014/01/ebook-del-23-01-2014.png?w=293&#34; alt=&#34;Ebook del 23-01-2014&#34; width=&#34;293&#34; height=&#34;300&#34; class=&#34;aligncenter size-medium wp-image-337&#34; /&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Anche l&amp;rsquo;ebook gratis di oggi della &lt;a href=&#34;https://app.packtpub.com/&#34;&gt;Packt Publishing&lt;/a&gt; sembra interessante:&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://app.packtpub.com/#!/search/category/2/book/6164&#34;&gt;Jacob Perkins, Python Text Processing with NLTK 2.0 Cookbook (2010)&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;Scaricatelo finché siete in tempo. Python è secondo me il miglior linguaggio di programmazione, oggi, e vale sempre la pena imparare qualcosa su questo bellissimo linguaggio.&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>Senza fretta</title>
      <link>https://static.233.196.69.159.clients.your-server.de/it/2013/12/27/senza-fretta/</link>
      <pubDate>Fri, 27 Dec 2013 06:00:00 +0000</pubDate>
      <guid>https://static.233.196.69.159.clients.your-server.de/it/2013/12/27/senza-fretta/</guid>
      <description>&lt;p&gt;Ho scoperto solo di recente questo interessante articolo sulla programmazione: &lt;a href=&#34;http://norvig.com/21-days.html&#34;&gt;Teach Yourself Programming in Ten Years&lt;/a&gt; di Peter Norvig. Purtroppo la traduzione in italiano non è più disponibile direttamente ma può essere ritrovata, tramite il benemerito sito &lt;a href=&#34;https://archive.org&#34;&gt;archive.org&lt;/a&gt;, alla pagina &lt;a href=&#34;https://web.archive.org/web/20130521001215/http://www.culturahacker.it/documenti/teach.html&#34;&gt;Impara a Programmare in Dieci Anni&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Questo articolo è una lettura fondamentale per chiunque voglia avvicinarsi al mondo affascinante della programmazione ed insegna fondamentalmente a&amp;hellip; non avere fretta.&lt;/p&gt;&#xA;&lt;p&gt;Imparare a programmare è una attività intellettuale simile a imparare a suonare uno strumento musicale, a parlare una nuova lingua o a cucinare. Ci vuole dedizione, tempo ed esperienza. Bisogna sperimentare, sbagliare, ed imparare a correggere i propri errori. Tutte cose che non si possono fare in pochi giorni né, beninteso, in pochi mesi. Ci vogliono anni di lavoro.&lt;/p&gt;&#xA;&lt;p&gt;Per fortuna i primi frutti possono essere ottenuti in tempi relativamente brevi, in modo da essere stimolati a proseguire lo studio. Ma bisogna avere pazienza. Iniziare dalle cose basilari, preferibilmente usando un linguaggio di programmazione semplice ma potente come &lt;a href=&#34;http://www.python.org&#34;&gt;Python&lt;/a&gt;, e non porsi obiettivi troppo ambiziosi per le proprie capacità del momento.&lt;/p&gt;&#xA;&lt;p&gt;Fatto questo, le soddisfazioni non mancheranno.&lt;/p&gt;&#xA;</description>
    </item>
  </channel>
</rss>
