<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Editor on Melabit</title>
    <link>https://static.233.196.69.159.clients.your-server.de/it/tags/editor/</link>
    <description>Recent content in Editor on Melabit</description>
    <generator>Hugo</generator>
    <language>it</language>
    <lastBuildDate>Wed, 04 Mar 2026 18:00:00 +0000</lastBuildDate>
    <atom:link href="https://static.233.196.69.159.clients.your-server.de/it/tags/editor/index.xml" rel="self" type="application/rss+xml" />
    <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>Antigravity: dalla sorpresa al dubbio</title>
      <link>https://static.233.196.69.159.clients.your-server.de/it/2026/02/16/antigravity-dalla-sorpresa-al-dubbio/</link>
      <pubDate>Mon, 16 Feb 2026 18:00:00 +0000</pubDate>
      <guid>https://static.233.196.69.159.clients.your-server.de/it/2026/02/16/antigravity-dalla-sorpresa-al-dubbio/</guid>
      <description>&lt;p&gt;Per quanto Antigravity sia efficace, scavando più in profondità ci si accorge che i sistemi ad agenti che agiscono al suo interno, per quanto servizievoli e capaci di rispondere in modo preciso a &lt;a href=&#34;https://melabit.com/it/2026/01/21/sorpresa-antigravity/&#34;&gt;tante questioni complesse&lt;/a&gt;, non sono esenti dai soliti problemi di tutti i modelli linguistici di grandi dimensioni (LLM, &lt;em&gt;Large Language Model&lt;/em&gt;) con cui abbiamo a che fare da tre anni a questa parte.&lt;/p&gt;&#xA;&lt;p&gt;Vediamo alcuni esempi pratici.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2026-02-16-antigravity-dalla-sorpresa-al-dubbio/Gemini_Generated_Image_vzsj3tvzsj3tvzsj.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;esempio-1&#34;&gt;Esempio #1&lt;/h4&gt;&#xA;&lt;p&gt;Dopo aver provato con successo ad estrarre i dati dalle &lt;a href=&#34;https://melabit.com/it/2026/01/21/sorpresa-antigravity/#compito-1-estrazione-di-dati-dalle-immagini&#34;&gt;immagini di un mio articolo&lt;/a&gt;, mi sono messo subito al lavoro per provare a applicare il metodo ad altre figure simili a quelle analizzate la prima volta, come ad esempio &lt;a href=&#34;https://www.sciencedirect.com/science/article/pii/S0341816225007738&#34;&gt;questa&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2026-02-16-antigravity-dalla-sorpresa-al-dubbio/1-s2.0-S0341816225007738-gr4_lrg.jpg&#34; alt=&#34;&#34;&gt;&lt;p&gt;Obiettivamente, la figura è più complessa rispetto alle mie precedenti: nella parte superiore compare un istogramma che mostra le misurazioni mensili di precipitazione e altezza della neve per due località dal nome impronunciabile del Québec, dove le diverse misurazioni sono rappresentate con tonalità e colori differenti. Più in basso, ma parzialmente sovrapposto all’istogramma, troviamo un grafico a linee con le temperature medie mensili delle due località, la cui scala verticale è posizionata sul lato destro.&lt;/p&gt;&#xA;&lt;p&gt;La figura è più complessa, è vero, ma non mi sarei mai aspettato che &lt;code&gt;Gemini 3 Flash&lt;/code&gt; faticasse così tanto. Ci prova, ci riprova, ma ogni volta c&amp;rsquo;è qualcosa che non va. L&amp;rsquo;istogramma tutto sommato non è un grosso problema, ma non c&amp;rsquo;è verso di fargli capire cosa deve fare con i dati del grafico a linee. E questo anche dopo avergli spiegato dove deve guardare per determinare i valori di temperatura di ogni mese&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;Hint: To evaluate temperatures for a given month you should take a point on the temperature plot that is between the two precipitation bars &#xA;&lt;div&gt;&#xA;&lt;/details&gt;&#xA;&#xA;&lt;p&gt;Sono molto sorpreso dalla difficoltà che ha Gemini a ripetere ed estendere i risultati della &lt;a href=&#34;https://melabit.com/it/2026/01/21/sorpresa-antigravity/#compito-1-estrazione-di-dati-dalle-immagini&#34;&gt;mia prima prova&lt;/a&gt;, anche se continua a rassicurarmi sostenendo di aver &lt;em&gt;capito&lt;/em&gt; benissimo quello che voglio e di aver eseguito un lavoro &lt;em&gt;meticoloso&lt;/em&gt;.&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;I have completed a meticulous re-evaluation of Figure 4 using the &#34;midpoint&#34; method you suggested (reading the temperature at the horizontal center between the two monthly precipitation bars).&#xA;Final Corrections Applied: [...]&#xA;&lt;div&gt;&#xA;&lt;/details&gt;&#xA;&#xA;&lt;p&gt;Nei fatti, sembra che Gemini non abbia la minima idea di cosa sia davvero il metodo &amp;ldquo;midpoint&amp;rdquo; e si limiti solo a ripetere ciò che gli dico, modificando solo qualche parola. Se così non fosse, infatti, risolverebbe l&amp;rsquo;intoppo in pochi secondi, tirando fuori i dati giusti proprio ha fatto la prima volta.&lt;/p&gt;&#xA;&lt;p&gt;Alla fine mi arrendo. Non ha senso perdere delle ore per far fare ad un &lt;em&gt;agente intelligente&lt;/em&gt; un lavoro che fatto a mano richiederebbe solo pochi minuti.&lt;/p&gt;&#xA;&lt;h4 id=&#34;esempio-2&#34;&gt;Esempio #2&lt;/h4&gt;&#xA;&lt;p&gt;Devo ammettere di essere deluso, ma forse mi sono aspettato troppo dal mio agente intelligente.&lt;/p&gt;&#xA;&lt;p&gt;E allora cerco di semplificargli la vita, scegliendo un grafico di un mio &lt;a href=&#34;https://pubs.aip.org/aip/apl/article-abstract/86/4/042501/117168/Overdamped-Nb-Al-AlOx-Nb-Josephson-junctions&#34;&gt;vecchio articolo&lt;/a&gt; che non dovrebbe costituire un ostacolo particolarmente arduo per Gemini 3 Flash.&lt;/p&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2026-02-16-antigravity-dalla-sorpresa-al-dubbio/042501_fig2.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;Che invece si incarta e fa errori incomprensibili. Con qualche aiutino, riesce a tirare fuori i dati mostrati in questo grafico, che però ha ancora parecchi punti mancanti (messi in evidenza dai riquadri colorati) o punti aggiunti in modo fantasioso (come quello indicato dalla freccia).&lt;/p&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2026-02-16-antigravity-dalla-sorpresa-al-dubbio/recreate_figure_2.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;Nuova delusione. Perché usare un &lt;em&gt;agente intelligente&lt;/em&gt; se si fa prima ad acquisire i punti a mano?&lt;/p&gt;&#xA;&lt;h4 id=&#34;esempio-3&#34;&gt;Esempio #3&lt;/h4&gt;&#xA;&lt;p&gt;Ma io non mi arrendo facilmente e provo ancora a fargli fare qualcosa di buono. E allora prendo una figura da &lt;a href=&#34;https://pubs.aip.org/aip/apl/article-abstract/91/25/252505/334515/Nb-Al-AlOx-Nb-overdamped-Josephson-junctions-above&#34;&gt;quest&amp;rsquo;altro articolo&lt;/a&gt;, che è piuttosto semplice dal punto di vista grafico, ma che allo stesso tempo sarebbe utile poter acquisire in modo automatico, perché la quantità di dati contenuta rende difficile digitalizzarla a mano in modo preciso.&lt;/p&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2026-02-16-antigravity-dalla-sorpresa-al-dubbio/252505_fig1.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;Scottato dalle esperienze precedenti gli chiedo prima di tutto di descrivere cosa &lt;em&gt;vede&lt;/em&gt; nella figura.&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;Now could you describe in simple words what you &#34;see&#34; in figure 1?&#xA;&lt;div&gt;&#xA;&lt;/details&gt;&#xA;&#xA;&lt;p&gt;La risposta è lunga, precisa e quasi senza sbavature,&lt;/p&gt;&#xA;&#xA;&lt;details class=&#34;answer&#34;&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;p&gt;Looking at figure 252505_1_f1.jpeg, I can see:&lt;/p&gt;&#xA;    &lt;p&gt;&lt;strong&gt;Two side-by-side graphs&lt;/strong&gt; showing current-voltage (I-V) characteristics:&lt;/p&gt;&#xA;    &lt;p&gt;&lt;strong&gt;(a) Left graph (T = 2.0 K)&lt;/strong&gt;:&lt;/p&gt;&#xA;    &lt;ul&gt;&#xA;    &lt;li&gt;Shows a &lt;strong&gt;hysteretic&lt;/strong&gt; behavior - the curve forms a loop&lt;/li&gt;&#xA;    &lt;li&gt;The current jumps abruptly at certain voltage points&lt;/li&gt;&#xA;    &lt;li&gt;There&amp;rsquo;s a clear gap between the upward and downward voltage sweeps&lt;/li&gt;&#xA;    &lt;li&gt;The vertical jumps occur around ±1 mV&lt;/li&gt;&#xA;    &lt;/ul&gt;&#xA;    &lt;p&gt;&lt;strong&gt;(b) Right graph (T = 5.8 K)&lt;/strong&gt;:&lt;/p&gt;&#xA;    &lt;p&gt;Shows &lt;strong&gt;non-hysteretic&lt;/strong&gt; behavior - smooth, continuous curve&lt;/p&gt;&#xA;    &lt;ul&gt;&#xA;    &lt;li&gt;No loop or gap between voltage sweeps&lt;/li&gt;&#xA;    &lt;li&gt;The transition is gradual rather than abrupt&lt;/li&gt;&#xA;    &lt;li&gt;The curve is more rounded at the critical points&lt;/li&gt;&#xA;    &lt;/ul&gt;&#xA;    &lt;p&gt;&lt;strong&gt;Key observation&lt;/strong&gt;: This demonstrates how the same Josephson junction behaves differently at different temperatures. At the lower temperature (2.0 K), it shows hysteresis (memory effect), while at the higher temperature (5.8 K), the hysteresis disappears and the junction becomes &amp;ldquo;overdamped.&amp;rdquo;&lt;/p&gt;&#xA;    &lt;p&gt;Both graphs show current ranging from about -15 to +15 mA on the y-axis, with voltage on the x-axis measured in millivolts (mV).&lt;/p&gt;&#xA;    &#xA;&#xA;&lt;div&gt;&#xA;&lt;/details&gt;&#xA;&#xA;&lt;p&gt;ma in realtà contiene un errore proprio alla fine della risposta che manderebbe a pallino tutti i tentativi di digitalizzare i dati contenuti nei due grafici.&lt;/p&gt;&#xA;&lt;p&gt;Quando glielo faccio notare, Gemini 3 Flash si corregge immediatamente e sembra quasi dispiaciuto. Ma come ben sappiamo, tutti gli LLM sono programmati per assecondare sempre l&amp;rsquo;interlocutore.&lt;/p&gt;&#xA;&lt;p&gt;Vado avanti e cerco di dargli una mano, spiegandogli per bene cosa dovrebbe fare.&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;No problem. Now could you extract the values of voltage and current from the two images? Please produce a table for each image, and export the table as a csv file and a markdown file, with suffix `_table`.&lt;/br&gt;  &#xA;Since one of the I-V curves is hysteretic, I suggest this strategy for extracting the data: start from V=0, increase V up to the maximum value following one of the paths, decrease V to 0 following the other path, do the same for the negative values of V.&#xA;&lt;div&gt;&#xA;&lt;/details&gt;&#xA;&#xA;&lt;p&gt;Ma nonostante il suggerimento, non c&amp;rsquo;è verso di fargli fare un lavoro decente. Il meglio che ottengo sarebbe questo, che a prima vista è un ottimo risultato.&lt;/p&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2026-02-16-antigravity-dalla-sorpresa-al-dubbio/252505_1_f1_lowres_v22.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;Peccato però che ci sia un errore grave e incomprensibile, che lascio a voi scoprire.&lt;/p&gt;&#xA;&lt;p&gt;In ogni caso, l&amp;rsquo;immagine precedente è davvero il meglio del meglio del meglio, ed è stata ottenuta dopo ore di tentativi falliti (come &lt;a href=&#34;https://static.233.196.69.159.clients.your-server.de/img/2026-02-16-antigravity-dalla-sorpresa-al-dubbio/252505_1_f1_recreated.png&#34;&gt;questo&lt;/a&gt; tentativo iniziale, o &lt;a href=&#34;https://static.233.196.69.159.clients.your-server.de/img/2026-02-16-antigravity-dalla-sorpresa-al-dubbio/252505_1_f1_lowres_v13.png&#34;&gt;questo&lt;/a&gt;, o &lt;a href=&#34;https://static.233.196.69.159.clients.your-server.de/img/2026-02-16-antigravity-dalla-sorpresa-al-dubbio/252505_1_f1_lowres_final.png&#34;&gt;questo&lt;/a&gt;) e di suggerimenti prima vaghi e poi sempre più precisi, un po&amp;rsquo; come si fa con uno studente impreparato dal quale si cerca di  tirar fuori qualche parola. Nonché di risposte che cercavano di adattarsi al suggerimento del momento, senza fare mai, o quasi mai, tesoro di tutto ciò che si era detto in precedenza.&lt;/p&gt;&#xA;&lt;p&gt;Tutti questi tentativi infruttuosi sono stati resi ancora più frustanti dal fatto che, diversi anni fa, avevo risolto lo stesso problema in modo preciso e riproducibile con appena duecento righe di codice in Python (&lt;a href=&#34;https://melabit.com/it/2026/01/21/sorpresa-antigravity/#fn:3&#34;&gt;ricordavo male&lt;/a&gt;, non era C ma Python).&lt;/p&gt;&#xA;&lt;p&gt;E quando alla fine gli spiego per filo e per segno come si fa, suggerendogli perfino che la chiave di tutto è convertire il file originale &lt;code&gt;JPEG&lt;/code&gt; in un formato, il &lt;code&gt;PBM&lt;/code&gt; (che è praticamente una griglia di 0 o 1 a seconda che il pixel sia bianco o nero),&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;My suggestion is to change focus completely. If I were you I would:&lt;/p&gt;&#xA;    &lt;ol&gt;&#xA;    &lt;li&gt;&#xA;    &lt;p&gt;take note of the extreme values of voltage and current on the X and Y axes;&lt;/p&gt;&#xA;    &lt;/li&gt;&#xA;    &lt;li&gt;&#xA;    &lt;p&gt;get rid of the extraneous information outside the plot area and of the text (if any) inside it;&lt;/p&gt;&#xA;    &lt;/li&gt;&#xA;    &lt;li&gt;&#xA;    &lt;p&gt;convert the image to the PBM (or PGM) format, that gives you a clean grid of black and white (or gray and white) pixels;&lt;/p&gt;&#xA;    &lt;/li&gt;&#xA;    &lt;li&gt;&#xA;    &lt;p&gt;remove the extraneous grid dots using a 3x3 or 5x5 filter (or anything like that);&lt;/p&gt;&#xA;    &lt;/li&gt;&#xA;    &lt;li&gt;&#xA;    &lt;p&gt;calculate the X and Y position of each black pixel, converting the [values] to Voltage and Current (it is just a proportion).&lt;/p&gt;&#xA;    &lt;/li&gt;&#xA;    &lt;/ol&gt;&#xA;    &lt;p&gt;Clearly you can change the order of the steps or do something different if you believe your approach is better than mine.&lt;/p&gt;&#xA;    &#xA;&#xA;&lt;div&gt;&#xA;&lt;/details&gt;&#xA;&#xA;&lt;p&gt;non c&amp;rsquo;è lo stesso verso lo stesso di fargli fare qualcosa di utile.&lt;/p&gt;&#xA;&lt;p&gt;Ancora più frustante è il fatto che Gemini non si è nemmeno fatto scrupolo di provare ad imbrogliarmi! Quando ha trovato il file originale dei valori misurati, che usavo per confrontare i risultati delle sue analisi con i dati &lt;em&gt;veri&lt;/em&gt;, ha provato ad usare quel file per generare i dati che gli chiedevo. Chiaramente questa volta i risultati erano perfetti, ma ci voleva una &lt;em&gt;intelligenza&lt;/em&gt;, artificiale o non, per tirare fuori una cosa del genere?&lt;/p&gt;&#xA;&lt;h4 id=&#34;altri-esempi&#34;&gt;Altri esempi&lt;/h4&gt;&#xA;&lt;p&gt;Nei giorni in cui ho provato e riprovato quello che ho descritto in questo articolo ho fatto anche molte altre prove, come fargli scrivere del semplice codice in LaTeX, o convertire in &lt;code&gt;CSV&lt;/code&gt; o &lt;code&gt;Markdown&lt;/code&gt; le tabelle contenute nei file PDF di alcuni articoli.&lt;/p&gt;&#xA;&lt;p&gt;Con il LaTeX se l&amp;rsquo;è cavato sempre bene, con le tabelle ha faticato parecchio anche quando il layout era abbastanza semplice. Inutile entrare nei dettagli, perché alla fine non ci sono grosse differenze rispetto agli esempi precedenti.&lt;/p&gt;&#xA;&lt;h4 id=&#34;conclusioni&#34;&gt;Conclusioni&lt;/h4&gt;&#xA;&lt;p&gt;Dopo gli ottimi risultati &lt;a href=&#34;https://melabit.com/it/2026/01/21/sorpresa-antigravity/#compito-1-estrazione-di-dati-dalle-immagini&#34;&gt;descritti nell&amp;rsquo;articolo precedente&lt;/a&gt; ero sinceramente convinto di poter usare gli agenti intelligenti integrati in Antigravity per estrarre facilmente i dati sepolti in tanti articoli scientifici di qualche anno fa, cosa che mi avrebbe permesso di eseguire delle nuove analisi comparate in modo rapido ed efficiente.&lt;/p&gt;&#xA;&lt;p&gt;Purtroppo tutte le prove più approfondite descritte in questo articolo si sono rivelate un totale fallimento.&lt;/p&gt;&#xA;&lt;p&gt;Il modello usato, quasi sempre Gemini 3 Flash (ma ho provato, anche se ho provato in modo più superficiale anche Gemini 3 Pro e Claude Sonnet 4.5),&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; ha mostrato un &lt;strong&gt;comportamento poco coerente e ripetibile&lt;/strong&gt;. Ad esempio utilizzando metodi diversi per risolvere lo stesso problema, senza che fosse mai chiaro se dietro la scelta di un algoritmo o libreria di calcolo ci fosse una precisa motivazione tecnica o se  si trattasse solo di una questione di probabilità statistica nella generazione delle risposte.&lt;/p&gt;&#xA;&lt;p&gt;Un altro problema serio è stato la &lt;strong&gt;mancanza di memoria&lt;/strong&gt;, un po&amp;rsquo; come la &lt;a href=&#34;https://youtu.be/arnEy6qr6ZA?si=M0n4Cb98OtYmnKGB&amp;amp;t=58&#34;&gt;pesciolina Dory&lt;/a&gt; dei cartoni animati. Nonostante pochi giorni prima avesse risolto con successo il problema di estrarre i dati da un istogramma, Gemini non stato in grado di riapplicare la stessa metodologia ad un caso analogo. Altre volte, una volta risolto un problema in modo parziale, gli capitava di ricominciare a lavorarci su ripartendo da zero, invece di limitarsi a rielaborare e a migliorare la risposta precedente.&lt;/p&gt;&#xA;&lt;p&gt;Ma il problema che forse mi ha disturbato di più è stata l&amp;rsquo;&lt;strong&gt;incapacità di generalizzare&lt;/strong&gt; il lavoro già fatto. Se gli chiedi di estrarre dei dati da una immagine, Gemini crea un programma adatto a &lt;em&gt;quella&lt;/em&gt; immagine, senza mai cercare di sviluppare un metodo generale applicabile ad altre immagini dello stesso tipo. Se gli chiedi di generare il grafico di un file di dati, Gemini crea uno script adatto solo per &lt;em&gt;quel&lt;/em&gt; file, che sarà impossibile o quasi adattare ad altri casi analoghi.&lt;/p&gt;&#xA;&lt;p&gt;Quando un umano affronta un problema, tende ad affezionarsi alla soluzione e cerca di riusarla e di estenderla a problemi simili. Un LLM non se ne cura e riscopre la ruota ad ogni nuova iterazione. Sembra il trionfo dell&amp;rsquo;usa-e-getta, lo spreco di risorse e di intelligenza (per quanto artificiale)  elevato all&amp;rsquo;ennesima potenza.&lt;/p&gt;&#xA;&lt;p&gt;E queste cose non le ho notate solo io, che con queste cose ci gioco soltanto. Studi scientifici molto seri &amp;ndash; che ad esempio hanno provato ad usare gli LLM per riscoprire la &lt;a href=&#34;https://arxiv.org/abs/2507.06952v4&#34;&gt;legge di gravitazione di Newton&lt;/a&gt; a partire dalle orbite dei pianeti attorno al Sole, oppure per prevedere il &lt;a href=&#34;https://pubs.rsc.org/en/content/articlelanding/2025/dd/d5dd00176e&#34;&gt;comportamento di una molecola&lt;/a&gt; in base alle diverse rappresentazioni della sua struttura &amp;ndash; hanno raggiunto le stesse, identiche conclusioni.&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;em&gt;La nostra analisi rivela che questi modelli si comportano, invece, come se sviluppassero delle euristiche specifiche per il singolo compito, che non riescono a generalizzare.&lt;/em&gt;&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;&lt;/blockquote&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;em&gt;Il semplice aumento delle dimensioni del modello non migliora le prestazioni né la capacità di generalizzazione.&lt;/em&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;&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;Infine, e anche se a prima vista sembra il contrario, non dobbiamo mai dimenticare che gli LLM &lt;strong&gt;non capiscono davvero&lt;/strong&gt; quello che gli si chiede, sono solo molto bravi a ritrovare un ago in un pagliaio molto, molto, molto grande. Un LLM può spiegare per filo e per segno cos&amp;rsquo;è una &amp;ldquo;caratteristica I-V di una giunzione Josephson&amp;rdquo;, perché ha &lt;em&gt;letto&lt;/em&gt; un sacco di libri e di articoli sull&amp;rsquo;argomento. Ma poi, quando si tratta di collegare il concetto ideale di &amp;ldquo;caratteristica I-V&amp;rdquo; con la sua rappresentazione sperimentale riportata in una figura, fallisce miserabilmente, dimostrando di essere solo un pappagallo bene ammaestrato.&lt;/p&gt;&#xA;&lt;p&gt;C&amp;rsquo;è chi sostiene che gli LLM di ultima generazione siano in grado di scrivere da soli un &lt;a href=&#34;https://arstechnica.com/ai/2026/02/sixteen-claude-ai-agents-working-together-created-a-new-c-compiler/&#34;&gt;intero compilatore C&lt;/a&gt; o decine di migliaia di righe di &lt;a href=&#34;https://shumer.dev/something-big-is-happening&#34;&gt;codice perfettamente funzionante&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Da parte mia, e molto più umilmente, mi accontenterei che questi modelli riuscissero a produrre un file di dati o una tabella in maniera ripetibile, senza incorrere in errori inspiegabili o in risultati incoerenti. E magari evitando situazioni incresciose come quelle che ho sperimentato, in cui una volta tutto procede senza problemi e la volta successiva non si riesce a cavare un ragno da un buco.&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;Ho usato anche la versione a pagamento di Gemini, gentilmente concessami dall&amp;rsquo;università, senza notare differenze rispetto alla versione gratuita. Chi sostiene che i modelli a pagamento facciano cose che quelli gratuiti si sognano dovrebbe fornire prove più che solide prima di essere creduto.&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;K. Vafa &lt;em&gt;et al.&lt;/em&gt;, &lt;a href=&#34;https://arxiv.org/abs/2507.06952v4&#34;&gt;What Has a Foundation Model Found? Using Inductive Bias to Probe for World Models&lt;/a&gt;, arXiv 2507.06952v4, 2025.&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;B. Yan &lt;em&gt;et al.&lt;/em&gt;, &lt;a href=&#34;https://pubs.rsc.org/en/content/articlelanding/2025/dd/d5dd00176e&#34;&gt;Inconsistency of LLMs in molecular representations&lt;/a&gt;, Digital Discovery vol. 4, 2025.&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>Sorpresa Antigravity</title>
      <link>https://static.233.196.69.159.clients.your-server.de/it/2026/01/21/sorpresa-antigravity/</link>
      <pubDate>Wed, 21 Jan 2026 18:00:00 +0000</pubDate>
      <guid>https://static.233.196.69.159.clients.your-server.de/it/2026/01/21/sorpresa-antigravity/</guid>
      <description>&lt;p&gt;Lo confesso, quando ho &lt;a href=&#34;https://melabit.com/it/2025/12/15/fotocopiato/&#34;&gt;cominciato ad usare Antigravity&lt;/a&gt; avevo molte riserve, perché il nuovo editor &lt;em&gt;rivoluzionario&lt;/em&gt; prodotto da Google mi sembrava solo uno dei tanti cloni di &lt;a href=&#34;https://code.visualstudio.com/&#34;&gt;VS Code&lt;/a&gt; di Microsoft.&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;Ma appena ho iniziato ad usare le funzioni &lt;em&gt;agentiche&lt;/em&gt; di Google Antigravity ho dovuto ricredermi, perché c&amp;rsquo;è davvero del buono.&lt;/p&gt;&#xA;&lt;p&gt;Certo, ci sono anche tanti limiti, ma sono gli stessi di tutti gli altri modelli linguistici di grandi dimensioni (LLM, &lt;em&gt;Large Language Model&lt;/em&gt;), che funzionano bene se li guidi passo passo in quello che devono fare, ma che hanno anche poca fantasia e vanno in affanno se gli sottoponi dei problemi nuovi e appena appena complicati.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2026-01-21-sorpresa-antigravity/Gemini_Generated_Image_nu8qhynu8qhynu8q.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;editor-e-ide&#34;&gt;Editor e IDE&lt;/h4&gt;&#xA;&lt;p&gt;Google Antigravity è una &lt;a href=&#34;https://en.wikipedia.org/wiki/Integrated_development_environment&#34;&gt;IDE (Integrated Development Environment)&lt;/a&gt;, in italiano un &lt;em&gt;ambiente di sviluppo integrato&lt;/em&gt;, cioè è un editor con funzionalità aggiuntive che aiutano a scrivere e a correggere il codice.&lt;/p&gt;&#xA;&lt;p&gt;Essendo un derivato da VS Code ne riprende tutti gli aspetti positivi e negativi, primo fra tutti il fatto di essere basato su &lt;a href=&#34;https://www.electronjs.org/&#34;&gt;Electron&lt;/a&gt;, un framework multipiattaforma molto comodo per gli sviluppatori ma anche molto avido di risorse e di spazio su disco.&lt;/p&gt;&#xA;&lt;p&gt;Infatti, come avevo già notato nell&amp;rsquo;&lt;a href=&#34;https://melabit.com/it/2025/12/15/fotocopiato/&#34;&gt;ultimo articolo&lt;/a&gt;, una volta installato Google Antigravity occupa sul mio Mac la bellezza di 700 MB (696.6 MB per la precisione), un pelo di più dello stesso VS Code (683.9 MB) e qualcosa meno del &lt;em&gt;padre&lt;/em&gt; Windsurf (718.7 MB). Tanto per fare un confronto, i miei due editor preferiti, TextMate e BBEdit, occupano rispettivamente 40 e 65 MB.&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;Sulle funzionalità di editing del codice e di supporto allo sviluppo c&amp;rsquo;è poco da dire. Sono identiche a quelle di VS Code e possono essere estese a dismisura tramite le più di 8.500 estensioni disponibili sull&amp;rsquo;&lt;a href=&#34;https://open-vsx.org/&#34;&gt;Open VSX Registry&lt;/a&gt;, un database di estensioni specifico per gli editor derivati da VS Code.&lt;/p&gt;&#xA;&lt;p&gt;In teoria si potrebbero usare le &lt;a href=&#34;https://marketplace.visualstudio.com/&#34;&gt;estensioni di VS Code&lt;/a&gt;, ma Microsoft da qualche mese &lt;a href=&#34;https://freedium-mirror.cfd/https://medium.com/@S3CloudHub/microsoft-quietly-blocked-cursor-from-using-its-vscode-extension-heres-the-line-of-code-that-40d65f14ef0f&#34;&gt;ha bloccato&lt;/a&gt; l&amp;rsquo;uso del marketplace di VS Code a tutti gli altri editor derivati (fra cui Cursor, Windsurf o Antigravity). Alla faccia dei principi dell&amp;rsquo;&lt;a href=&#34;https://code.visualstudio.com/&#34;&gt;open source&lt;/a&gt;&amp;hellip;&lt;/p&gt;&#xA;&lt;h4 id=&#34;funzioni-agentiche&#34;&gt;Funzioni &lt;em&gt;agentiche&lt;/em&gt;&lt;/h4&gt;&#xA;&lt;p&gt;Ma cos&amp;rsquo;è l&amp;rsquo;&lt;a href=&#34;https://www.ibm.com/think/topics/agentic-ai&#34;&gt;Intelligenza Artificiale ad agenti&lt;/a&gt; (o &lt;em&gt;agentica&lt;/em&gt;)? È un sistema di IA in grado di agire in modo autonomo, raggiungendo obiettivi complessi con una minima supervisione umana e senza dover essere istruito in modo dettagliato e ben definito.&lt;/p&gt;&#xA;&lt;p&gt;È un po&amp;rsquo; come il sogno dei cuochi dilettanti: avere a disposizione un robot in grado di guardare cosa c&amp;rsquo;è in frigorifero e nella dispensa e di preparare da solo un pranzo completo dopo avergli spiegato vagamente cosa vogliamo.&lt;/p&gt;&#xA;&lt;p&gt;Ma è anche il sogno dei programmatori da bar, i &lt;em&gt;vibe coders&lt;/em&gt;, quelli che vorrebbero poter chiedere all&amp;rsquo;IA di programmare una applicazione &amp;ldquo;fatta così e cosà&amp;rdquo;, andare a mangiare una pizza e trovare tutto pronto  al ritorno, compreso il porting per le principali piattaforme e un sito di e-commerce dove venderla.&lt;/p&gt;&#xA;&lt;h4 id=&#34;mettere-antigravity-alla-prova&#34;&gt;Mettere Antigravity alla prova&lt;/h4&gt;&#xA;&lt;p&gt;Finora tutti questi esperimenti non è che ci abbiano fatto una &lt;a href=&#34;https://freedium-mirror.cfd/https://ninza7.medium.com/anthropic-gave-an-ai-a-job-the-results-were-hilarious-and-terrifying-e85a204b06f4&#34;&gt;grande figura&lt;/a&gt; ma, come ci &lt;a href=&#34;https://it.wikipedia.org/wiki/Mai_dire_mai_%28film%29&#34;&gt;insegna Sean Connery&lt;/a&gt;, mai dire mai. E allora vediamo come funzionano nella pratica le funzioni agentiche integrate in Google Antigravity.&lt;/p&gt;&#xA;&lt;p&gt;Per provarle, ho chiesto al programma di eseguire alcuni compiti specifici, spaziando da cose semplici fino ad un compito particolarmente complesso, cercando di lasciarlo libero di decidere cosa fare e intervenendo solo quando era davvero necessario. Ho scelto compiti vicini alle esigenze di ricercatore, ma credo che i risultati siano lo stesso molto significativi.&lt;/p&gt;&#xA;&lt;p&gt;Ecco come è andata.&lt;/p&gt;&#xA;&lt;h5 id=&#34;prima-di-iniziare&#34;&gt;Prima di iniziare&lt;/h5&gt;&#xA;&lt;p&gt;Prima di iniziare ho finto di usare Antigravity per la prima volta, cancellando con &lt;a href=&#34;https://freemacsoft.net/appcleaner/&#34;&gt;AppCleaner&lt;/a&gt; tutti i file generati dall&amp;rsquo;applicazione. Ho eseguito di nuovo la procedura di &lt;em&gt;onboarding&lt;/em&gt;, decidendo di &lt;code&gt;Start fresh&lt;/code&gt;, senza importare la configurazione da VS Code o da Windsurf, e di usare la modalità &lt;code&gt;Review driven development&lt;/code&gt;, senza modificare le opzioni di default.&lt;/p&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2026-01-21-sorpresa-antigravity/agent-mode.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;Per quanto riguarda le estensioni, non ne installo nessuna, perché preferisco decidere da solo cosa mi serve.&lt;/p&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2026-01-21-sorpresa-antigravity/extensions.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;Dimenticavo: la versione di Antigravity che ho usato per scrivere questo articolo è la 1.11.17 ma, vista la velocità dello sviluppo, è possibile che alcuni aspetti dell&amp;rsquo;interfaccia e del funzionamento del programma siano già cambiati al momento della pubblicazione dell&amp;rsquo;articolo.&lt;/p&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2026-01-21-sorpresa-antigravity/version.png&#34; alt=&#34;&#34;&gt;&lt;h5 id=&#34;compito-1-estrazione-di-dati-dalle-immagini&#34;&gt;Compito #1: Estrazione di dati dalle immagini&lt;/h5&gt;&#xA;&lt;p&gt;Cominciamo con una cosa semplice, ma molto importante quando si ha a che fare con dei vecchi articoli scientifici: estrarre i dati dalle immagini. Il mio obiettivo è verificare se è possibile istruire l&amp;rsquo;IA di Antigravity ad estrarre da solo i dati dalle figure di &lt;a href=&#34;https://link.springer.com/article/10.1007/s13762-025-06837-z&#34;&gt;questo articolo&lt;/a&gt; appena pubblicato, di cui non sono per niente orgoglioso (per usare un eufemismo), ma che i &lt;em&gt;referee&lt;/em&gt;, sorprendentemente, hanno accettato quasi senza fiatare.&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;Oggi, in base ai principi della &lt;a href=&#34;https://www.nature.com/collections/prbfkwmwvz&#34;&gt;riproducibilità dei risultati ottenuti&lt;/a&gt;, è diventato normale condividere tutti i dati di un articolo scientifico tramite dei &lt;em&gt;repository&lt;/em&gt; pubblici come &lt;a href=&#34;https://zenodo.org&#34;&gt;Zenodo&lt;/a&gt;, &lt;a href=&#34;https://osf.io&#34;&gt;OSF&lt;/a&gt;, &lt;a href=&#34;https://dataverse.org/&#34;&gt;Dataverse&lt;/a&gt; o magari &lt;a href=&#34;https://github.com/&#34;&gt;GitHub&lt;/a&gt;. Ma fino a pochi anni fa i dati originali erano di fatto accessibili solo attraverso le figure negli articoli, ed è proprio per questo che è fondamentale poterli estrarre dalle immagini.&lt;/p&gt;&#xA;&lt;p&gt;Ci sono parecchi programmi dedicati all&amp;rsquo;estrazione dei dati dalle figure (come &lt;a href=&#34;https://akhuettel.github.io/engauge-digitizer/&#34;&gt;questo&lt;/a&gt;, &lt;a href=&#34;https://www.digitizeit.xyz/&#34;&gt;questo&lt;/a&gt; o &lt;a href=&#34;https://cran.r-project.org/web/packages/metaDigitise/vignettes/metaDigitise.html&#34;&gt;questo&lt;/a&gt;), ma richiedono di essere guidati dall&amp;rsquo;utente, che al minimo deve definire la posizione degli assi X ed Y e i limiti delle coordinate da estrarre. Alcuni programmi riescono a funzionare automaticamente, ma solo se hanno a che fare con tipi ben definiti di immagini.&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;/div&gt;&#xA;&lt;/br&gt;&#xA;&lt;p&gt;Prima di cominciare, creo una nuova directory dove salvo i grafici scaricati dalla &lt;a href=&#34;https://link.springer.com/article/10.1007/s13762-025-06837-z&#34;&gt;pagina web&lt;/a&gt; dell&amp;rsquo;articolo, proprio come farebbe un collega che volesse ripetere il mio esperimento. Già che ci sono, ci metto anche il file PDF dell&amp;rsquo;articolo, che mi servirà più avanti.&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;&lt;strong&gt;NOTA.&lt;/strong&gt; Tutte le domande riportate qui sotto sono state copiate senza correggere gli errori di battitura e la sintassi zoppicante, causati (anche) alla voglia di vedere rapidamente cosa veniva fuori. Tutto sommato questi errori sono utili, perché dimostrano che questi sistemi riescono a comprendere le nostre richieste anche quando la forma non è perfetta.&lt;/p&gt;&#xA;&lt;/div&gt;&#xA;&lt;/br&gt;&#xA;&lt;p&gt;Scelgo di usare &lt;code&gt;Gemini 3 Pro (High)&lt;/code&gt;, che in questo momento è il modello più potente presente in Antigravity, e per prima cosa gli chiedo di orientarsi nel contenuto della directory.&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;In the current directory you will find a pdf file, a couple of folders and some inages in png or webp format. Is all this right?&#xA;&lt;div&gt;&#xA;&lt;/details&gt;&#xA;&#xA;&lt;p&gt;Gemini ci pensa un paio di secondi e poi mi conferma che è tutto corretto. Molto bene, allora&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;Now open the file containing &#34;Fig1&#34; in the filename. This is an histogram showing the concentration of several chemical species in two kinds of Shungite, type Z (darker bars) and type B (lighter bars). Could you extract the values of concentration from the images? Please produce a table with the name of each chemical species and the associated concentrations for the Type Z and Type B material. Export the table as a csv file named &#34;gemini-fig1.csv&#34; and as a markdown file &#34;gemini-fig1.md&#34;&#xA;&lt;div&gt;&#xA;&lt;/details&gt;&#xA;&#xA;&lt;p&gt;Questa è l&amp;rsquo;immagine con cui ha a che fare Gemini&lt;/p&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2026-01-21-sorpresa-antigravity/13762_2025_6837_Fig1_HTML.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;Nonostante io sia stato volutamente vago sul nome del file, Gemini la trova senza problemi e e dopo una ventina di secondi produce i due file richiesti. La tabella generata da Gemini è questa&lt;/p&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th style=&#34;text-align: left&#34;&gt;Chemical Species&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: left&#34;&gt;Type Z (Concentration %)&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: left&#34;&gt;Type B (Concentration %)&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: left&#34;&gt;SiO2&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;41&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;52&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;C&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;33&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;16&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Al2O3&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;11&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;16&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Fe2O3&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;5&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;3&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;FeO&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;3&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;2&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;TiO2&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;0.2&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;1&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;MnO&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;0.1&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;0.2&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;S&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;1.2&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;0.5&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;MgO&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;0.5&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;1.5&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Na2O&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;1.5&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;1.2&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;CaO&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;0.5&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;2&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;K2O&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;1&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;2&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;H2O&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;2&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;1.5&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;minor elements&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;0.5&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;0.5&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;Confrontandola con la tabella &lt;em&gt;vera&lt;/em&gt;, che contiene i valori di concentrazione realmente misurati&lt;/p&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th style=&#34;text-align: left&#34;&gt;Species&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: left&#34;&gt;Type_Z&lt;/th&gt;&#xA;          &lt;th style=&#34;text-align: left&#34;&gt;Type_B&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: left&#34;&gt;SiO2&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;40.8&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;52&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;C&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;33.4&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;16.3&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Al2O3&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;10.6&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;15.8&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Fe2O3&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;4.7&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;3.2&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;FeO&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;3.5&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;1.9&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;TiO2&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;0.4&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;0.9&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;MnO&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;0.14&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;0.12&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;S&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;1.1&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;0.6&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;MgO&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;0.3&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;1.6&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Na2O&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;1.6&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;1.2&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;CaO&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;0.4&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;2.3&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;K2O&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;1&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;2.2&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;H2O&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;1.6&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;1.4&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;Other&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;0.46&lt;/td&gt;&#xA;          &lt;td style=&#34;text-align: left&#34;&gt;0.48&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;si nota subito che tutti i valori estratti dalla figura sono molto vicini a quelli reali, con approssimazioni minime e sempre minori dello 0,5%.&lt;/p&gt;&#xA;&lt;p&gt;Sono davvero impressionato dal risultato: Antigravity ha fatto tutto in pochi secondi e senza nessun intervento da parte mia, a parte la preparazione dei file e la scrittura del prompt. È vero che anche i normali chatbot come ChatGPT o Claude possono fare le stesse cose, ma Antigravity ci permette di lavorare direttamente sul nostro computer e con i nostri file, senza dover trasferire niente su e giù per l&amp;rsquo;interfaccia web del chatbot.&lt;/p&gt;&#xA;&lt;p&gt;Compito superato a pieni voti.&lt;/p&gt;&#xA;&lt;h5 id=&#34;compito-2-riproduzione-di-grafici&#34;&gt;Compito #2: Riproduzione di grafici&lt;/h5&gt;&#xA;&lt;p&gt;Per motivi non rilevanti qui, ho partecipato poco &amp;ndash; e più che altro in modo critico &amp;ndash; alla stesura dell&amp;rsquo;&lt;a href=&#34;https://link.springer.com/article/10.1007/s13762-025-06837-z&#34;&gt;articolo&lt;/a&gt; menzionato nel Compito #1. In particolare, non mi sono occupato come al solito di preparare i grafici, che invece sono stati realizzati da una collega in &lt;a href=&#34;https://www.mathworks.com/products/matlab.html&#34;&gt;Matlab&lt;/a&gt;, un sistema di calcolo molto amato dagli ingegneri. I quali hanno ragione, perché con Matlab si possono fare con poco sforzo dei calcoli molto complicati. Ma produrre dei grafici di qualità non è certo il suo forte.&lt;/p&gt;&#xA;&lt;p&gt;Vediamo allora se riesco a far ricreare a Gemini 3 Pro l&amp;rsquo;istogramma del Compito #1, utilizzando la libreria &lt;a href=&#34;https://ggplot2.tidyverse.org/&#34;&gt;ggplot2&lt;/a&gt; di &lt;code&gt;R&lt;/code&gt;.&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;Now generate the R code to recreate the same graph, using ggplot2 and whenever possible the functions available in the tidyverse.&#xA;&lt;div&gt;&#xA;&lt;/details&gt;&#xA;&#xA;&lt;p&gt;Dopo un po&amp;rsquo; lo script è pronto e viene salvato automaticamente nella directory del progetto. Gli do una rapida occhiata e mi sembra a posto. Apro il terminale integrato in Antigravity ed eseguo lo script come mi viene suggerito,&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Rscript recreate_fig1.R&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;e, a parte i colori invertiti, la figura è identica all&amp;rsquo;originale.&lt;/p&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2026-01-21-sorpresa-antigravity/recreated_fig1.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;Voglio essere chiaro su questo punto: io non ho toccato nemmeno una virgola del codice generato in Antigravity da Gemini (e non lo farò nemmeno in seguito), il quale quindi riesce da solo a ricreare in &lt;code&gt;R&lt;/code&gt; una copia quasi perfetta dell&amp;rsquo;originale, &lt;em&gt;leggendo&lt;/em&gt; i dati presenti nella figura e riconoscendo tutti gli elementi di contorno del grafico, come le etichette degli assi X e Y, le scale numeriche o la legenda.&lt;/p&gt;&#xA;&lt;p&gt;Conosco abbastanza bene R e avrei potuto ottenere lo stesso risultato in poco tempo, ma non c&amp;rsquo;è dubbio che anche in casi come questo Antigravity può essere un valido aiuto per chi è a digiuno di programmazione.&lt;/p&gt;&#xA;&lt;p&gt;Io comunque sono incontentabile e chiedo a Gemini di invertire i colori&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;Sorry, but the colors are inverted. Type Z is light grey and Type B is dark grey. Please switch the colors so that they are identical to the original. Save the new R code as `Rscript recreate_fig1-1.R`&#xA;&lt;div&gt;&#xA;&lt;/details&gt;&#xA;&#xA;&lt;p&gt;Eseguo il nuovo script e ora i colori sono quelli corretti. Noto con piacere che anche il nome del file &lt;code&gt;png&lt;/code&gt; generato è stato aggiornato, cosa che rende più facile confrontare i diversi file prodotti da Gemini.&lt;/p&gt;&#xA;&lt;p&gt;Di nuovo, sono davvero molto impressionato. Gemini ha fatto tutto perfettamente e io non ho dovuto correggere nemmeno una riga del codice.&lt;/p&gt;&#xA;&lt;p&gt;Era un lavoro facile, non c&amp;rsquo;è dubbio, ma rimane comunque un risultato molto interessante. Anche perché stiamo parlando di un linguaggio specialistico come &lt;code&gt;R&lt;/code&gt;, che non ha certo la mole di esempi su cui addestrarsi che hanno linguaggi molto più diffusi, come Python o JavaScript.&lt;/p&gt;&#xA;&lt;p&gt;Anche questo compito mi pare superato a pieni voti.&lt;/p&gt;&#xA;&lt;h5 id=&#34;compito-3-generazione-di-nuovi-grafici&#34;&gt;Compito #3: Generazione di nuovi grafici&lt;/h5&gt;&#xA;&lt;p&gt;Gemini è riuscito a ricreare perfettamente l&amp;rsquo;istogramma dell&amp;rsquo;&lt;a href=&#34;https://link.springer.com/article/10.1007/s13762-025-06837-z&#34;&gt;articolo&lt;/a&gt;, ma vorrei verificare se ci sono delle rappresentazioni alternative più efficaci.&lt;/p&gt;&#xA;&lt;p&gt;Lascio di nuovo la palla a Gemini 3 Pro, che tira fuori due idee interessanti, un grafico &lt;em&gt;Lollipop&lt;/em&gt; e un &lt;em&gt;Dumbell plot&lt;/em&gt;, che però per varie ragioni non mi soddisfano più di tanto. Provo a fargli fare delle modifiche, Gemini esegue sempre tutto a puntino ma il risultato non migliora.&lt;/p&gt;&#xA;&lt;p&gt;Alla fine, mi convinco che il grafico più equilibrato è il solito istogramma, ma questa volta con gli assi X e Y scambiati e colori molto diversi per i due tipi di materiale.&lt;/p&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2026-01-21-sorpresa-antigravity/alternative_fig1_horizontal_bar.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;Dato che, come ho già detto, sono incontentabile, prendo una figura molto più complicata dal solito articolo,&lt;/p&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2026-01-21-sorpresa-antigravity/concentrazione_metalli3.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;e gli faccio ripetere il lavoro di generazione dei grafici equivalenti usando &lt;code&gt;R&lt;/code&gt; e &lt;code&gt;ggplot2&lt;/code&gt;. Gemini si mette subito all&amp;rsquo;opera e capisce da solo che la concentrazione dei vari elementi al giorno 0 vale per entrambi i tipi di materiale, una cosa che non è banale da capire guardando solo il grafico.&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;For Day 0 (&#34;untreated sample&#34;), I assigned the same concentration value to both Type Z and Type B in the dataset. This format suggests that both treatments start from the same baseline, which will make plotting lines easier in R.&#xA;&lt;div&gt;&#xA;&lt;/details&gt;&#xA;&#xA;&lt;p&gt;Vi risparmio i dettagli, dico solo che Gemini fa tutto quello che gli chiedo, e produce con poco sforzo diversi tipi di visualizzazioni diverse dei dati presenti nell&amp;rsquo;immagine qui sopra, come questa &lt;a href=&#34;https://static.233.196.69.159.clients.your-server.de/img/2026-01-21-sorpresa-antigravity/fig4_heatmap.png&#34;&gt;heatmap&lt;/a&gt; o questo &lt;a href=&#34;https://static.233.196.69.159.clients.your-server.de/img/2026-01-21-sorpresa-antigravity/fig4_sankey_grid_bold.png&#34;&gt;Sankey plot&lt;/a&gt;. I grafici prodotti non mi soddisfano al 100%, ma comunque dimostrano che Gemini è in grado di eseguire anche i compiti richiesti da utenti incontentabili come il sottoscritto.&lt;/p&gt;&#xA;&lt;p&gt;Gemini riesce anche a capire da solo che, se gli chiedo di mettere i grafici prodotti in due colonne, una per ciascuno dei due materiali studiati, quello che voglio davvero sono quelle che nel gergo di R si chiamano &lt;code&gt;facet&lt;/code&gt;. Sembra una cosa sciocca, ma significa che queste rappresentazioni più complesse diventano alla portata anche di chi sa cosa vuole, ma non sa come esprimerlo in modo preciso.&lt;/p&gt;&#xA;&lt;p&gt;Va detto, però ,che per quanto sia comodo (e anche divertente) chiedere e osservare Gemini mentre lavora, quando si arriva alle modifiche più fini si perde molto più tempo a scrivere le domande e ad aspettare le risposte che a lavorare direttamente sul codice. E questo è un dettaglio da tenere in conto.&lt;/p&gt;&#xA;&lt;p&gt;Diciamo che questo compito merita la sufficienza.&lt;/p&gt;&#xA;&lt;h5 id=&#34;compito-4-interazione-con-il-codice-e-il-sistema-operativo&#34;&gt;Compito #4: Interazione con il codice e il sistema operativo&lt;/h5&gt;&#xA;&lt;p&gt;Vediamo ora se Gemini 3 Pro integrato in Antigravity è in grado di eseguire delle operazioni basilari di gestione dei file e delle cartelle. Tutti gli esempi valgono per macOS, su cui ho fatto tutte le prove, ma anche per le varie incarnazioni di Linux e di BSD Unix.&lt;/p&gt;&#xA;&lt;p&gt;Per prima cosa gli chiedo di mettere ordine nei file generati finora, spostando gli script in R nella directory &lt;code&gt;code&lt;/code&gt;, i file dati in &lt;code&gt;data&lt;/code&gt; e i grafici podotti in &lt;code&gt;output&lt;/code&gt;. Gemini 3 Pro ci pensa un po&amp;rsquo; su e poi crea un semplice script di shell per eseguire quanto richiesto. Fa anche un errore, se ne accorge e mi chiede di autorizzarlo a correggerlo. Molto, molto bene.&lt;/p&gt;&#xA;&lt;p&gt;Ma quello che mi piace ancora di più è che aggiorna da solo tutto il codice già scritto con i nuovi percorsi dei vari file.&lt;/p&gt;&#xA;&lt;p&gt;Gli chiedo allora di aggiungere a ciascuno script in &lt;code&gt;R&lt;/code&gt; il mio solito preambolo, che crea un ambiente R ben definito. Gli do un esempio tratto da uno dei miei vecchi script. ma per il resto gli lascio mano libera. Gemini fa tutto a puntino e aggiorna di nuovo da solo tutti i percorsi dei file creati finora. Davvero impressionante!&lt;/p&gt;&#xA;&lt;p&gt;Gemini si comporta in modo ineccepibile anche con la conversione dei &lt;code&gt;tab&lt;/code&gt;, da due spazi a quattro spazi, come piace a me. Anzi, si accorge persino che deve farlo evitando errori di formattazione nel codice. Meglio di un &lt;em&gt;linter&lt;/em&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Passo infine al &lt;em&gt;versioning&lt;/em&gt; con &lt;code&gt;git&lt;/code&gt; che è sempre utile quando un progetto diventa appena complicato.&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;Could you now initialize a local `git` repository for this project? Versioning is very useful as soon as a project starts to become complicated.&#xA;&lt;div&gt;&#xA;&lt;/details&gt;&#xA;&#xA;&lt;p&gt;Va tutto a meraviglia, Gemini crea il &lt;em&gt;repository&lt;/em&gt; richiesto, fa un primo &lt;em&gt;commit&lt;/em&gt; e aggiunge anche un file &lt;code&gt;.gitignore&lt;/code&gt; sensato. Ovviamente posso interrogarlo per chiedere lo &lt;em&gt;status&lt;/em&gt; del repository o per eseguire tutte le altre operazioni con &lt;code&gt;git&lt;/code&gt; che sono abituato ad eseguire dal Terminale.&lt;/p&gt;&#xA;&lt;p&gt;Devo ammettere che ho un po&amp;rsquo; paura a far fare tutte queste cose ad un sistema &lt;em&gt;agentico&lt;/em&gt;, ma in ogni caso il risultato è perfetto.&lt;/p&gt;&#xA;&lt;p&gt;Anche in questo caso vale quello che ho scritto alla fine del Compito precedente: chi conosce bene i comandi di &lt;code&gt;git&lt;/code&gt; fa molto più in fretta a lavorare nel Terminale che a chiedere a Gemini. Però è altrettanto vero che per il normale ricercatore (ma anche per il normale utente) a digiuno di Terminale e sistemi di &lt;em&gt;versioning&lt;/em&gt;, usare un sistema ad agenti come questo può essere un ottimo modo per interagire a basso livello con il codice senza dover studiare pagine e pagine di documentazione.&lt;/p&gt;&#xA;&lt;p&gt;In ogni caso, un altro compito superato a pieni voti.&lt;/p&gt;&#xA;&lt;h5 id=&#34;compito-5-analisi-statistica-dei-dati&#34;&gt;Compito #5: Analisi statistica dei dati&lt;/h5&gt;&#xA;&lt;p&gt;Qui non la faccio lunga, anche perché sulla analisi statistica Antigravity/Gemini 3 Pro è un po&amp;rsquo; scarso.&lt;/p&gt;&#xA;&lt;p&gt;Se lo lascio libero di fare quello che preferisce, tira fuori cose senza senso, come creare delle matrici di correlazione fra le concentrazioni dei diversi metalli pesanti o cercare di confrontare le &amp;ldquo;differenze di efficacia&amp;rdquo; dei due materiali. Non è un compito facile, lo ammetto, ma dimostra &amp;ndash; se ci fosse ancora bisogno di dimostrarlo &amp;ndash; che questi sistemi &lt;em&gt;intelligenti&lt;/em&gt; sono molto utili quando gli si dice con precisione cosa fare, ma non riescono a lavorare da soli quando l&amp;rsquo;utente non ha una idea chiara su cosa vuole ottenere.&lt;/p&gt;&#xA;&lt;p&gt;Infatti, quando gli spiego per benino con che tipo di dati ho a che fare e cosa voglio ottenere,&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;The two types of shungite, type Z and type B, are different materials and they are used independently. In other words, the experiments made using type Z material is completely independent from the experiment with type B, so the two materials cannot be directly compared. This means that the stat_difference_boxplot has little sense, and the same is true for the correlation matrix which photographs a single day (I guess day 0 for only one type of material), while we are interested to time series. Therefore you should try to use some statistical analysis able to deal with time series.&#xA;&lt;div&gt;&#xA;&lt;/details&gt;&#xA;&#xA;&lt;p&gt;Gemini ci pensa su per un po&amp;rsquo;, fa degli errori ma riesce a correggerli da solo e alla fine tira fuori un modellino che dimostra come il materiale di tipo Z assorbe i metalli pesanti più rapidamente del materiale di tipo B. Se ci fossero più dati a disposizione, avrebbe senso ragionare un po&amp;rsquo; sul modello, ma per ora può bastare.&lt;/p&gt;&#xA;&lt;p&gt;Difficile dare un voto qui, diciamo non classificato.&lt;/p&gt;&#xA;&lt;h5 id=&#34;compito-6-estrazione-di-tabelle-dai-file-pdf&#34;&gt;Compito #6: Estrazione di tabelle dai file PDF&lt;/h5&gt;&#xA;&lt;p&gt;Qui entrarre in un territorio ostile. Estrarre automaticamente il contenuto delle tabelle contenute nei file PDF sembra una cosa banale, e invece è un argomento su cui si sono arrovellati centinaia e centinaia di ricercatori, e io fra questi. Il problema principale è che il formato PDF è orientato a gestire l&amp;rsquo;aspetto grafico della pagina, ma non &lt;em&gt;sa&lt;/em&gt; nulla del suo contenuto.&lt;/p&gt;&#xA;&lt;p&gt;Per le mie prove, ho chiesto ad Antigravity di aprire il file PDF di uno degli &lt;a href=&#34;https://protezionecivile.regione.puglia.it/annali-idrologici-parte-i-documenti-dal-1921-al-2021&#34;&gt;Annali Idrologici della Regione Puglia&lt;/a&gt; e di estrarre i dati di temperatura minima e massima misurati in alcune stazioni meteorologiche pugliesi. I dati giornalieri ora sono &lt;a href=&#34;https://reteidrometeo.protezionecivile.puglia.it/polarisopen/gis/map&#34;&gt;disponibili sul web&lt;/a&gt;, ma gli Annali in PDF rimangono una risorsa fondamentale, perché contengono i dati di temperatura e precipitazione (e altro) misurati in tutte le circa 150 stazioni della rete meteorologica pugliese a partire dal 1921, permettendo così di &lt;a href=&#34;https://iopscience.iop.org/article/10.1088/1742-6596/1065/19/192005&#34;&gt;analizzare&lt;/a&gt; com&amp;rsquo;è &lt;a href=&#34;https://www.sciencedirect.com/science/article/abs/pii/S0048969719344067&#34;&gt;cambiato il clima della regione&lt;/a&gt; nell&amp;rsquo;ultimo secolo.&lt;/p&gt;&#xA;&lt;p&gt;Il problema di estrarre i dati da questi file PDF l&amp;rsquo;ho &lt;a href=&#34;https://presentations.copernicus.org/EGU23/EGU23-15072_presentation.pdf&#34;&gt;risolto anni fa&lt;/a&gt; attraverso una combinazione di script in &lt;code&gt;R&lt;/code&gt; e &lt;code&gt;AWK&lt;/code&gt;, ma la procedura è lunga e complessa perché bisogna correggere a mano le tante incongruenze contenute nelle tabelle.&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; Alla fine, per estrarre i dati di un singolo anno ci vogliono un paio di ore di lavoro attento, che non è male vista la complessità dell&amp;rsquo;analisi, ma che sarebbe molto utile riuscire a delegare all&amp;rsquo;IA.&lt;/p&gt;&#xA;&lt;p&gt;E allora provo a farlo fare a Gemini 3 Pro, scrivendo un prompt bello lungo dove gli spiego per filo e per segno cosa fare&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;Open &lt;code&gt;annale2013.pdf&lt;/code&gt; and go to page 6, where you will find a pair of data tables with measured precipitations [sic! sarebbe dovuto essere &amp;ldquo;temperatures&amp;rdquo;] for two weather stations. The data is arranged in pairs of columns, and each pair corresponds to a month, &lt;code&gt;G&lt;/code&gt; for &lt;code&gt;gennaio&lt;/code&gt; (january), &lt;code&gt;F&lt;/code&gt; for &lt;code&gt;febbraio&lt;/code&gt; (february), etc,. until &lt;code&gt;D&lt;/code&gt; or &lt;code&gt;dicembre&lt;/code&gt; (december).&lt;/p&gt;&#xA;    &lt;p&gt;As for the pairs, the first column is the minimum temperature and the second column is the maximum temperature.&lt;/p&gt;&#xA;    &lt;p&gt;Each row represents a different day.&lt;/p&gt;&#xA;    &lt;p&gt;At the end of each table there are some summary data, &lt;code&gt;Medie&lt;/code&gt;, &lt;code&gt;Med.mens.&lt;/code&gt; and &lt;code&gt;Med.norm&lt;/code&gt; that you can skip.&lt;/p&gt;&#xA;    &lt;p&gt;Missing data can be marked by either one or more &lt;code&gt;&amp;gt;&lt;/code&gt; or &lt;code&gt;&amp;lt;&lt;/code&gt; signs, or by &lt;code&gt;=&lt;/code&gt; or be simply blank. In some tables there are extraneuous signs that you can skip outright.&lt;br&gt;&#xA;    Read the table and generate two different csv files, one for the maximum temperature and one for the minimum temperature, following this example&lt;/p&gt;&#xA;    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Date,Altamura,Andretta&#xA;    2007-01-01,13.4, 7.7,&#xA;    2007-01-02,15.7, 9.7,&#xA;    2007-01-03, 7.1, 2.7,&#xA;    2007-01-04, 9.5, 7.0,&#xA;    &lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The header contains the date in ISO format, YYYY-MM-DD, and the name of the weather station which is written in bold at the top of each table, just under the months. All other information in thsi area, eg., &lt;code&gt;(Te)&lt;/code&gt;, &lt;code&gt;Bacino&lt;/code&gt; etc. is not useful and can be skipped.&lt;/p&gt;&#xA;    &#xA;&#xA;&lt;div&gt;&#xA;&lt;/details&gt;&#xA;&#xA;&lt;p&gt;Gemini prova e riprova a risolvere il problema con Python, ma i suoi script producono un sacco di errori e saltano parecchi giorni con dati validi. Del resto non è un problema facile, ci ho buttato il sangue io stesso per mesi, per cui gli do un aiutino.&lt;/p&gt;&#xA;&lt;p&gt;Ma a questo punto Gemini va in errore e non c&amp;rsquo;è verso di andare avanti.&lt;/p&gt;&#xA;&lt;p&gt;La cosa migliore sarebbe ricominciare da zero, ma nel frattempo ho raggiunto il &lt;code&gt;quota limit for Gemini 3 Pro (High)&lt;/code&gt; e dovrei aspettare diversi giorni prima di poter continuare.&lt;/p&gt;&#xA;&lt;p&gt;Non se ne parla, preferisco cambiare modello e passo a &lt;code&gt;Gemini 3 Flash&lt;/code&gt; di cui tutti parlano in questo momento. Gemini 3 Flash si mette al lavoro e mi propone un piano di lavoro che sembra sensato, ma che alla prova dei fatti produce, come ammette lui stesso, una &lt;em&gt;jumbled mess&lt;/em&gt; (un pasticcio confuso) perché ci sono &lt;em&gt;extraneous characters and unclear formatting&lt;/em&gt; (caratteri estranei e formattazione poco chiara).&lt;/p&gt;&#xA;&lt;p&gt;Gli suggerisco di usare la libreria &lt;code&gt;pdftools&lt;/code&gt; di R, che ho usato io stesso e che dà risultati infinitamente migliori dei tool analoghi per Python e alla fine, bingo!, Gemini ce la fa e produce un file dati corretto al 100%.&lt;/p&gt;&#xA;&lt;p&gt;Lo so, per essere davvero utile dovrei fargli ripetere il processo per tutte le stazioni e per parecchi anni diversi, ma per ora mi accontento, anche perché non voglio sprecare tutta la mia quota in questa attività. In ogni caso il risultato raggiunto con &lt;code&gt;Gemini 3 Flash&lt;/code&gt; è molto promettente e merita di essere approfondito come si deve.&lt;/p&gt;&#xA;&lt;p&gt;Va detto, invece, che con &lt;code&gt;Claude Sonnet 4.5 (Thinking)&lt;/code&gt; non c&amp;rsquo;è verso di fargli fare qualcosa di buono. Prova e riprova, raggiungo il limite di quota anche per questo modello  e mi devo fermare.&lt;/p&gt;&#xA;&lt;p&gt;Votazione? Gemini 3 Flash prende il massimo, mentre Gemini 3 Pro andrebbe riprovato nelle stesse condizioni del modello minore. Claude Sonnet 4.5, infine, prende un non classificato&lt;/p&gt;&#xA;&lt;h5 id=&#34;compito-7-programmazione-di-un-microcontroller&#34;&gt;Compito #7: Programmazione di un microcontroller&lt;/h5&gt;&#xA;&lt;p&gt;Un altro campo in cui le funzioni &lt;em&gt;agentiche&lt;/em&gt; di Google Antigravity potrebbero dimostrarsi molto interessanti e la programmazione dei microcontroller, come Arduino, Raspberry Pi Pico o ESP32. Ci sono letteralmente una marea di questi oggettini, e non per niente facile orientarsi fra i tanti modelli diversi e, ancora di più, fra le migliaia di sensori e moduli che gli si possono collegare.&lt;/p&gt;&#xA;&lt;p&gt;In questo caso specifico, un sistema di IA che produca velocemente del codice funzionante potrebbe essere davvero utile.&lt;/p&gt;&#xA;&lt;p&gt;Per le mie prove decido di usare un &lt;a href=&#34;https://www.arduino.cc/pro/hardware-product-nicla-vision/&#34;&gt;Nicla Vision&lt;/a&gt;, che di fatto è un Arduino con una videocamera incorporata. Il Nicla Vision è un vero gioiellino, che non costa poco ma che vale tutti i soldi spesi. Ma è anche un oggetto poco diffuso rispetto ai normali microcontroller, per cui se Antigravity riesce a programmarlo correttamente, riuscirà di sicuro a fare altrettanto con i normali Arduino, Pi Pico o ESP32.&lt;/p&gt;&#xA;&lt;p&gt;Torno quindi ad usare &lt;code&gt;Gemini 3 Flash&lt;/code&gt; e gli chiedo se conosce il Nicla Vision. Gli do anche il link alla pagina web del prodotto per aiutarlo ad orientarsi. Gemini mi conferma di sapere bene di cosa sto parlando, per cui possiamo partire può partire.&lt;/p&gt;&#xA;&lt;p&gt;Per programmare questi oggettini, io ho sempre e solo usato &lt;a href=&#34;https://www.arduino.cc/en/software/&#34;&gt;Arduino IDE&lt;/a&gt; e &lt;a href=&#34;https://thonny.org/&#34;&gt;Thonny&lt;/a&gt; e non so se Gemini può gestire il microcontroller direttamente dall&amp;rsquo;editor. Quando glielo chiedo, Gemini risponde con un comando molto semplice&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;% ls /dev/tty.usbmodem* /dev/cu.usbmodem* 2&amp;gt;/dev/null || echo &amp;#34;No usbmodem devices found&amp;#34;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;che permette di controllare che il Nicla Vision sia collegato al Mac. Una volta che l&amp;rsquo;ha trovato, verifica se sono installate le librerie Python necessarie per comunicare con il microcontroller e, dato che non ci sono, mi propone di installarle. Giustamente mi dà anche la possibilità di scegliere se farlo a livello globale o in un &lt;code&gt;virtual environment&lt;/code&gt;, e non c&amp;rsquo;è bisogno di dire che scelgo la seconda opzione.&lt;/p&gt;&#xA;&lt;p&gt;Gemini prepara anche un piccolo script di test che fa lampeggiare il LED (il classico Hello World dell&amp;rsquo;IoT) e, quando gli confermo che tutto funziona, proclama soddisfatto&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;I&#39;m ready to start writing more complex code for your project. What would you like to build first?&#xA;&lt;div&gt;&#xA;&lt;/details&gt;&#xA;&#xA;&lt;p&gt;Fin qui Gemini non fa nulla di più di quello che avrei potuto fare io stesso con &lt;a href=&#34;https://brew.sh/&#34;&gt;Homebrew&lt;/a&gt; e &lt;a href=&#34;https://github.com/conda/conda&#34;&gt;Conda&lt;/a&gt;. Ma per riuscirci avrei dovuto consultare pagine e pagine di documentazione sparsa per il web. Qui invece riesco a configurare tutto in pochi minuti, e per di più imparo tante cose utili.&lt;/p&gt;&#xA;&lt;p&gt;Dato che Gemini era così ansioso di rendersi utile, gli ho chiesto di scrivere un piccolo programma che sfrutta il Nicla Vision per scattare delle foto ad intervalli prestabiliti e inviarle al Mac tramite Wi-Fi. Risultato? Ha funzionato tutto al primo colpo.&lt;/p&gt;&#xA;&lt;p&gt;E Gemini non si è nemmeno offeso quando gli ho detto papale papale che non mi fidavo a dargli in pasto la password del mio Wi-Fi, anzi ha proposto una soluzione alternativa più sicura. Ma io sono malfidato, e alla fine ho usato l&amp;rsquo;hotspt del mio iPhone con una password usa e getta.&lt;/p&gt;&#xA;&lt;p&gt;Anche l&amp;rsquo;ultimo compito è superato a pieni voti.&lt;/p&gt;&#xA;&lt;h4 id=&#34;lasciare-una-traccia&#34;&gt;Lasciare una traccia&lt;/h4&gt;&#xA;&lt;p&gt;&lt;del&gt;Una cosa seccante di Antigravity è che non dispone di una funzione per esportare un &lt;code&gt;log&lt;/code&gt; completo di quello che si fa, con le domande fatte e le risposte del modello, e magari anche i suoi &lt;em&gt;pensieri&lt;/em&gt;.&lt;/del&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Correzione.&lt;/strong&gt; Mi sbagliavo, l&amp;rsquo;abbreviazione da tastiera &lt;strong&gt;CMD&lt;/strong&gt; (⌘)-&lt;strong&gt;E&lt;/strong&gt; consente di aprire l&amp;rsquo;&lt;code&gt;Agent Manager&lt;/code&gt;, una finestra separata di Antigravity che, fra le altre cose, consente di vedere l&amp;rsquo;intera storia di quello che ha fatto Antigravity, compresi i suoi &lt;em&gt;pensieri&lt;/em&gt;. Il problema è che non c&amp;rsquo;è una voce di menu specifica per l&amp;rsquo;Agent Manager (o almeno, io non l&amp;rsquo;ho trovata) e l&amp;rsquo;abbreviazione da tastiera è visibile solo all&amp;rsquo;avvio del programma.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Correzione #2.&lt;/strong&gt; Si può aprire l&amp;rsquo;Agent Manager direttamente dalla barra degli strumenti di Antigravity: la voce corrispondente si trova proprio accanto alle icone che permettono di modificare il layout dell’applicazione e di effettuare delle ricerche. Non so perché non me ne sia accorto prima, ma è anche vero che tutti gli altri comandi della barra degli strumenti sono rappresentati da icone; per questo non è immediato riconoscere quella voce come un comando anziché come una semplice stringa, come avviene per il nome dell’applicazione che occupa il centro della barra degli strumenti.&lt;/p&gt;&#xA;&lt;p&gt;In ogni caso, dopo ogni operazione volta, Antigravity mi permette di leggere un &lt;code&gt;Walkthrough&lt;/code&gt; dettagliato di ciò che ha fatto  e, facendo click con il tasto destro sul Tab relativo,&lt;/p&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2026-01-21-sorpresa-antigravity/walkthrough.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;mi accorgo che posso &lt;em&gt;rivelare&lt;/em&gt; il file nel Finder. Quando lo faccio, compare una cartella con un gran numero di file Markdown, con nomi standard come &lt;code&gt;implementation_plan&lt;/code&gt;, &lt;code&gt;task&lt;/code&gt;,  o &lt;code&gt;walkthrough&lt;/code&gt; seguiti dal suffisso &lt;code&gt;resolved&lt;/code&gt; e da un numero progressivo&lt;/p&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2026-01-21-sorpresa-antigravity/agent-files.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;che dovrebbero rappresentare la &lt;em&gt;storia&lt;/em&gt; di tutto quello che faccio con il sistema agentico.&lt;/p&gt;&#xA;&lt;p&gt;Da quanto vedo, ogni volta che chiedo qualcosa ad uno degli &lt;em&gt;agenti&lt;/em&gt; integrati, Antigravity genera tre file contenenti: (1) quello che deve fare, &lt;code&gt;task&lt;/code&gt;, (2) il piano di lavoro, &lt;code&gt;implementation_plan&lt;/code&gt; e (3) una sintesi di quello che ha fatto, &lt;code&gt;walkthrough&lt;/code&gt;. A prima vista, non è facile mettere in relazione fra loro questi file, ma il meccanismo merita di essere approfondito. Per la cronaca, tutti i file in questione si trovano in una directory contenuta all&amp;rsquo;interno di  &lt;code&gt;~/.gemini/antigravity/brain/&lt;/code&gt;, ma la directory principale &lt;code&gt;~/.gemini/antigravity/&lt;/code&gt; contiene parecchie altre directory con file di configurazione, codice generato e altro.&lt;/p&gt;&#xA;&lt;h4 id=&#34;conclusioni&#34;&gt;Conclusioni&lt;/h4&gt;&#xA;&lt;p&gt;Da quello che ho scritto è chiaro che usare Antigravity mi è piaciuto. Ci sono casi in cui chi sa programmare rischia di essere &lt;a href=&#34;https://mastodon.social/@recantha/115829219381438249&#34;&gt;più rallentato che aiutato&lt;/a&gt;, ma in generale, e soprattutto per coloro che sanno usare Word, Excel e poco più, le funzioni &lt;em&gt;agentiche&lt;/em&gt; di Antigravity possono rivelarsi un aiuto davvero prezioso.&lt;/p&gt;&#xA;&lt;p&gt;Nel corso della mia vita di programmatore non-professionista sono passato dallo  scrivere il codice consultando i volumoni giganteschi di documentazione a cercare le risposte su &lt;a href=&#34;https://stackoverflow.com&#34;&gt;StackOverflow&lt;/a&gt;. Per come la vedo io, le funzioni &lt;em&gt;agentiche&lt;/em&gt; di Antigravity sono come uno &lt;a href=&#34;https://stackoverflow.com/&#34;&gt;StackOverflow&lt;/a&gt; con il turbo: non si limitano a presentare delle risposte alle nostre domande, ma le interpretano, ragionano su di esse e propongono soluzioni in modo quasi autonomo.&lt;/p&gt;&#xA;&lt;p&gt;Ma, proprio come su StackOverflow, bisogna sempre fare affidamento sulle proprie conoscenze e sulla propria esperienza per separare il grano dal loglio, le risposte utili e davvero funzionanti da quelle che valgono meno di niente.&lt;/p&gt;&#xA;&lt;p&gt;Non parliamo però per favore di &lt;em&gt;vibe coding&lt;/em&gt;, cioè di poter chiedere genericamente al programma di svolgere un dato compito, per poi andarsene in giro mentre Antigravity fa tutto da solo!&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; Come si vede dagli esempi, se non si è molto precisi e non gli si spiega per bene cosa vogliamo, controllando poi passo passo ciò che Antigravity propone di fare, si rischia che l&amp;rsquo;intero processo fallisca o produca dei risultati sbagliati.&lt;/p&gt;&#xA;&lt;p&gt;Proprio come un tesista, una dottoranda, o un nuovo collega, Antigravity può darti una grossa mano se sai cosa vuoi e come lo vuoi ottenere, e se glielo spieghi per bene. Ma &lt;a href=&#34;https://bigthink.com/starts-with-a-bang/vibe-physics-ai-slop/&#34;&gt;fargli tirare fuori delle idee sue&lt;/a&gt;, non dico originali ma almeno sensate, per ora è solo fantascienza. O marketing.&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;Già il solo fatto che Google utilizzasse, per un suo strumento di sviluppo, del codice prodotto da un concorrente diretto mi sembrava, diciamo così, piuttosto singolare.&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;È vero che TextMate e BBEdit non sono delle IDE vere e proprie (soprattutto TextMate), ma la differenza di dimensioni rimane lo stesso impressionante.&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;Io stesso ho sviluppato parecchi anni fa un programma in &lt;del&gt;C&lt;/del&gt;, no era in Python, che faceva tutto da solo, ma funzionava solo con le immagini di un tipo ben determinato di oscilloscopio digitale.&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;La fantasia degli estensori delle tabelle meriterebbe un premio.&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;Anche un guru della programmazione molto indaffarato come Linus Torvalds usa il vibe coding, ma sa perfettamente quello che vuole fargli fare. E comunque lo usa solo &lt;a href=&#34;https://itsfoss.com/news/linus-torvalds-vibe-coding/&#34;&gt;per i suoi giochetti&lt;/a&gt;, non certo per sviluppare il kernel di Linux.&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>Fotocopiato!</title>
      <link>https://static.233.196.69.159.clients.your-server.de/it/2025/12/15/fotocopiato/</link>
      <pubDate>Mon, 15 Dec 2025 18:00:00 +0000</pubDate>
      <guid>https://static.233.196.69.159.clients.your-server.de/it/2025/12/15/fotocopiato/</guid>
      <description>&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/SVCBA-pBgt0?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;Il video qui sopra è la presentazione ufficiale di &lt;a href=&#34;https://antigravity.google/&#34;&gt;Google Antigravity&lt;/a&gt;, una IDE (&lt;em&gt;Integrated Development Environment&lt;/em&gt;) che non è solo una semplice IDE ma è &amp;ldquo;&lt;em&gt;un nuovo modo di lavorare per questa prossima era dell&amp;rsquo;intelligenza agentica&lt;/em&gt;&amp;rdquo;. Che non ho ancora ben capito cosa significa, ma che suona tanto intelligente e al passo con i tempi.&lt;/p&gt;&#xA;&lt;p&gt;E allora vediamo cos&amp;rsquo;è questo &amp;ldquo;&lt;em&gt;nuovo modo di lavorare&lt;/em&gt;&amp;rdquo; nel quale gli agenti &amp;ldquo;&lt;em&gt;ti aiutano a decollare&lt;/em&gt;&amp;rdquo;. Una espressione che in altri tempi avrebbe significato ben altro.&lt;/p&gt;&#xA;&lt;p&gt;Scarico l&amp;rsquo;ultima versione disponibile di Google Antigravity, la 1.11.17 per la cronaca, che una volta installata occupa la bellezza di 700 MB. Una volta superate le solite schermate di &lt;em&gt;onboarding&lt;/em&gt; ed essermi autenticato tramite il mio account Gmail, ecco cosa viene fuori&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://static.233.196.69.159.clients.your-server.de/img/2025-12-15-fotocopiato/google-antigravity.png&#34;&gt;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2025-12-15-fotocopiato/google-antigravity.png&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Praticamente &lt;a href=&#34;https://code.visualstudio.com/&#34;&gt;VS Code&lt;/a&gt; di Microsoft, con in più il tool &lt;em&gt;agentico&lt;/em&gt; &lt;code&gt;Antigravity&lt;/code&gt;, che non so ancora bene a cosa possa servire e, soprattutto, se serve davvero.&lt;/p&gt;&#xA;&lt;p&gt;Del resto, me lo avevano praticamente detto durante l&amp;rsquo;onboarding, quando è comparsa questa schermata dove mi veniva proposto di configurare l&amp;rsquo;editor da zero oppure di importare la configurazione da VS Code. O da Windsurf.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://static.233.196.69.159.clients.your-server.de/img/2025-12-15-fotocopiato/google-antigravity-setup.png&#34;&gt;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2025-12-15-fotocopiato/google-antigravity-setup.png&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Windsurf?&lt;/p&gt;&#xA;&lt;p&gt;Sì, &lt;a href=&#34;https://windsurf.com/&#34;&gt;Windsurf&lt;/a&gt;, un editor derivato da &lt;a href=&#34;https://cursor.com/&#34;&gt;Cursor&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; che a sua volta derivava dal solito VS Code.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://static.233.196.69.159.clients.your-server.de/img/2025-12-15-fotocopiato/windsurf.png&#34;&gt;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2025-12-15-fotocopiato/windsurf.png&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;La somiglianza (per usare un eufemismo) diventa evidente quando li si mette uno accanto all&amp;rsquo;altro, Antigravity a sinistra e Windsurf a destra.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://static.233.196.69.159.clients.your-server.de/img/2025-12-15-fotocopiato/side-by-side.png&#34;&gt;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2025-12-15-fotocopiato/side-by-side.png&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Identici.&lt;/p&gt;&#xA;&lt;p&gt;Insomma, l&amp;rsquo;IDE rivoluzionaria, il &amp;ldquo;&lt;em&gt;nuovo modo di lavorare per questa prossima era dell&amp;rsquo;intelligenza agentica&lt;/em&gt;&amp;rdquo; che &amp;ldquo;&lt;em&gt;ti aiuta a decollare&lt;/em&gt;&amp;rdquo;, non è altro che un clone di un editor che a sua volta era già il clone di un altro editor che a sua volta era il clone&amp;hellip;&lt;/p&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/Rm_aUj4B4dU?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;Basta &lt;a href=&#34;https://levelup.gitconnected.com/the-2-4b-clone-how-three-companies-carved-up-one-startup-in-72-hours-36039524a9bb&#34;&gt;approfondire un po&amp;rsquo;&lt;/a&gt; per scoprire che Google ha speso 2.4 miliardi di dollari per acquisire il codice di Windsurf e per assumere i due fondatori, Varun Mohan e Douglas Chen, insieme ad una manciata di sviluppatori dell&amp;rsquo;azienda.&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, per timore di interventi dell&amp;rsquo;antitrust, Google ha evitato di acquistare il prodotto vero e proprio o il marchio, per cui Windsurf continua ad esistere e ad essere sviluppato indipendentemente, provando a ripetere la storia di Davide contro Golia.&lt;/p&gt;&#xA;&lt;p&gt;Insomma, è un po&amp;rsquo; come se negli anni &amp;lsquo;80 Microsoft avesse assunto Steve Jobs e Steve Wozniak, con magari anche Bill Atkinson, Andy Hertzfeld e Susan Kare, prendendo con loro anche il codice del primo Macintosh. Per poi ripubblicarlo qualche mese dopo come Windows 1.0. E tutto ciò mentre Apple continuava tranquillamente a sviluppare lo stesso codice per il Mac originale.&lt;/p&gt;&#xA;&lt;p&gt;Ho l&amp;rsquo;impressione che quelli di Google abbiano usato qualcos&amp;rsquo;altro per decollare.&lt;/p&gt;&#xA;&lt;p&gt;Ma a parte le battute, gli &lt;em&gt;agenti&lt;/em&gt; presenti in Antigravity funzionano e sono utili nel corso dello sviluppo del codice? Non lo so nemmeno io, ed è quello che vedremo in diretta la prossima volta.&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;Chi è interessato alle polemiche nate dopo le ultime modifiche ai prezzi di Cursor può leggere &lt;a href=&#34;https://medium.com/@chrisdunlop_37984/wtf-is-cursor-doing-with-its-pricing-i-have-to-swap-at-this-rate-63681001a08e&#34;&gt;qui&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;L&amp;rsquo;articolo citato è a pagamento, ma può essere letto liberamente &lt;a href=&#34;https://freedium-mirror.cfd/https://levelup.gitconnected.com/the-2-4b-clone-how-three-companies-carved-up-one-startup-in-72-hours-36039524a9bb&#34;&gt;qui&lt;/a&gt;.&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>Modifiche a colpo d&#39;occhio con SubEthaEdit</title>
      <link>https://static.233.196.69.159.clients.your-server.de/it/2023/11/27/modifiche-a-colpo-docchio-con-subethaedit/</link>
      <pubDate>Mon, 27 Nov 2023 06:00:00 +0000</pubDate>
      <guid>https://static.233.196.69.159.clients.your-server.de/it/2023/11/27/modifiche-a-colpo-docchio-con-subethaedit/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2023-11-27-modifiche-a-colpo-docchio-con-subethaedit/possessed-photography-miWGZ02CLKI-unsplash.jpg&#34; alt=&#34;&#34;&gt;&#xA;&amp;ndash; &lt;em&gt;Fonte: &lt;a href=&#34;https://unsplash.com/@possessedphotography&#34;&gt;Possessed Photography&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;&lt;a href=&#34;https://subethaedit.net/&#34;&gt;SubEthaEdit&lt;/a&gt; (SEE per brevità) è un editor per macOS discreto, che fa più o meno tutto ciò che ci si aspetta da un editor moderno (con alcune mancanze significative), e che in più ha la particolarità di permettere a più utenti collegati di lavorare in modo collaborativo allo stesso documento.&lt;/p&gt;&#xA;&lt;p&gt;Di queste caratteristiche generali ho già scritto nell&amp;rsquo;&lt;a href=&#34;https://melabit.com/it/2023/10/30/subethaedit-scrivere-insieme-in-tempo-reale/&#34;&gt;articolo precedente&lt;/a&gt;. In questo articolo, invece, voglio soffermarmi sulla funzione di SEE che mi ha colpito di più in assoluto, cioè la possibilità di mettere bene in evidenza tutte le modifiche effettuate su un documento di testo anche quando non si collabora con altri utenti, una funzione molto particolare ma che in certi casi può diventare davvero un toccasana.&lt;/p&gt;&#xA;&lt;h4 id=&#34;modifiche-in-evidenza&#34;&gt;Modifiche in evidenza&lt;/h4&gt;&#xA;&lt;p&gt;A che serve evidenziare le modifiche ad un testo? Serve tutte le volte in cui si debba mostrare in modo chiaro e tracciabile all&amp;rsquo;editore, al committente, al cliente, o semplicemente ai colleghi, cosa è stato cambiato in un dato documento, come succede molto spesso nell&amp;rsquo;editoria scientifica ma anche in tanti altri settori professionali.&lt;/p&gt;&#xA;&lt;p&gt;Con un wordprocessor non è un problema, Word e i suoi cloni hanno uno strumento integrato di revisione del testo che, per quanto pesante e implementato in modo farraginoso, fa il suo lavoro. Ma come può fare chi preferisce scrivere in modalità solo testo, usando &lt;a href=&#34;https://www.latex-project.org/&#34;&gt;LaTeX&lt;/a&gt; o il sempre più popolare &lt;a href=&#34;https://daringfireball.net/projects/markdown/&#34;&gt;Markdown&lt;/a&gt;?&lt;/p&gt;&#xA;&lt;p&gt;Questi due strumenti permettono di segnalare le modifiche inserendole all&amp;rsquo;interno di tag dedicati (&lt;code&gt;\hl{testo modificato}&lt;/code&gt; per LaTeX e &lt;code&gt;{==testo modificato==}&lt;/code&gt; per Markdown), ma è fastidioso dover aggiungere i tag mentre si procede alla revisione del testo, con il rischio di perdere il filo del discorso e di allungare i tempi di lavoro.&lt;/p&gt;&#xA;&lt;p&gt;Come mi sono accorto da poco, SEE può essere un ottimo strumento per risolvere questo problema.&lt;/p&gt;&#xA;&lt;div markdown=&#34;1&#34; 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;La funzione di evidenziazione del testo modificato di SubEthaEdit può essere attivata una volta per tutte selezionando l&#39;opzione `Highlight Changes when not collaborating posta in cima al pannello `General` delle Preferenze, e sarà valida per tutti i nuovi documenti aperti nel programma.&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2023-11-27-modifiche-a-colpo-docchio-con-subethaedit/general-custom.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;Se vogliamo attivarla anche nel documento corrente, dobbiamo andare nel menu &lt;code&gt;View&lt;/code&gt; e selezionare la voce &lt;code&gt;Highlight Changes&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2023-11-27-modifiche-a-colpo-docchio-con-subethaedit/view-highlight-changes.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;Da questo momento in poi, tutte le modifiche o le aggiunte al testo corrente verranno messe in evidenza da un fondo colorato in giallo (il colore si può cambiare nella sezione &lt;code&gt;Collaboration&lt;/code&gt; delle solite Preferenze).&lt;/p&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2023-11-27-modifiche-a-colpo-docchio-con-subethaedit/highlights.png&#34; alt=&#34;&#34;&gt;&lt;/div&gt;&#xA;&lt;h4 id=&#34;un-caso-personale&#34;&gt;Un caso personale&lt;/h4&gt;&#xA;&lt;p&gt;Alcune settimane fa dovevo modificare un articolo scritto in LaTeX che richiedeva la riscrittura o l&amp;rsquo;aggiunta di grosse porzioni di testo, nonché la correzione di un bel po&amp;rsquo; di errori di inglese, il tutto con la necessità di mettere bene in evidenza tutte le modifiche effettuate, anche al livello delle singole parole.&lt;/p&gt;&#xA;&lt;p&gt;LaTeX ha una funzione specifica per mettere in evidenza il testo modificato (&lt;code&gt;\hl&lt;/code&gt;, che sta per &lt;em&gt;highlight&lt;/em&gt;), il problema è che, quando le modifiche sono tante, è difficile riuscire a ricordarsi di circondare anche il più piccolo pezzetto di testo modificato con &lt;code&gt;\hl{...}&lt;/code&gt; senza perdere il filo del discorso e finire per dimenticare qualcosa di importante.&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;Ho provato i miei soliti editor,&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; per vedere se potevano offrire qualcosa che faceva al caso mio ma, a parte (ovviamente) Emacs,&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; non ho trovato niente più del solito &lt;code&gt;diff&lt;/code&gt;, uno strumento da Terminale molto usato dai programmatori che mette a confronto due file diversi e segnala quali righe sono state modificate.&lt;/p&gt;&#xA;&lt;p&gt;Ma, appunto, con &lt;code&gt;diff&lt;/code&gt; possiamo vedere quali righe sono cambiate, non cosa è cambiato in ciascuna riga! Per un programmatore non è un problema, perché le righe di codice sono brevi ed è facile notare le differenze, ma in un documento LaTeX una singola riga può corrispondere ad un lungo paragrafo di testo, ed è quindi molto più difficile notare a prima vista cosa è cambiato rispetto al testo originale.&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;Ci sono altri strumenti a linea di comando che avrebbero potuto fare al caso mio, come &lt;code&gt;wdiff&lt;/code&gt;, che bisogna installare con &lt;a href=&#34;https://melabit.com/it/2014/04/29/homebrew-software-per-il-mac-fatto-in-casa/&#34;&gt;Homebrew&lt;/a&gt;, oppure &lt;code&gt;git diff --word-diff&lt;/code&gt;, ma usarli avrebbe complicato ulteriormente un lavoro già di per sé piuttosto complesso.&lt;/p&gt;&#xA;&lt;p&gt;Un po&amp;rsquo; per caso un po&amp;rsquo; per fortuna ho lanciato SEE, che avevo installato sul Mac senza usarlo mai più di tanto, e mi sono accorto che faceva perfettamente al caso mio.&lt;/p&gt;&#xA;&lt;p&gt;Con questo editor il lavoro di revisione è stato semplicissimo: mi bastava prendere un blocco di testo dal file originale in LaTeX, copiarlo nella finestra di SEE e inserire via via le correzioni, vedendole tutte chiaramente e in tempo reale con il loro fondo giallo. Una volta finita la revisione di tutto il blocco, potevo circondare tutte le parti di testo evidenziate con &lt;code&gt;hl{...}&lt;/code&gt;, per poi sostituire il testo rivisto a quello del file originale LaTeX.&lt;/p&gt;&#xA;&lt;p&gt;Vi assicuro, descrivere la procedura è molto più complicato che realizzarla, tanto che sono riuscito a completare tutta la revisione in appena un paio di giorni, perché SEE mi permetteva di concentrarmi esclusivamente sulla riscrittura del testo, rimandando la gestione minuta delle modifiche solo alla fine della correzione dell&amp;rsquo;intero blocco.&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;Perché tutta questa trafila di copia e incolla da LaTeX a SEE e viceversa? Non sarebbe stato più semplice lavorare solo in SEE? Certo, ma l&amp;rsquo;articolo originale era su &lt;a href=&#34;https://www.overleaf.com/&#34;&gt;Overleaf&lt;/a&gt; e volevo che i colleghi potessero continuare ad accedere all&amp;rsquo;ultima versione anche mentre io ci lavoravo. E poi SEE ha un grosso difetto, perché non conserva le evidenziazioni quando si salva un documento e lo si riapre una seconda volta. Sarebbe bastata quindi una distrazione, un blocco imprevisto del Mac o magari un banale calo di tensione per perdere di colpo traccia di tutte le modifiche più recenti. Non potevo permettermelo e non ho voluto rischiare.&lt;sup id=&#34;fnref:6&#34;&gt;&lt;a href=&#34;#fn:6&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;6&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#xA;&lt;p&gt;A questo proposito, ho chiesto agli sviluppatori di &lt;a href=&#34;https://github.com/subethaedit/SubEthaEdit/issues/244&#34;&gt;rendere permanenti le evidenziazioni del testo&lt;/a&gt;, ma dopo due mesi non ho avuto risposta e temo che la richiesta non sarà soddisfatta, almeno in tempi brevi.&lt;/p&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2023-11-27-modifiche-a-colpo-docchio-con-subethaedit/highlighted-post.png&#34; alt=&#34;&#34;&gt;&lt;h4 id=&#34;dal-personale-al-generale&#34;&gt;Dal personale al generale&lt;/h4&gt;&#xA;&lt;p&gt;Ma questa funzione particolare di SEE serve solo a chi, come me, si muove nell&amp;rsquo;ambito dell&amp;rsquo;editoria scientifica? Non credo, in realtà mettere bene in evidenza le modifiche ad un documento è una funzione molto utile in svariati settori professionali, e spesso sono proprio i committenti o i clienti a richiedere esplicitamente che il documento contenga una visualizzazione chiara di tutti i cambiamenti subiti.&lt;/p&gt;&#xA;&lt;p&gt;Non a caso la funzione di revisione con evidenziazione delle modifiche effettuate è molto usata da chi scrive in Word, sia quando lavora in collaborazione con altri che quando deve semplicemente correggere un documento altrui.&lt;/p&gt;&#xA;&lt;p&gt;L&amp;rsquo;implementazione delle revisioni in Word è molto macchinosa (e come poteva essere diversamente?) e le modifiche possono essere visualizzate in molti modi diversi, una flessibilità che però tante volte genera solo confusione quando si aprono dei documenti altrui. Nella modalità di visualizzazione più dettagliata si arrivano a vedere le singole lettere aggiunte o cancellate, e il tutto diventa presto un guazzabuglio incomprensibile di testo barrato e testo colorato, con configurazioni e colori diversi per ciascun utente. Considerazioni analoghe si possono fare anche per altri sistemi di scrittura come LibreOffice Writer o Google Docs, che forse riescono a fare persino peggio di Word.&lt;/p&gt;&#xA;&lt;p&gt;In ogni caso, Word sarà anche molto popolare ma tanti, come me, preferiscono usare sistemi di scrittura basati sul testo puro, come LaTeX o il popolarissimo Markdown, che ha parecchi &lt;a href=&#34;https://github.com/CriticMarkup/CriticMarkup-toolkit&#34;&gt;segni speciali&lt;/a&gt; per gestire &lt;mark&gt;le  evidenziazioni di un blocco di testo&lt;/mark&gt; (&lt;code&gt;{==testo evidenziato==}&lt;/code&gt;), così come le &lt;mark style=&#34;background-color: #ccf7cc&#34;&gt;aggiunte&lt;/mark&gt; (&lt;code&gt;{++testo aggiunto++}&lt;/code&gt;), le &lt;del style=&#34;color: #ffa2a2&#34;&gt;cancellazioni&lt;/del&gt; (&lt;code&gt;{--testo cancellato--}&lt;/code&gt;), e perfino le &lt;del style=&#34;color: #ffa2a2&#34;&gt;modifiche&lt;/del&gt; &lt;mark style=&#34;background-color: #ccf7cc&#34;&gt;sostituzioni&lt;/mark&gt; (&lt;code&gt;{&lt;del&gt;&lt;del&gt;testo precedente&lt;/del&gt;&amp;gt;testo sostituito&lt;/del&gt;~}&lt;/code&gt;).&lt;/p&gt;&#xA;&lt;p&gt;Quando le modifiche da fare sono tante, come ci si può concentrare sul testo da rivedere senza perdere il filo del discorso, quando bisogna inserire di continuo i tag, piuttosto complessi in verità, che indicano tutti i cambiamenti effettuati?&lt;/p&gt;&#xA;&lt;p&gt;SubEthaEdit può essere un&amp;rsquo;ottima risposta a questo problema.&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;Una funzione analoga ce l&amp;rsquo;ha anche Markdown, che usa i tag &lt;code&gt;{==&lt;/code&gt; e &lt;code&gt;==}&lt;/code&gt; per mettere in evidenza il testo compreso fra essi. Purtroppo non tutti gli interpreti Markdown supportano questi tag (fra cui, purtroppo, l&amp;rsquo;interprete usato da Wordpress.com), una particolarità che crea non poca confusione.&lt;br&gt;&#xA;Per aggirare il problema, si può usare la coppia di tag standard HTML5 &lt;code&gt;&amp;lt;mark&amp;gt;testo evidenziato&amp;lt;/mark&amp;gt;&lt;/code&gt;, che di default produce un testo &lt;mark&gt;con uno sfondo giallo&lt;/mark&gt; (ma si possono &lt;mark style=&#34;background-color: MediumSpringGreen&#34;&gt;usare&lt;/mark&gt; &lt;mark style=&#34;background-color: PapayaWhip&#34;&gt;facilmente&lt;/mark&gt; &lt;mark style=&#34;background-color: Cyan&#34;&gt;altri&lt;/mark&gt; &lt;mark style=&#34;background-color: Violet&#34;&gt;colori&lt;/mark&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;Per i più curiosi, i miei editor sono, in ordine di preferenza, &lt;a href=&#34;https://macromates.com/&#34;&gt;TextMate&lt;/a&gt;, &lt;a href=&#34;https://www.barebones.com/products/bbedit/&#34;&gt;BBEdit&lt;/a&gt; e &lt;a href=&#34;https://code.visualstudio.com/&#34;&gt;Visual Studio Code&lt;/a&gt;, che ho dovuto adottare al posto del defunto &lt;a href=&#34;https://github.com/atom/atom&#34;&gt;Atom&lt;/a&gt;. Uso anche la versione per macOS di &lt;a href=&#34;https://emacsformacosx.com/&#34;&gt;GNU Emacs&lt;/a&gt;, ma ammetto di farlo molto meno spesso di quanto vorrei.&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;Emacs dispone dell&amp;rsquo;&lt;a href=&#34;https://www.gnu.org/software/emacs/manual/html_node/emacs/Highlight-Interactively.html&#34;&gt;&lt;code&gt;highlight-changes-mode&lt;/code&gt;&lt;/a&gt; che avrebbe fatto perfettamente al caso mio, ma c&amp;rsquo;erano dei motivi pratici che mi impedivano di usarlo.&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;E comunque &lt;code&gt;diff&lt;/code&gt; lavora su due file diversi, una cosa che nel mio caso particolare avrebbe aggiunto un ulteriore livello di complicazione.&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;L&amp;rsquo;ho già detto ma è meglio ripetere: a differenza di altri strumenti che confrontano due file separati, uno contenente il testo originale e l&amp;rsquo;altro quello modificato, SEE opera in tempo reale e direttamente sul testo in lavorazione, semplificando parecchio il lavoro di revisione&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;li id=&#34;fn:6&#34;&gt;&#xA;&lt;p&gt;In effetti ci sarebbe un&amp;rsquo;altra opzione, usare &lt;a href=&#34;https://meldmerge.org/&#34;&gt;Meld&lt;/a&gt;. Ma fino a poco tempo fa, per motivi che mi sfuggono, Meld si rifiutava di partire sul mio Mac con macOS Monterey, per cui non ho provato nemmeno ad usarlo per questo lavoro. Da un po&amp;rsquo; però funziona, per cui potrebbe essere argomento per un prossimo articolo.&amp;#160;&lt;a href=&#34;#fnref:6&#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>SubEthaEdit, scrivere insieme in tempo reale</title>
      <link>https://static.233.196.69.159.clients.your-server.de/it/2023/10/30/subethaedit-scrivere-insieme-in-tempo-reale/</link>
      <pubDate>Mon, 30 Oct 2023 06:00:00 +0000</pubDate>
      <guid>https://static.233.196.69.159.clients.your-server.de/it/2023/10/30/subethaedit-scrivere-insieme-in-tempo-reale/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2023-10-30-subethaedit-scrivere-insieme-in-tempo-reale/annie-spratt-QckxruozjRg-unsplash.jpg&#34; alt=&#34;&#34;&gt;&#xA;&amp;ndash; &lt;em&gt;Fonte: &lt;a href=&#34;https://unsplash.com/@anniespratt&#34;&gt;Annie Spratt&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;&lt;a href=&#34;https://subethaedit.net/&#34;&gt;SubEthaEdit&lt;/a&gt; è in giro da un bel po&amp;rsquo; di tempo, se la memoria non mi inganna più o meno dai tempi di Tiger.&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; Quando uscì fece scalpore, perché per la prima volta dava la possibilità a più utenti di lavorare contemporaneamente allo stesso documento, con il limite che tutti i Mac dovevano essere connessi alla stessa rete locale.&lt;/p&gt;&#xA;&lt;p&gt;Oggi, fra &lt;a href=&#34;https://www.office.com&#34;&gt;Office 365&lt;/a&gt;, &lt;a href=&#34;https://www.microsoft.com/it-it/microsoft-teams&#34;&gt;Teams&lt;/a&gt;, &lt;a href=&#34;https://docs.google.com&#34;&gt;Google Documents&lt;/a&gt; (e naturalmente &lt;a href=&#34;https://it.overleaf.com/&#34;&gt;Overleaf&lt;/a&gt;), scrivere un testo in collaborazione fra vari utenti sparsi nel mondo sembra una cosa scontata,&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 20 anni fa era una funzione mai vista prima su un computer personale.&lt;/p&gt;&#xA;&lt;p&gt;Infatti, &lt;a href=&#34;https://web.archive.org/web/20130126195203/http://log.emonk.net/post/6539765532/a-short-and-slightly-biased-history-of-collaborative&#34;&gt;secondo uno degli autori&lt;/a&gt;, la scrittura collaborativa di un testo è stata inventata intorno alla metà degli anni &amp;lsquo;90 presso il solito Xerox PARC, ma fino a SubEthaEdit nessuno aveva pensato di applicarla ad un prodotto commerciale.&lt;/p&gt;&#xA;&lt;h4 id=&#34;leditor&#34;&gt;L&amp;rsquo;editor&lt;/h4&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://subethaedit.net/&#34;&gt;SubEthaEdit&lt;/a&gt; (SEE per gli amici) è un editor di testo puro, proprio come &lt;a href=&#34;https://macromates.com/&#34;&gt;TextMate&lt;/a&gt;, &lt;a href=&#34;https://www.barebones.com/products/bbedit/&#34;&gt;BBEdit&lt;/a&gt;, &lt;a href=&#34;https://www.sublimetext.com/&#34;&gt;Sublime Text&lt;/a&gt; o il defunto &lt;a href=&#34;https://github.com/atom/atom&#34;&gt;Atom&lt;/a&gt;, ormai soppiantato da &lt;a href=&#34;https://code.visualstudio.com/&#34;&gt;Visual Studio Code&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;&lt;/p&gt;&#xA;&lt;p&gt;SEE ha tutte le funzioni di base di un editor moderno, riconosce la sintassi dei principali linguaggi di programmazione (tranne R, accidenti!), così come di Markdown e di LaTeX, e può essere configurato in modo abbastanza dettagliato, per adattarsi al meglio ai gusti personali.&lt;/p&gt;&#xA;&lt;p&gt;A questo proposito, io preferisco visualizzare i caratteri nascosti (&lt;code&gt;Show: Invisible Characters&lt;/code&gt;) e sostituire i &lt;code&gt;tab&lt;/code&gt; con gli spazi (una abitudine da programmatore). Entrambe le modifiche si fanno nel pannelo &lt;code&gt;Editing&lt;/code&gt; delle Preferenze di SEE. Mi piace anche ingrandire leggermente il font di default a 12 punti e aumentare la spaziatura fra le linee al 110% per rendere il testo più leggibile e più consistente con gli altri editor che uso (pannello &lt;code&gt;Styles&lt;/code&gt;).&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2023-10-30-subethaedit-scrivere-insieme-in-tempo-reale/editing-custom.png&#34; alt=&#34;&#34;&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2023-10-30-subethaedit-scrivere-insieme-in-tempo-reale/styles-custom.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Rispetto ai mostri sacri citati prima, SEE manca di parecchie funzioni, fra cui alcune che ormai fanno parte del normale corredo di un editor moderno, come la possibilità di commentare rapidamente un blocco di codice, di aggiungere delle parentesi aperte e chiuse oppure dei simboli attorno ad un blocco di testo selezionato,&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; oppure di effettuare una selezione per colonne, utile in particolare quando si lavora con le tabelle.&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;SEE non ha nemmeno il completamento automatico del codice ma insomma, questa è una funzione supportata solo dagli editor più avanzati, quindi è un peccato veniale. Anche gli stili, i temi, o come volete chiamarli, sono pochi, ma almeno per me, che uso quasi sempre lo stile di default, questo è un non-problema.&lt;/p&gt;&#xA;&lt;p&gt;Peccato anche che non metta in evidenza automaticamente gli errori ortografici, ma che io sappia questo lo fa nativamente solo BBEdit ed è uno dei motivi per usarlo per scrivere dei testi in Markdowno o LaTeX.&lt;/p&gt;&#xA;&lt;p&gt;Molto utile, invece, la possibilità di avere visualizzazioni diverse dello stesso documento sia nella stessa finestra che in finestre separate, così come il conteggio in tempo reale del numero di caratteri, parole o linee di cui è composto un documento, una funzione che mi avrebbe aiutato moltissimo qualche mese fa.&lt;/p&gt;&#xA;&lt;p&gt;Per averlo, bisogna attivare dal menu &lt;code&gt;View&lt;/code&gt; la visualizzazione della barra di stato superiore e inferiore (che servirà fra poco), che riportano una serie di informazioni utili sul documento aperto fra cui, a destra della barra di stato superiore, proprio il numero di caratteri, parole o linee del documento. Cliccando sul numero si può cambiare ciclicamente il tipo di conteggio riportato.&lt;/p&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2023-10-30-subethaedit-scrivere-insieme-in-tempo-reale/view-status-bars.png&#34; alt=&#34;&#34;&gt;&lt;h4 id=&#34;scrittura-collaborativa&#34;&gt;Scrittura collaborativa&lt;/h4&gt;&#xA;&lt;p&gt;La caratteristica più interessante di SSE è il supporto nativo per la scrittura collaborativa, che permette a due o più utenti collegati alla stessa rete locale di lavorare contemporaneamente allo stesso documento.&lt;/p&gt;&#xA;&lt;p&gt;Prima di condividere un documento bisogna aprire il pannello &lt;code&gt;Collaboration&lt;/code&gt; delle Preferenze di SEE e assicurarsi di aver attivato l&amp;rsquo;opzione relativa (&lt;code&gt;Enable Collaboration&lt;/code&gt;) e di non essere invisibili agli altri utenti della rete (&lt;code&gt;Invisible to others on the Network&lt;/code&gt;).&lt;/p&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2023-10-30-subethaedit-scrivere-insieme-in-tempo-reale/collaboration-custom.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;È sufficiente ora cliccare sull&amp;rsquo;icona in basso a destra nella barra di stato (quella che assomiglia al simbolo del Wi-Fi ruotato) per rendere il documento disponibile agli altri utenti della rete. Questa circostanza viene indicata in modo evidente nella stessa barra di stato, dove compare una grossa icona colorata con le iniziali dell&amp;rsquo;utente che ha iniziato la condivisione. Per differenziare meglio i vari utenti è possibile personalizzare l&amp;rsquo;icona ed il colore associato a ciascun utente nel solito pannello &lt;code&gt;Collaboration&lt;/code&gt; delle Preferenze, come si può vedere nelle due immagini qui sotto.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2023-10-30-subethaedit-scrivere-insieme-in-tempo-reale/bottom-status-bar.png&#34; alt=&#34;&#34;&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2023-10-30-subethaedit-scrivere-insieme-in-tempo-reale/bottom-status-bar-custom-icon.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;A questo punto, se un altro utente esegue SubEthaEdit su un Mac collegato alla stessa rete locale, potrà accedere non solo alla lista dei suoi documenti locali più recenti, ma anche a quelli condivisi su cui può collaborare.&lt;/p&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2023-10-30-subethaedit-scrivere-insieme-in-tempo-reale/document-hub.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;Per farlo, dovrà cliccare sul nome del documento condiviso e aspettare di essere autorizzato a modificare o eventualmente soltanto a leggere il documento in questione, potendo così iniziare la sua attività di scrittura a quattro (o più) mani.&lt;/p&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2023-10-30-subethaedit-scrivere-insieme-in-tempo-reale/accept-sharing.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;Anche la barra di stato di SEE cambierà, mostrando le icone dei due (o più) utenti che stanno lavorando in contemporanea, con i colori associati a ciascun utente.&lt;/p&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2023-10-30-subethaedit-scrivere-insieme-in-tempo-reale/status-bar-collaboration-active.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;Questi colori sono fondamentali, perché permettono di valutare a colpo d&amp;rsquo;occhio chi ha effettuato ciascuna modifica. È anche possibile lavorare sulla stessa porzione di testo, correggendo e integrando ciò che ha scritto l&amp;rsquo;altro.&lt;/p&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2023-10-30-subethaedit-scrivere-insieme-in-tempo-reale/collaborative-editing.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;SEE non ha problemi nemmeno quando si prova a scrivere in contemporanea esattamente nello stesso punto, ma si limita ad inserire entrambi i caratteri, differenziandoli in base all&amp;rsquo;utente. Per quanto ci abbia provato non sono mai riuscito a mandarlo in crash con giochetti di questo tipo.&lt;/p&gt;&#xA;&lt;p&gt;In alternativa alla trafila di condivisione descritta prima, è anche possibile invitare esplicitamente a collaborare un altro utente che ha già aperto SEE sul suo Mac.&lt;/p&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2023-10-30-subethaedit-scrivere-insieme-in-tempo-reale/invite-collaboration.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;Inoltre, cliccando con il tasto destro del mouse sull&amp;rsquo;icona simil-Wi-Fi in basso a destra, è possibile definire a priori se il documento su cui si sta lavorando è modificabile dagli altri utenti, solo leggibile oppure è &lt;em&gt;bloccato&lt;/em&gt;. In quest&amp;rsquo;ultimo caso non viene condiviso in rete e potrà essere modificato solo in locale.&lt;/p&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2023-10-30-subethaedit-scrivere-insieme-in-tempo-reale/sharing-options.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;Insomma, le possibilità non mancano, ed anche se ormai dovremmo essere abituati a lavorare in rete sullo stesso file, qui tutto si svolge in modo molto fluido e intuitivo. Peccato solo per il limite della rete locale e per il fatto che SEE giri solo su macOS, due fattori che rendono il programma utile solo ad un numero piuttosto ristretto di utenti.&lt;/p&gt;&#xA;&lt;h4 id=&#34;conclusioni&#34;&gt;Conclusioni&lt;/h4&gt;&#xA;&lt;p&gt;SubEthaEdit è un discreto editor di testo per macOS, che diventa insostituibile quando si ha bisogno di utilizzare le sue funzioni di scrittura collaborativa. Devo ammettere, però, che finora ho sempre preferito i suoi fratelli maggiori, in particolare TextMate e BBEdit.&lt;/p&gt;&#xA;&lt;p&gt;Ma ultimammente ho scoperto una funzione piccola-piccola e molto specialistica di questo programma che, quando serve, si dimostra davvero insostituibile. Però di questo ne parlerò la &lt;a href=&#34;https://melabit.com/it/2023/11/27/modifiche-a-colpo-docchio-con-subethaedit/&#34;&gt;prossima volta&lt;/a&gt;.&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;Mi sono sbagliato di poco, secondo &lt;a href=&#34;https://en.wikipedia.org/wiki/SubEthaEdit&#34;&gt;Wikipedia&lt;/a&gt; la prima versione di SubEthaEdit risale ai tempi di Panther (Mac OS X 10.3), il sistema operativo immediatamente precedente a Tiger (10.4).&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;Ma conosco fin troppi utenti rimasti ancorati allo scambio via email di una sequenza interminabile di &lt;code&gt;documento_v1.docx&lt;/code&gt;,&lt;code&gt;documento_v2.docx&lt;/code&gt;, &lt;code&gt;documento_v2b.docx&lt;/code&gt;, &lt;code&gt;documento_v2b_ultima_versione.docx&lt;/code&gt;, seguiti inevitabilmente da &lt;code&gt;documento_v2b_straultimissima_versione.docx&lt;/code&gt; e da &lt;code&gt;documento_v2b_sara_la_volta_buona.docx&lt;/code&gt;&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;Chi rimpiange Atom può provare &lt;a href=&#34;https://pulsar-edit.dev/&#34;&gt;Pulsar&lt;/a&gt;, un &lt;em&gt;fork&lt;/em&gt; open source di Atom che aspira ad essere una versione migliorata e più moderna del genitore, ma che su macOS ha sembra avere ancora problemi di prestazioni.&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;Con gli altri editor quando scrivo in Markdown sono abituato a selezionare un blocco di testo e a scrivere &lt;code&gt;_&lt;/code&gt; o &lt;code&gt;**&lt;/code&gt; per circondarlo con i tag che lo fanno visualizzare rispettivamente in italico o in grassetto. Con SEE non funziona e questa mancanza mi ha fatto penare durante la scrittura di questo articolo.&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;Ho proposto di &lt;a href=&#34;https://github.com/subethaedit/SubEthaEdit/issues/243&#34;&gt;aggiungere queste funzioni&lt;/a&gt; sul &lt;a href=&#34;https://github.com/subethaedit/SubEthaEdit&#34;&gt;repository GitHub&lt;/a&gt; del programma ma finora non ho ricevuto alcun feedback dagli sviluppatori. Vedo anche che la maggior parte delle richieste rimangono inascoltate ed è probabile che la mia farà la stessa fine.&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>Script per tutti i giorni: lo script è il comando</title>
      <link>https://static.233.196.69.159.clients.your-server.de/it/2019/04/12/script-per-tutti-i-giorni-lo-script-e-il-comando/</link>
      <pubDate>Fri, 12 Apr 2019 18:00:00 +0000</pubDate>
      <guid>https://static.233.196.69.159.clients.your-server.de/it/2019/04/12/script-per-tutti-i-giorni-lo-script-e-il-comando/</guid>
      <description>&lt;img src=&#34;http://storage.datormuseum.se/u/96935524/Datormusuem/VT50/VT50-RT11-small.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;Nelle puntate precedenti abbiamo visto come scrivere dei semplici script in &lt;code&gt;bash&lt;/code&gt; o in &lt;code&gt;awk&lt;/code&gt; che risolvono un problema assai specifico, è vero, ma che possono anche costituire una buona base di partenza per affrontare argomenti più complessi (i link alle puntate precedenti si trovano alla fine dell&amp;rsquo;articolo).&lt;/p&gt;&#xA;&lt;p&gt;In particolare, nella &lt;a href=&#34;https://melabit.wordpress.com/2018/12/30/script-per-tutti-i-giorni-shell-e-parametri/&#34;&gt;terza puntata&lt;/a&gt; abbiamo imparato come rendere i nostri script &lt;em&gt;quasi&lt;/em&gt; indistinguibili dai normali comandi del Terminale: (1) si aggiunge in testa allo script lo &lt;a href=&#34;https://en.wikipedia.org/wiki/Shebang_%28Unix%29&#34;&gt;shebang&lt;/a&gt;, cioè la sequenza di caratteri &lt;code&gt;#!&lt;/code&gt;, seguita dal percorso completo al programma da utilizzare per eseguire lo script,&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; (2) si usa il comando &lt;code&gt;chmod&lt;/code&gt; per rendere lo script eseguibile (almeno) all’utente attuale del Mac,&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ chmod u+x nomescript&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;dove &lt;code&gt;nomescript&lt;/code&gt; è il nome generico dello script che vogliamo rendere eseguibile (ad esempio lo script &lt;code&gt;convert_title.sh&lt;/code&gt; della &lt;a href=&#34;https://melabit.wordpress.com/2018/12/30/script-per-tutti-i-giorni-shell-e-parametri/&#34;&gt;terza puntata&lt;/a&gt;).&lt;/p&gt;&#xA;&lt;p&gt;Il &amp;ldquo;quasi&amp;rdquo; di prima dipende dal fatto che, anche con queste modifiche, ogni volta che eseguiamo lo script dobbiamo indicare esplicitamente la directory dove si trova. Ad esempio, se ci siamo spostati con &lt;code&gt;cd&lt;/code&gt; nella directory che contiene &lt;code&gt;nomescript&lt;/code&gt;, per eseguirlo script dobbiamo scrivere&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ ./nomescript&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;premettendo quindi al nome dello script il percorso (&lt;code&gt;./&lt;/code&gt;) alla directory corrente.&lt;/p&gt;&#xA;&lt;p&gt;Invece, quando eseguiamo uno dei comandi del sistema operativo, ci basta scrivere il nome del comando nel Terminale e il sistema operativo (o più precisamente la &lt;a href=&#34;https://it.wikipedia.org/wiki/Shell_Unix&#34;&gt;shell&lt;/a&gt; che stiamo usando, che in genere è &lt;code&gt;bash&lt;/code&gt;)&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; va a cercare il programma sul disco rigido e lo esegue senza troppi problemi.&lt;/p&gt;&#xA;&lt;p&gt;Qual&amp;rsquo;è il meccanismo che permette alla shell di &lt;em&gt;sapere&lt;/em&gt; in quale directory si trovano i comandi che eseguiamo nel Terminale? Esiste un modo per replicare questo comportamento anche per i nostri script, rendendoli praticamente indistinguibili dai comandi intrinseci del sistema operativo?&lt;/p&gt;&#xA;&lt;h4 id=&#34;variabili-di-ambiente&#34;&gt;Variabili di ambiente&lt;/h4&gt;&#xA;&lt;p&gt;In realtà non c&amp;rsquo;è niente di sofisticato o di particolarmente intelligente in quello che fa la shell. La chiave di tutto sta nelle &lt;a href=&#34;https://it.wikipedia.org/wiki/Variabile_d%27ambiente_%28Unix%29&#34;&gt;variabili di ambiente&lt;/a&gt; di &lt;code&gt;bash&lt;/code&gt;, delle variabili speciali usate fra l&amp;rsquo;altro per specificare le impostazioni di lavoro della shell. Se lanciamo il Terminale ed eseguiamo il comando&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ env&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;otterremo un lungo elenco con tutte le variabili di ambiente definite da &lt;code&gt;bash&lt;/code&gt;, che per convenzione vengono scritte in maiuscolo. Fra queste spiccano &lt;code&gt;HOME&lt;/code&gt;, che definisce il percorso alla cartella Home dell&amp;rsquo;utente che sta usando il Mac, &lt;code&gt;USER&lt;/code&gt; che riporta il &lt;code&gt;nome account&lt;/code&gt; (o &lt;code&gt;nome breve&lt;/code&gt;) dell&amp;rsquo;utente, e &lt;code&gt;PWD&lt;/code&gt; che contiene il percorso alla directory in cui ci troviamo (percorso che, come già visto, &lt;a href=&#34;https://melabit.wordpress.com/2019/01/30/script-per-tutti-i-giorni-ricapitoliamo/&#34;&gt;si può ricavare&lt;/a&gt; con il comando &lt;code&gt;pwd&lt;/code&gt;, ma guarda la combinazione).&lt;/p&gt;&#xA;&lt;p&gt;Se siamo interessati solo ad una particolare variabile di ambiente, possiamo stamparla con &lt;code&gt;echo&lt;/code&gt; seguito dal nome della variabile di ambiente, che però deve essere preceduto dal simbolo &lt;code&gt;$&lt;/code&gt;. Ad esempio&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ echo $HOME&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;stampa nel Terminale il valore della variabile di ambiente &lt;code&gt;HOME&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Fra tutte le variabili di ambiente elencate da &lt;code&gt;env&lt;/code&gt;, quella che ci interessa di più in questo momento è &lt;code&gt;PATH&lt;/code&gt;, che contiene una serie di percorsi di directory separati dal simbolo &lt;code&gt;:&lt;/code&gt;. Nella configurazione di default il valore del PATH è&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ echo $PATH&#xA;PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;h4 id=&#34;shell-e-path&#34;&gt;Shell e PATH&lt;/h4&gt;&#xA;&lt;p&gt;È proprio il PATH che permette alla shell di trovare da sola i comandi di sistema. Ogni volta che eseguiamo un comando nel Terminale, la shell lo cerca nelle directory indicate nel PATH, esaminandole una dopo l&amp;rsquo;altra nell&amp;rsquo;ordine in cui sono scritte. Se trova il comando lo esegue immediatamente, senza preoccuparsi di esaminare le directory successive, altrimenti dà un errore di &lt;code&gt;command not found&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Di conseguenza, l&amp;rsquo;ordine in cui sono elencati i percorsi nel PATH è importante. Questa particolarità può essere sfruttata per sostituire un comando del sistema operativo con una versione più recente, senza però cancellare il comando originale: se il comando originale è situato in &lt;code&gt;/usr/bin&lt;/code&gt; o in &lt;code&gt;/bin&lt;/code&gt;, basta installare la versione aggiornata in una directory del PATH che precede queste due directory, come ad esempio &lt;code&gt;/usr/local/bin&lt;/code&gt; (che nei sistemi Unix serve proprio per installare il software &amp;ldquo;locale&amp;rdquo; non gestito direttamente dal sistema operativo).&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;La seconda conseguenza è che, se modifichiamo il PATH aggiungendo altre directory in testa o in fondo all&amp;rsquo;elenco originale, possiamo &lt;em&gt;obbligare&lt;/em&gt; la shell a cercare i comandi anche in queste nuove directory non presenti nella configurazione di default. Che è proprio quello che ci serve.&lt;/p&gt;&#xA;&lt;p&gt;Prima di andare avanti una avvertenza &lt;strong&gt;FONDAMENTALE&lt;/strong&gt;. Possiamo aggiungere senza troppi problemi delle nuove directory al PATH di default, ma non dobbiamo &lt;strong&gt;MAI MAI MAI&lt;/strong&gt; rimuovere le directory presenti nella configurazione originale del PATH, in particolare le quattro directory &lt;code&gt;/usr/bin:/bin:/usr/sbin:/sbin&lt;/code&gt; (leggetele ad alta voce e notate l&amp;rsquo;assonanza). Cancellare per errore una di queste directory dal PATH significa non poter più usare il Mac, o perlomeno dover usare degli strumenti non alla portata di tutti per rimettere a posto le cose.&lt;/p&gt;&#xA;&lt;p&gt;Siete avvertiti!!!&lt;/p&gt;&#xA;&lt;h4 id=&#34;modificare-il-path&#34;&gt;Modificare il PATH&lt;/h4&gt;&#xA;&lt;p&gt;Per aggiungere (o rimuovere) delle directory al PATH di default del nostro Mac dobbiamo modificare con un &lt;a href=&#34;https://melabit.wordpress.com/2018/12/05/script-per-tutti-i-giorni-dalla-linea-di-comando-al-programma/&#34;&gt;editor di testo&lt;/a&gt; (non con un wordprocessor!) il file &lt;code&gt;.bashrc&lt;/code&gt; situato nella nostra &lt;code&gt;HOME&lt;/code&gt;. Questo introduce una piccola complicazione, perché il file &lt;code&gt;~/.bashrc&lt;/code&gt; è un file nascosto, non accessibile direttamente dal Finder.&lt;/p&gt;&#xA;&lt;p&gt;Se usiamo &lt;code&gt;emacs&lt;/code&gt; o &lt;code&gt;vi&lt;/code&gt; possiamo aprire &lt;code&gt;.bashrc&lt;/code&gt; direttamente dal Terminale. Ci basta spostarci nella &lt;code&gt;HOME&lt;/code&gt;&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ cd ~&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;ed eseguire&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ emacs .bashrc&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;oppure&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ vi .bashrc&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Se questi editor ci sembrano troppo difficili da usare (e lo sono!), possiamo usare &lt;code&gt;nano&lt;/code&gt; che, come &lt;code&gt;emacs&lt;/code&gt; e &lt;code&gt;vi&lt;/code&gt;, si trova installato di default su ogni Mac&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ nano .bashrc&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Anche se &lt;a href=&#34;https://www.nano-editor.org/&#34;&gt;nano&lt;/a&gt; è un editor piuttosto limitato rispetto ai due mostri sacri, è molto comodo per modificare velocemente i file di sistema senza dover affrontare una lunga fase di apprendimento.&lt;/p&gt;&#xA;&lt;p&gt;Se invece preferiamo usare un &lt;a href=&#34;https://melabit.wordpress.com/2018/12/05/script-per-tutti-i-giorni-dalla-linea-di-comando-al-programma/&#34;&gt;editor grafico&lt;/a&gt; come BBEdit, TextMate, Atom o simili, la procedura esatta per aprire un file nascosto dipende dall&amp;rsquo;editor scelto.&lt;/p&gt;&#xA;&lt;p&gt;Alcuni editor permettono di installare un comando di Terminale con cui lanciare l&amp;rsquo;editor dalla linea di comando: &lt;code&gt;mate&lt;/code&gt; per TextMate, &lt;code&gt;atom&lt;/code&gt; e &lt;code&gt;bbedit&lt;/code&gt; per&amp;hellip; lo sapete già. Anche con questi editor, quindi, possiamo aprire &lt;code&gt;.bashrc&lt;/code&gt; dal Terminale con uno dei comandi seguenti&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ mate .bashrc &#xA;$ atom .bashrc&#xA;$ bbedit .bashrc&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Con BBEdit e TextMate, la finestra di apertura file dispone di un tasto &lt;code&gt;Opzioni&lt;/code&gt; con il quale si può decidere di mostrare (e quindi di aprire) anche i file nascosti&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://melabit.files.wordpress.com/2019/04/textmate-options.png&#34; alt=&#34;&#34;&gt;&#xA;&lt;img src=&#34;https://melabit.files.wordpress.com/2019/04/textmate-hidden.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Ma il metodo più generale per modificare un file nascosto con un editor grafico è quello di usare il comando &lt;code&gt;open&lt;/code&gt; dal Terminale&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ cd ~&#xA;$ open -a &amp;quot;TextMate&amp;quot; .bashrc&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;dove l&amp;rsquo;opzione &lt;code&gt;-a&lt;/code&gt; permette di specificare l&amp;rsquo;applicazione con cui aprire il file indicato.&lt;/p&gt;&#xA;&lt;p&gt;Qualunque sia il metodo utilizzato, alla fine ci ritroveremo con il file &lt;code&gt;.bashrc&lt;/code&gt; pronto per essere modificato. Tutto quello che dobbiamo fare è aggiungere questa linea alla fine di &lt;code&gt;.bashrc&lt;/code&gt;&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;export PATH=$PATH:~/Development&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;che istruisce la shell di andare a cercare i comandi da eseguire nel Terminale anche nella directory &lt;code&gt;~/Development&lt;/code&gt;, dove &lt;a href=&#34;https://melabit.wordpress.com/2018/12/30/script-per-tutti-i-giorni-shell-e-parametri/&#34;&gt;abbiamo deciso di salvare&lt;/a&gt; tutti gli script che sviluppiamo.&lt;/p&gt;&#xA;&lt;p&gt;Una volta fatta questa semplice modifica, salviamo il file &lt;code&gt;.bashrc&lt;/code&gt; e usciamo dall&amp;rsquo;editor. Chiudiamo e riapriamo il Terminale per &lt;em&gt;costringere&lt;/em&gt; la shell a rileggere il file &lt;code&gt;.bashrc&lt;/code&gt; (oppure eseguiamo il comando &lt;code&gt;$ source ~/.bashrc&lt;/code&gt; senza chiudere il Terminale) e proviamo di nuovo ad eseguire &lt;code&gt;nomescript&lt;/code&gt;, ma questa volta senza premettere il percorso alla directory dove si trova&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ nomescript&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Questa volta lo script funzionerà senza bisogno di &lt;em&gt;aiutini&lt;/em&gt;, proprio come se fosse un normale comando di sistema. Per verificare che tutto funzioni come descritto possiamo provare ad eseguire uno degli script della &lt;a href=&#34;https://melabit.wordpress.com/2018/12/30/script-per-tutti-i-giorni-shell-e-parametri/&#34;&gt;terza&lt;/a&gt; o della &lt;a href=&#34;https://melabit.wordpress.com/2019/02/18/script-per-tutti-i-giorni-entra-in-scena-awk/&#34;&gt;quinta&lt;/a&gt; puntata.&lt;/p&gt;&#xA;&lt;h4 id=&#34;ma-non-è-ancora-finita&#34;&gt;Ma non è ancora finita&amp;hellip;&lt;/h4&gt;&#xA;&lt;p&gt;Bisogna ammetterlo, aggiungere al &lt;code&gt;$PATH&lt;/code&gt; una directory &lt;em&gt;qualunque&lt;/em&gt; come &lt;code&gt;~/Development&lt;/code&gt; può andar bene per fare delle prove veloci, ma non è per niente elegante. Sarebbe molto meglio adeguarsi alle convenzioni di Unix, secondo le quali i programmi eseguibili devono trovarsi in una directory denominata &lt;code&gt;bin&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Niente di più facile, possiamo creare facilmente una directory &lt;code&gt;bin&lt;/code&gt; nella nostra &lt;code&gt;HOME&lt;/code&gt;&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ cd&#xA;$ mkdir bin&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;e decidere di tenere gli script in fase di sviluppo nella directory &lt;code&gt;~/Development&lt;/code&gt;, per poi spostarli (o meglio copiarli) in &lt;code&gt;~/bin&lt;/code&gt; quando sono pronti per essere usati. Naturalmente dovremo modificare di conseguenza il file &lt;code&gt;.bashrc&lt;/code&gt;, aggiungendo alla fine del file&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;export PATH=$PATH:~/bin&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;al posto di &lt;code&gt;export PATH=$PATH:~/Development&lt;/code&gt; visto sopra.&lt;/p&gt;&#xA;&lt;p&gt;Non ci piace vedere con il Finder la directory &lt;code&gt;bin&lt;/code&gt; nella &lt;code&gt;HOME&lt;/code&gt;? Possiamo nasconderla con facilità, basta solo eseguire dal solito Terminale il comando&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ chflags hidden ~/bin&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;(il comando duale &lt;code&gt;$ chflags nohidden ~/bin&lt;/code&gt; rende di nuovo visibile la directory).&lt;/p&gt;&#xA;&lt;h4 id=&#34;conclusioni&#34;&gt;Conclusioni&lt;/h4&gt;&#xA;&lt;p&gt;Per i più pigri che non vogliono andare a rileggere le puntate precedenti per provare le novità descritte nell&amp;rsquo;articolo, ecco un semplice script in &lt;code&gt;bash&lt;/code&gt; che mostra la data e l&amp;rsquo;ora corrente nel formato standard Unix e in una forma molto più dettagliata (e per una volta anche nella nostra lingua)&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;#!/bin/bash&#xA;&#xA;year=`date +%Y`&#xA;month=`date +%B`&#xA;day=`date +%d`&#xA;hour=`date +%H`&#xA;minute=`date +%M`&#xA;second=`date +%S`&#xA;dayofyear=`date +%j`&#xA;weekday=`date +%A`&#xA;&#xA;echo `date`&#xA;echo -n &amp;#34;Oggi è $weekday $day $month $year, &amp;#34;&#xA;echo -n &amp;#34;il $dayofyear-esimo giorno dell&amp;#39;anno, &amp;#34;&#xA;echo &amp;#34;e sono le ore $hour:$minute:$second&amp;#34;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Copiamo lo script nell&amp;rsquo;editor preferito, salviamolo in &lt;code&gt;~/bin&lt;/code&gt; (o in &lt;code&gt;~/Development&lt;/code&gt;) con il nome &lt;code&gt;data_estesa&lt;/code&gt;, rendiamolo eseguibile con &lt;code&gt;chmod&lt;/code&gt; e proviamo che funzioni come previsto&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ data_estesa&#xA;Fri Apr 12T17:28:00:50 CEST 2019&#xA;Oggi è Venerdì 12 Aprile 2019, il 102-esimo giorno dell&#39;anno, e sono le ore 17:28:50&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;E per oggi è davvero tutto.&lt;/p&gt;&#xA;&lt;h4 id=&#34;articoli-precedenti&#34;&gt;Articoli precedenti&lt;/h4&gt;&#xA;&lt;p&gt;Per leggere gli articoli precedenti della serie basta cliccare sui link qui sotto.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Prima puntata, &lt;a href=&#34;https://melabit.wordpress.com/2018/11/23/script-per-tutti-i-giorni-semplici-modifiche-alle-stringhe-di-testo/&#34;&gt;Script per tutti i giorni: semplici modifiche alle stringhe di testo&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;Seconda puntata, &lt;a href=&#34;https://melabit.wordpress.com/2018/12/05/script-per-tutti-i-giorni-dalla-linea-di-comando-al-programma/&#34;&gt;Script per tutti i giorni: dalla linea di comando al programma&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;Terza puntata, &lt;a href=&#34;https://melabit.wordpress.com/2018/12/30/script-per-tutti-i-giorni-shell-e-parametri/&#34;&gt;Script per tutti i giorni: shell e parametri&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;Quarta puntata, &lt;a href=&#34;https://melabit.wordpress.com/2019/01/30/script-per-tutti-i-giorni-ricapitoliamo/&#34;&gt;Script per tutti i giorni: ricapitoliamo&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;Quinta puntata, &lt;a href=&#34;https://melabit.wordpress.com/2019/02/18/script-per-tutti-i-giorni-entra-in-scena-awk/&#34;&gt;Script per tutti i giorni: entra in scena awk&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&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;Sul Mac uno script in &lt;code&gt;bash&lt;/code&gt; richiede il percorso &lt;code&gt;/bin/bash&lt;/code&gt;, uno in &lt;code&gt;awk&lt;/code&gt; &lt;em&gt;puro&lt;/em&gt; &lt;code&gt;/usr/bin/awk&lt;/code&gt;, mentre uno nella ormai veneranda versione 2.7 di &lt;code&gt;python&lt;/code&gt; installata di default in macOS richiede &lt;code&gt;/usr/bin/python&lt;/code&gt; (ma ci vuol poco ad installare &lt;code&gt;python3&lt;/code&gt; con &lt;a href=&#34;https://brew.sh&#34;&gt;Homebrew&lt;/a&gt; o &lt;a href=&#34;https://conda.io/en/latest/&#34;&gt;Conda&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;Ma ci sono anche &lt;code&gt;zsh&lt;/code&gt;, &lt;code&gt;ksh&lt;/code&gt;, &lt;code&gt;tcsh&lt;/code&gt;, &lt;code&gt;fish&lt;/code&gt;, solo per menzionare le shell più note.&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;È esattamente quello che fa &lt;a href=&#34;https://brew.sh&#34;&gt;Homebrew&lt;/a&gt;, uno strumento utilissimo (di cui ho &lt;a href=&#34;https://melabit.wordpress.com/2014/04/29/homebrew-software-per-il-mac-fatto-in-casa/&#34;&gt;scritto parecchio&lt;/a&gt; su questo blog) che utilizza &lt;code&gt;/usr/local/bin&lt;/code&gt; per installare un gran numero di strumenti software provenienti dal mondo Linux e non disponibili su macOS, oppure per aggiornare a versioni più recenti quelli, normalmente piuttosto datati, forniti da Apple insieme al sistema operativo.&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>Script per tutti i giorni: entra in scena awk</title>
      <link>https://static.233.196.69.159.clients.your-server.de/it/2019/02/18/script-per-tutti-i-giorni-entra-in-scena-awk/</link>
      <pubDate>Mon, 18 Feb 2019 18:00:00 +0000</pubDate>
      <guid>https://static.233.196.69.159.clients.your-server.de/it/2019/02/18/script-per-tutti-i-giorni-entra-in-scena-awk/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;https://www.viscountinstruments.it/wp-content/uploads/2020/01/ebano_3-600x433.jpg&#34; alt=&#34;&#34;&gt;&#xA;&amp;ndash; &lt;em&gt;&lt;a href=&#34;https://www.viscountinstruments.it/instrument/a-w-k-keyboard/&#34;&gt;Tastiera A.W.K., Viscount Instruments&lt;/a&gt;&lt;/em&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Nelle prime tre puntate di questa serie abbiamo imparato a scrivere uno script in &lt;code&gt;bash&lt;/code&gt; per trasformare una stringa di testo in modo che segua delle  convenzioni ben determinate a priori (qui i link alla &lt;a href=&#34;https://melabit.wordpress.com/2018/11/23/script-per-tutti-i-giorni-semplici-modifiche-alle-stringhe-di-testo/&#34;&gt;prima&lt;/a&gt;, &lt;a href=&#34;https://melabit.wordpress.com/2018/12/05/script-per-tutti-i-giorni-dalla-linea-di-comando-al-programma/&#34;&gt;seconda&lt;/a&gt; e &lt;a href=&#34;https://melabit.wordpress.com/2018/12/30/script-per-tutti-i-giorni-shell-e-parametri/&#34;&gt;terza&lt;/a&gt; puntata).&lt;/p&gt;&#xA;&lt;p&gt;In questo caso particolare, la stringa risultante dalla trasformazione deve essere scritta tutta in minuscolo e non deve contenere apostrofi o altri caratteri speciali, a parte il trattino usato come separatore di parole. L&amp;rsquo;idea è quella di usare questa stringa, insieme alla data di pubblicazione del post, per dare un nome standard e facilmente rintracciabile al file Markdown che contiene il testo del post stesso, &lt;a href=&#34;https://melabit.wordpress.com/2018/11/23/script-per-tutti-i-giorni-semplici-modifiche-alle-stringhe-di-testo/&#34;&gt;utilizzando il formato&lt;/a&gt; &lt;code&gt;YYYY-MM-DD-titolo-del-post.md&lt;/code&gt;, dove &lt;code&gt;YYYY&lt;/code&gt; indica l’anno, &lt;code&gt;MM&lt;/code&gt; il mese e &lt;code&gt;DD&lt;/code&gt; il giorno di pubblicazione.&lt;/p&gt;&#xA;&lt;p&gt;L&amp;rsquo;approccio &lt;a href=&#34;https://melabit.wordpress.com/2018/12/30/script-per-tutti-i-giorni-shell-e-parametri/&#34;&gt;seguito finora&lt;/a&gt; è utile per imparare i fondamenti della programmazione in &lt;code&gt;bash&lt;/code&gt;, ma manca decisamente di praticità. Partire dal titolo e dalla data di pubblicazione presenti nell&amp;rsquo;intestazione del post per arrivare al nome completo del file richiede un certo lavoro di copia e incolla fra l&amp;rsquo;editor, il Finder e il Terminale, e gli errori sono sempre in agguato.&lt;/p&gt;&#xA;&lt;p&gt;Quello che ci vuole è uno script che renda il processo completamente automatico, rinominando il file Markdown a partire dal contenuto del documento stesso.&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;Si potrebbe benissimo fare anche con &lt;code&gt;bash&lt;/code&gt;, ma perché complicarsi la vita quando c&amp;rsquo;è uno strumento fatto apposta per analizzare ed estrarre dei dati dai file di testo?&lt;/p&gt;&#xA;&lt;h4 id=&#34;awk-questo-sconosciuto&#34;&gt;AWK, questo sconosciuto&lt;/h4&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/onetrueawk/awk&#34;&gt;AWK&lt;/a&gt; è un linguaggio di programmazione interpretato sviluppato negli anni &amp;lsquo;70 presso i &lt;a href=&#34;https://it.wikipedia.org/wiki/Bell_Laboratories&#34;&gt;Bell Labs&lt;/a&gt;, il famosissimo centro di ricerca americano che ci ha dato il transistor, il laser, Unix e il C (e moltissimo altro). AWK è stato sviluppato da Alfred Aho, Peter Weinberger e Brian Kernighan, tre grandi studiosi di &lt;em&gt;computer science&lt;/em&gt;, fra i quali spicca il terzo, coautore insieme a Dennis Ritchie di &lt;a href=&#34;https://archive.org/stream/CProgLangBooksCollection/1_TheCProgLang-2ndEd-RitchieKernighan#page/n17/mode/2up&#34;&gt;The C Programming Language&lt;/a&gt;, il volume di riferimento sul linguaggio C, noto anche semplicemente come &amp;ldquo;K&amp;amp;R&amp;rdquo; dai cognomi dei due autori.&lt;/p&gt;&#xA;&lt;p&gt;Alla base di AWK c&amp;rsquo;è l&amp;rsquo;idea di elaborare un file di testo una riga alla volta, controllando che la riga in esame soddisfi una o più condizioni prestabilite ed eseguendo le azioni programmate per ciascuna di queste condizioni&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;    condizione #1: {azione #1}&#xA;    condizione #2: {azione #2}&#xA;    ...&#xA;    condizione #N: {azione #N}   &#xA;    &#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Per AWK un file di testo è costituito da un certo numero di righe (&lt;em&gt;record&lt;/em&gt;), ciascuna delle quali è suddivisa in uno o più campi (&lt;em&gt;field&lt;/em&gt;), separati fra loro da un &lt;em&gt;separatore di campo&lt;/em&gt;, che di default è lo spazio ma che può essere modificato a piacere. Per riferirsi a ciascun campo AWK usa le variabili speciali &lt;code&gt;$1&lt;/code&gt;, &lt;code&gt;$2&lt;/code&gt; e così via, dove il numero indica la posizione del campo all&amp;rsquo;interno della riga. La variabile &lt;code&gt;$0&lt;/code&gt; contiene l&amp;rsquo;intera riga corrente.&lt;/p&gt;&#xA;&lt;p&gt;Tutto qui? Più o meno. C&amp;rsquo;è (quasi) solo da aggiungere che AWK prevede due azioni speciali opzionali, racchiuse fra i blocchi &lt;code&gt;BEGIN {...}&lt;/code&gt;, &lt;code&gt;END {...}&lt;/code&gt;, che servono per eseguire le operazioni preliminari e conclusive necessarie per il buon funzionamento del programma, ad esempio per definire il separatore di campo. Un programma completo in AWK ha quindi una struttura di questo tipo,&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;    BEGIN { istruzione&#xA;            istruzione&#xA;            ....&#xA;          }&#xA;    &#xA;    condizione #1: { istruzione&#xA;                     istruzione&#xA;                     ....&#xA;                   }&#xA;    condizione #2: { istruzione&#xA;                     istruzione&#xA;                     ....&#xA;                   }&#xA;&#xA;    ...&#xA;    condizione #N: { istruzione&#xA;                     istruzione&#xA;                     istruzione&#xA;                     ....&#xA;                   }&#xA;&#xA;     END { istruzione&#xA;           istruzione&#xA;           ....&#xA;         }&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;dove come già detto i blocchi &lt;code&gt;BEGIN {...}&lt;/code&gt;, &lt;code&gt;END {...}&lt;/code&gt; sono opzionali.&lt;/p&gt;&#xA;&lt;p&gt;Nonostante la fama dei suoi autori, AWK è poco utilizzato, molto meno di quanto meriterebbe, i programmatori del mondo UNIX preferiscono usare strumenti più semplici ma meno potenti come &lt;code&gt;sed&lt;/code&gt; (che abbiamo già incontrato nelle &lt;a href=&#34;https://melabit.wordpress.com/2018/11/23/script-per-tutti-i-giorni-semplici-modifiche-alle-stringhe-di-testo/&#34;&gt;puntate&lt;/a&gt; &lt;a href=&#34;https://melabit.wordpress.com/2018/12/05/script-per-tutti-i-giorni-dalla-linea-di-comando-al-programma/&#34;&gt;precedenti&lt;/a&gt;) o il declinante &lt;code&gt;perl&lt;/code&gt;, un linguaggio di manipolazione di file di testo perfetto per i programmatori che mitizzano Tafazzi.&lt;/p&gt;&#xA;&lt;p&gt;AWK invece ha il giusto equilibrio di potenza e semplicità d&amp;rsquo;uso ed è uno strumento perfetto se gli si chiede di fare quello per cui è stato ideato, elaborare informazioni strutturate contenute in file di testo.&lt;/p&gt;&#xA;&lt;p&gt;Per fortuna AWK è installato di default in macOS e in Linux, oltre che in tutti i sistemi operativi basati su UNIX che si trovano in giro, per cui per provarlo basta lanciare il Terminale ed eseguire il comando &lt;code&gt;awk&lt;/code&gt;. In realtà ci sono in giro almeno due versioni diverse di AWK. In macOS è installato &lt;code&gt;awk&lt;/code&gt; &lt;em&gt;liscio&lt;/em&gt;, la versione del linguaggio definita dai tre autori originali nel volume &lt;a href=&#34;https://archive.org/details/pdfy-MgN0H1joIoDVoIC7&#34;&gt;The AWK programming language&lt;/a&gt;. Su Linux, invece, si trova in genere &lt;code&gt;gawk&lt;/code&gt;, una &lt;a href=&#34;https://www.gnu.org/software/gawk/manual/&#34;&gt;implementazione&lt;/a&gt; del linguaggio della Free Software Foundation pienamente compatibile con &lt;code&gt;awk&lt;/code&gt;, a cui sono state aggiunte alcune estensioni piuttosto utili. Installare &lt;code&gt;gawk&lt;/code&gt; su macOS è facile per chi usa &lt;a href=&#34;https://melabit.wordpress.com/2014/04/29/homebrew-software-per-il-mac-fatto-in-casa/&#34;&gt;Homebrew&lt;/a&gt;, dal Terminale&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ brew install gawk&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Da ora in poi per semplicità farò cadere la distinzione fatta finora fra AWK, il linguaggio di programmazione, e &lt;code&gt;awk&lt;/code&gt;, l&amp;rsquo;interprete del linguaggio, usando sempre e solo il termine awk per riferirmi ad entrambi.&lt;/p&gt;&#xA;&lt;h4 id=&#34;un-programma-banale-in-awk&#34;&gt;Un programma banale in awk&lt;/h4&gt;&#xA;&lt;p&gt;Per avere una idea di cosa può fare awk, ecco un piccolissimo (e rozzo) programma di esempio,&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;BEGIN { FS = &amp;#34;,&amp;#34;&#xA;        OFS = &amp;#34;, &amp;#34;&#xA;      }&#xA;&#xA;$1 ~ /Violanda/ { $1 = &amp;#34;Jolanda&amp;#34; }&#xA;                { print $2, $1, $3, $6, $4, $5 }&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;che applicato ad un elenco di indirizzi come questo,&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;NOME,COGNOME,INDIRIZZO,LOCALITA,PROVINCIA,CAP&#xA;Massino,Nardini,Via Roma 8,Grana,AT,14031&#xA;Primo,Sabbatini,Via C. Cattaneo 50,Cala di Volpe,SS,07020&#xA;Giuseppe,Marino,Via C. Alberto 75,Barni,CO,22030&#xA;Ivano,Costa,Via Guantai Nuovi 29,Ischia,NA,80077&#xA;Margherita,Davide,Via Nuova Agnano 83,Rufina,FI,50068&#xA;Daphne,Lettiere,Via R. Conforti 67,Castel Di Ieri,AQ,67020&#xA;Violanda,Lori,Via A. Manzoni 101,Parona,PV,27020&#xA;Luigia,Cremonesi,Via Castelfidardo 145,Cittadella Del Capo,CS,87020&#xA;Fiore,Mucciano,Via Valpantena 120,Buccino Stazione,SA,84020&#xA;Sandra,Greco,Via Pisanelli 140,Castiglione D&amp;#39;Adda,LO,26823&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;scambia la posizione del nome e del cognome e sposta il CAP prima della Località in tutte le righe del file. Già che c&amp;rsquo;è, corregge anche il nome sbagliato &amp;ldquo;Violanda&amp;rdquo; e lo trasforma in &amp;ldquo;Jolanda&amp;rdquo;. Nella riga #5, &lt;code&gt;$1 ~ /Violanda/&lt;/code&gt; è la condizione, e &lt;code&gt;{$1 = &amp;quot;Jolanda&amp;quot;}&lt;/code&gt; l&amp;rsquo;azione relativa, mentre nella riga #6 la condizione è vuota e quindi l&amp;rsquo;azione conseguente &lt;code&gt;{print $2, $1, $3, $6, $4, $5}&lt;/code&gt; si applica a tutte le righe del file. Il blocco &lt;code&gt;BEGIN {...}&lt;/code&gt; serve per definire il carattere (o i caratteri) che separa i campi contenuti in ciascuna riga letta o scritta dal programma: la variabile predefinita &lt;code&gt;FS&lt;/code&gt; è il separatore dei campi del file di input (quello letto dal programma), &lt;code&gt;OFS&lt;/code&gt; è il separatore dei campi delle righe stampate dallo script.&lt;/p&gt;&#xA;&lt;p&gt;Per provarlo, copiate il programma in un editor e salvatelo come &lt;code&gt;swap.awk&lt;/code&gt;, poi copiate la lista di indirizzi e salvatela come &lt;code&gt;address.csv&lt;/code&gt; (meglio se salvate i due file nella cartella &lt;code&gt;~/Development&lt;/code&gt;, &lt;a href=&#34;https://melabit.wordpress.com/2018/12/30/script-per-tutti-i-giorni-shell-e-parametri/&#34;&gt;ricordate&lt;/a&gt;?). Infine lanciate il Terminale, eseguite il comando&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ awk -f swap.awk address.csv &#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;e vedete cosa viene fuori. Provate a cambiare &lt;code&gt;OFS&lt;/code&gt; e a vedere che succede.&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;Domanda 1: Come si fa a lanciare lo script senza dover premettere il comando &lt;code&gt;awk&lt;/code&gt;?&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;Domanda 2: Se si rimuove la variabile &lt;code&gt;FS&lt;/code&gt; dal blocco &lt;code&gt;BEGIN{...}&lt;/code&gt; lo script continua a funzionare correttamente?&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;Ma basta con awk. Questo articolo non vuole essere una introduzione al linguaggio ma vuole solo mostrare come si può risolvere con AWK il problema che ci sta a cuore. Chi volesse è approfondire la conoscenza del linguaggio può consultare i volumi e le guide online riportate in bibliografia.&lt;/p&gt;&#xA;&lt;h4 id=&#34;rinominare-automaticamente-un-post&#34;&gt;Rinominare automaticamente un post&lt;/h4&gt;&#xA;&lt;p&gt;E finalmente eccoci al programma &lt;code&gt;awk&lt;/code&gt; che rinomina da solo il file Markdown di un post in base al titolo e alla data contenuti nei &lt;a href=&#34;https://melabit.wordpress.com/2018/11/23/script-per-tutti-i-giorni-semplici-modifiche-alle-stringhe-di-testo/&#34;&gt;metadati del documento&lt;/a&gt;, che contengono, fra l&amp;rsquo;altro, il titolo, la data di pubblicazione, la categoria e i tag associati al post stesso.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;BEGIN { FS = &amp;#34; &amp;#34;&#xA;        OFS = &amp;#34;-&amp;#34;&#xA;        EXT = &amp;#34;.md&amp;#34;&#xA;      }&#xA;&#xA;$1 ~ /[Dd]ate:/   { date = $2 }&#xA;$1 ~ /[Tt]itle:/  { title = &amp;#34;&amp;#34;&#xA;                    for (i = 2; i &amp;lt;= NF; i++) {&#xA;                        title = title FS tolower($i)&#xA;                    }&#xA;                  }&#xA;&#xA;END { newfilename = date OFS title&#xA;      gsub(&amp;#34;[[:cntrl:]]&amp;#34;, &amp;#34;&amp;#34;, newfilename)&#xA;      gsub(&amp;#34;[\&amp;#34;]+&amp;#34;, &amp;#34;&amp;#34;, newfilename)&#xA;      gsub(&amp;#34;[\.,;:!\?&amp;amp;\$]+&amp;#34;, &amp;#34;&amp;#34;, newfilename)&#xA;      gsub(&amp;#34;[-| ]+&amp;#34;, &amp;#34;-&amp;#34;, newfilename)&#xA;      newfilename = newfilename EXT&#xA;      system(&amp;#34;mv &amp;#34; FILENAME &amp;#34; &amp;#34; newfilename)&#xA;    }&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Riassumo brevemente cosa fa il programma, chi non fosse interessato può saltare direttamente al prossimo paragrafo. La prima condizione &lt;code&gt;$1 ~ /[Dd]ate/&lt;/code&gt; cerca la stringa &lt;code&gt;date:&lt;/code&gt; (indifferentemente in minuscolo o maiuscolo) nel primo campo di tutte le righe del post e quando la trova assegna il secondo campo, corrispondente alla data, alla variabile &lt;code&gt;date&lt;/code&gt;.&#xA;La seconda condizione fa lo stesso per il titolo e lo assegna alla variabile &lt;code&gt;title&lt;/code&gt;. Poiché il titolo è distribuito su un numero imprecisato di campi (ricordo che il separatore di campo &lt;code&gt;FS&lt;/code&gt; è lo spazio), viene utilizzato un ciclo &lt;code&gt;for&lt;/code&gt; per leggere ed aggiungere in successione a &lt;code&gt;title&lt;/code&gt; tutti i campi della riga successivi al primo. Il numero di campi presenti nella riga del titolo è contenuto nella variabile di sistema &lt;code&gt;NF&lt;/code&gt;, aggiornata automaticamente dall&amp;rsquo;interprete ogni volta che viene letta una nuova riga.&#xA;La parte finale del programma, racchiusa nel blocco &lt;code&gt;END {...}&lt;/code&gt;, si occupa di definire la variabile &lt;code&gt;newfilename&lt;/code&gt;, contenente il nuovo nome da assegnare al file, e di trasformarla secondo le regole desiderate.&#xA;La variabile &lt;code&gt;newfilename&lt;/code&gt; contiene inizialmente (riga #12) la data e il titolo letti nel post, separati da un trattino (il valore di &lt;code&gt;OFS&lt;/code&gt;). Nelle quattro righe successive viene utilizzata la funzione &lt;code&gt;gsub&lt;/code&gt; per rimuovere da questa variabile tutti i caratteri indesiderati (caratteri di controllo, virgolette, punteggiatura) e per sostituire spazi e trattini (anche multipli) con un trattino singolo. Alla riga #17 viene aggiunta l&amp;rsquo;estensione definita in &lt;code&gt;EXT&lt;/code&gt;, mentre l&amp;rsquo;ultima riga del blocco effettua una chiamata al sistema operativo per rinominare effettivamente il file, utilizzando un&amp;rsquo;altra variabile di sistema, &lt;code&gt;FILENAME&lt;/code&gt;, che contiene il nome originale del file Markdown su cui sta operando lo script.&lt;/p&gt;&#xA;&lt;p&gt;Salviamo il programma nella solita cartella &lt;code&gt;Development&lt;/code&gt; con il nome &lt;code&gt;setpostname.awk&lt;/code&gt;. Per provarlo dobbiamo avere anche un file Markdown contenente nell&amp;rsquo;intestazione (&lt;em&gt;header&lt;/em&gt;) almeno i metadati relativi al titolo e alla data. Possiamo prendere la prima parte di questo post,&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;---&#xA;layout: post  &#xA;title: &amp;#34;Script per tutti i giorni: entra in scena awk&amp;#34;  &#xA;author:&#x9;Sabino Maggi  &#xA;date: 2019-02-18T18:00:00  &#xA;categories:  &#xA;  - programmazione  &#xA;tags:  &#xA;  - awk  &#xA;  - bash  &#xA;  - editor  &#xA;  - gawk  &#xA;  - perl  &#xA;  - script  &#xA;  - terminale  &#xA;comments: true  &#xA;sidebar: true  &#xA;toc: true  &#xA;published: 2019-02-18T18:00:00  &#xA;slug:  &#xA;&#xA;---&#xA;&#xA;Nelle prime tre puntate di questa serie abbiamo imparato a scrivere uno script in `bash` per trasformare una stringa di testo in modo che segua delle  convenzioni ben determinate a priori (qui i link alla [prima](https://melabit.wordpress.com/2018/11/23/script-per-tutti-i-giorni-semplici-modifiche-alle-stringhe-di-testo/), [seconda](https://melabit.wordpress.com/2018/12/05/script-per-tutti-i-giorni-dalla-linea-di-comando-al-programma/) e [terza](https://melabit.wordpress.com/2018/12/30/script-per-tutti-i-giorni-shell-e-parametri/) puntata).&#xA;&#xA;In questo caso particolare,...&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;e salvarlo con un nome qualsiasi nella stessa cartella &lt;code&gt;Development&lt;/code&gt;. Poiché la fantasia fa difetto, chiamiamolo &lt;code&gt;articolo.md&lt;/code&gt;. A questo punto lanciamo il Terminale, spostiamoci nella cartella &lt;code&gt;Development&lt;/code&gt;&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ cd ~/Development&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;e lanciamo lo script in &lt;code&gt;awk&lt;/code&gt; con il comando&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$  /usr/bin/awk -f setpostname.awk articolo.md&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;e voilà, il file &lt;code&gt;articolo.md&lt;/code&gt; viene rinominato automaticamente in &lt;code&gt;2019-02-18-script-per-tutti-i-giorni-entra-in-scena-awk&lt;/code&gt;, che è esattamente quello che volevamo. Nota per i più curiosi:  dato che &lt;code&gt;awk&lt;/code&gt; ha bisogno di sapere sia il nome dello script contenente i comandi che quello del file da elaborare, si usa l&amp;rsquo;opzione &lt;code&gt;-f&lt;/code&gt; per indicare esplicitamente lo script con i comandi.&lt;/p&gt;&#xA;&lt;p&gt;Perché uso l&amp;rsquo;intero percorso &lt;code&gt;/usr/bin/awk&lt;/code&gt; per richiamare &lt;code&gt;awk&lt;/code&gt;? Semplicemente perché voglio essere sicuro di utilizzare l&amp;rsquo;interprete &lt;code&gt;awk&lt;/code&gt; presente di default in macOS e non la versione estesa installata tramite Homebrew, che funziona in modo leggermente diverso e darebbe degli avvertimenti poco incomprensibili, pur riuscendo lo stesso a rinominare correttamente il file.&lt;/p&gt;&#xA;&lt;h4 id=&#34;conclusioni&#34;&gt;Conclusioni&lt;/h4&gt;&#xA;&lt;p&gt;Ormai siamo quasi a posto con la rinominazione automatica di un post in Markdown (che poi in effetti è solo una scusa per gettare le basi e per poter affrontare script complessi e più utili). Manca solo un piccolissimo dettaglio, che può far diventare questo script del tutto indistinguibile dai comandi standard del sistema operativo e che sarà l&amp;rsquo;argomento della prossima puntata.&lt;/p&gt;&#xA;&lt;h4 id=&#34;bibliografia&#34;&gt;Bibliografia&lt;/h4&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Alfred Aho, Brian Kernighan, Peter Weinberger, &lt;a href=&#34;https://archive.org/details/pdfy-MgN0H1joIoDVoIC7&#34;&gt;The AWK programming language&lt;/a&gt;, Addison-Wesley, 1988.&lt;/li&gt;&#xA;&lt;li&gt;Arnold Robbins, &lt;a href=&#34;https://www.gnu.org/software/gawk/manual/&#34;&gt;Gawk: Effective AWK Programming&lt;/a&gt;, Edition 4.2, 2018.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://matt.might.net/articles/sculpting-text/&#34;&gt;Sculpting text with regex, grep, sed, awk, emacs and vim&lt;/a&gt;.&lt;/li&gt;&#xA;&lt;li&gt;Wikibooks, &lt;a href=&#34;https://en.wikibooks.org/wiki/An_Awk_Primer&#34;&gt;An Awk Primer&lt;/a&gt;.&lt;/li&gt;&#xA;&lt;li&gt;Bruce Barnett, &lt;a href=&#34;http://www.grymoire.com/Unix/Awk.html&#34;&gt;Awk a Tutorial and Introduction&lt;/a&gt;.&lt;/li&gt;&#xA;&lt;li&gt;Tutorials Point, &lt;a href=&#34;https://www.tutorialspoint.com/awk/index.htm&#34;&gt;Awk Tutorial&lt;/a&gt;.&lt;/li&gt;&#xA;&lt;/ul&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;Una cosa che io trovo bellissima anche dal punto di vista diciamo così, &lt;em&gt;filosofico&lt;/em&gt;, e che mi ricorda i bellissimi articoli di Douglas Hofstadter su Le Scienze sui &lt;a href=&#34;http://www.repubblica.it/2003/g/rubriche/lessicoenuvole/9settemb/9settemb.html&#34;&gt;testi autoreferenziali&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;/ol&gt;&#xA;&lt;/div&gt;&#xA;</description>
    </item>
    <item>
      <title>Script per tutti i giorni: shell e parametri</title>
      <link>https://static.233.196.69.159.clients.your-server.de/it/2018/12/30/script-per-tutti-i-giorni-shell-e-parametri/</link>
      <pubDate>Sun, 30 Dec 2018 18:00:00 +0000</pubDate>
      <guid>https://static.233.196.69.159.clients.your-server.de/it/2018/12/30/script-per-tutti-i-giorni-shell-e-parametri/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;https://farm9.staticflickr.com/8002/7151170579_753c6fb9c0.jpg&#34; alt=&#34;&#34;&gt;&#xA;&amp;ndash; Foto: &lt;a href=&#34;https://www.flickr.com/photos/osr/&#34;&gt;Trammell Hudson&lt;/a&gt; su Flickr.&lt;/p&gt;&#xA;&lt;p&gt;Lo script di conversione del titolo di un post mostrato alla fine della &lt;a href=&#34;https://melabit.wordpress.com/2018/12/05/script-per-tutti-i-giorni-dalla-linea-di-comando-al-programma/&#34;&gt;puntata precedente&lt;/a&gt; è diventato ormai quasi &amp;ldquo;utilizzabile&amp;rdquo;. Mancano solo un paio di tocchi finali, che vedremo nel corso di questa terza parte.&lt;/p&gt;&#xA;&lt;h4 id=&#34;una-casa-per-i-programmi&#34;&gt;Una casa per i programmi&lt;/h4&gt;&#xA;&lt;p&gt;Prima di proseguire è bene decidere una volta per tutte dove salvare gli script che stiamo sviluppando. Non so voi, ma io preferisco usare una cartella dedicata allo scopo invece di buttare tutto dove capita. In tutti gli articoli di questa serie gli script in fase di sviluppo saranno salvati nella cartella &lt;code&gt;Development&lt;/code&gt;, situata all&amp;rsquo;interno della cartella &lt;code&gt;Home&lt;/code&gt; (o &lt;code&gt;Inizio&lt;/code&gt;) dell’utente che ha effettuato il login (la cartella &lt;code&gt;Home&lt;/code&gt; è quella rappresentata dall’icona di una casetta). Ovviamente siete liberi di usare un altro nome e un&amp;rsquo;altra posizione sul disco rigido, ma dovrete ricordarvi di modificare di conseguenza i percorsi dei comandi.&lt;/p&gt;&#xA;&lt;p&gt;Già che ci siamo, creiamo subito la cartella &lt;code&gt;Development&lt;/code&gt;. Se usate il Finder non ho bisogno di dirvi come si fa, se invece usate il Terminale basta eseguire i comandi&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ cd ~&#xA;$ mkdir Development&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;dove il primo comando, &lt;code&gt;cd ~&lt;/code&gt; (ma su macOS e varie versioni di Linux è sufficiente il semplice &lt;code&gt;cd&lt;/code&gt;) ci fa spostare nella nostra &lt;code&gt;Home&lt;/code&gt;, mentre il secondo comando crea la nuova directory &lt;code&gt;Development&lt;/code&gt;. Nelle shell Unix come &lt;code&gt;bash&lt;/code&gt;, il simbolo tilde &lt;code&gt;~&lt;/code&gt; (che si scrive premendo ALT-5) indica la &lt;code&gt;Home&lt;/code&gt; dell&amp;rsquo;utente.&lt;/p&gt;&#xA;&lt;p&gt;Volendo potremmo anche eseguire semplicemente&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ mkdir ~/Development&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;che crea la directory desiderata con un unico comando.&lt;/p&gt;&#xA;&lt;p&gt;Qualche breve nota generale. In questo contesto i termini &lt;em&gt;script&lt;/em&gt; o &lt;em&gt;programma&lt;/em&gt; sono equivalenti e li userò indifferentemente. Lo stesso vale per &lt;em&gt;directory&lt;/em&gt; e &lt;em&gt;cartella&lt;/em&gt;. Io preferisco il primo, ma so benissimo che, da quando esistono le interfacce grafiche, il termine &amp;ldquo;cartella&amp;rdquo; è diventato di uso molto più comune. Nel seguito cercherò di usare &amp;ldquo;cartella&amp;rdquo; nel testo discorsivo degli articoli e &amp;ldquo;directory&amp;rdquo; quando si tratterà di riferirsi ai comandi di &lt;code&gt;bash&lt;/code&gt; e al Terminale. Infine, il simbolo &lt;code&gt;$&lt;/code&gt; prima di ogni comando è il cosiddetto &lt;code&gt;prompt&lt;/code&gt; e serve ad indicare che stiamo interagendo con il Terminale; non fa parte dei comandi e quindi non deve mai essere inserito quando scriviamo un comando nel Terminale.&lt;/p&gt;&#xA;&lt;h4 id=&#34;andare-con-le-proprie-gambe&#34;&gt;Andare con le proprie gambe&lt;/h4&gt;&#xA;&lt;p&gt;Nella &lt;a href=&#34;https://melabit.wordpress.com/2018/12/05/script-per-tutti-i-giorni-dalla-linea-di-comando-al-programma/&#34;&gt;puntata precedente&lt;/a&gt; siamo arrivati ad usare uno dei tanti &lt;a href=&#34;https://melabit.wordpress.com/2018/12/05/script-per-tutti-i-giorni-dalla-linea-di-comando-al-programma/&#34;&gt;editor di testo&lt;/a&gt; disponibili su macOS per inserire queste righe di codice&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;string=&amp;#34;La privacy al tempo dell&amp;#39;Internet of Things: gran finale&amp;#34;&#xA; &#xA;fix_string=$(echo $string | tr &amp;#34;[:upper:]&amp;#34; &amp;#34;[:lower:]&amp;#34;)&#xA;fix_string=$(echo $fix_string | sed &amp;#34;s/&amp;#39;/ /g&amp;#34;)&#xA;fix_string=$(echo $fix_string | sed &amp;#34;s/[[:punct:]]//g&amp;#34;)&#xA;fix_string=$(echo $fix_string | sed &amp;#34;s/ /-/g&amp;#34;)&#xA; &#xA;converted_string=$fix_string&#xA;echo $converted_string&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Ora possiamo salvare lo script nella cartella &lt;code&gt;~/Development/&lt;/code&gt;, dandogli un nome significativo che ci aiuti a ricordare anche in un secondo momento cosa fa il programma. Molto meglio quindi usare un nome come &lt;code&gt;convert_title.sh&lt;/code&gt; piuttosto che un criptico &lt;code&gt;SCCUSIFJ.sh&lt;/code&gt;, anche se profuma tanto di DOS e di anni &amp;lsquo;80.&lt;/p&gt;&#xA;&lt;p&gt;Nei sistemi Unix come macOS l&amp;rsquo;estensione &lt;code&gt;.sh&lt;/code&gt; non è indispensabile ma ci aiuta a capire al volo che il file è uno script della shell (da cui &lt;code&gt;.sh&lt;/code&gt;). È possibile usare altre estensioni come &lt;code&gt;.shell&lt;/code&gt;, &lt;code&gt;.script&lt;/code&gt;, &lt;code&gt;.cmd&lt;/code&gt; o perfino &lt;code&gt;.bat&lt;/code&gt;, per il sistema operativo non cambia nulla.&lt;/p&gt;&#xA;&lt;p&gt;A questo punto possiamo finalmente di eseguire lo script. Lanciamo il Terminale, spostiamoci nella cartella dove abbiamo salvato lo script&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ cd ~/Development&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;ed eseguiamo lo script con il comando&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ sh convert_title.sh&#xA;la-privacy-al-tempo-dell-internet-of-things-gran-finale&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;ottenendo, come previsto, la trasformazione della stringa definita nella &lt;code&gt;string&lt;/code&gt; nel &lt;a href=&#34;https://melabit.wordpress.com/2018/11/23/script-per-tutti-i-giorni-semplici-modifiche-alle-stringhe-di-testo/&#34;&gt;formato adatto&lt;/a&gt; a Jekyll o a Wordpress.&lt;/p&gt;&#xA;&lt;p&gt;Per eseguire lo script dobbiamo premettere al nome del file il comando &lt;code&gt;sh&lt;/code&gt; che indica al sistema operativo che il file in questione contiene una serie di &lt;a href=&#34;https://melabit.wordpress.com/2014/11/06/script-di-shell-in-os-x/&#34;&gt;comandi di shell&lt;/a&gt;, cioè di comandi che permettono di interagire con il sistema operativo stesso (attenzione, il &lt;em&gt;comando&lt;/em&gt; &lt;code&gt;sh&lt;/code&gt; è una cosa ben diversa dall&amp;rsquo;&lt;em&gt;estensione&lt;/em&gt; &lt;code&gt;.sh&lt;/code&gt; vista prima!). Con questa informazione, il sistema operativo trasferisce l&amp;rsquo;esecuzione dello script alla shell di default, che in macOS e nella maggior parte dei sistemi Linux attuali è &lt;code&gt;bash&lt;/code&gt;. Niente però impedisce di &lt;em&gt;forzare&lt;/em&gt; l&amp;rsquo;utilizzo di &lt;code&gt;bash&lt;/code&gt;, scrivendo esplicitamente&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ bash convert_title.sh&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;al posto di &lt;code&gt;sh convert_title.sh&lt;/code&gt;, oppure di utilizzare &lt;a href=&#34;https://opensource.com/business/16/3/top-linux-shells&#34;&gt;altre shell&lt;/a&gt; eventualmente disponibili nel sistema, come &lt;code&gt;tcsh&lt;/code&gt;, &lt;code&gt;ksh&lt;/code&gt;, &lt;code&gt;zsh&lt;/code&gt; o &lt;code&gt;fish&lt;/code&gt; (argomento che non verrà trattato in questa serie).&lt;/p&gt;&#xA;&lt;p&gt;Purtroppo affidarsi alla configurazione di default del sistema può creare problemi, ad esempio perché qualcuno ha cambiato la shell di default, magari solo per fare una prova, dimenticando di ripristinare la configurazione iniziale. Per fortuna in genere queste cose non succedono per cui possiamo stare relativamente tranquilli. Però il meccanismo appena descritto non è né semplice, né tanto meno a prova di bomba.&lt;/p&gt;&#xA;&lt;p&gt;Proviamo a semplificarci la vita con due piccole modifiche. Prima di tutto utilizziamo il comando &lt;code&gt;chmod&lt;/code&gt; per rendere &lt;em&gt;eseguibile&lt;/em&gt; lo script all’utente attuale del Mac&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ chmod u+x convert_title.sh&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;dove la &lt;code&gt;u&lt;/code&gt; indica l&amp;rsquo;utente che sta usando il Mac e il simbolo &lt;code&gt;+x&lt;/code&gt; significa che il file viene reso eseguibile (la &lt;code&gt;x&lt;/code&gt; sta per &lt;em&gt;eXecute&lt;/em&gt;). Se volessimo rimuovere questa autorizzazione, non dovremmo far altro che eseguire il comando duale&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ chmod u-x convert_title.sh`&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Se invece volessimo autorizzare tutti gli utenti del Mac ad eseguire questo script, dovremmo scrivere&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ chmod a+x convert_title.sh&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;mentre per autorizzare solo gli utenti che fanno parte del nostro stesso gruppo di lavoro oppure tutti gli altri utenti fuori dal nostro gruppo di lavoro, dobbiamo usare rispettivamente &lt;code&gt;chmod g+x convert_title.sh&lt;/code&gt; oppure &lt;code&gt;chmod o+x convert_title.sh&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Ma queste sono finezze utili per i server a cui accedono decine e decine di utenti contemporaneamente, i Mac sono sostanzialmente macchine monoutente (o che gestiscono un numero molto ridotto di utenti), per cui &lt;code&gt;chmod u+x&lt;/code&gt; (o al massimo &lt;code&gt;chmod a+x&lt;/code&gt;) a noi basta e avanza.&lt;/p&gt;&#xA;&lt;p&gt;L&amp;rsquo;altra modifica utile è quella di indicare esplicitamente al sistema operativo quale shell vogliamo utilizzare per interpretare i comandi contenuti nel nostro script. Per farlo è sufficiente aggiungere all&amp;rsquo;inizio dello dello script la sequenza di caratteri &lt;code&gt;#!&lt;/code&gt;, il cosiddetto &lt;a href=&#34;https://en.wikipedia.org/wiki/Shebang_%28Unix%29&#34;&gt;shebang&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; seguita dal percorso completo al programma di shell che vogliamo usare.&lt;/p&gt;&#xA;&lt;!--&#xA;(per motivi che saranno chiari fra poco, è meglio inserire lo shebang e il percorso esattamente nella _prima_ riga dello script).&#xA;--&gt;&#xA;&lt;p&gt;Dato che qui usiamo &lt;code&gt;bash&lt;/code&gt;, il nostro script diventa&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;#!/bin/bash&#xA;&#xA;string=&amp;#34;La privacy al tempo dell&amp;#39;Internet of Things: gran finale&amp;#34;&#xA; &#xA;fix_string=$(echo $string | tr &amp;#34;[:upper:]&amp;#34; &amp;#34;[:lower:]&amp;#34;)&#xA;fix_string=$(echo $fix_string | sed &amp;#34;s/&amp;#39;/ /g&amp;#34;)&#xA;fix_string=$(echo $fix_string | sed &amp;#34;s/[[:punct:]]//g&amp;#34;)&#xA;fix_string=$(echo $fix_string | sed &amp;#34;s/ /-/g&amp;#34;)&#xA; &#xA;converted_string=$fix_string&#xA;echo $converted_string&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Ma come lo troviamo il percorso di &lt;code&gt;bash&lt;/code&gt;? C&amp;rsquo;è un comando anche per questo: &lt;code&gt;which&lt;/code&gt; seguito dal nome di un qualunque comando Unix restituisce proprio il percorso completo del comando all&amp;rsquo;interno del filesystem. Di conseguenza &lt;code&gt;which bash&lt;/code&gt; restituisce&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ which bash&#xA;/bin/bash&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;che è proprio ciò che dobbiamo inserire in testa allo script subito dopo lo shebang.&lt;/p&gt;&#xA;&lt;!--&#xA;Se la stringa `#!/bin/bash` è esattamente la prima riga dello script, al momento del salvataggio lo script diventa automaticamente eseguibile da tutti gli utenti del sistema, proprio come se avessimo usato il comando `chmod a+x convert_title.sh` descritto prima. Dal punto di vista della sicurezza non è il massimo, ma per i nostri piccoli script inoffensivi può andar bene così.&#xA;--&gt;&#xA;&lt;p&gt;Per verificarlo, basta provare a salvare lo script modificato con un nome diverso, diciamo &lt;code&gt;convert_title_v2.sh&lt;/code&gt; e rendiamolo esegubile con il comando &lt;code&gt;chmod a+x convert_title_v2.sh&lt;/code&gt; descritto prima.&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; A differenza di &lt;code&gt;convert_title.sh&lt;/code&gt;, questo secondo script potrà essere eseguito senza dover premettere &lt;code&gt;sh&lt;/code&gt;&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ ./convert_title_v2.sh &#xA;la-privacy-al-tempo-dell-internet-of-things-gran-finale&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Per una serie di ragioni che vedremo in una prossima puntata, dobbiamo però &lt;em&gt;aiutare&lt;/em&gt; il sistema operativo a trovare lo script aggiungendo esplicitamente il percorso allo script da eseguire. Poiché nei sistemi Unix (e non solo), il punto &lt;code&gt;.&lt;/code&gt; indica la cartella corrente (mentre il doppio punto &lt;code&gt;..&lt;/code&gt; si riferisce alla cartella che contiene la cartella corrente), scrivere &lt;code&gt;./&lt;/code&gt; immediatamente prima del nome dello script equivale a dire al sistema operativo che lo script si trova nella cartella corrente, che in questo caso è la cartella dove siamo &lt;em&gt;entrati&lt;/em&gt; all&amp;rsquo;inizio di questa puntata con il comando &lt;code&gt;cd ~/Development&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;h4 id=&#34;parametri-sulla-linea-di-comando&#34;&gt;Parametri sulla linea di comando&lt;/h4&gt;&#xA;&lt;p&gt;C&amp;rsquo;è ancora una cosa che non va bene. Ogni volta che vogliamo cambiare la stringa da convertire dobbiamo intervenire direttamente sullo script, modificando la variabile &lt;code&gt;string&lt;/code&gt;. Facendo così è facile sbagliare, e in ogni caso sarebbe molto più comodo rendere lo script indipendente dai dati sui quali deve operare (in questo caso la stringa da convertire).&lt;/p&gt;&#xA;&lt;p&gt;Non voglio entrare nei dettagli (ma ci sarà tempo per approfondire la questione), per ora basterà dire che per rendere lo script indipendente dalla stringa da trasformare è sufficiente assegnare a &lt;code&gt;string&lt;/code&gt; il valore della variabile convenzionale &lt;code&gt;$1&lt;/code&gt;&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;#!/bin/bash&#xA;&#xA;string=$1&#xA;&#xA;fix_string=$(echo $string | tr &amp;#34;[:upper:]&amp;#34; &amp;#34;[:lower:]&amp;#34;)&#xA;fix_string=$(echo $fix_string | sed &amp;#34;s/&amp;#39;/ /g&amp;#34;)&#xA;fix_string=$(echo $fix_string | sed &amp;#34;s/[[:punct:]]//g&amp;#34;)&#xA;fix_string=$(echo $fix_string | sed &amp;#34;s/ /-/g&amp;#34;)&#xA; &#xA;converted_string=$fix_string&#xA;echo $converted_string&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;L&amp;rsquo;interprete &lt;code&gt;bash&lt;/code&gt; assegna automaticamente alle variabili &lt;code&gt;$1&lt;/code&gt;, &lt;code&gt;$2&lt;/code&gt;, &amp;hellip; &lt;code&gt;$9&lt;/code&gt;, dette &lt;em&gt;parametri posizionali&lt;/em&gt;, i valori degli &lt;em&gt;argomenti&lt;/em&gt; dello script, cioè i valori dei parametri presenti sulla linea di comando subito dopo il nome dello script da eseguire.&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; I diversi parametri sono separati da uno o più spazi, e se un parametro contiene degli spazi bisogna racchiuderlo fra virgolette, non importa se semplici &lt;code&gt;&#39;&lt;/code&gt; o doppie &lt;code&gt;&amp;quot;&lt;/code&gt; (però è preferibile &lt;del&gt;essere consistenti ed&lt;/del&gt; evitare di mescolare i due simboli).&lt;/p&gt;&#xA;&lt;p&gt;Salviamo lo script così modificato con il solito nome &lt;code&gt;convert_title.sh&lt;/code&gt; e torniamo al Terminale. Ora per usare lo script dobbiamo scrivere la stringa da convertire direttamente sulla linea di comando, subito dopo il nome del file, racchiudendola fra virgolette dato che la stringa contiene degli spazi (io preferisco usare le virgolette doppie)&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ ./convert_title.sh &amp;quot;La privacy al tempo dell&#39;Internet of Things: gran finale&amp;quot;&#xA;la-privacy-al-tempo-dell-internet-of-things-gran-finale&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Naturalmente niente impedisce di trasformare stringhe molto più lunghe, come ad esempio un paragrafo di questo stesso articolo, l&amp;rsquo;unica limitazione è che la stringa non deve contenere dei caratteri di &lt;a href=&#34;https://it.wikipedia.org/wiki/Ritorno_a_capo&#34;&gt;&lt;em&gt;ritorno a capo&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ convert_title.sh &amp;quot;Purtroppo affidarsi alla configurazione di default del sistema può creare problemi, ad esempio perché qualcuno ha cambiato la shell di default, magari solo per fare una prova, dimenticando di ripristinare la configurazione iniziale. Per fortuna in genere queste cose non succedono per cui possiamo stare relativamente tranquilli. Però il meccanismo appena descritto non è né semplice, né tanto meno a prova di bomba.&amp;quot;&#xA;purtroppo-affidarsi-alla-configurazione-di-default-del-sistema-può-creare-problemi-ad-esempio-perché-qualcuno-ha-cambiato-la-shell-di-default-magari-solo-per-fare-una-prova-dimenticando-di-ripristinare-la-configurazione-iniziale-per-fortuna-in-genere-queste-cose-non-succedono-per-cui-possiamo-stare-relativamente-tranquilli-però-il-meccanismo-appena-descritto-non-è-né-semplice-né-tanto-meno-a-prova-di-bomba&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Se guardiamo attentamente il risultato della conversione notiamo come lo script non riesce a trattare correttamente i caratteri accentati, come era stato già notato esplicitamente nella &lt;a href=&#34;https://melabit.wordpress.com/2018/11/23/script-per-tutti-i-giorni-semplici-modifiche-alle-stringhe-di-testo/&#34;&gt;prima puntata&lt;/a&gt; di questa serie di articoli. Per ora sarà sufficiente evitare di usare i caratteri accentati o almeno scriverli con una vocale seguita da un apostrofo, come se stessimo usando una tastiera americana.&lt;/p&gt;&#xA;&lt;h4 id=&#34;conclusioni-per-ora&#34;&gt;Conclusioni (per ora)&lt;/h4&gt;&#xA;&lt;p&gt;Se togliessimo l&amp;rsquo;estensione al nome del file, lo script &lt;code&gt;convert_title&lt;/code&gt; diventerebbe quasi indistinguibile dai comandi veri e propri del sistema operativo. Dico &amp;ldquo;quasi&amp;rdquo; perché per poterlo eseguire dobbiamo ancora premettere il percorso alla cartella corrente al nome del file. Ci sarà modo per risolvere questo (piccolo) problema, i più impazienti possono &lt;a href=&#34;https://melabit.wordpress.com/2014/11/06/script-di-shell-in-os-x/&#34;&gt;leggere qui&lt;/a&gt; per capire in anteprima come si fa.&lt;/p&gt;&#xA;&lt;p&gt;La prossima volta faremo un veloce ripasso dei comandi presentati in queste prime tre puntate, utile per consolidare quanto visto finora prima di passare ad usare uno degli strumenti più potenti ma anche meno conosciuti dell&amp;rsquo;arsenale Unix.&lt;/p&gt;&#xA;&lt;h5 id=&#34;revisioni&#34;&gt;Revisioni&lt;/h5&gt;&#xA;&lt;p&gt;&lt;strong&gt;30-12-2018&lt;/strong&gt;: Corretta una imprecisione relativa al cambiamento dei permessi dei file quando la prima riga di uno script contiene lo shebang e il percorso all&amp;rsquo;interprete &lt;code&gt;bash&lt;/code&gt; (si veda la nota 2).&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;Detto anche &lt;em&gt;sha-bang&lt;/em&gt; o &lt;em&gt;hashbang&lt;/em&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;Se la stringa &lt;code&gt;#!/bin/bash&lt;/code&gt; è esattamente la prima riga dello script, quando salviamo lo script l&amp;rsquo;editor TextMate lo rende eseguibile da tutti gli utenti del sistema, proprio come se avessimo usato esplicitamente il comando &lt;code&gt;chmod a+x ...&lt;/code&gt;. È una particolarità del solo TextMate, tutti gli altri editor che ho provato (Atom, BBEdit, Visual Studio Code e CotEditor fra quelli grafici, nano, emacs e vim per quanto riguarda gli editor testuali) non modificano mai i permessi del file.&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;Se abbiamo bisogno di più di nove parametri, dobbiamo racchiudere quelli dal decimo in poi fra parentesi graffe, scrivendo &lt;code&gt;${10}&lt;/code&gt;, &lt;code&gt;${11}&lt;/code&gt; e così via.&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>Script per tutti i giorni: dalla linea di comando al programma</title>
      <link>https://static.233.196.69.159.clients.your-server.de/it/2018/12/05/script-per-tutti-i-giorni-dalla-linea-di-comando-al-programma/</link>
      <pubDate>Wed, 05 Dec 2018 18:00:00 +0000</pubDate>
      <guid>https://static.233.196.69.159.clients.your-server.de/it/2018/12/05/script-per-tutti-i-giorni-dalla-linea-di-comando-al-programma/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;https://farm4.staticflickr.com/3701/9171586772_b1ec32a77f_b.jpg&#34; alt=&#34;&#34;&gt;&#xA;&amp;ndash; Foto: &lt;a href=&#34;https://www.flickr.com/photos/mratzloff/&#34;&gt;Matthew Ratzloff&lt;/a&gt; su Flickr.&lt;/p&gt;&#xA;&lt;p&gt;Il comando per generare automaticamente il nome del file nel formato previsto da Jekyll (o da Wordpress) dal titolo del post presentato alla fine della &lt;a href=&#34;https://melabit.wordpress.com/2018/11/23/script-per-tutti-i-giorni-semplici-modifiche-alle-stringhe-di-testo/&#34;&gt;prima puntata&lt;/a&gt; potrà anche essere interessante dal punto di vista didattico ma, diciamolo, è poco pratico per essere utilizzato &lt;em&gt;veramente&lt;/em&gt;. Bisogna lanciare il Terminale, andare a cercare il comando da qualche parte, copiarlo e incollarlo nel Terminale, cancellare il titolo preesistente e incollare il titolo del nuovo post su cui stiamo lavorando&amp;hellip; Si fa prima a fare tutto a mano nel Finder!&lt;/p&gt;&#xA;&lt;p&gt;Ma se lo trasformiamo in uno &lt;em&gt;script&lt;/em&gt;, cioè in un piccolo programma eseguibile direttamente dal Terminale come un qualunque comando del sistema operativo, le cose diventano improvvisamente molto più interessanti.&lt;/p&gt;&#xA;&lt;h4 id=&#34;dove-vai-se-leditor-non-ce-lhai&#34;&gt;Dove vai se l&amp;rsquo;editor non ce l&amp;rsquo;hai?&lt;/h4&gt;&#xA;&lt;p&gt;Per lavorare sugli script è fondamentale avere a disposizione un buon editor di testo. In macOS sono già integrati due pesi massimi, &lt;code&gt;emacs&lt;/code&gt; e &lt;code&gt;vi&lt;/code&gt;, eseguibili direttamente dal Terminale tramite i comandi omonimi. Fatevi un favore e non usateli.&lt;/p&gt;&#xA;&lt;p&gt;Questi due editor, che hanno dato origine ad una vera e propria guerra di religione fra i fan dell&amp;rsquo;uno e dell&amp;rsquo;altro programma, sono perfetti per i professionisti, per chi è già esperto di programmazione ed è disposto ad affrontare una fase di apprendimento lunga e piuttosto impervia. Ma per chi è all&amp;rsquo;inizio e deve concentrarsi sull&amp;rsquo;imparare le basi e la logica della programmazione, un editor troppo complicato è più che altro un ostacolo ed una distrazione.&lt;/p&gt;&#xA;&lt;p&gt;Molto meglio installare uno dei tanti editor grafici disponibili per macOS. Fra &lt;a href=&#34;https://atom.io/&#34;&gt;Atom&lt;/a&gt;, &lt;a href=&#34;http://www.barebones.com/products/bbedit/&#34;&gt;BBEdit&lt;/a&gt;, &lt;a href=&#34;https://macromates.com/&#34;&gt;TextMate&lt;/a&gt;, &lt;a href=&#34;https://code.visualstudio.com/&#34;&gt;Visual Studio Code&lt;/a&gt;, c&amp;rsquo;è solo l&amp;rsquo;imbarazzo della scelta. Sono tutti gratuiti (si, ora anche BBEdit è gratuito, la licenza serve per sbloccare le funzioni avanzate utili per i professionisti), sono tutti di ottima qualità (si, anche un prodotto Microsoft come Visual Studio Code può essere ottimo). Io preferisco usare TextMate e Atom &amp;ndash; di quest&amp;rsquo;ultimo mi piace moltissimo la possibilità di sincronizzare automaticamente le impostazioni, i plugin e i temi fra tutti i computer su cui l&amp;rsquo;ho installato, che siano Mac o generici PC con Linux o Windows &amp;ndash; però BBEdit è perfetto per i file di grosse (o meglio dire enormi) dimensioni come quelli che mi stanno capitando per le mani ultimamente. Mentre Visual Studio Code&amp;hellip; beh, Visual Studio Code è stato una vera sorpresa sin dalla prima volta che l&amp;rsquo;ho usato.&lt;/p&gt;&#xA;&lt;h4 id=&#34;dalla-linea-di-comando-allo-script&#34;&gt;Dalla linea di comando allo script&lt;/h4&gt;&#xA;&lt;p&gt;Lanciamo quindi l&amp;rsquo;editor che preferiamo e incolliamo l&amp;rsquo;ultima versione del comando di Terminale visto nella &lt;a href=&#34;https://melabit.wordpress.com/2018/11/23/script-per-tutti-i-giorni-semplici-modifiche-alle-stringhe-di-testo/&#34;&gt;puntata precedente&lt;/a&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; | 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;In questo comando c&amp;rsquo;è una parte variabile, la stringa &amp;ldquo;La privacy al tempo dell&amp;rsquo;Internet of Things: gran finale&amp;rdquo;, che dobbiamo cambiare ogni volta che vogliamo generare un nuovo titolo, mentre tutto il resto rimane sempre inalterato (a meno di non modificare di proposito il codice).&lt;/p&gt;&#xA;&lt;p&gt;È sempre consigliabile separare le parti variabili del codice da quelle che rimangono sempre uguali, per evitare di alterare il programma per errore e renderlo inusabile. In questo caso, basta definire una &lt;em&gt;variabile&lt;/em&gt; a cui viene assegnata la stringa da elaborare, usata come una specie di segnaposto nel resto del programma, e separare anche visivamente con una o più righe vuote le variabili dal resto del programma. Lo script diventa così&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;string=&amp;#34;La privacy al tempo dell&amp;#39;Internet of Things: gran finale&amp;#34;&#xA;&#xA;echo $string | tr &amp;#34;[:upper:]&amp;#34; &amp;#34;[:lower:]&amp;#34; | sed &amp;#34;s/&amp;#39;/ /g&amp;#34; | sed &amp;#34;s/[[:punct:]]//g&amp;#34; | sed &amp;#34;s/ /-/g&amp;#34;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;dove la prima riga definisce la variabile &lt;code&gt;string&lt;/code&gt;, che viene poi usata nel comando vero e proprio.&lt;/p&gt;&#xA;&lt;p&gt;Da notare che quando si assegna una variabile in &lt;code&gt;bash&lt;/code&gt; non si possono mettere degli spazi prima e dopo l&amp;rsquo;operatore di assegnazione &lt;code&gt;=&lt;/code&gt;. In altre parole il nome della variabile, l&amp;rsquo;operatore e il valore della variabile devono essere scritti &lt;em&gt;tutti attaccati&lt;/em&gt;. Inoltre, quando si usa la variabile nello script bisogna sempre anteporre il prefisso &lt;code&gt;$&lt;/code&gt; e scriverla come &lt;code&gt;$string&lt;/code&gt;. Sono due particolarità di &lt;code&gt;bash&lt;/code&gt; di cui è facile dimenticarsi quando si è abituati ad usare altri linguaggi di programmazione, a me succede anche troppo spesso.&lt;/p&gt;&#xA;&lt;p&gt;Guardiamo ora la seconda riga. Nel comando originale da Terminale l&amp;rsquo;abbiamo scritta tutta di seguito, usando l&amp;rsquo;operatore &lt;code&gt;|&lt;/code&gt; per trasferire il risultato di un comando al comando immediatamente successivo, che lo usa come dato di ingresso da elaborare. È una pratica che evita la creazione di troppe variabili, magari usate solo una volta, che è diventata popolare di recente in &lt;a href=&#34;https://www.r-project.org/&#34;&gt;R&lt;/a&gt;, un linguaggio di programmazione specializzato nell&amp;rsquo;analisi statistica dei dati.&lt;/p&gt;&#xA;&lt;p&gt;Personalmente la trovo una pratica poco lungimirante. Sarà anche comoda nel momento in cui sviluppiamo un programma, ma rende molto più difficile capire in un secondo momento quello che fa lo script. Ormai la memoria dei computer è gigantesca, possiamo benissimo sprecarne un po&amp;rsquo; per definire qualche variabile in più.&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;Una versione riveduta del programma precedente, nella quale i risultati di ciascuna fase di elaborazione vengono salvati in una variabile diversa, può quindi essere&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;string=&amp;#34;La privacy al tempo dell&amp;#39;Internet of Things: gran finale&amp;#34;&#xA;&#xA;lowercase=$(echo $string | tr &amp;#34;[:upper:]&amp;#34; &amp;#34;[:lower:]&amp;#34;)&#xA;del_apostr=$(echo $lowercase | sed &amp;#34;s/&amp;#39;/ /g&amp;#34;)&#xA;del_punct=$(echo $del_apostr | sed &amp;#34;s/[[:punct:]]//g&amp;#34;)&#xA;fix_spaces=$(echo $del_punct | sed &amp;#34;s/ /-/g&amp;#34;)&#xA;&#xA;converted_string=$fix_spaces&#xA;echo $converted_string&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Qui devo ammettere di avere esagerato. Se la prima versione scritta tutta d&amp;rsquo;un fiato era difficile da leggere e da capire, usare una variabile diversa per ogni passo del programma è altrettanto estremo. Un buon compromesso potrebbe essere&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;string=&amp;#34;La privacy al tempo dell&amp;#39;Internet of Things: gran finale&amp;#34;&#xA;&#xA;fix_string=$(echo $string | tr &amp;#34;[:upper:]&amp;#34; &amp;#34;[:lower:]&amp;#34;)&#xA;fix_string=$(echo $fix_string | sed &amp;#34;s/&amp;#39;/ /g&amp;#34;)&#xA;fix_string=$(echo $fix_string | sed &amp;#34;s/[[:punct:]]//g&amp;#34;)&#xA;fix_string=$(echo $fix_string | sed &amp;#34;s/ /-/g&amp;#34;)&#xA;&#xA;converted_string=$fix_string&#xA;echo $converted_string&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;in cui si usa una variabile (&lt;code&gt;string&lt;/code&gt;) per la stringa da elaborare, un&amp;rsquo;altra (&lt;code&gt;fix_string&lt;/code&gt;) per conservare i risultati intermedi ed infine un&amp;rsquo;ultima variabile (&lt;code&gt;converted_string&lt;/code&gt;) per il risultato finale del programma.&lt;/p&gt;&#xA;&lt;p&gt;Se si guardano attentamente le due ultime versioni dello script, si nota che ho continuato ad usare l&amp;rsquo;operatore &lt;code&gt;|&lt;/code&gt; per inviare a &lt;code&gt;sed&lt;/code&gt; o a &lt;code&gt;tr&lt;/code&gt; la stringa da elaborare. Non è una contraddizione rispetto a quanto dicevo prima. Una cosa è scrivere una sequenza di quattro, cinque o più comandi collegati uno all&amp;rsquo;altro a formare una catena di montaggio inestricabile, un&amp;rsquo;altra è utilizzare ripetutamente una struttura ben definita e riconoscibile come &lt;code&gt;echo $... | tr &amp;quot;...&amp;quot;&lt;/code&gt; oppure &lt;code&gt;echo $... | sed &amp;quot;...&amp;quot;&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Del resto non ci sono alternative: sia &lt;code&gt;sed&lt;/code&gt; che &lt;code&gt;tr&lt;/code&gt; sono fatti per operare su un file oppure in modo interattivo nel Terminale (si scrive una stringa nel Terminale, si preme Invio e &lt;code&gt;sed&lt;/code&gt; o &lt;code&gt;tr&lt;/code&gt; la elaborano, stampano il risultato e si mettono in attesa di una nuova stringa finché non li interrompiamo premendo CTRL-D) e l&amp;rsquo;unico modo per &lt;em&gt;obbligarli&lt;/em&gt; a lavorare da programma e usare &lt;code&gt;echo&lt;/code&gt; per fornirgli il dato in ingresso già bello e pronto.&lt;/p&gt;&#xA;&lt;p&gt;Al nostro script mancano ancora due cosette per essere &lt;em&gt;quasi&lt;/em&gt; comodo da usare, ma questo sarà l&amp;rsquo;argomento della prossima puntata.&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;A meno naturalmente di non avere dei grossi limiti di memoria, come succede quando si scrivono programmi per dispositivi &lt;em&gt;embedded&lt;/em&gt; o dell&amp;rsquo;IoT, oppure di dover scrivere del codice molto efficiente per applicazioni ultrasofisticate. Ma chi è alle prese con questi problemi non ha bisogno di leggere questi articoli.&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>First Draft: la prova</title>
      <link>https://static.233.196.69.159.clients.your-server.de/it/2015/12/23/first-draft-la-prova/</link>
      <pubDate>Wed, 23 Dec 2015 06:00:00 +0000</pubDate>
      <guid>https://static.233.196.69.159.clients.your-server.de/it/2015/12/23/first-draft-la-prova/</guid>
      <description>&lt;p&gt;Non soffro particolarmente della sindrome della pagina bianca, ma sono anche consapevole che le cose migliori mi vengono fuori quando ho l&amp;rsquo;ispirazione e scrivo di getto.&lt;/p&gt;&#xA;&lt;p&gt;Non a caso scrivo ancora spesso a mano. Mi piace la sensazione della penna che scorre veloce sul foglio, seguendo al meglio il filo del pensiero. Anche se vengono fuori geroglifici quasi incomprensibili, riesco (quasi sempre) a decifrarli e a tradurli in un testo decente.&lt;/p&gt;&#xA;&lt;p&gt;Scrivendo al computer si dovrebbe cercare di fare lo stesso: buttare giù una prima stesura senza preoccuparsi troppo della forma, degli errori o della formattazione, tutte cose che distraggono dalla scrittura e di cui ci si può preoccupare in un secondo momento.&lt;/p&gt;&#xA;&lt;p&gt;Purtroppo i programmi di scrittura non aiutano, perché invitano a concentrarsi fin dall&amp;rsquo;inizio sui dettagli, distraendo dall&amp;rsquo;obiettivo principale che è quello di riuscire a fissare le idee sulla pagina.&lt;/p&gt;&#xA;&lt;h4 id=&#34;first-draft&#34;&gt;First Draft&lt;/h4&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.96problems.com/first-draft/&#34;&gt;First Draft&lt;/a&gt; è un programma di scrittura anomalo, che si propone di riprodurre sullo schemo del computer quello che facciamo quando scriviamo su un foglio di carta. Tutto quello che si cancella non viene rimosso definitivamente dallo schermo ma viene solo sbarrato, restando comunque visibile e magari riutilizzabile in un secondo momento.&lt;/p&gt;&#xA;&lt;p&gt;First Draft può essere &lt;a href=&#34;https://itunes.apple.com/it/app/first-draft/id1021874663?l=en&amp;amp;amp;mt=12&#34;&gt;scaricato liberamente&lt;/a&gt; dal Mac App Store.&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;&#xA;La versione gratuita non ha limitazioni e salva automaticamente tutto quello che scriviamo sul Mac, compresi gli errori e le cancellazioni.&lt;/p&gt;&#xA;&lt;p&gt;Ma se vogliamo rimuovere le modifiche e utilizzare il documento &lt;em&gt;pulito&lt;/em&gt; è indispensabile sbloccare la funzione di esportazione, con un acquisto in-App di 14.99 euro. Vedremo fra poco se ne vale la pena.&lt;/p&gt;&#xA;&lt;h4 id=&#34;usiamo-il-programma&#34;&gt;Usiamo il programma&lt;/h4&gt;&#xA;&lt;p&gt;Quando avviamo First Draft ci viene chiesto se vogliamo assistere ad una breve lezione interattiva che insegna ad usare il programma. La lezione è fatta bene, peccato che la richiesta venga ripetuta ad ogni avvio, diventando rapidamente noiosa. È vero che si può decidere di saltare la lezione, ma sarebbe più logico memorizzare la scelta dell&amp;rsquo;utente ed evitare di ripetere ogni volta la stessa domanda.&lt;/p&gt;&#xA;&lt;p&gt;Considerazioni analoghe valgono per la schemata di presentazione di First Draft. Perché si deve essere obbligati ogni volta a leggere le caratteristiche introdotte nella nuova versione, senza poter scegliere di passare direttamente all&amp;rsquo;uso del programma? La prima volta va anche bene, ma dopo un po&amp;rsquo; è una vera seccatura.&lt;/p&gt;&#xA;&lt;p&gt;[caption id=&amp;ldquo;attachment_2294&amp;rdquo; align=&amp;ldquo;aligncenter&amp;rdquo; width=&amp;ldquo;605&amp;rdquo;]&lt;img src=&#34;https://melabit.files.wordpress.com/2015/12/01_apertura.png?w=605&#34; alt=&#34;Schermata di presentazione di First Draft.&#34; width=&#34;605&#34; height=&#34;423&#34; class=&#34;size-large wp-image-2294&#34; /&gt; Schermata di presentazione di First Draft.[/caption]&lt;/p&gt;&#xA;&lt;p&gt;La finestra dell&amp;rsquo;editor di First Draft è divisa in tre parti distinte, un&amp;rsquo;area centrale che contiene il testo e due colonne bianche ai lati. La larghezza dell&amp;rsquo;area di testo è fissa e non può essere modificata. Allargando la finestra dell&amp;rsquo;editor si aumenta solo la larghezza delle colonne laterali, che diventano preponderanti rispetto all&amp;rsquo;area centrale. A qualcuno potrà anche piacere, a me da solo l&amp;rsquo;impressione di un sacco di spazio sprecato inutilmente. Una scelta del genere può andare bene per un iPad o un MacBook con lo schermo piccolo, ma non ha molto senso con un monitor di dimensioni normali.&lt;/p&gt;&#xA;&lt;p&gt;[caption id=&amp;ldquo;attachment_2295&amp;rdquo; align=&amp;ldquo;aligncenter&amp;rdquo; width=&amp;ldquo;605&amp;rdquo;]&lt;img src=&#34;https://melabit.files.wordpress.com/2015/12/02_editor.png?w=605&#34; alt=&#34;La finestra dell&amp;#039;editor.&#34; width=&#34;605&#34; height=&#34;423&#34; class=&#34;size-large wp-image-2295&#34; /&gt; La finestra dell&amp;rsquo;editor.[/caption]&lt;/p&gt;&#xA;&lt;p&gt;Anche la dimensione del testo non può essere modificata, nonostante la presenza dell&amp;rsquo;opzione relativa nella barra laterale di configurazione del programma. Lo stesso vale per lo stile del font: cliccando su uno dei quattro stili disponibili non succede assolutamente niente.&lt;/p&gt;&#xA;&lt;p&gt;[caption id=&amp;ldquo;attachment_2296&amp;rdquo; align=&amp;ldquo;aligncenter&amp;rdquo; width=&amp;ldquo;605&amp;rdquo;]&lt;img src=&#34;https://melabit.files.wordpress.com/2015/12/03_preferenze.png?w=605&#34; alt=&#34;Barra laterale di configurazione.&#34; width=&#34;605&#34; height=&#34;423&#34; class=&#34;size-large wp-image-2296&#34; /&gt; Barra laterale di configurazione.[/caption]&lt;/p&gt;&#xA;&lt;h4 id=&#34;troppi-bachi&#34;&gt;Troppi bachi&lt;/h4&gt;&#xA;&lt;p&gt;Ma i problemi non si limitano a questo. Purtroppo First Draft è infestato da parecchi altri bachi evidenti. Ad esempio, dopo averlo usato alcune volte, le cartelle che contengono i documenti di First Draft e che sono visibili sul lato sinistro della finestra di avvio appaiono ripetute più volte. La ripetizione non ha nessun effetto negativo sull&amp;rsquo;uso del programma, ma è comunque piuttosto fastidiosa.&lt;/p&gt;&#xA;&lt;p&gt;[caption id=&amp;ldquo;attachment_2297&amp;rdquo; align=&amp;ldquo;aligncenter&amp;rdquo; width=&amp;ldquo;605&amp;rdquo;]&lt;img src=&#34;https://melabit.files.wordpress.com/2015/12/04_cartelle_multiple.png?w=605&#34; alt=&#34;Cartelle multiple nella finestra di avvio.&#34; width=&#34;605&#34; height=&#34;423&#34; class=&#34;size-large wp-image-2297&#34; /&gt; Cartelle multiple nella finestra di avvio.[/caption]&lt;/p&gt;&#xA;&lt;p&gt;Se nella barra laterale di configurazione si seleziona la modalità scura, l&amp;rsquo;unico modo per ripristinare quella chiara di default è tornare alla finestra di avvio del programma e riaprire il documento su cui si sta lavorando. Ma anche così la finestra di avvio rimane parzialmente scura e la finestra dell&amp;rsquo;editor è imbruttita da una barretta laterale scura. La visualizzazione corretta viene ripristinata solo chiudendo e riaprendo il programma.&lt;/p&gt;&#xA;&lt;img src=&#34;https://melabit.files.wordpress.com/2015/12/05_modalita_scura_a.png?w=605&#34; alt=&#34;05_modalita_scura_a&#34; width=&#34;605&#34; height=&#34;423&#34; class=&#34;aligncenter size-large wp-image-2298&#34; /&gt;&#xA;&lt;p&gt;[caption id=&amp;ldquo;attachment_2299&amp;rdquo; align=&amp;ldquo;aligncenter&amp;rdquo; width=&amp;ldquo;605&amp;rdquo;]&lt;img src=&#34;https://melabit.files.wordpress.com/2015/12/05_modalita_scura_b.png?w=605&#34; alt=&#34;Problemi di visualizzazione passando dalla modalità chiara a quella scura.&#34; width=&#34;605&#34; height=&#34;423&#34; class=&#34;size-large wp-image-2299&#34; /&gt; Problemi di visualizzazione passando dalla modalità chiara a quella scura.[/caption]&lt;/p&gt;&#xA;&lt;p&gt;In certi casi, in particolare quando si sposta la finestra di First Draft mentre si sta editando un documento (ma non solo), i bottoni rosso, arancione e verde tipici delle finestre di OS X vengono cancellati più o meno completamente. La cosa è ben visibile in alcune delle immagini di questo articolo ed è dovuta alla comparsa di una finestra vuota leggermente più piccola, che si sovrappone quasi completamente alla finestra principale. È la prima volta che vedo qualcosa del genere, dopo aver usato alcune centinaia di programmi per OS X.&lt;/p&gt;&#xA;&lt;p&gt;Come se non bastasse, First Draft va molto spesso in crash, per fortuna senza cancellare quello che si è scritto fino a quel momento (ma in questo caso probabilmente tutti i meriti vanno a OS X e alle sue funzioni di &lt;a href=&#34;http://www.engadget.com/2011/07/20/os-x-lion-auto-save-and-versions-to-the-rescue/&#34;&gt;salvataggio automatico&lt;/a&gt; dei documenti).&lt;/p&gt;&#xA;&lt;p&gt;[caption id=&amp;ldquo;attachment_2300&amp;rdquo; align=&amp;ldquo;aligncenter&amp;rdquo; width=&amp;ldquo;557&amp;rdquo;]&lt;img src=&#34;https://melabit.files.wordpress.com/2015/12/06_crash.png&#34; alt=&#34;Uno dei tanti crash di First Draft.&#34; width=&#34;557&#34; height=&#34;273&#34; class=&#34;size-full wp-image-2300&#34; /&gt; Uno dei tanti crash di First Draft.[/caption]&lt;/p&gt;&#xA;&lt;h4 id=&#34;ma-a-un-certo-punto&#34;&gt;Ma a un certo punto&amp;hellip;&lt;/h4&gt;&#xA;&lt;p&gt;Dopo aver aperto e chiuso molte volte First Draft sono costretto a correggere, almeno in parte, quello che ho scritto. Infatti improvvisamente le opzioni di scelta dello stile e della dimensione del font e il passaggio dalla modalità chiara a quella scura hanno iniziato a funzionare in modo corretto (ma tutti gli altri bachi rimangono).&lt;/p&gt;&#xA;&lt;p&gt;Per cercare di riprodurre questo comportamento strano, ho provato a resettare First Draft, cancellando tutti i file di supporto di First Draft con l&amp;rsquo;ottimo &lt;a href=&#34;http://freemacsoft.net/appcleaner/&#34;&gt;AppCleaner&lt;/a&gt; (un programma che consiglio senza remore) e conservando solo l&amp;rsquo;applicazione vera e propria.&lt;/p&gt;&#xA;&lt;p&gt;[caption id=&amp;ldquo;attachment_2301&amp;rdquo; align=&amp;ldquo;aligncenter&amp;rdquo; width=&amp;ldquo;605&amp;rdquo;]&lt;img src=&#34;https://melabit.files.wordpress.com/2015/12/07_reset.png?w=605&#34; alt=&#34;Reset del programma.&#34; width=&#34;605&#34; height=&#34;532&#34; class=&#34;size-large wp-image-2301&#34; /&gt; Reset del programma.[/caption]&lt;/p&gt;&#xA;&lt;p&gt;In questo modo il programma torna allo stato iniziale, come se fosse stato appena installato dall&amp;rsquo;App Store. Purtroppo anche tutti i bachi si ripresentano esattamente come prima.&lt;/p&gt;&#xA;&lt;p&gt;Lanciando di nuovo First Draft un numero imprecisato di volte compaiono all&amp;rsquo;improvviso, e senza un motivo apparente, dei riquadri di suggerimento (&lt;code&gt;balloon help&lt;/code&gt;) sovrapposti alla finestra principale di First Draft. È proprio questo che, chissà perché, riattiva il funzionamento corretto delle preferenze del programma.&lt;/p&gt;&#xA;&lt;p&gt;Non è chiaro però cosa determini la comparsa degli aiuti. L&amp;rsquo;ipotesi più probabile è che questi appaiano solo dopo un certo numero di riavvii del programma. Se è così, è un&amp;rsquo;altra scelta incomprensibile: gli aiuti servono immediatamente, per guidare il nuovo utente all&amp;rsquo;uso del programma, non dopo decine di riavvii, quando è presumibile che l&amp;rsquo;utente abbia imparato ad usarlo.&lt;/p&gt;&#xA;&lt;h4 id=&#34;conclusioni&#34;&gt;Conclusioni&lt;/h4&gt;&#xA;&lt;p&gt;First Draft è un programma potenzialmente interessante, ma purtroppo la realizzazione pratica è del tutto insoddisfacente. Alcune scelte di progetto poco comprensibili e i tanti bachi fastidiosi lo rendono, allo stato attuale, poco utilizzabile in modo serio e produttivo.&lt;/p&gt;&#xA;&lt;p&gt;Distribuire un programma in queste condizioni da solo l&amp;rsquo;impressione di sciatteria e di scarsa attenzione nei confronti degli  utenti.&lt;/p&gt;&#xA;&lt;p&gt;I 15 euro richiesti per sbloccare le funzioni di esportazione sarebbero eccessivi anche se il programma funzionasse perfettamente ma, allo stato attuale, rappresentano praticamente una truffa.&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;In questo momento First Draft è ancora disponibile sul Mac App Store italiano. Ma dovrebbe essere stato rimosso dal Mac App Store americano per &lt;a href=&#34;http://nanowrimo.org/forum_comments/5883011&#34;&gt;violazione del marchio commerciale&lt;/a&gt;, perché una azienda concorrente ha registrato dal 2014 un programma per Windows &lt;a href=&#34;http://www.justoutsourcing.com/files/fd/&#34;&gt;con lo stesso nome&lt;/a&gt;. Un programma piuttosto &lt;em&gt;furbetto&lt;/em&gt;, un generatore automatico di contenuti per blog, pagine web e simili (probabilmente alcune persone che conosco lo usano già a fondo).&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>Script di shell in OS X</title>
      <link>https://static.233.196.69.159.clients.your-server.de/it/2014/11/06/script-di-shell-in-os-x/</link>
      <pubDate>Thu, 06 Nov 2014 06:00:00 +0000</pubDate>
      <guid>https://static.233.196.69.159.clients.your-server.de/it/2014/11/06/script-di-shell-in-os-x/</guid>
      <description>&lt;p&gt;Nei sistemi operativi basati su Unix la &lt;code&gt;shell&lt;/code&gt; è una applicazione che permette di eseguire i comandi del sistema tramite una interfaccia testuale a linea di comando.&lt;/p&gt;&#xA;&lt;p&gt;La shell più popolare oggi è &lt;a href=&#34;http://it.wikipedia.org/wiki/Bash&#34;&gt;bash&lt;/a&gt;,  acronimo di &amp;ldquo;Bourne-Again Shell&amp;rdquo;, un gioco di parole fra Stephen Bourne, l&amp;rsquo;autore della shell &lt;code&gt;sh&lt;/code&gt; da cui deriva bash, e il termine &amp;ldquo;born&amp;rdquo; (nato). Bash significa quindi sia &amp;ldquo;la nuova shell di Bourne&amp;rdquo; che &amp;ldquo;la shell rinata&amp;rdquo;.&lt;/p&gt;&#xA;&lt;p&gt;Bash è la &lt;a href=&#34;http://www.gnu.org/software/bash/&#34;&gt;shell ufficiale del progetto GNU&lt;/a&gt;, ed è da tempo la shell di default in praticamente tutte le distribuzioni di Linux oltre che in OS X.&#xA;Per accedere a bash in OS X si utilizza il Terminale, una applicazione di cui si è già parlato più volte in questo blog. Il Terminale si trova in &lt;code&gt;Applicazioni&lt;/code&gt; &amp;gt; &lt;code&gt;Utility&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Bash permette di eseguire i comandi del sistema operativa sia in modo interattivo, scrivendoli uno alla volta sulla linea di comando, che tramite uno &lt;code&gt;script di shell&lt;/code&gt; (&lt;code&gt;shell script&lt;/code&gt;), un vero e proprio programma all&amp;rsquo;interno del quale è possibile usare variabili, strutture di controllo e funzioni, esattamente come in tutti i linguaggi di programmazione.&lt;/p&gt;&#xA;&lt;p&gt;Uno script di shell ben fatto può diventare quindi un vero e proprio comando specializzato, eseguibile dalla linea di comando e praticamente indistinguibile dai comandi intrinseci del sistema.&lt;/p&gt;&#xA;&lt;p&gt;Ma come si crea uno script di shell? Basta seguire alcune semplici regole.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Innanzi tutto lo script va scritto usando un editor, mai un wordprocessor come Word o Pages. Lo script deve infatti essere un semplice file di testo e non deve contenere i codici di formattazione o i caratteri speciali inseriti normalmente dai programmi di videoscrittura.&lt;br&gt;&#xA;Come editor si può usare TextEdit, preinstallato in tutte le versioni di OS X, ma vanno ancora meglio programmi gratuiti, come &lt;a href=&#34;http://www.barebones.com/products/textwrangler/&#34;&gt;TextWrangler&lt;/a&gt;, &lt;a href=&#34;http://macromates.com/&#34;&gt;TextMate 2.0&lt;/a&gt;, &lt;a href=&#34;http://brackets.io/&#34;&gt;Brackets&lt;/a&gt;, &lt;a href=&#34;https://atom.io/&#34;&gt;Atom&lt;/a&gt;, o commerciali, come il mostro sacro &lt;a href=&#34;http://www.barebones.com/products/bbedit/&#34;&gt;BBEdit&lt;/a&gt; e &lt;a href=&#34;http://www.sublimetext.com/&#34;&gt;Sublime Text&lt;/a&gt;. Tutti questi editor hanno il grande vantaggio rispetto al semplice TextEdit di evidenziare i comandi di bash e di supportare l&amp;rsquo;autocompletamento delle parole chiave riconosciute dall&amp;rsquo;editor.&lt;br&gt;&#xA;Volendo si possono usare anche &lt;a href=&#34;https://code.google.com/p/macvim/&#34;&gt;macvim&lt;/a&gt; o &lt;a href=&#34;http://aquamacs.org/&#34;&gt;emacs&lt;/a&gt;, ma chi è in grado di usarli non ha bisogno di sicuro di leggere queste note.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Per permettere al sistema operativo di identificare il file come uno script per la shell bash, gli script devono iniziare con la riga&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;code&gt;&lt;pre&gt;&#xA;#!/bin/bash&#xA;&lt;/pre&gt;&lt;/code&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;È buona regola salvare tutti i propri script in una cartella (&lt;code&gt;directory&lt;/code&gt;) comune, in modo che siano facilmente rintracciabili dal sistema operativo (ma dopo un po&amp;rsquo; di tempo anche da noi stessi!)&lt;br&gt;&#xA;Per uniformarci alle convenzioni di Unix, creiamo una directory &lt;code&gt;bin&lt;/code&gt; nella nostra cartella &lt;code&gt;Inizio&lt;/code&gt; (o directory &lt;code&gt;home&lt;/code&gt;), dove salveremo tutti gli script.&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;&#xA;Lanciamo il Terminale ed eseguiamo i comandi&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;code&gt;&lt;pre&gt;&#xA;$ cd ~&#xA;$ mkdir bin&#xA;&lt;/pre&gt;&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;dove il simbolo &lt;code&gt;~&lt;/code&gt; indica per convenzione la cartella &lt;code&gt;home&lt;/code&gt; dell&amp;rsquo;utente.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Lo script deve essere reso eseguibile direttamente con il comando&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;code&gt;&lt;pre&gt;&#xA;$ chmod u+x scriptname &lt;br&gt;&#xA;&lt;/pre&gt;&lt;/code&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Aiutiamo il sistema operativo a trovare facilmente i nostri script aggiungendo la directory &lt;code&gt;bin&lt;/code&gt; appena creata alla variabile di ambiente &lt;code&gt;PATH&lt;/code&gt;, che definisce le directory dove il sistema operativo va a cercare i comandi del sistema. Torniamo al Terminale ed eseguiamo in sequenza i comandi&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;code&gt;&lt;pre&gt;&#xA;cp -p .bashrc .bashrc.ORIGINAL&#xA;echo &amp;ldquo;export PATH=~/bin:$PATH&amp;rdquo; &amp;raquo; .bashrc&#xA;&lt;/pre&gt;&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;Il primo comando duplica il file &lt;code&gt;.bashrc&lt;/code&gt; originale, mentre il secondo aggiunge la riga contenuta fra virgolette alla fine del file &lt;code&gt;.bashrc&lt;/code&gt;.&#xA;Bisogna stare molto attenti ad usare &lt;strong&gt;due simboli di maggiore&lt;/strong&gt; nel secondo comando altrimenti si rischia di sovrascrivere &lt;code&gt;.bashrc&lt;/code&gt; con effetti potenzialmente disastrosi (questo è il motivo per cui è bene  prima duplicare il file &lt;code&gt;.bashrc&lt;/code&gt; originale).&lt;/p&gt;&#xA;&lt;p&gt;Una volta chiuso e rilanciato il Terminale, la cartella &lt;code&gt;~/bin&lt;/code&gt; sarà aggiunta alla lista delle directory contenenti i comandi eseguiti da bash.&lt;/p&gt;&#xA;&lt;p&gt;Bisogna notare che la creazione della directory &lt;code&gt;~/bin&lt;/code&gt; e la sua aggiunta al PATH del sistema vanno eseguiti una sola volta per ogni utente del Mac.&lt;/p&gt;&#xA;&lt;p&gt;Vorrei infine sfatare una credenza ormai obsoleta: non è assolutamente necessario che il nome dello script termini con l&amp;rsquo;estensione &lt;code&gt;.sh&lt;/code&gt;. È una vecchia abitudine che ha l&amp;rsquo;unico vantaggio di rendere immediatamente riconoscibile uno script salvato in una directory qualunque del sistema. Ma è una pratica inutile se si segue il consiglio di tenere tutti gli script di shell in una directory predefinita come &lt;code&gt;~/bin&lt;/code&gt;.&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;La cartella &lt;code&gt;Inizio&lt;/code&gt; in OS X è quella identificata dall&amp;rsquo;icona di una casetta.&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>
  </channel>
</rss>
