<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Terminale on Melabit</title>
    <link>https://static.233.196.69.159.clients.your-server.de/it/tags/terminale/</link>
    <description>Recent content in Terminale on Melabit</description>
    <generator>Hugo</generator>
    <language>it</language>
    <lastBuildDate>Sat, 09 Aug 2025 06:00:00 +0000</lastBuildDate>
    <atom:link href="https://static.233.196.69.159.clients.your-server.de/it/tags/terminale/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Addio dc, benvenuta luka: una nuova calcolatrice RPN da Terminale</title>
      <link>https://static.233.196.69.159.clients.your-server.de/it/2025/08/09/addio-dc-benvenuta-luka-una-nuova-calcolatrice-rpn-da-terminale/</link>
      <pubDate>Sat, 09 Aug 2025 06:00:00 +0000</pubDate>
      <guid>https://static.233.196.69.159.clients.your-server.de/it/2025/08/09/addio-dc-benvenuta-luka-una-nuova-calcolatrice-rpn-da-terminale/</guid>
      <description>&lt;p&gt;La &lt;em&gt;Notazione Polacca Inversa&lt;/em&gt; (o RPN, dall&amp;rsquo;inglese Reverse Polish Notation) è un modo per eseguire operazioni matematiche senza usare le parentesi. Negli anni ‘70-80 l&amp;rsquo;RPN fu resa popolare da Hewlett-Packatd (HP), che l&amp;rsquo;utilizzò in &lt;a href=&#34;https://www.hpmuseum.org/rpnvers.htm&#34;&gt;tutte le sue calcolatrici&lt;/a&gt; scientifiche e finanziarie.&lt;/p&gt;&#xA;&lt;p&gt;Con le calcolatrici della rivale Texas-Instruments, che usavano le parentesi, era facile perdere il conto di quante parentesi si erano aperte o chiuse, cosa che costringeva spesso a reinserire l’intera espressione dal principio. Chi usava una calcolatrice RPN non aveva questi problemi, anche se doveva superare un piccolo scoglio iniziale per abituarsi alla nuova notazione.&lt;/p&gt;&#xA;&lt;p&gt;Oggi le calcolatrici &lt;em&gt;fisiche&lt;/em&gt; sono poco usate, e quasi tutti preferiscono utilizzare un&amp;rsquo;app sul telefono o sul computer. Ma c&amp;rsquo;è ancora qualche &lt;em&gt;nerd&lt;/em&gt; impenitente che non si arrende all&amp;rsquo;interfaccia grafica e si ostina ad usare il Terminale. Perché? Ad esempio, perché è molto più facile inserire numeri e operazioni complicate con la tastiera, che &lt;em&gt;premere&lt;/em&gt; i tasti di vetro di una calcolatrice virtuale.&lt;/p&gt;&#xA;&lt;h4 id=&#34;premessa&#34;&gt;Premessa&lt;/h4&gt;&#xA;&lt;p&gt;Se avete fretta e non volete sobbarcarvi la lettura di questo lungo articolo, troverete tutte le informazioni che vi servono in &lt;a href=&#34;https://macintelligence.org/post/2025-07-24-ma-non-per-calcolo/&#34;&gt;questo post&lt;/a&gt;, sintetico ma come sempre brillante, su &lt;a href=&#34;https://macintelligence.org/&#34;&gt;Quickloox&lt;/a&gt;, uno dei blog di riferimento per chi è appassionato del mondo Apple.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2025-08-09-addio-dc-benvenuta-luka-una-nuova-calcolatrice-rpn-da-terminale/Gemini_Generated_Image_72y1t072y1t072y1.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;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;h4 id=&#34;un-po-di-storia&#34;&gt;Un po&amp;rsquo; di storia&lt;/h4&gt;&#xA;&lt;p&gt;La Polonia ci ha dato Niccolò Copernico, Fryderyk Chopin, Joseph Conrad, Marie Curie, Arthur Rubinstein, Stanislaw Lem. Ma ci ha dato anche Jan Lukasiewicz, un logico matematico (e filosofo) che cent&amp;rsquo;anni fa inventò una notazione matematica che non faceva uso di parentesi.&lt;/p&gt;&#xA;&lt;p&gt;In questa &lt;em&gt;notazione polacca&lt;/em&gt; tutti i simboli di operazione ( \( + \), \( - \), \( \times \), \( / \) ) precedono i numeri a cui si applicano. Lo stesso vale più in generale per le funzioni matematiche, come \( \sqrt{} \), \( \sin \), \( \cos \), \( \exp \) (dette &lt;em&gt;operatori&lt;/em&gt;) e i numeri o le variabili (dette &lt;em&gt;operandi&lt;/em&gt;) su cui agiscono.&lt;/p&gt;&#xA;&lt;p&gt;Ad esempio, una operazione come \( 3 + 4 \), in notazione polacca viene scritta \( + \ 3 \ 4 \), mentre \( (5 + 2) \times (5 - 2) \) diventa \( \times + 5 \ 2 - 5 \ 2 \).&lt;/p&gt;&#xA;&lt;p&gt;Per molti anni questa è rimasta solo una idea un po&amp;rsquo; bislacca, perché il vantaggio di non usare le parentesi non sembrava compensare a sufficienza la notazione inusuale e più difficile da leggere.&lt;/p&gt;&#xA;&lt;p&gt;Poi alla fine degli anni &amp;lsquo;50, John McCarthy rispolverò la notazione polacca  (o &lt;em&gt;prefissa&lt;/em&gt;) per il &lt;a href=&#34;https://twobithistory.org/2018/10/14/lisp.html&#34;&gt;LISP&lt;/a&gt;, uno dei linguaggi di programmazione più influenti di tutti i tempi,&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; sviluppato con l&amp;rsquo;obiettivo di essere applicato allo sviluppo di programmi nell&amp;rsquo;ambito della nascente intelligenza artificiale.&lt;/p&gt;&#xA;&lt;p&gt;La notazione prefissa, infatti, non solo semplificava notevolmente la scrittura dell&amp;rsquo;interprete LISP, ma permetteva anche di rappresentare allo stesso modo sia il codice che i dati, una cosa utilissima per un linguaggio finalizzato a rendere in computer &lt;em&gt;intelligente&lt;/em&gt;. Ma meglio non divagare troppo.&lt;/p&gt;&#xA;&lt;h4 id=&#34;notazione-polacca-inversa&#34;&gt;Notazione polacca inversa&lt;/h4&gt;&#xA;&lt;p&gt;Ma la vera svolta avviene invertendo l&amp;rsquo;ordine fra operandi ed operatori, cioè scrivendo &lt;em&gt;prima&lt;/em&gt; i numeri e &lt;em&gt;poi&lt;/em&gt; le operazioni da eseguire, per cui \( 3 + 4 \) diventa \( 3 \ 4 \ + \) e \( (5 + 2) \times (5 - 2) \) diventa \( \ 5 \ 2 + 5 \ 2 - \times \).&lt;/p&gt;&#xA;&lt;p&gt;Questa &lt;a href=&#34;https://en.wikipedia.org/wiki/Reverse_Polish_notation&#34;&gt;&lt;em&gt;notazione polacca inversa&lt;/em&gt;&lt;/a&gt; (RPN) viene scoperta e riscoperta per almeno tre volte in vent&amp;rsquo;anni, ma diventò popolare solo all&amp;rsquo;inizio degli anni &amp;lsquo;60 quando Friedrich Bauer, inventore del concetto di &lt;a href=&#34;https://en.wikipedia.org/wiki/Stack_%28abstract_data_type%29&#34;&gt;&lt;em&gt;stack&lt;/em&gt;&lt;/a&gt; e uno degli sviluppatori dell&amp;rsquo;&lt;a href=&#34;https://en.wikipedia.org/wiki/ALGOL&#34;&gt;ALGOL&lt;/a&gt;, e Edsger Dijkstra, famoso per la soluzione del &amp;ldquo;problema del cammino minimo&amp;rdquo; e per mile altre cose, ripresero in mano il concetto, perché permetteva di ridurre l&amp;rsquo;accesso alla memoria, che nei computer dell&amp;rsquo;epoca era scarsa e lenta, e di eseguire tutte le operazioni in un&amp;rsquo;area di memoria bene definita (lo &lt;em&gt;stack&lt;/em&gt;) e per questo più facile da manipolare.&lt;/p&gt;&#xA;&lt;p&gt;I vantaggi dell&amp;rsquo;RPN per eseguire i calcoli matematici erano così evidenti che HP la utilizzò in praticamente &lt;a href=&#34;https://www.hpmuseum.org/rpnvers.htm&#34;&gt;tutte le sue calcolatrici&lt;/a&gt; scientifiche e finanziarie, almeno fino all&amp;rsquo;inizio degli anni &amp;lsquo;90. Solo con lo sviluppo di memorie più capienti e di display molto più grandi divenne possibile visualizzare e modificare facilmente l&amp;rsquo;intera operazione impostata &amp;ndash; e non più solo l’ultimo numero inserito &amp;ndash; rendendo così meno necessario l’uso dell&amp;rsquo;RPN.&lt;/p&gt;&#xA;&lt;/div&gt;&#xA;&lt;br/&gt;&#xA;&lt;h4 id=&#34;una-calcolatrice-nel-terminale&#34;&gt;Una calcolatrice nel Terminale&lt;/h4&gt;&#xA;&lt;p&gt;Chi vuole usare una calcolatrice tradizionale nel Terminale di macOS o di Linux ha una scelta pressoché obbligata: &lt;code&gt;bc&lt;/code&gt;, il &lt;a href=&#34;https://en.wikipedia.org/wiki/Bc_%28programming_language%29&#34;&gt;&lt;em&gt;basic calculator&lt;/em&gt;&lt;/a&gt;, presente in UNIX dal 1975, 50 anni filati. La versione attuale, disponibile su Linux e macOS, è stata completamente riscritta, ma quella originale era solo una interfaccia per &lt;code&gt;dc&lt;/code&gt; (&lt;a href=&#34;https://en.wikipedia.org/wiki/Dc_%28computer_program%29&#34;&gt;&lt;em&gt;desk calculator&lt;/em&gt;&lt;/a&gt;), una delle più antiche utility presenti in UNIX e più vecchia persino del C.&lt;/p&gt;&#xA;&lt;p&gt;E &lt;code&gt;dc&lt;/code&gt; era&amp;hellip; una calcolatrice RPN. Una scelta che confermava l’intuizione di HP: la notazione RPN era più efficiente e più semplice da implementare, e quindi ideale anche per i computer dalle risorse limitate degli anni ’70.&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;Oggi l&amp;rsquo;RPN non è più una scelta quasi obbligata dalle limitazioni hardware, ma direi una scelta motivata soprattutto dalla &lt;em&gt;pigrizia&lt;/em&gt;. Perché, una volta che si è spesa una mezz&amp;rsquo;oretta per imparare ad usarla, si scopre che è davvero molto più comodo eseguire i calcoli con questa notazione piuttosto che con quella tradizionale.&lt;/p&gt;&#xA;&lt;p&gt;E poi forse c&amp;rsquo;è anche un certo gusto per andare controcorrente: in un mondo in cui tutti si uniformano ai dettami degli &lt;em&gt;influencer&lt;/em&gt; (veri o presunti) sui social, usare una calcolatrice RPN diventa un modo per distinguersi, per sentirsi fuori dal coro, quasi una dichiarazione di indipendenza intellettuale.&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;dc&lt;/code&gt; è ancora presente in Linux e macOS e può essere tranquillamente usata dal Terminale, ma è una bella fatica, i suoi cinquant&amp;rsquo;anni si sentono (e si vedono) tutti. I risultati delle operazioni non si vedono, a meno di non &lt;em&gt;stamparli&lt;/em&gt; sullo schermo con &lt;code&gt;p&lt;/code&gt;. Nemmeno lo stack si vede, a meno di non chiederlo esplicitamente con &lt;code&gt;f&lt;/code&gt;. I numeri negativi si indicano con l&amp;rsquo;underscore &lt;code&gt;_&lt;/code&gt; e non con il normale &lt;code&gt;-&lt;/code&gt;, per cui \( - 4 \) si scrive \( \_4 \). E così via.&lt;/p&gt;&#xA;&lt;p&gt;Ma da oggi c&amp;rsquo;è &lt;code&gt;dc2&lt;/code&gt; o meglio, &lt;code&gt;luka&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;h4 id=&#34;la-calcolatrice-rpn-del-xxi-secolo&#34;&gt;La calcolatrice RPN del XXI secolo&lt;/h4&gt;&#xA;&lt;p&gt;E sì, perché da qualche settimana abbiamo a disposizione una nuova calcolatrice RPN per il Terminale di macOS di Linux, chiamata inizialmente &lt;a href=&#34;https://github.com/mastro35/dc2&#34;&gt;&lt;code&gt;dc2&lt;/code&gt;&lt;/a&gt;, in omaggio alla veneranda calcolatrice ormai ultracinquantenne.&lt;/p&gt;&#xA;&lt;p&gt;Però &lt;code&gt;dc2&lt;/code&gt; sapeva troppo di una riscrittura dell&amp;rsquo;originale, mentre questo è un progetto completamente nuovo, scritto da zero in &lt;code&gt;C&lt;/code&gt;. Meritava quindi un nome tutto suo, &lt;a href=&#34;https://github.com/mastro35/luka&#34;&gt;&lt;code&gt;luka&lt;/code&gt;&lt;/a&gt;, in omaggio a Jan Lukasiewicz, l&amp;rsquo;inventore della &lt;em&gt;notazione polacca&lt;/em&gt; (si veda il riquadro qui sopra).&lt;/p&gt;&#xA;&lt;p&gt;Rispetto a &lt;code&gt;dc&lt;/code&gt;, &lt;code&gt;luka&lt;/code&gt; è davvero di un&amp;rsquo;altro secolo, e si vede appena si inizia a provarla. È interattiva, mostra in ogni momento il contenuto dello stack, ha la storia delle operazioni eseguite, le variabili, un help sintetico ma completo in linea, una pagina di manuale cristallina (ce ne fossero tante altre così!).&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2025-08-09-addio-dc-benvenuta-luka-una-nuova-calcolatrice-rpn-da-terminale/luka-example.png&#34; alt=&#34;&#34;&gt;&lt;br&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2025-08-09-addio-dc-benvenuta-luka-una-nuova-calcolatrice-rpn-da-terminale/luka-help.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;E poi &lt;code&gt;luka&lt;/code&gt; è fatta in Italia. In tempi in cui si esalta l’identità nazionale per i motivi più futili, è bello vedere qualcosa che merita davvero di essere valorizzato.&lt;/p&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2025-08-09-addio-dc-benvenuta-luka-una-nuova-calcolatrice-rpn-da-terminale/luka-credits.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;Il programma in questo momento ha un piccolo &lt;em&gt;bug&lt;/em&gt; legato alla visualizzazione dell’history, ma l&amp;rsquo;autore macina il codice molto più velocemente di quanto io macini le parole, per cui è più che probabile che il bug sarà corretto al più presto (vacanze permettendo).&lt;/p&gt;&#xA;&lt;h4 id=&#34;evoluzione-del-codice&#34;&gt;Evoluzione del codice&lt;/h4&gt;&#xA;&lt;p&gt;Lo sviluppo di &lt;code&gt;dc2&lt;/code&gt;/&lt;code&gt;luka&lt;/code&gt; è stato rapidissimo. Dietro al progetto c&amp;rsquo;è Davide Mastromatteo, noto fra i suoi &lt;em&gt;amici di penna&lt;/em&gt; come @mastro35 e autore dell&amp;rsquo;ottimo blog &lt;a href=&#34;https://thepythoncorner.com/&#34;&gt;The Python Corner&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;In pochi giorni Davide è passato dalla versione 0.1.0, perfettamente funzionale ma con una interfaccia utente ancora acerba,&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2025-08-09-addio-dc-benvenuta-luka-una-nuova-calcolatrice-rpn-da-terminale/dc2-010.png&#34; alt=&#34;&#34;&gt;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2025-08-09-addio-dc-benvenuta-luka-una-nuova-calcolatrice-rpn-da-terminale/dc2-010-help.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;alla versione 0.2.0, con una vista dello stack molto più chiara, la possibilità di usare gradi e radianti e di cambiare il formato di rappresentazione dei numeri, nonché con un help più compatto.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2025-08-09-addio-dc-benvenuta-luka-una-nuova-calcolatrice-rpn-da-terminale/dc2-020.png&#34; alt=&#34;&#34;&gt;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2025-08-09-addio-dc-benvenuta-luka-una-nuova-calcolatrice-rpn-da-terminale/dc2-020-help.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;La versione 0.3.0 ha introdotto l&amp;rsquo;&lt;em&gt;history&lt;/em&gt; delle operazioni eseguite e un help ancora rivisto,&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2025-08-09-addio-dc-benvenuta-luka-una-nuova-calcolatrice-rpn-da-terminale/dc2-030.png&#34; alt=&#34;&#34;&gt;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2025-08-09-addio-dc-benvenuta-luka-una-nuova-calcolatrice-rpn-da-terminale/dc2-030-help.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;mentre la versione 0.4.0, che è coincisa con il cambio di nome del programma, ci ha portato le variabili e parecchi nuovi comandi da tastiera, come si può vedere nelle prime immagini di questo articolo.&lt;/p&gt;&#xA;&lt;h4 id=&#34;usare-luka&#34;&gt;Usare luka&lt;/h4&gt;&#xA;&lt;p&gt;Installare &lt;code&gt;luka&lt;/code&gt; sul Mac o su Linux è un attimo, almeno &lt;a href=&#34;https://www.melabit.com/it/2014/04/29/homebrew-software-per-il-mac-fatto-in-casa/&#34;&gt;per chi usa &lt;code&gt;homebrew&lt;/code&gt;&lt;/a&gt; (e chi non lo usa dovrebbe iniziare a farlo subito)&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;brew install mastro35/homebrew-mastro35/luka&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Altrimenti basta scaricare l&amp;rsquo;&lt;a href=&#34;https://github.com/mastro35/luka/releases&#34;&gt;ultima release&lt;/a&gt; del codice sorgente, scompattarla ed eseguire&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;make clean &amp;amp;&amp;amp; make&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;dal Terminale, ovviamente dopo essersi &lt;a href=&#34;https://melabit.com/it/2018/01/30/script-per-tutti-i-giorni-ricapitoliamo/&#34;&gt;spostati nella directory&lt;/a&gt; che contiene il codice sorgente.&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;Inutile dire che chi ha installato &lt;code&gt;make&lt;/code&gt; e un compilatore C su Windows, potrà compilare &lt;code&gt;luka&lt;/code&gt; anche su questo sistema operativo.&lt;/p&gt;&#xA;&lt;p&gt;Dimenticavo: presto arriveranno i pacchetti per Linux, in formato  &lt;code&gt;deb&lt;/code&gt; e &lt;code&gt;rpn&lt;/code&gt; e, chissà, magari anche &lt;code&gt;aur&lt;/code&gt;. E forse anche un installatore per Windows.&lt;/p&gt;&#xA;&lt;p&gt;Sull&amp;rsquo;uso vero e proprio della calcolatrice c&amp;rsquo;è poco da dire. Chi conosce già l&amp;rsquo;RPN si troverà a suo agio, e ci metterà pochissimo ad usare &lt;code&gt;luka&lt;/code&gt;  al meglio. Chi non conosce l&amp;rsquo;RPN magari avrà voglia di provarla, per toccare con mano quanto sia più comodo eseguire un calcolo appena appena complicato con una calcolatrice RPN piuttosto che con una normale calcolatrice algebrica.&lt;/p&gt;&#xA;&lt;p&gt;Di guide all&amp;rsquo;RPN ce ne sono a iosa, purtroppo sono tutte orientate a &lt;a href=&#34;https://hansklav.home.xs4all.nl/rpn/&#34;&gt;spiegarne l&amp;rsquo;uso con una calcolatrice fisica&lt;/a&gt;, come le ormai mitiche HP &lt;em&gt;vintage&lt;/em&gt;, oppure con le emulazioni grafiche per Android o iOS.&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;Rispetto a queste guide ci sono alcune differenze da considerare. La principale è che, non avendo i tasti fisici, &lt;code&gt;luka&lt;/code&gt; (ma anche &lt;code&gt;dc&lt;/code&gt;) richiede che si prema ogni volta &lt;code&gt;ENTER&lt;/code&gt; per inserire un numero o una funzione. Anche alcuni nomi di funzioni sono diversi, così come i comandi per gestire lo stack o per salvare e recuperare le variabili. Ad esempio &lt;code&gt;luka&lt;/code&gt; usa &lt;code&gt;store&lt;/code&gt; e &lt;code&gt;load&lt;/code&gt; per le variabili, mentre le calcolatrici fisiche o emulate usano dei tasti denominati in genere &lt;code&gt;STO&lt;/code&gt; e &lt;code&gt;RCL&lt;/code&gt; (ma se l&amp;rsquo;autore legge questo articolo forse cambierà idea 😂). Ma, a parte questi dettagli, la logica di fondo non cambia.&lt;/p&gt;&#xA;&lt;p&gt;Da parte mia, ho provato in tutti i modi a far andare &lt;code&gt;luka&lt;/code&gt; in crash, e non ci sono mai riuscito. Ho provato a fargli calcolare il fattoriale di numeri assurdamente grandi o piccoli, a dividere per zero, ad eseguire il famigerato \( 0 / 0 \) e poi a calcolare il reciproco del risultato. Ma niente, imperturbabile mi ha sempre dato il risultato esatto. Insomma, la qualità c&amp;rsquo;è.&lt;/p&gt;&#xA;&lt;h4 id=&#34;conclusioni&#34;&gt;Conclusioni&lt;/h4&gt;&#xA;&lt;p&gt;Provare &lt;code&gt;luka&lt;/code&gt; non costa niente. Si installa (e disinstalla) in pochi secondi, funziona su macOS, Linux e, per chi vuole, anche su Windows. I risultati che produce sono esatti (e questa è la cosa che conta di più). Lo sviluppatore è bravo ed aperto ai suggerimenti. Insomma, è uno strumento ideale per chi vuole eseguire dei calcoli dal Terminale.&lt;/p&gt;&#xA;&lt;p&gt;Certo, è uno strumento di nicchia, destinato a pochi utenti sofisticati che apprezzano la notazione RPN e non hanno paura del Terminale. Ma proprio per questo ha un fascino tutto suo.&lt;/p&gt;&#xA;&lt;p&gt;E poi, vuoi mettere la bellezza di vedere un programma che evolve davanti ai nostri occhi, magari &lt;a href=&#34;https://github.com/mastro35/luka/issues&#34;&gt;partecipando allo sviluppo&lt;/a&gt; con suggerimenti o critiche?&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;Ed uno dei pochi linguaggi di programmazione, assieme a &lt;a href=&#34;https://www.melabit.com/it/2024/10/06/70-anni-di-fortran-piu-o-meno/&#34;&gt;FORTRAN&lt;/a&gt; e COBOL, ad essere ancora vivo e vegeto.&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;Non a caso, uno dei linguaggi di programmazione più efficienti in assoluto è il FORTH, che si basa sullo stack e sull&amp;rsquo;uso dell&amp;rsquo;RPN.&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;Come, non avete nemmeno &lt;code&gt;make&lt;/code&gt;? Allora correte ad installare &lt;code&gt;homebrew&lt;/code&gt;!&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;Per quest&amp;rsquo;ultimo consiglio senza riserve &lt;a href=&#34;https://apps.apple.com/it/app/pcalc-lite/id300311831&#34;&gt;PCalc Lite&lt;/a&gt; o meglio ancora la versione &lt;em&gt;full&lt;/em&gt; &lt;a href=&#34;https://apps.apple.com/it/app/pcalc/id284666222&#34;&gt;Pcalc&lt;/a&gt;, che costa quanto un panino e una minerale al bar. In alternativa &lt;a href=&#34;https://apps.apple.com/it/app/wp-34s/id620255094&#34;&gt;WP 34s&lt;/a&gt;, che riesce a compattare tutto in una sola schermata, oppure &lt;a href=&#34;https://apps.apple.com/it/app/i41cx/id292619450&#34;&gt;i41CX&lt;/a&gt;, perfetta per chi a suo tempo sognava di averla.&amp;#160;&lt;a href=&#34;#fnref:4&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/div&gt;&#xA;</description>
    </item>
    <item>
      <title>macOS Tahoe: dov&#39;è il Terminale?</title>
      <link>https://static.233.196.69.159.clients.your-server.de/it/2025/07/08/macos-tahoe-dov-e-il-terminale/</link>
      <pubDate>Tue, 08 Jul 2025 06:00:00 +0000</pubDate>
      <guid>https://static.233.196.69.159.clients.your-server.de/it/2025/07/08/macos-tahoe-dov-e-il-terminale/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2025-07-08-macos-tahoe-dov-e-il-terminale/p4xisap4xisap4xi.png&#34; alt=&#34;&#34;&gt;&lt;br&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;Prendete macOS Tahoe, aggiornato alla versione 26.0 Developer Beta 2, e aprite il Terminale. Anzi non apritene solo uno, aprite due, tre, quattro Terminali diversi, &lt;a href=&#34;https://support.apple.com/it-it/guide/terminal/trmlb20c7888/mac&#34;&gt;ciascuno nel suo pannello&lt;/a&gt;. Più o meno così:&lt;/p&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2025-07-08-macos-tahoe-dov-e-il-terminale/tahoe-where-is-my-terminal.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;A questo punto ditemi: qual&amp;rsquo;è il Terminale attivo in questo momento?&lt;/p&gt;&#xA;&lt;p&gt;Per rispondere dovrete aguzzare lo sguardo, e solo allora vi accorgerete che la barra del titolo del Terminale attivo è di un grigio appena appena più scuro degli altri, e che il titolo stesso è in grassetto.&lt;/p&gt;&#xA;&lt;p&gt;Rifate lo stesso giochetto con Sequoia, o con qualunque versione precedente di macOS, e vedrete a colpo d&amp;rsquo;occhio qual&amp;rsquo;è il Terminale che state usando.&lt;/p&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2025-07-08-macos-tahoe-dov-e-il-terminale/sequoia-where-is-my-terminal.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;In realtà, un modo per distinguere il Terminale in uso esiste anche in Tahoe, ma è contro-intuitivo e richiede l&amp;rsquo;uso del mouse. Se si sposta il mouse sopra la barra del Terminale attivo non si vede nessun cambiamento,&lt;/p&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2025-07-08-macos-tahoe-dov-e-il-terminale/tahoe-where-is-my-terminal-hover.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;mentre, quando si sposta mentre il mouse sopra il pannello di uno dei Terminali inattivi, lo sfondo diventa più scuro.&lt;/p&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2025-07-08-macos-tahoe-dov-e-il-terminale/tahoe-where-is-my-terminal-hover-2.png&#34; alt=&#34;&#34;&gt;&lt;hr style = &#34;border: none; &#xA;            border-top: 3px double #333; &#xA;            color: #333; &#xA;            overflow: visible; &#xA;            height: 5px; &#xA;            width: 50%; &#xA;            margin-left: auto; &#xA;            margin-right: auto;&#34;&#xA;&gt;&#xA;&#xA;&lt;p&gt;A tanti sembrerà un dettaglio trascurabile, ma il Terminale è uno strumento essenziale per interagire a basso livello con il sistema operativo e viene usato da gente che non possono permettersi di perdere tempo a cercare il Terminale giusto o, peggio ancora!, di rischiare di inserire un comando pericoloso nel Terminale sbagliato.&lt;/p&gt;&#xA;&lt;p&gt;Per fare un esempio concreto: per gestire questo blog uso tre pannelli del Terminale, ciascuno dedicato ad un compito specifico. In uno di questi lavoro via &lt;code&gt;ssh&lt;/code&gt; su un sito privato di test, che mi serve per verificare che tutto funzioni prima di caricare il blog sul vero server. Essendo un ambiente di prova, sono abituato a cancellare tutto con un brutale &lt;code&gt;rm -r *&lt;/code&gt;. Oggi posso farlo senza problemi, perché so a colpo d&amp;rsquo;occhio e senza bisogno di leggere che sono nel Terminale &lt;em&gt;giusto&lt;/em&gt;. Ma con Tahoe dovrò cambiare abitudini, perché eseguire lo stesso comando nel pannello sbagliato potrebbe avere conseguenze catastrofiche.&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;hr style = &#34;border: none; &#xA;            border-top: 3px double #333; &#xA;            color: #333; &#xA;            overflow: visible; &#xA;            height: 5px; &#xA;            width: 50%; &#xA;            margin-left: auto; &#xA;            margin-right: auto;&#34;&#xA;&gt;&#xA;&#xA;&lt;p&gt;Fra tutte le &lt;a href=&#34;https://melabit.com/it/2025/06/28/macos-tahoe-rimandato-a-settembre/&#34;&gt;incongruenze di macOS Tahoe&lt;/a&gt;, questa è forse è la più incomprensibile, e potenzialmente la più pericolosa.&lt;/p&gt;&#xA;&lt;p&gt;A questo punto una domanda è d&amp;rsquo;obbligo: ma gli sviluppatori Apple usano davvero i prodotti che realizzano?&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;Certo, io per non fare errori prendo ulteriori precauzioni, come assegnare colori diversi ai vari Terminali. Ma il problema di fondo rimane.&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>Quando iCloud non va...</title>
      <link>https://static.233.196.69.159.clients.your-server.de/it/2024/03/01/quando-icloud-non-va/</link>
      <pubDate>Fri, 01 Mar 2024 06:00:00 +0000</pubDate>
      <guid>https://static.233.196.69.159.clients.your-server.de/it/2024/03/01/quando-icloud-non-va/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2024-03-01-quando-icloud-non-va/polina-kuzovkova-KuyKNXklMcg-unsplash.jpg&#34; alt=&#34;&#34;&gt;&#xA;&amp;ndash; &lt;em&gt;Fonte: &lt;a href=&#34;https://unsplash.com/@p_kuzovkova&#34;&gt;Polina Kuzovkova&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;Per chi usa il Mac, iCloud è lo strumento più semplice e naturale per sincronizzare i propri file con computer diversi (sì, anche se usano &lt;a href=&#34;https://support.apple.com/it-it/guide/icloud-windows/icwd3c1cca5e/icloud&#34;&gt;Windows&lt;/a&gt; o &lt;a href=&#34;https://github.com/cross-platform/icloud-for-linux&#34;&gt;Linux&lt;/a&gt;) o con l&amp;rsquo;iPhone e l&amp;rsquo;iPad. Costa un pelo più dei concorrenti ma è studiato specificatamente per i prodotti Apple, funziona bene ed è veloce a sufficienza, non mi pare che ci sia partita.&lt;/p&gt;&#xA;&lt;p&gt;Ma anche iCloud ogni tanto si &lt;em&gt;incrocchia&lt;/em&gt; e rimane bloccato, senza più riuscire a completare la sincronizzazione.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2024-03-01-quando-icloud-non-va/icloud-stuck.png&#34; alt=&#34;&#34;&gt;&#xA;&amp;ndash; &lt;em&gt;Tante grazie a &lt;a href=&#34;https://koolinus.net/blog/&#34;&gt;kOoLiNuS&lt;/a&gt; per l&amp;rsquo;immagine!&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;La soluzione più immediata è riavviare il Mac, cosa che risolve quasi sempre il problema senza troppa fatica.&lt;/p&gt;&#xA;&lt;p&gt;Ma riavviare il computer può essere seccante per chi ha sempre molte finestre aperte, oppure se ha l&amp;rsquo;abitudine di tenere sempre acceso il computer (come faccio io). In realtà riavviare non serve, basta solo interrompere il processo &lt;code&gt;bird&lt;/code&gt;, che gira di continuo nel &lt;em&gt;retrobottega&lt;/em&gt; del  Mac.&lt;/p&gt;&#xA;&lt;p&gt;Per farlo ci sono due modi diversi ma equivalenti:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;selezionando il processo &lt;code&gt;bird&lt;/code&gt; nella scheda &lt;code&gt;CPU&lt;/code&gt; di &lt;code&gt;Monitoraggio Attività&lt;/code&gt; (si trova in &lt;code&gt;Applicazioni &amp;amp;#62; Utility&lt;/code&gt;) e cliccando sull&amp;rsquo;icona di &lt;code&gt;Stop&lt;/code&gt; (&lt;span style=&#34;font-size:1.2em;&#34;&gt;⊗&lt;/span&gt;) nella barra dell&amp;rsquo;applicazione;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;aprendo il &lt;code&gt;Terminale&lt;/code&gt; (anche questo si trova in &lt;code&gt;Applicazioni &amp;amp;#62; Utility&lt;/code&gt;) ed &lt;a href=&#34;https://superuser.com/questions/1045791/icloud-drive-sync-stuck&#34;&gt;eseguendo il comando&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;killall bird&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;In entrambi i casi il processo verrà interrotto e fatto ripartire automaticamente, risolvendo (quasi sempre) il problema senza alcun bisogno di riavviare.&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>Apple abbiamo altri problemi: uno sguardo ai bachi d&#39;epoca di macOS</title>
      <link>https://static.233.196.69.159.clients.your-server.de/it/2024/02/22/apple-abbiamo-altri-problemi-uno-sguardo-ai-bachi-depoca-di-macos/</link>
      <pubDate>Thu, 22 Feb 2024 06:00:00 +0000</pubDate>
      <guid>https://static.233.196.69.159.clients.your-server.de/it/2024/02/22/apple-abbiamo-altri-problemi-uno-sguardo-ai-bachi-depoca-di-macos/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2024-02-22-apple-abbiamo-altri-problemi-uno-sguardo-ai-bachi-depoca-di-macos/macos-bugs.jpeg&#34; alt=&#34;&#34;&gt;&#xA;&amp;ndash; &lt;em&gt;Immagine generata dall&amp;rsquo;IA di &lt;a href=&#34;https://designer.microsoft.com/image-creator&#34;&gt;Microsoft Designer&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;Nell&amp;rsquo;&lt;a href=&#34;https://melabit.com/it/2024/02/12/apple-abbiamo-un-problema-uno-sguardo-ai-bachi-di-macos-sonoma/&#34;&gt;ultimo post&lt;/a&gt; ho descritto alcuni bachi freschissimi presenti in Sonoma, la versione più recente di macOS.&lt;/p&gt;&#xA;&lt;p&gt;I bachi riportati qui, invece, si trascinano da svariate versioni di macOS e sembra che Apple non abbia &lt;a href=&#34;https://tidbits.com/2019/10/21/six-reasons-why-ios-13-and-catalina-are-so-buggy/&#34;&gt;nessuna voglia di sistemarli&lt;/a&gt; o che non li consideri dei veri e propri bachi. Questi problemi però, a differenza di &lt;a href=&#34;https://eclecticlight.co/2023/12/14/serious-bugs-remain-in-macos-sonoma-14-2/&#34;&gt;altri report&lt;/a&gt;, non si verificano in condizioni estreme o dopo aver aperto un dazillione di file ma in normalissime condizioni d&amp;rsquo;uso, e quindi mi pare ancora più strano che non siano mai stati risolti.&lt;/p&gt;&#xA;&lt;hr style = &#34;border: none; &#xA;            border-top: 3px double #333; &#xA;            color: #333; &#xA;            overflow: visible; &#xA;            height: 5px; &#xA;            width: 50%; &#xA;            margin-left: auto; &#xA;            margin-right: auto;&#34;&#xA;&gt;&#xA;&#xA;&lt;p&gt;I primi due sono più che altro incongruenze dell&amp;rsquo;interfaccia utente, molto sorprendenti se si considera l&amp;rsquo;&lt;a href=&#34;https://developer.apple.com/design/human-interface-guidelines&#34;&gt;attenzione quasi maniacale&lt;/a&gt; che Apple dedica ai minimi &lt;a href=&#34;https://developer.apple.com/design/&#34;&gt;dettagli di design&lt;/a&gt; dei propri prodotti.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;La barra di scorrimento (scrollbar) della lista delle applicazioni acquistate dall&amp;rsquo;App Store è parzialmente nascosta dal titolo della finestra e compare solo dopo aver scorso un certo numero di applicazioni (quante dipende dal numero totale di applicazioni presenti nella lista, se sono tante bisogna scendere parecchio per rivedere la barra).&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;La stessa cosa succede nella pagina iniziale dell&amp;rsquo;App Store quando si sposta il mouse nella parte superiore della finestra facendone comparire il titolo. Qui però gli elementi contenuti nella pagina sono pochi e quindi una parte della scrollbar rimane sempre visibile.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;hr style = &#34;border: none; &#xA;            border-top: 3px double #333; &#xA;            color: #333; &#xA;            overflow: visible; &#xA;            height: 5px; &#xA;            width: 50%; &#xA;            margin-left: auto; &#xA;            margin-right: auto;&#34;&#xA;&gt;&#xA;&#xA;&lt;p&gt;Questo invece è un vecchio baco relativo al Terminale.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Ho configurato le &lt;code&gt;Impostazioni di Sistema &amp;amp;#062; Scrivania e Dock&lt;/code&gt; in modo che l&amp;rsquo;opzione &lt;code&gt;Preferisci pannelli quando apri i documenti&lt;/code&gt; sia sempre attiva. In questo modo, ogni volta che apro una nuova finestra nelle applicazioni che supportano questa funzione (fra cui il Terminale), macOS crea al suo posto un nuovo pannello all&amp;rsquo;interno della finestra già aperta.&lt;/p&gt;&#xA;&lt;p&gt;Ma se sto usando il Terminale con una configurazione personalizzata (ad esempio la mia ha 120 colonne x 40 righe) e seleziono la voce di menu &lt;code&gt;Nuova Finestra&lt;/code&gt; scegliendo un profilo che ha una dimensione diversa (ad esempio quella di default di 80 colonne x 24 righe), viene sì creato un nuovo pannello, ma tutto il Terminale cambia dimensione e assume quelle del profilo appena scelto.&lt;/p&gt;&#xA;&lt;p&gt;In effetti questa potrebbe anche essere una scelta progettuale degli sviluppatori. Scelta che però contrasta con quello che succede quando l&amp;rsquo;opzione &lt;code&gt;Preferisci pannelli quando apri i documenti&lt;/code&gt; è attiva solo a pieno schermo, perché qui il nuovo pannello assume invece la dimensione di quello di partenza.&lt;/p&gt;&#xA;&lt;p&gt;Va detto che con High Sierra era perfino peggio: ogni volta che si apriva un nuovo pannello il Terminale perdeva una riga. Per fortuna questo baco è stato corretto nella versione successiva di macOS.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;hr style = &#34;border: none; &#xA;            border-top: 3px double #333; &#xA;            color: #333; &#xA;            overflow: visible; &#xA;            height: 5px; &#xA;            width: 50%; &#xA;            margin-left: auto; &#xA;            margin-right: auto;&#34;&#xA;&gt;&#xA;&#xA;&lt;p&gt;Questo baco, per me che uso sempre la modalità &lt;code&gt;Allinea alla griglia&lt;/code&gt; nelle finestre del Finder e ordino le icone dei file in modo visuale seguendo un ordine logico (almeno per me) e lasciando spesso degli spazi vuoti, è una grandissima seccatura.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Fino a El Capitan, se spostavo le icone di una cartella al di sotto del bordo inferiore della finestra, il Finder non faceva una piega e manteneva l&amp;rsquo;ordine delle icone spostate, lasciando uno spazio vuoto dove queste si trovavano in origine. Da Sierra in poi, invece, il bordo inferiore della finestra del Finder è diventato una specie di barriera invalicabile, per cui la stessa operazione fa &lt;em&gt;rimbalzare&lt;/em&gt; le icone che sarebbero finite sotto il bordo nella parte superiore della finestra, ora rimasta vuota.&lt;/p&gt;&#xA;&lt;p&gt;Per evitarlo, bisogna trascinare le icone premendo contemporaneamente il tasto &lt;strong&gt;CMD&lt;/strong&gt; (⌘), che in teoria serve per bypassare l&amp;rsquo;allineamento alla griglia, obbligando a ripristinare l&amp;rsquo;ordine delle icone  in un secondo momento.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;hr style = &#34;border: none; &#xA;            border-top: 3px double #333; &#xA;            color: #333; &#xA;            overflow: visible; &#xA;            height: 5px; &#xA;            width: 50%; &#xA;            margin-left: auto; &#xA;            margin-right: auto;&#34;&#xA;&gt;&#xA;&#xA;&lt;p&gt;Questa chicca finale, quello che senza dubbio è il mio baco preferito di macOS, non è solo una seccatura ma, per dirla alla Camilleri, &lt;em&gt;una grandissima rottura di cabasisi&lt;/em&gt;.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Proprio come per i documenti, io organizzo le applicazioni in modo visuale, raggruppandole in base alla tipologia e a quanto spesso le uso, e allinenando le icone alla griglia virtuale del Finder.&lt;/p&gt;&#xA;&lt;p&gt;Di conseguenza, lascio in cima alla finestra &lt;code&gt;Applicazioni&lt;/code&gt; tutte le applicazioni preinstallate di casa Apple e quelle che aggiungo io subito dopo la prima configurazione del sistema operativo, Pages, Numbers, Keynote, XCode, iMovie, GarageBand e così via. Subito sotto ci sono quelle da ufficio (la suite Office 365 e LibreOffice, gestori di PDF), quelle per la comunicazione (Teams, Webex, Skype), poi i browser e le applicazioni di sincronizzazione e accesso remoto. Ancora più giù le applicazioni più specifiche per il mio lavoro, per scrivere, prendere note e gestire gli articoli, editare le immagini, sviluppare codice. In fondo finiscono le utility varie per tenere sotto controllo la temperatura del Mac, gestire la clipboard, scompattare i file strani, registrare lo schermo e, ogni tanto, eseguire una scansione antivirus del Mac (MalwareBytes).&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;Con questa organizzazione ci metto un attimo a scorrere la cartella &lt;code&gt;Applicazioni&lt;/code&gt; in cerca del programma che mi serve, perché so a priori dove dovrebbe essere anche se non ne ricordo il nome esatto.&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;Purtroppo però, da non so più quante versioni di macOS, ogni volta che aggiorno macOS le icone delle applicazioni vengono sempre riordinate in modo alfabetico. Dato che per la cartella &lt;code&gt;Applicazioni&lt;/code&gt; l&amp;rsquo;ordinamento alfabetico è quello di default, la maggior parte degli utenti non se ne accorge nemmeno. Ma chi, come me, preferisce un ordinamento personalizzato, è obbligato ogni volta a rimettere tutto a posto.&lt;/p&gt;&#xA;&lt;p&gt;Perché considero questo un baco e non una caratteristica voluta di macOS? Il motivo è banale: se per ogni cartella il Finder mi consente di ordinare i file in modi diversi &amp;ndash; alfabetico, per data, per dimensione, per tipo &amp;ndash; e mi consente anche di allinearli su una griglia o non ordinarli affatto, non si capisce perché mai la cartella &lt;code&gt;Applicazioni&lt;/code&gt; dovrebbe comportarsi in modo diverso.&lt;/p&gt;&#xA;&lt;p&gt;Ci sono dei motivi tecnici alla base di questa decisione? Nell&amp;rsquo;uso normale la cartella &lt;code&gt;Applicazioni&lt;/code&gt; può essere personalizzata esattamente come tutte le altre cartelle del &lt;code&gt;Finder&lt;/code&gt;, quindi perché mai il &lt;code&gt;Finder&lt;/code&gt; dovrebbe essere obbligato a resettare le personalizzazioni ad ogni aggiornamento, anche minore, del sistema operativo?&lt;/p&gt;&#xA;&lt;p&gt;Secondo la mia modestissima opinione questo errore, insieme a quello descritto al punto precedente, è legato ad un problema con i fetentissimi file &lt;code&gt;.DS_Store&lt;/code&gt;, che gestiscono la configurazione di ciascuna cartella nel Finder e il cui &lt;a href=&#34;https://0day.work/parsing-the-ds_store-file-format/&#34;&gt;formato&lt;/a&gt; è tenuto più segreto di ciò che avviene dietro i cancelli dell&amp;rsquo;Area 51.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;hr style = &#34;border: none; &#xA;            border-top: 3px double #333; &#xA;            color: #333; &#xA;            overflow: visible; &#xA;            height: 5px; &#xA;            width: 50%; &#xA;            margin-left: auto; &#xA;            margin-right: auto;&#34;&#xA;&gt;&#xA;&#xA;&lt;p&gt;Se qualcuno del team di sviluppo di Apple sta leggendo queste righe, può trovare un&amp;rsquo;oretta per sistemare questi bachi? Non dovrebbe essere troppo difficile, dateci una occhiata per favore, un vostro fedele utente ve ne sarà grato.&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 possibilità di organizzare le applicazioni e i documenti in modo &lt;em&gt;visuale&lt;/em&gt; è una delle funzioni di macOS che me lo fa preferire a Linux o a, orrore!, a Windows, dove questo modo di lavorare semplicemente non esiste.&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;Sul Mac di casa su cui sto scrivendo ho 148 applicazioni installate, e per le mie abitudini non sono nemmeno tante. Ricordare il nome di tutte non fa per me, infatti non ho mai usato l&amp;rsquo;ordinamento alfabetico né tanto meno applicazioni come Alfred e simili.&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>Come controllare lo spazio occupato sul Mac con il Terminale: gli strumenti grafici</title>
      <link>https://static.233.196.69.159.clients.your-server.de/it/2023/05/16/come-controllare-lo-spazio-occupato-sul-mac-con-il-terminale-gli-strumenti-grafici/</link>
      <pubDate>Tue, 16 May 2023 06:00:00 +0000</pubDate>
      <guid>https://static.233.196.69.159.clients.your-server.de/it/2023/05/16/come-controllare-lo-spazio-occupato-sul-mac-con-il-terminale-gli-strumenti-grafici/</guid>
      <description>&lt;p&gt;Nel &lt;a href=&#34;https://melabit.com/it/2023/05/03/come-controllare-lo-spazio-occupato-sul-mac-con-il-terminale/&#34;&gt;post di qualche giorno fa&lt;/a&gt; ho presentato &lt;code&gt;du&lt;/code&gt;, un comando per il Terminale che consente di visualizzare lo spazio occupato sul disco da una data cartella e da tutte le cartelle contenute al suo interno. Se la cartella in questione è la vostra &lt;code&gt;Home&lt;/code&gt;, potrete usare &lt;code&gt;du&lt;/code&gt; per visualizzare rapidamente lo spazio occupato da tutti i vostri file ed eventualmente intervenire per cancellare o spostare ciò che non vi serve.&lt;/p&gt;&#xA;&lt;p&gt;Il comando &lt;code&gt;du&lt;/code&gt; può essere usato anche per visualizzare le dimensioni delle cartelle al di fuori della &lt;code&gt;Home&lt;/code&gt; che contengono il sistema operativo, i file di supporto, le applicazioni e così via, ma per farlo dovete disporre di un account amministrativo e premettere a &lt;code&gt;du&lt;/code&gt; il solito comando &lt;code&gt;sudo&lt;/code&gt;, che vi fa diventare l&amp;rsquo;amministratore onnipotente del sistema. Finché vi limitate a guardare non c&amp;rsquo;è nessun pericolo, ma non provate a cancellare i file al di fuori dalla vostra &lt;code&gt;Home&lt;/code&gt; a meno che non sappiate esattamente cosa state facendo.&lt;/p&gt;&#xA;&lt;h4 id=&#34;interfacce-testuali&#34;&gt;Interfacce testuali&lt;/h4&gt;&#xA;&lt;p&gt;Il comando &lt;code&gt;du&lt;/code&gt; è installato di default in macOS e &lt;a href=&#34;https://melabit.com/it/2023/05/03/come-controllare-lo-spazio-occupato-sul-mac-con-il-terminale/&#34;&gt;va usato&lt;/a&gt; nel Terminale spostandosi nella cartella di interesse con &lt;code&gt;cd&lt;/code&gt; ed eseguendo &lt;code&gt;du&lt;/code&gt; seguito dagli opportuni switch. In alternativa, si può aggiungere alla fine del comando il percorso completo della cartella che ci interessa, come ho fatto qui,&lt;/p&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2023-05-16-come-controllare-lo-spazio-occupato-sul-mac-con-il-terminale-gli-strumenti-grafici/du-path.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;ma personalmente trovo più comodo spostarmi &lt;em&gt;prima&lt;/em&gt; nella cartella di interesse e &lt;em&gt;poi&lt;/em&gt; eseguire &lt;code&gt;du&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Con un minimo di pratica controllare una o l&amp;rsquo;altra cartella a colpi di &lt;code&gt;cd&lt;/code&gt;  e &lt;code&gt;du&lt;/code&gt; è velocissimo, in particolare grazie alle funzioni di autocompletamento già presenti in &lt;code&gt;bash&lt;/code&gt; e diventate ancora più efficienti in &lt;code&gt;zsh&lt;/code&gt; (che da alcuni anni è la shell di default di macOS).&lt;/p&gt;&#xA;&lt;p&gt;Tuttavia, mi rendo conto che molti utenti sono intimiditi dal Terminale e dalla necessità di inserire i comandi a mano. Pertanto, in questa seconda parte voglio presentare alcuni strumenti dotati di un&amp;rsquo;interfaccia testuale o grafica, che consentono di eseguire le stesse operazioni di &lt;code&gt;du&lt;/code&gt; in modo più comodo e interattivo, mantenendo sempre un livello di efficienza ben maggiore rispetto a quanto è consentito dal Finder.&lt;/p&gt;&#xA;&lt;h5 id=&#34;disk-usage-analyzer&#34;&gt;Disk Usage Analyzer&lt;/h5&gt;&#xA;&lt;p&gt;Primo fra tutti &lt;code&gt;dua&lt;/code&gt;, ovvero &lt;a href=&#34;https://lib.rs/crates/dua-cli&#34;&gt;Disk Usage Analyzer&lt;/a&gt;, che nella sua forma di normale comando da Terminale  è più o meno un clone semplificato di &lt;code&gt;du&lt;/code&gt;. Ma &lt;code&gt;dua&lt;/code&gt; cambia pelle quando viene usato in modo interattivo, facendo cioè seguire il comando principale dal sottocomando &lt;code&gt;interactive&lt;/code&gt; (o più semplicemente  &lt;code&gt;i&lt;/code&gt;),&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;% dua interactive&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;che disegna sul Terminale una interfaccia utente testuale che permette di muoversi fra una directory e l&amp;rsquo;altra tramite i tasti freccia (oppure, per gli adepti di &lt;code&gt;vi&lt;/code&gt;, anche con i tasti &lt;code&gt;j&lt;/code&gt;/&lt;code&gt;k&lt;/code&gt;/&lt;code&gt;l&lt;/code&gt;/&lt;code&gt;h&lt;/code&gt;). Il tasto &lt;code&gt;q&lt;/code&gt; permette di uscire dall&amp;rsquo;applicazione e il tasto &lt;code&gt;?&lt;/code&gt; richiama l&amp;rsquo;help in linea, con la spiegazione degli altri comandi disponibili.&lt;/p&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2023-05-16-come-controllare-lo-spazio-occupato-sul-mac-con-il-terminale-gli-strumenti-grafici/dua-tui.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;Il modo più semplice per installare &lt;code&gt;dua&lt;/code&gt; sul Mac è tramite &lt;a href=&#34;https://brew.sh&#34;&gt;Homebrew&lt;/a&gt;, il &amp;ldquo;gestore di pacchetti mancati per macOS&amp;rdquo; di cui &lt;a href=&#34;https://melabit.com/it/2014/04/29/homebrew-software-per-il-mac-fatto-in-casa/&#34;&gt;ho scritto parecchio&lt;/a&gt; alcuni anni fa. Installare Homebrew è un attimo, basta eseguire nel Terminale (chi vuole informazioni più dettagliate può &lt;a href=&#34;https://melabit.com/it/2014/05/04/homebrew-installazione-e-disinstallazione/&#34;&gt;dare una occhiata qui&lt;/a&gt;)&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;% /bin/bash -c &amp;#34;$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)&amp;#34;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Homebrew installerà un nuovo comando &lt;code&gt;brew&lt;/code&gt;, che permetterà a sua volta di installare non solo &lt;code&gt;dua&lt;/code&gt;,&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;% brew install dua-cli&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;ma anche un gran numero di altri pacchetti e strumenti utili per lo sviluppo e la gestione del sistema che girano prevalentemente nel Terminale.&lt;/p&gt;&#xA;&lt;p&gt;Homebrew ha parecchie altre funzioni interessanti, che meritano di essere discusse in un articolo specifico.&lt;/p&gt;&#xA;&lt;h5 id=&#34;ncurses-disk-usage&#34;&gt;NCurses Disk Usage&lt;/h5&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://dev.yorhel.nl/ncdu&#34;&gt;NCurses Disk Usage&lt;/a&gt;, ovvero &lt;code&gt;ncdu&lt;/code&gt;, è un&amp;rsquo;applicazione molto simile alla versione interattiva di &lt;code&gt;dua&lt;/code&gt;, ma questa volta la sua interfaccia testuale è realizzata tramite la notissima &lt;a href=&#34;https://it.wikipedia.org/wiki/Ncurses&#34;&gt;libreria &lt;code&gt;ncurses&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Per installare &lt;code&gt;ncdu&lt;/code&gt; basta eseguire,&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;% brew install ncdu&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;che installerà automaticamente anche la libreria &lt;code&gt;ncurses&lt;/code&gt; se non è già presente sul Mac.&lt;/p&gt;&#xA;&lt;p&gt;Ad ogni avvio &lt;code&gt;ncdu&lt;/code&gt; scansiona il contenuto della cartella di cui deve calcolare le dimensioni, una processo che con le cartelle più grosse può durare anche diversi secondi,&lt;/p&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2023-05-16-come-controllare-lo-spazio-occupato-sul-mac-con-il-terminale-gli-strumenti-grafici/ncdu-starting.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;e solo alla fine dell&amp;rsquo;analisi mostra l&amp;rsquo;interfaccia testuale del programma (&lt;code&gt;dua&lt;/code&gt; invece fa il contrario, prima mostra l&amp;rsquo;interfaccia e poi esegue la scansione).&lt;/p&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2023-05-16-come-controllare-lo-spazio-occupato-sul-mac-con-il-terminale-gli-strumenti-grafici/ncdu-tui.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;Lo schema di colori di default di &lt;code&gt;ncdu&lt;/code&gt; è poco azzeccato, ma basta eseguire&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;% ncdu --color dark&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;per utilizzare una combinazione di colori decisamente migliore (questione di gusti, naturalmente).&lt;/p&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2023-05-16-come-controllare-lo-spazio-occupato-sul-mac-con-il-terminale-gli-strumenti-grafici/ncdu-dark-tui.png&#34; alt=&#34;&#34;&gt;&lt;h5 id=&#34;dust&#34;&gt;Dust&lt;/h5&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/bootandy/dust&#34;&gt;Dust&lt;/a&gt; è focalizzato su una cosa sola: mostrare quali sono le cartelle che occupano più spazio all&amp;rsquo;interno della cartella di lavoro, quali sono le sottocartelle più grandi contenute all&amp;rsquo;interno di queste, e così via.&lt;/p&gt;&#xA;&lt;p&gt;Anche &lt;code&gt;dust&lt;/code&gt; si installa con Homebrew,&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;% brew install dust&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;e come &lt;code&gt;ncdu&lt;/code&gt; scansiona l&amp;rsquo;intera cartella di lavoro all&amp;rsquo;avvio, per poi mostrare i risultati con un istogramma che riporta la dimensione relativa delle cartelle più grandi rispetto alla cartella che le contiene (ecco perché il totale non fa 100%).&lt;/p&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2023-05-16-come-controllare-lo-spazio-occupato-sul-mac-con-il-terminale-gli-strumenti-grafici/dust.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;Una lunga serie di switch permette di modificare il comportamente di &lt;code&gt;dust&lt;/code&gt; o di renderlo più simile a &lt;code&gt;du&lt;/code&gt;. Ad esempio, eseguendo&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;% dust -t&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;dust&lt;/code&gt; mostra lo spazio occupato da ciascun tipo di file,&lt;/p&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2023-05-16-come-controllare-lo-spazio-occupato-sul-mac-con-il-terminale-gli-strumenti-grafici/dust-by-filetype.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;una cosa molto utile per individuare rapidamente gli eventuali file inutili che occupano molto spazio.&lt;/p&gt;&#xA;&lt;p&gt;Un&amp;rsquo;altro switch utile è &lt;code&gt;-r&lt;/code&gt;,&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;% dust -r&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;che inverte l&amp;rsquo;ordine di visualizzazione delle barre dell&amp;rsquo;istogramma, che ora vengono mostrate più razionalmente dalla più grande alla più piccola.&lt;/p&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2023-05-16-come-controllare-lo-spazio-occupato-sul-mac-con-il-terminale-gli-strumenti-grafici/dust-reverse.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;Interessante, infine, lo switch &lt;code&gt;-L&lt;/code&gt;&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;% dust -L&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;che permette di &lt;em&gt;seguire&lt;/em&gt; i &lt;a href=&#34;https://melabit.com/it/2020/08/05/ssd-o-dischi-meccanici-perche-non-tutti-e-due-prima-parte/&#34;&gt;collegamenti simbolici&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Nel mio caso specifico questa opzione potrebbe mostrare oltre al contenuto del disco principale, anche le cartelle presenti sul disco esterno, che sono collegate al disco principale proprio attraverso una serie di collegamenti simbolici. Dico &lt;em&gt;potrebbe&lt;/em&gt;, perché dopo che &lt;code&gt;dust&lt;/code&gt; ha indicizzato più di 160 milioni di file, &lt;code&gt;zsh&lt;/code&gt; decide che ne ha abbastanza e &lt;em&gt;uccide&lt;/em&gt; il processo. Nessun problema, invece, se provo ad analizzare direttamente il disco esterno.&lt;/p&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2023-05-16-come-controllare-lo-spazio-occupato-sul-mac-con-il-terminale-gli-strumenti-grafici/dust-reverse-external-hd.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;Evidentemente oltre un certo limite &lt;code&gt;dust&lt;/code&gt; ha delle difficoltà a seguire in modo efficiente i collegamenti simbolici. Peccato!&lt;/p&gt;&#xA;&lt;h5 id=&#34;go-disk-usage&#34;&gt;Go Disk Usage&lt;/h5&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/dundee/gdu&#34;&gt;Go Disk Usage&lt;/a&gt;, cioè &lt;code&gt;gdu&lt;/code&gt;, come è evidente già dal nome è sviluppato in Go, un linguaggio di programmazione di casa Google, e si installa con il solito Homebrew&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;% brew install gdu&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Anche &lt;code&gt;gdu&lt;/code&gt; all&amp;rsquo;avvio fa la solita scansione preliminare della cartella di cui deve calcolare le dimensioni e solo alla fine mostra la sua interfaccia testuale,&lt;/p&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2023-05-16-come-controllare-lo-spazio-occupato-sul-mac-con-il-terminale-gli-strumenti-grafici/gdu-tui.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;che già alla prima occhiata sembra più rifinita di quella di &lt;code&gt;dua&lt;/code&gt; e &lt;code&gt;ncdu&lt;/code&gt;. Anche la scelta dei colori mi pare più azzeccata. L&amp;rsquo;uso dei tasti freccia per spostarsi da una cartella all&amp;rsquo;altra (in aggiunta ai soliti &lt;code&gt;j&lt;/code&gt;/&lt;code&gt;k&lt;/code&gt;/&lt;code&gt;l&lt;/code&gt;/&lt;code&gt;h&lt;/code&gt; alla &lt;code&gt;vi&lt;/code&gt;), e l&amp;rsquo;help in linea compatto ma molto chiaro, richiamabile in ogni momento con il tasto &lt;code&gt;?&lt;/code&gt;, rendono l&amp;rsquo;uso del programma molto più intuitivo rispetto agli altri (provare per credere).&lt;/p&gt;&#xA;&lt;p&gt;Ammetto che prima di provarlo non avevo delle grosse aspettative, invece &lt;code&gt;gdu&lt;/code&gt; ha dimostrato fin da subito di essere un gran bel programma.&lt;/p&gt;&#xA;&lt;h5 id=&#34;cosa-scegliere&#34;&gt;Cosa scegliere?&lt;/h5&gt;&#xA;&lt;p&gt;In effetti non c&amp;rsquo;è bisogno di scegliere, tutte le utility appena descritte consumano pochissimo spazio e possono convivere tranquillamente sul Mac, scegliendo di volta in volta quella che ci aggrada di più.&lt;/p&gt;&#xA;&lt;p&gt;Ma se dovessi fare una classifica metterei al primo posto Go Disk Usage, che funziona benissimo, è veloce quanto basta, permette di muoversi con grande facilità fra una cartella e l&amp;rsquo;altra e, concedetemelo, ricorda pure l&amp;rsquo;indimenticabile Norton Commander dei tempi del DOS e il suo clone moderno, &lt;a href=&#34;https://guide.debianizzati.org/index.php/Midnight_Commander&#34;&gt;Midnight Commander&lt;/a&gt;, che per anni ed anni è stato una presenza costante sui miei computer.&lt;/p&gt;&#xA;&lt;p&gt;Menzione d&amp;rsquo;onore per &lt;code&gt;dust&lt;/code&gt;, che fa una cosa sola ma la fa davvero molto bene.&lt;/p&gt;&#xA;&lt;h4 id=&#34;interfacce-grafiche&#34;&gt;Interfacce grafiche&lt;/h4&gt;&#xA;&lt;p&gt;E se il Terminale proprio non vi va proprio giù e volete usare a tutti i costi uno strumento con una interfaccia grafica? Anche qui in teoria c&amp;rsquo;è solo l&amp;rsquo;imbarazzo della scelta, ma alla fine (spoiler!) il vincitore è solo uno, e con un bel distacco.&lt;/p&gt;&#xA;&lt;h5 id=&#34;grandperspective&#34;&gt;GrandPerspective&lt;/h5&gt;&#xA;&lt;p&gt;Che dire di &lt;a href=&#34;https://grandperspectiv.sourceforge.net/&#34;&gt;GrandPerspective&lt;/a&gt;? Che funziona bene, che è facile da usare, che ha una interfaccia grafica chiara e flessibile e infine che può essere &lt;a href=&#34;https://grandperspectiv.sourceforge.net/&#34;&gt;scaricato gratuitamente&lt;/a&gt; da SourceForge oppure, pagando la cifra irrisoria di 3 caffè, anche dall&amp;rsquo;&lt;a href=&#34;https://apps.apple.com/it/app/grandperspective/id1111570163&#34;&gt;AppStore&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;GrandPerspective mostra i file contenuti nella cartella selezionata al momento dell&amp;rsquo;esecuzione,&lt;/p&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2023-05-16-come-controllare-lo-spazio-occupato-sul-mac-con-il-terminale-gli-strumenti-grafici/grandperspective-launch.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;utilizzando la tecnica delle &lt;em&gt;treemap&lt;/em&gt; (mappe ad albero), che ha una &lt;a href=&#34;http://www.cs.umd.edu/hcil/treemap-history/index.shtml&#34;&gt;storia che risale a più di trent&amp;rsquo;anni fa&lt;/a&gt; e che è stata implementata per la prima volta su un&amp;hellip; scommettiamo che &lt;a href=&#34;http://www.cs.umd.edu/hcil/pubs/treeviz.shtml&#34;&gt;lo sapete&lt;/a&gt;?&lt;/p&gt;&#xA;&lt;p&gt;Se provo ad analizzare la cartella contenente i post di questo blog (la stessa cartella che ho usato nella &lt;a href=&#34;https://melabit.com/it/2023/05/03/come-controllare-lo-spazio-occupato-sul-mac-con-il-terminale/&#34;&gt;prima parte&lt;/a&gt; di questo articolo), ottengo un risultato piuttosto banale,&lt;/p&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2023-05-16-come-controllare-lo-spazio-occupato-sul-mac-con-il-terminale-gli-strumenti-grafici/grandperspective-posts.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;dove il file più grosso è &lt;code&gt;.DS_Store&lt;/code&gt;, che gestisce la disposizione dei file nelle finestre del Finder, mentre tutti gli altri file hanno dimensioni microscopiche che vanno dai 4 ai 24 kB. Sulla sinistra, in un altro colore, sono messi in evidenza i file contenuti nella cartella annidata &lt;code&gt;TODO&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Cliccando sull&amp;rsquo;icona &lt;code&gt;Info&lt;/code&gt; in alto a destra, si apre una finestra contenente parecchie informazioni utili sulla cartella analizzata, tramite la quale è anche possibile modificare in modo interattivo, tramite la scheda &lt;code&gt;Display&lt;/code&gt;, la &lt;em&gt;palette&lt;/em&gt; di colori usata per la visualizzazione dei dati e il metodo di attribuzione dei colori stessi.&lt;/p&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2023-05-16-come-controllare-lo-spazio-occupato-sul-mac-con-il-terminale-gli-strumenti-grafici/grandperspective-info.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;Ma usare GrandPerspective su una cartella piccola e poco strutturata come questa non ha molto senso. Mi basta però ripetere l&amp;rsquo;analisi sulla mia &lt;code&gt;Home&lt;/code&gt; per ottenere l&amp;rsquo;immagine seguente, molto più interessante, dove è evidente che il file di gran lunga più grande è uno degli ultimi aggiornamenti dell&amp;rsquo;iPhone.&lt;/p&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2023-05-16-come-controllare-lo-spazio-occupato-sul-mac-con-il-terminale-gli-strumenti-grafici/grandperspective-home.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;Quando la cartella in esame contiene tanti file di tipologia diversa diventa molto utile poter cambiare le modalità di visualizzazione dei file, una cosa facilissima da fare in GrandPerspective tramite la finestra &lt;code&gt;Info &amp;gt; Display&lt;/code&gt;. Questo ad esempio è quello che ottengo se scelgo di colorare i risultati in base al tipo di file.&lt;/p&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2023-05-16-come-controllare-lo-spazio-occupato-sul-mac-con-il-terminale-gli-strumenti-grafici/grandperspective-home-color-by-filetype.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;Inutile spendere troppe altre parole, GrandPerspective è davvero un gran bel programma e lo consiglio senza riserve.&lt;/p&gt;&#xA;&lt;h5 id=&#34;daisydisk&#34;&gt;DaisyDisk&lt;/h5&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://daisydiskapp.com/&#34;&gt;DaisyDisk&lt;/a&gt; costa 11.99 euro, una cifra in sé più che onesta ma che sembra comunque un po&amp;rsquo; sproporzionata rispetto a GrandPerspective, e la versione trial scaricata dal sito richiede di essere attivata via email prima di poter essere usata.&lt;/p&gt;&#xA;&lt;p&gt;Il programma utilizza una modalità di visualizzazione diversa rispetto a quella di GrandPerspective, che assomiglia ad un grafico a torte agli steroidi, dove ogni cerchio concentrico rappresenta un livello di cartelle annidate. All&amp;rsquo;avvio DaisyDisk  propone di scansionare uno dei dischi collegati al Mac, ma tramite il menu &lt;code&gt;Action&lt;/code&gt; si può anche decidere di analizzare una singola cartella.&lt;/p&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2023-05-16-come-controllare-lo-spazio-occupato-sul-mac-con-il-terminale-gli-strumenti-grafici/daisydisk-home.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;Anche se il metodo di visualizzazione di DaisyDisk è graficamente più &lt;em&gt;bello&lt;/em&gt; di quello di GrandPerspective, nei fatti è molto meno efficace sia da navigare che da analizzare. Se a questo si aggiunge il prezzo più alto, trovo davvero poche ragioni per sceglierlo rispetto al concorrente.&lt;/p&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2023-05-16-come-controllare-lo-spazio-occupato-sul-mac-con-il-terminale-gli-strumenti-grafici/daisydisk-folder.png&#34; alt=&#34;&#34;&gt;&lt;h5 id=&#34;omnidisksweeper&#34;&gt;OmniDiskSweeper&lt;/h5&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.omnigroup.com/more/&#34;&gt;OmniDiskSweeper&lt;/a&gt; in teoria non supporta le versioni più recenti di macOS, ma l&amp;rsquo;ultima versione disponibile (la 1.14) gira senza problemi in Monterey. Come DaisyDisk, all&amp;rsquo;avvio OmniDiskSweeper propone di analizzare uno dei dischi collegati al Mac, ma tramite il menu &lt;code&gt;File&lt;/code&gt; è possibile scansionare anche le singole cartelle.&lt;/p&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2023-05-16-come-controllare-lo-spazio-occupato-sul-mac-con-il-terminale-gli-strumenti-grafici/omnidisksweeper-home.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;In ogni caso, OmniDiskSweeper è solo una versione graficamente più gradevole di &lt;code&gt;du&lt;/code&gt;, e se a questo si aggiunge il fatto che non viene più sviluppato da tempo, mi pare che abbia poco senso continuare ad usarlo.&lt;/p&gt;&#xA;&lt;h5 id=&#34;non-è-finita-qui&#34;&gt;Non è finita qui&lt;/h5&gt;&#xA;&lt;p&gt;E per finire, qualche breve cenno per alcuni software di analisi del contenuto del disco che si trovano facilmente su internet ma che, secondo me, sono meno interessanti.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://duc.zevv.nl/&#34;&gt;Dude where are my bytes&lt;/a&gt;, ovvero &lt;code&gt;duc&lt;/code&gt; (mi sfugge il senso dell&amp;rsquo;acronimo ma non importa) è un programma grafico per il Terminale che si installa con il solito Homebrew insieme ad un bel numero di librerie di supporto.&#xA;Purtroppo non c&amp;rsquo;è verso di farlo funzionare dal Terminale, e pare che il problema non riguardi solo macOS ma anche Linux. In più il metodo di visualizzazione usato da &lt;code&gt;duc&lt;/code&gt; assomiglia molto a quello di DaisyDisk (che non mi piace), per cui non mi pare che abbia senso perdere tempo per provare ad usarlo.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://apps.apple.com/it/app/space-gremlin/id414515628&#34;&gt;Space Gremlin&lt;/a&gt;, si trova sull&amp;rsquo;App Store e utilizza una modalità di visualizzazione dei file molto simile a quella di GrandPerspective. Ma non viene aggiornato da almeno 8 anni, per cui potrebbe servire solo a chi ha un Mac d&amp;rsquo;epoca su cui gira una vecchia versione di macOS.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://apps.apple.com/it/app/purple-tree/id764936294&#34;&gt;PurpleTree&lt;/a&gt;, disponibile anch&amp;rsquo;esso sull&amp;rsquo;AppStore alla modica cifra di 2.99 euro. Sembra bello, ma le informazioni sul programma sono molto scarse, il sito dello sviluppatore è irraggiungibile, c&amp;rsquo;è una sola recensione di un anno fa e il programma stesso non viene aggiornato da 1 anno. Posso fidarmi a dare in pasto i miei file ad un programma così?&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.squirreldisk.com/&#34;&gt;SquirrelDisk&lt;/a&gt; è open source e multipiattaforma, una cosa che io apprezzo sempre moltissimo, ma che in questo caso impedisce di ottimizzare il programma per il sistema operativo in uso. Anche graficamente non è il massimo, francamente non vedo il motivo di usarlo sul Mac.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/zz85/space-radar&#34;&gt;Space Radar&lt;/a&gt;, altro programma multipiattaforma, è scritto in &lt;a href=&#34;https://www.electronjs.org/&#34;&gt;Electron&lt;/a&gt;, una cosa che è di per se una garanzia di scarsa efficienza. E in effetti è proprio così, perché Space Radar si blocca tanto spesso da diventare irritante. Peccato, perché se fosse più stabile potrebbe diventare una alternativa interessante a GrandPerspective.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2023-05-16-come-controllare-lo-spazio-occupato-sul-mac-con-il-terminale-gli-strumenti-grafici/space-radar.png&#34; alt=&#34;&#34;&gt;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.jgoodies.com/freeware/jdiskreport/&#34;&gt;JDiskReport&lt;/a&gt; richiede Java, che non è disponibile sul mio Mac su cui ho installato da poco Monterey da zero, né ho voglia di doverlo installare solo per provare JDiskReport. Se qualcuno l&amp;rsquo;ha fatto può scrivere le sue impressioni nei commenti.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h4 id=&#34;conclusioni&#34;&gt;Conclusioni&lt;/h4&gt;&#xA;&lt;p&gt;Finisce qui questa lunga carrellata alle prese con &lt;code&gt;du&lt;/code&gt; e affini. Analizzare lo spazio occupato dai nostri file sul Mac è una operazione che non si fa ogni giorno, ma quando serve (e prima o poi servirà) è bene essere preparati e sapere quale strumento usare.&lt;/p&gt;&#xA;&lt;p&gt;Serve per conoscere meglio il vostro computer, ma serve anche per evitare di ritrovarsi nella stessa spiacevole situazione di un collega (ed amico) della settimana scorsa, con il computer bloccato per mancanza di spazio sul disco e una scadenza urgente da rispettare a tutti i costi. Meglio, molto meglio, non dover ripetere la sua esperienza.&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>Come controllare lo spazio occupato sul Mac con il Terminale</title>
      <link>https://static.233.196.69.159.clients.your-server.de/it/2023/05/03/come-controllare-lo-spazio-occupato-sul-mac-con-il-terminale/</link>
      <pubDate>Wed, 03 May 2023 06:00:00 +0000</pubDate>
      <guid>https://static.233.196.69.159.clients.your-server.de/it/2023/05/03/come-controllare-lo-spazio-occupato-sul-mac-con-il-terminale/</guid>
      <description>&lt;p&gt;Il Terminale di macOS è l&amp;rsquo;applicazione installata di default su &lt;a href=&#34;https://setapp.com/how-to/full-list-of-all-macos-versions&#34;&gt;tutte le versioni di macOS&lt;/a&gt; per accedere alla &lt;a href=&#34;https://melabit.com/it/le-parole-per-dirlo/&#34;&gt;shell&lt;/a&gt;, l&amp;rsquo;interfaccia a linea di comando del sistema operativo. La maggior parte dei comandi della shell è identica in tutti i sistema operativi basati su UNIX, che oggi sono principalmente Linux e macOS. Una cosa che ci permette di usare gli stessi comandi su questi due sistemi operativi, così come sulle &lt;a href=&#34;https://www.freebsd.org/&#34;&gt;varie&lt;/a&gt; &lt;a href=&#34;https://www.netbsd.org/&#34;&gt;incarnazioni&lt;/a&gt; &lt;a href=&#34;https://www.openbsd.org/&#34;&gt;disponibili&lt;/a&gt; di BSD Unix e perfino su Windows, almeno dopo aver installato il &lt;a href=&#34;https://learn.microsoft.com/en-us/windows/wsl/about&#34;&gt;Windows Subsystem for Linux&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Del Terminale di macOS ho scritto parecchie volte su questo blog. Riguardando i vecchi post ho ritrovato  questa &lt;a href=&#34;https://melabit.com/it/2019/01/30/script-per-tutti-i-giorni-ricapitoliamo/&#34;&gt;introduzione all&amp;rsquo;uso del Terminale&lt;/a&gt; e ai suoi comandi principali che mi pare ancora attuale, a parte il fatto che nel frattempo la &lt;a href=&#34;https://melabit.com/it/le-parole-per-dirlo/&#34;&gt;shell&lt;/a&gt; di default di macOS è diventata &lt;code&gt;zsh&lt;/code&gt; al posto di &lt;code&gt;bash&lt;/code&gt;. Ma questo cambiamento dovrebbe essere quasi trasparente per l&amp;rsquo;utente finale, dato che &lt;code&gt;zsh&lt;/code&gt; è una versione estesa e compatibile quasi al 100% di &lt;code&gt;bash&lt;/code&gt; (le principali differenze fra le due shell sono &lt;a href=&#34;https://www.fosslinux.com/58416/bash-vs-zsh-differences.htm&#34;&gt;elencate qui&lt;/a&gt; e, in termini più tecnici, &lt;a href=&#34;https://apple.stackexchange.com/questions/361870/what-are-the-practical-differences-between-bash-and-zsh&#34;&gt;anche qui&lt;/a&gt;).&lt;/p&gt;&#xA;&lt;p&gt;Oggi però voglio andare oltre i soliti, un po&amp;rsquo; noiosi, comandi di base e proporre un comando poco conosciuto ma che può fare comodo nella gestione giornaliera del Mac.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Una premessa&lt;/strong&gt;: tanti utenti del Mac sono spaventati dal Terminale, magari vorrebbero usarlo ma temono di far danni. Non è il caso di questo comando, che al massimo può produrre delle lunghe liste di file, ma non può in nessun modo danneggiare il sistema (in ogni caso, per danneggiare un sistema operativo come macOS bisogna usare il Terminale in modo davvero scriteriato).&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Altra premessa&lt;/strong&gt;: per non rendere l&amp;rsquo;esposizione troppo pesante suppongo che chi legge sappia cos&amp;rsquo;è una &lt;code&gt;shell&lt;/code&gt; o qual è la cartella &lt;code&gt;Home&lt;/code&gt; (o &lt;code&gt;Inizio&lt;/code&gt;) di un utente. Chi ha bisogno di un ripasso, può &lt;a href=&#34;https://melabit.com/it/le-parole-per-dirlo/&#34;&gt;trovare qui&lt;/a&gt; una breve spiegazione dei concetti principali relativi a macOS e al Terminale.&lt;/p&gt;&#xA;&lt;h4 id=&#34;quanto-spazio-occupano-i-miei-file&#34;&gt;Quanto spazio occupano i miei file?&lt;/h4&gt;&#xA;&lt;p&gt;Questa è una preoccupazione ricorrente in chi ha un disco di capacità ridotta (i 256 GB di spazio sui modelli base di MacBook Air/Pro e Mini sono davvero troppo pochi), oppure un disco grande ma ormai pieno di file.&lt;/p&gt;&#xA;&lt;p&gt;Il comando base per sapere quanto spazio occupano i file presenti sul Mac è &lt;code&gt;du&lt;/code&gt; (ovvero &lt;em&gt;disk usage&lt;/em&gt;), che riporta la dimensione (in blocchi) della cartella corrente e di tutte le cartelle contenute al suo interno.&lt;/p&gt;&#xA;&lt;p&gt;Ad esempio, se voglio vedere quanto spazio occupano i sorgenti in Markdown di tutti i post di questo blog, mi sposto con &lt;code&gt;cd&lt;/code&gt; nella cartella &lt;code&gt;~/Documents/Articoli\ Mac/Blog/posts&lt;/code&gt; del mio Mac (&lt;code&gt;zsh&lt;/code&gt; riporta il nome della cartella corrente immediatamente prima del simbolo del prompt &lt;code&gt;%&lt;/code&gt;) ed eseguo &lt;code&gt;du&lt;/code&gt;, ottenendo&lt;/p&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2023-05-03-come-controllare-lo-spazio-occupato-sul-mac-con-il-terminale/du.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;dove il &lt;code&gt;.&lt;/code&gt; indica per convenzione la cartella corrente, che a sua volta contiene la cartella &lt;code&gt;TODO&lt;/code&gt; dove, come è facilmente immaginabile, conservo i post in lavorazione. La dimensione totale occupata dai miei post è di 7080 blocchi, di cui 160 blocchi sono utilizzati da TODO.&lt;/p&gt;&#xA;&lt;h4 id=&#34;comandi-e-interruttori&#34;&gt;Comandi e interruttori&lt;/h4&gt;&#xA;&lt;p&gt;Usare &lt;code&gt;du&lt;/code&gt; così com&amp;rsquo;è ha poco senso, perché la dimensione in blocchi può essere significativa per un esperto di hardware ma non è facilmente comprensibile per la maggior parte degli utenti, abituati a ragionare in termini di kilobyte, megabyte e gigabyte.&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;Meglio quindi aggiungere a &lt;code&gt;du&lt;/code&gt; lo switch &lt;code&gt;--si&lt;/code&gt;, con il quale &lt;code&gt;du&lt;/code&gt; riporta le dimensioni delle cartelle in kB, MB o GB, scegliendo l&amp;rsquo;unità migliore in base alle dimensioni di ciascuna cartella. Con &lt;code&gt;--si&lt;/code&gt;, 1 kB equivale a 1000 byte, 1 MB a 1000 kB e così via, proprio come fa il Finder.  Se vogliamo che le dimensioni siano espresse utilizzando i tradizionali multipli di 1024 dobbiamo utilizzare lo switch &lt;code&gt;-h&lt;/code&gt; al posto di &lt;code&gt;--si&lt;/code&gt;, ma sul Mac non ha molto senso.&lt;/p&gt;&#xA;&lt;p&gt;Se eseguo il comando &lt;code&gt;du --si&lt;/code&gt; nella cartella &lt;code&gt;~/Documents/Articoli\ Mac/Blog/posts&lt;/code&gt; ora ottengo,&lt;/p&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2023-05-03-come-controllare-lo-spazio-occupato-sul-mac-con-il-terminale/du-better-units.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;da cui si nota che i quasi 450 file Markdown contenuti in questa cartella occupano appena 3.6 MB e potrebbero stare tranquillamente in 3 floppy disk (eh sì, usare un formato testo per scrivere documenti è sempre molto efficiente).&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;I comandi del Terminale includono spesso uno o più _switch_, cioè delle opzioni che modificano il comportamento del comando per adattarlo alle necessità dell&#39;utente. Gli switch sono indicati da un trattino seguito da una lettera e, a volte, da un parametro che può essere un numero o una stringa. Ad esempio, il comando `ls -a` mostrerà anche i file nascosti, mentre il comando `shutdown -r now` riavvierà immediatamente il computer. &#xA;Nel caso in cui si debbano utilizzare più di uno switch, è possibile definirli singolarmente, come ad esempio in `ls -a -l`, oppure inserirli tutti insieme dopo il trattino, come in `ls -al`. &#xA;Gli switch più complessi possono essere indicati anche da due trattini seguiti da una stringa e dagli eventuali parametri, come lo switch `--si` appena visto.&#xA;&lt;/div&gt;&#xA;&lt;p&gt;Altri switch utili del comando &lt;code&gt;du&lt;/code&gt; sono:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;code&gt;-a&lt;/code&gt;: calcola lo spazio occupato non solo dalle cartelle ma anche dai file contenuti al loro interno.&lt;/p&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2023-05-03-come-controllare-lo-spazio-occupato-sul-mac-con-il-terminale/du-with-files.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;Ad esempio, se provo ad eseguire &lt;code&gt;du&lt;/code&gt; a partire dalla mia &lt;code&gt;Home&lt;/code&gt; ottengo una lista di più di 60.000 cartelle, ma se uso &lt;code&gt;du -a&lt;/code&gt; la lista cresce fino a comprendere quasi mezzo milione di file e cartelle (del comando collegato &lt;code&gt;wc&lt;/code&gt; &lt;a href=&#34;https://melabit.com/it/2016/07/05/duecento/&#34;&gt;ho già scritto&lt;/a&gt; un bel po&amp;rsquo; di tempo fa, qui serve a contare il numero di righe riportate da &lt;code&gt;du&lt;/code&gt;).&lt;/p&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2023-05-03-come-controllare-lo-spazio-occupato-sul-mac-con-il-terminale/du-home-basic.png&#34; alt=&#34;&#34;&gt;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;code&gt;-d&lt;/code&gt; seguito da un numero: definisce il livello di visualizzazione delle cartelle tramite il numero associato allo switch. Ad esempio, &lt;code&gt;-d 1&lt;/code&gt; mostrerà  solo le cartelle di primo livello, cioè quelle contenute nella cartella di partenza, mentre &lt;code&gt;-d 2&lt;/code&gt; mostrerà anche le cartelle contenute all&amp;rsquo;interno delle cartelle di primo livello, e così via.&lt;/p&gt;&#xA;&lt;p&gt;Se provo ad eseguire &lt;code&gt;du -d 1&lt;/code&gt; nella mia &lt;code&gt;Home&lt;/code&gt; ottengo,&lt;/p&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2023-05-03-come-controllare-lo-spazio-occupato-sul-mac-con-il-terminale/du-home-advanced.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;da cui si capisce immediatamente che le cartelle che occupano più spazio sono &lt;code&gt;Music&lt;/code&gt; e &lt;code&gt;Library&lt;/code&gt; (c&amp;rsquo;è da dire che la mia &lt;code&gt;Home&lt;/code&gt; è molto più grande, perché la maggior parte dei file si trova su un disco esterno collegato alla &lt;code&gt;Home&lt;/code&gt; &lt;a href=&#34;https://melabit.com/it/2020/08/05/ssd-o-dischi-meccanici-perche-non-tutti-e-due-prima-parte/&#34;&gt;tramite dei collegamenti simbolici&lt;/a&gt;, ma questa è un&amp;rsquo;altra storia). Se avessi bisogno di fare spazio sul disco saprei subito dove concentrarmi, invece di perdere tempo ad esaminare minuziosamente tutte le cartelle elencate di default da &lt;code&gt;du&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;code&gt;-t&lt;/code&gt; seguito da un numero: definisce la dimensione minima che deve avere una cartella per essere visualizzata.  Non è comodissimo, perché la dimensione va specificata in byte, però permette di filtrare rapidamente le cartelle più grandi, come in questo caso in cui ho scelto di visualizzare solo le cartelle più grandi di 1 MB (ovvero 1000000 byte).&lt;/p&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2023-05-03-come-controllare-lo-spazio-occupato-sul-mac-con-il-terminale/du-home-threshold.png&#34; alt=&#34;&#34;&gt;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;code&gt;-I&lt;/code&gt; seguito dal percorso di una cartella fra virgolette: permette di escludere la cartella specificata dal conteggio dello spazio occupato. È possibile usare una espressione regolare per escludere più cartelle in un solo colpo.&lt;/p&gt;&#xA;&lt;p&gt;Ad esempio, &lt;code&gt;-I &amp;quot;Library&amp;quot;&lt;/code&gt;, esclude la sola cartella &lt;code&gt;Library&lt;/code&gt;, oppure &lt;code&gt;-I &amp;quot;D*&amp;quot;&lt;/code&gt; esclude tutte le cartelle che iniziano con il punto o infine, come è mostrato qui sotto, &lt;code&gt;-I &amp;quot;.[a-z]&amp;quot;&lt;/code&gt; che esclude dalla visualizzazione tutte le cartelle il cui nome inizia con il punto seguito da una lettera maiuscola o minuscola (sono le cosiddette cartelle nascoste che contengono i file di configurazione di certe applicazioni e che in genere non sono molto grandi).&lt;/p&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2023-05-03-come-controllare-lo-spazio-occupato-sul-mac-con-il-terminale/du-home-exclude.png&#34; alt=&#34;&#34;&gt;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;code&gt;-k&lt;/code&gt;, &lt;code&gt;-m&lt;/code&gt;, &lt;code&gt;-g&lt;/code&gt;: forzano &lt;code&gt;du&lt;/code&gt; a riportare tutte le dimensioni rispettivamente in kB, MB o GB. Analogamente ad &lt;code&gt;-h&lt;/code&gt;, le dimensioni sono espresse in multipli di 1024. Se sulla stessa riga di comando si inserisce più di uno switch &lt;em&gt;dimensionale&lt;/em&gt;, &lt;code&gt;-g&lt;/code&gt;, &lt;code&gt;-h&lt;/code&gt;, &lt;code&gt;-k&lt;/code&gt;, &lt;code&gt;-m&lt;/code&gt; e &lt;code&gt;--si&lt;/code&gt;, viene utilizzato solo l&amp;rsquo;ultimo specificato.&lt;/p&gt;&#xA;&lt;p&gt;Questi switch servono soprattutto quando si vogliono ordinare le directory in base alle dimensioni, inviando l&amp;rsquo;output di &lt;code&gt;du&lt;/code&gt; al comando &lt;code&gt;sort -n -r&lt;/code&gt;, come nell&amp;rsquo;esempio qui sotto (dato che con questi switch 1 GB corrisponde a 1024 MB, i valori riportati qui sotto sono leggermente diversi rispetto a quelli dell&amp;rsquo;immagine precedente che usa &lt;code&gt;--si&lt;/code&gt;, e quindi i multipli di 1000).&lt;/p&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2023-05-03-come-controllare-lo-spazio-occupato-sul-mac-con-il-terminale/du-home-sort.png&#34; alt=&#34;&#34;&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h4 id=&#34;ma-ne-vale-la-pena&#34;&gt;Ma ne vale la pena?&lt;/h4&gt;&#xA;&lt;p&gt;Ma perché usare &lt;code&gt;du&lt;/code&gt; quando abbiamo a disposizione  il Finder? Prima di tutto perché il Terminale è molto più efficiente, con il Finder possiamo esaminare una sola cartella alla volta, il Terminale invece ci permette di analizzare lo stato un gran numero di cartelle tutte insieme, spostandosi molto più velocemente fra una cartella e l&amp;rsquo;altra rispetto a quanto sia possibile fare con il Finder.&lt;/p&gt;&#xA;&lt;p&gt;Un altro vantaggio non da poco è la possibilità di salvare su un file l&amp;rsquo;output del comando &lt;code&gt;du&lt;/code&gt;, in modo da poterlo esaminare con calma in un editor di testo, o magari perché vogliamo tenere traccia dello stato delle cartelle nel corso del tempo. Ad esempio potrei salvare nel file &lt;code&gt;du.txt&lt;/code&gt; sul Desktop l&amp;rsquo;elenco completo delle cartelle contenute in &lt;code&gt;Home&lt;/code&gt;,&lt;/p&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2023-05-03-come-controllare-lo-spazio-occupato-sul-mac-con-il-terminale/du-home-file.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;per poi esaminarlo con calma con TextMate o BBEdit, oppure direttamente nel Terminale a colpi di &lt;code&gt;awk&lt;/code&gt;, &lt;code&gt;grep&lt;/code&gt; e &lt;code&gt;sed&lt;/code&gt; e di espressioni regolari (ma questo richiederebbe almeno un articolo a sé stante).&lt;/p&gt;&#xA;&lt;p&gt;Infine, abbiamo appena scoperto che il Finder &lt;a href=&#34;https://eclecticlight.co/2023/04/17/the-finder-confuses-with-wildly-inaccurate-figures-for-available-space/&#34;&gt;non è molto affidabile&lt;/a&gt; quando si tratta di calcolare lo spazio occupato in un disco formattato in APFS, per cui meglio sentire un&amp;rsquo;altra campana. In questo caso specifico, il Finder mi dice che la mia &lt;code&gt;Home&lt;/code&gt; occupa 130.7 GB&lt;/p&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2023-05-03-come-controllare-lo-spazio-occupato-sul-mac-con-il-terminale/finder-home-size.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;mentre secondo &lt;code&gt;du&lt;/code&gt; sono solo 128 GB. Non è una grande differenza, però c&amp;rsquo;è da chiedersi chi ha ragione.&lt;/p&gt;&#xA;&lt;p&gt;Se queste considerazioni non bastano a convincervi, nel &lt;a href=&#34;https://melabit.com/it/2023/05/16/come-controllare-lo-spazio-occupato-sul-mac-con-il-terminale-gli-strumenti-grafici/&#34;&gt;prossimo post&lt;/a&gt; troverete delle soluzioni alternative utili a visualizzare rapidamente lo spazio occupato sul vostro disco. A presto!&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;Inoltre, il numero di blocchi riportati da &lt;code&gt;du&lt;/code&gt; varia a seconda del sistema operativo e della configurazione del file system, rendendo ancora più difficile la comprensione della dimensione effettiva dei file.&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>MacBook Air M1 la non-recensione: Big Sur</title>
      <link>https://static.233.196.69.159.clients.your-server.de/it/2022/04/07/macbook-air-m1-la-non-recensione-big-sur/</link>
      <pubDate>Thu, 07 Apr 2022 06:00:00 +0000</pubDate>
      <guid>https://static.233.196.69.159.clients.your-server.de/it/2022/04/07/macbook-air-m1-la-non-recensione-big-sur/</guid>
      <description>&lt;p&gt;Big Sur mi piace, ha portato una ventata di freschezza all&amp;rsquo;interfaccia grafica di macOS, un&amp;rsquo;interfaccia ormai familiare, ben assestata, rassicurante ma che, come le pareti di una casa abitata da tanti anni, attendeva con ansia una bella rinfrescata.&lt;/p&gt;&#xA;&lt;h4 id=&#34;big-sur&#34;&gt;Big Sur&lt;/h4&gt;&#xA;&lt;p&gt;Dopo i fasti di &lt;a href=&#34;https://en.wikipedia.org/wiki/Aqua_%28user_interface%29&#34;&gt;Aqua&lt;/a&gt;, la prima &lt;a href=&#34;https://arstechnica.com/gadgets/2000/02/mac-os-x-dp3/&#34;&gt;interfaccia grafica di Mac OS X&lt;/a&gt;, tanto innovativa e dirompente con i canoni stilistici dell&amp;rsquo;epoca da dare un grosso contributo alla rinascita del Mac e dell&amp;rsquo;intera Apple, e dopo il passaggio al &lt;em&gt;look&lt;/em&gt; grigio-metallico iniziato timidamente in Mac OS X 10.3/Panther e concluso con Mac OS X 10.5/Leopard, l&amp;rsquo;interfaccia grafica di macOS è sembrata stagnare per anni, un ritocchino qui e uno là, quasi sempre ispirato a iOS,&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; ma niente di più.&lt;/p&gt;&#xA;&lt;p&gt;Con Big Sur Apple ha cambiato radicalmente il linguaggio grafico di macOS, e lo ha fatto già a partire dallo sfondo che abbandona le noiose fotografie naturalistiche per tornare ad una grafica astratta molto moderna, chiaramente ispirata ai &lt;a href=&#34;https://512pixels.net/projects/default-mac-wallpapers-in-5k/&#34;&gt;grandiosi sfondi dei primi Mac OS X&lt;/a&gt; che hanno rallegrato i nostri occhi per tanti anni (il &lt;a href=&#34;https://melabit.com/it/2017/07/13/nostalgia-di-sfondo/&#34;&gt;mio preferito&lt;/a&gt; è quello di Tiger). E non solo i nostri, perché anche i grafici che curavano le distribuzioni di Linux di quegli anni si sentivano quasi in dovere di &lt;a href=&#34;https://www.gnome-look.org/p/1064519&#34;&gt;trarre&lt;/a&gt; &lt;a href=&#34;https://www.gnome-look.org/p/1056509&#34;&gt;ispirazione&lt;/a&gt; dagli sfondi di Mac OS X (e lo fanno &lt;a href=&#34;https://itsfoss.com/make-ubuntu-look-like-macos/&#34;&gt;ancora oggi&lt;/a&gt;).&lt;/p&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2022-04-07-macbook-air-m1-la-non-recensione-big-sur/macbook-air-m1-big-sur-desktop.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;Come tutti i cambiamenti radicali, Big Sur presenta dei difetti e delle incongruenze, che sono stati descritti molto bene da Riccardo Mori nella sua &lt;a href=&#34;http://morrick.me/archives/8945&#34;&gt;serie di articoli su Big Sur&lt;/a&gt;. La sua non sarà una recensione dettagliata e tecnicamente ineccepibile come quelle, inarrivabili!, di &lt;a href=&#34;https://arstechnica.com/gadgets/2015/04/after-fifteen-years-ars-says-goodbye-to-john-siracusas-os-x-reviews/&#34;&gt;John Siracusa&lt;/a&gt;, ma le si avvicina parecchio.&lt;/p&gt;&#xA;&lt;p&gt;Alcuni di questi difetti sono piuttosto evidenti proprio sull&amp;rsquo;Air M1. Ma cominciamo da quello che sull&amp;rsquo;Air non si vede, grazie alla potenza del processore M1. Sui Mac Intel Big Sur sembra &lt;a href=&#34;https://developer.apple.com/forums/thread/666661&#34;&gt;molto&lt;/a&gt; più &lt;a href=&#34;https://www.reddit.com/r/MacOSBeta/comments/julm74/big_sur_is_making_my_laptop_slow_and_laggy/&#34;&gt;pesante&lt;/a&gt; dei sistemi operativi precedenti, magari con un i7 o un i9 non ci facciamo troppo caso, ma se abbiamo solo un i5 o peggio un i3, il rallentamento è abbastanza evidente. Certo, dopo un aggiornamento del sistema operativo è normale che il Mac fatichi un po&amp;rsquo;, magari perché deve convertire il filesystem da HFS+ a APFS e di sicuro perché sta indicizzando il contenuto del disco rigido,&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 chi è ancora fermo a Catalina o a Mojave questo è un aspetto da non sottovalutare.&lt;/p&gt;&#xA;&lt;h4 id=&#34;il-finder&#34;&gt;Il Finder&lt;/h4&gt;&#xA;&lt;p&gt;Nell&amp;rsquo;elencare i difetti più evidenti di Big Sur sull&amp;rsquo;Air M1 mi voglio concentrare sul Finder che, anche per gli amanti del Terminale come il sottoscritto, rimane lo strumento principale per interagire con il Mac.&lt;/p&gt;&#xA;&lt;p&gt;Io preferisco avere delle finestre del Finder piuttosto piccole, non solo perché così posso copiare o trascinare più facilmente file e cartelle da una finestra all&amp;rsquo;altra (per questo ci sono i pannelli e sono forse più comodi), ma soprattutto perché una finestra piccola mi permette di avere sempre in vista i file su cui lavoro, anche quando la maggior parte del desktop è occupata dal programma (o dai programmi) in uso.&lt;/p&gt;&#xA;&lt;p&gt;Ma con Big Sur, ridurre le dimensioni delle finestre del Finder sull&amp;rsquo;Air M1 ha l&amp;rsquo;effetto collaterale di nascondere quasi tutte le icone della barra degli strumenti, dove rimane comunque un sacco di spazio vuoto che potrebbe essere utilizzato in modo più efficace.&lt;/p&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2022-04-07-macbook-air-m1-la-non-recensione-big-sur/macbook-air-m1-big-sur-finder-best-size.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;Per confronto, ecco come ho configurato il mio Finder su Mojave, le icone della barra degli strumenti sono più piccole e tutte ben visibili e nel complesso mi sembra che il tutto sia molto più usabile.&lt;/p&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2022-04-07-macbook-air-m1-la-non-recensione-big-sur/mojave-finder-best-size.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;La differenza sostanziale sta nel titolo della finestra, che nel Finder è il nome della cartella corrente. Fino a Catalina il titolo occupava uno spazio a sè stante in cima alla finestra, allineato ai bottoni colorati di chiusura/massimizzazione, mentre con Big Sur è stato integrato nella barra degli strumenti del Finder, rendendo necessario lasciare un po&amp;rsquo; di spazio vuoto per mostrare tutto il nome della cartella. Ma anche così, quando questo supera la ventina di caratteri il Finder non ce la fa più a farlo vedere tutto e lo deve accorciare con dei puntini di sospensione, messi un po&amp;rsquo; incongruamente alla fine del nome invece che nel mezzo, come siamo abituati a vedere da sempre nella finestra principale del Finder.&lt;/p&gt;&#xA;&lt;p&gt;Ma come già detto, nel Finder di Big Sur c&amp;rsquo;è anche un sacco di spazio fra una icona e l&amp;rsquo;altra, come si può vedere meglio nell&amp;rsquo;immagine qui sotto dove l&amp;rsquo;area attiva dell&amp;rsquo;icona, cioè l&amp;rsquo;area sensibile al click del mouse, appare in un grigio leggermente più scuro circondata da una enorme area più chiara del tutto inutilizzata.&lt;/p&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2022-04-07-macbook-air-m1-la-non-recensione-big-sur/big-sur-finder-icon-sensitive-area.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;Se volessi vedere tutte le icone della barra degli strumenti dovrei allargare parecchio la finestra del Finder, una cosa che può non essere un problema su un monitor da 27&amp;quot;, ma che diventa piuttosto seccante sul piccolo schermo dell&amp;rsquo;Air, perché significa occupare più della metà della larghezza del desktop. L&amp;rsquo;unico vero vantaggio di questa configurazione è la possibilità di passare con un click da una all&amp;rsquo;altra delle quattro modalità di visualizzazione dei file, una cosa che trovo molto comoda e di fatto irrinunciabile (ma dovrei ricordarmi una buona volta che ci sono le combinazioni di tasti ⌘1 - ⌘4 per fare la stessa cosa).&lt;/p&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2022-04-07-macbook-air-m1-la-non-recensione-big-sur/macbook-air-m1-finder-all-tools.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;C&amp;rsquo;è da dire che anche le icone della barra dei menu hanno subito lo stesso trattamento della barra degli strumenti del Finder, apparendo molto più separate l&amp;rsquo;una dall&amp;rsquo;altra rispetto alle versioni precedenti di macOS. Usando poco l&amp;rsquo;Air M1 (che tecnicamente è di mia moglie, io ne curo solo la parte &lt;em&gt;tecnica&lt;/em&gt;) non me ne accorgo, ma se avessi tante icone sulla barra dei menu, come è normale sui miei Mac, questa potrebbe diventare un&amp;rsquo;altra piccola seccatura.&lt;/p&gt;&#xA;&lt;h4 id=&#34;cè-sempre-un-modo&#34;&gt;C&amp;rsquo;è sempre un modo&lt;/h4&gt;&#xA;&lt;p&gt;Come succede spesso, il Terminale ci viene in aiuto, perché basta eseguire il comando&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ defaults write com.apple.finder NSWindowSupportsAutomaticInlineTitle -bool false&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;e riavviare il Finder (o meglio ancora fare logout e login nel proprio account) per &lt;a href=&#34;https://apple.stackexchange.com/questions/409825/always-show-directory-icon-on-finder-on-big-sur&#34;&gt;ripristinare l&amp;rsquo;aspetto&lt;/a&gt; che la barra del Finder aveva nelle versioni di macOS precedenti a Big Sur.&lt;/p&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2022-04-07-macbook-air-m1-la-non-recensione-big-sur/macbook-air-m1-big-sur-old-toolbar.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;Ora la finestra del Finder può assumere un aspetto più congruente con le piccole dimensioni dello schermo dell&amp;rsquo;Air, mostrando allo stesso tempo l&amp;rsquo;intera barra degli strumenti. Esteticamente non è un gran che &amp;ndash; il titolo della finestra in grassetto e l&amp;rsquo;icona colorata alla sua sinistra stonano con tutto il resto &amp;ndash; ma se risolve un problema può essere un buon compromesso. In ogni caso, il comando complementare&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ defaults write com.apple.finder NSWindowSupportsAutomaticInlineTitle -bool true&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;seguito dal riavvio del Finder (o dal logout/login) permette di ripristinare in ogni momento la situazione originale.&lt;/p&gt;&#xA;&lt;p&gt;Per cambiare invece l&amp;rsquo;aspetto della barra degli strumenti in tutte le applicazioni di Big Sur e non solo nel Finder, il comando da eseguire diventa&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ defaults write -g NSWindowSupportsAutomaticInlineTitle -bool false&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;dove il parametro &lt;code&gt;-g&lt;/code&gt; indica un cambiamento globale di configurazione. Anche in questo caso basta modificare il parametro finale in &lt;code&gt;-bool true&lt;/code&gt; per ripristinare la situazione originale.&lt;/p&gt;&#xA;&lt;p&gt;Se vogliamo invece riavvicinare le &lt;a href=&#34;https://www.reddit.com/r/MacOS/comments/kgsfto/ugly_spacing_in_the_bigsurs_menu_bar_can_be_fixed/&#34;&gt;icone della barra dei menu&lt;/a&gt;, pare che non ci sia alternativa ad usare &lt;a href=&#34;https://www.macbartender.com/&#34;&gt;Bartender&lt;/a&gt;, un programma da 17 euro ma che fa tante altre cose, per cui potrebbe essere un buon modo per investire i propri soldi. Chissà se prima o poi qualcuno scoprirà un comando da Terminale per risolvere la questione.&lt;/p&gt;&#xA;&lt;h4 id=&#34;ma-cè-dellaltro&#34;&gt;Ma c&amp;rsquo;è dell&amp;rsquo;altro&lt;/h4&gt;&#xA;&lt;p&gt;Big Sur mostra parecchi altri piccoli difetti, non ne farò una lista dettagliata che sarebbe stucchevole. Mi voglio invece concentrare su quelli che considero dei veri e propri &lt;em&gt;bug&lt;/em&gt;, niente di grave per fortuna, solo delle piccole incongruenze che spero che Apple corregga prima o poi.&lt;/p&gt;&#xA;&lt;p&gt;Primo esempio sono queste finestre di dialogo, nelle quali non si capisce perché il testo di uno dei pulsanti è in rosso o perché due azioni tutto sommato molto simili (perché potenzialmente pericolose per i propri file) hanno delle selezioni di default diverse.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2022-04-07-macbook-air-m1-la-non-recensione-big-sur/big-sur-dialog-1.png&#34; alt=&#34;&#34;&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2022-04-07-macbook-air-m1-la-non-recensione-big-sur/big-sur-dialog-2.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Ancora più inesplicabile è il motivo per cui i menu di Big Sur mostrano le abbreviazioni da tastiera nello stesso tono di grigio delle voci di menu non attive. È vero che ora i menu sono più puliti dal punto di vista grafico, ma non c&amp;rsquo;era una soluzione più soddisfacente di far pensare che le abbreviazioni siano state disattivate?&lt;/p&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2022-04-07-macbook-air-m1-la-non-recensione-big-sur/macbook-air-m1-finder-menu.png&#34; alt=&#34;&#34;&gt;&lt;h4 id=&#34;conclusioni&#34;&gt;Conclusioni&lt;/h4&gt;&#xA;&lt;p&gt;La freschezza di Big Sur è innegabile, i piccoli difetti elencati qui sembrano più che altro dei difetti di &lt;em&gt;gioventù&lt;/em&gt;, che saranno corretti man mano che la nuova interfaccia grafica si consolida. Quello che è altrettanto innegabile è la convergenza fra l&amp;rsquo;interfaccia utente di macOS e quella di iPadOS. Una tendenza che, se realizzata in maniera coerente, non può fare che bene, soprattutto ora che fra Universal Control, Sidecar, processori della stessa famiglia, diventa sempre più difficile dire dove finisce il Mac e dove inizia l&amp;rsquo;iPad.&lt;/p&gt;&#xA;&lt;p&gt;C&amp;rsquo;è chi ipotizza che l&amp;rsquo;aver separato nettamente le icone della barra del menu e della barra degli strumenti delle applicazioni sia il preludio all&amp;rsquo;introduzione sui Mac di uno schermo sensibile al tocco. Non so se sia vero e non so nemmeno se possa servire, personalmente ho provato brevemente ad usare le dita per gestire Windows 10 su un Surface della Microsoft ed è una impresa praticamente impossibile. Per fortuna Apple sa fare molto meglio.&lt;/p&gt;&#xA;&lt;p&gt;In ogni caso ci sarà da divertirsi.&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;Come le odiate barre di scorrimento nascoste o lo scroll &lt;em&gt;naturale&lt;/em&gt; del mouse, che tanto naturale non è. Opinione personale, naturalmente.&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;Un piccolo prezzo da pagare per avere delle ricerche istantanee o quasi.&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>Come nascondere in modo sicuro le informazioni riservate di un file pdf</title>
      <link>https://static.233.196.69.159.clients.your-server.de/it/2021/08/07/come-nascondere-in-modo-sicuro-le-informazioni-riservate-di-un-file-pdf/</link>
      <pubDate>Sat, 07 Aug 2021 06:00:00 +0000</pubDate>
      <guid>https://static.233.196.69.159.clients.your-server.de/it/2021/08/07/come-nascondere-in-modo-sicuro-le-informazioni-riservate-di-un-file-pdf/</guid>
      <description>&lt;p&gt;Ve la ricordate la figuraccia dell&amp;rsquo;esercito americano che aveva documentato i risultati dell&amp;rsquo;&lt;a href=&#34;https://www.repubblica.it/2005/d/sezioni/esteri/niccal3/relusa/relusa.html&#34;&gt;indagine sulla morte di Nicola Calipari&lt;/a&gt; con un PDF pieno di omissis ma che &lt;a href=&#34;https://www.macchianera.net/2005/05/01/il-rapporto-calipari-senza-omissis/&#34;&gt;poteva essere letto integralmente&lt;/a&gt; con un semplice copia e incolla del testo? Beh, è successo anche a me: dovevo nascondere delle informazioni riservate da alcuni documenti richiesti dal Ministero e &lt;strong&gt;ho fatto lo stesso errore degli americani&lt;/strong&gt;. Però poi ho imparato come si fa in modo corretto e lo racconto qui perché potrebbe essere utile ad altri lettori.&lt;/p&gt;&#xA;&lt;hr style = &#34;border: none; &#xA;            border-top: 3px double #333; &#xA;            color: #333; &#xA;            overflow: visible; &#xA;            height: 5px; &#xA;            width: 50%; &#xA;            margin-left: auto; &#xA;            margin-right: auto;&#34;&#xA;&gt;&#xA;&#xA;&lt;p&gt;La burocrazia italiana è un mostro dalle mille teste e da un pezzo ho smesso di cercare di capirne le motivazioni. Questa però non è male: ogni volta che partecipo a un progetto di ricerca finanziato da un Ministero o da una Regione devo produrre i miei cedolini dello stipendio in formato PDF per tutti i mesi (o meglio anni) di durata del progetto.&lt;/p&gt;&#xA;&lt;p&gt;Tutto ciò serve a dimostrare che il mio datore di lavoro è in regola con i contributi e con tutte le altre disposizioni di legge. Tutto bene in teoria, peccato che il mio datore di lavoro sia il CNR, un ente pubblico, che quindi deve per forza di cose essere in regola con queste disposizioni. Ma la burocrazia non guarda a questi dettagli, se c&amp;rsquo;è una norma va applicata ciecamente anche se è inutile (anzi, direi, preferibilmente se è inutile).&lt;/p&gt;&#xA;&lt;hr style = &#34;border: none; &#xA;            border-top: 3px double #333; &#xA;            color: #333; &#xA;            overflow: visible; &#xA;            height: 5px; &#xA;            width: 50%; &#xA;            margin-left: auto; &#xA;            margin-right: auto;&#34;&#xA;&gt;&#xA;&#xA;&lt;p&gt;Ma al di là della seccatura di dover rispondere ad una richiesta chiaramente superflua, i cedolini contengono &lt;strong&gt;informazioni riservate che è bene nascondere&lt;/strong&gt;: l&amp;rsquo;IBAN prima di tutto, ma poi anche l&amp;rsquo;eventuale quota sindacale, informazioni sulle tasse pagate o sui prestiti e benefici vari di cui si potrebbe usufruire, e chissà che altro che non so. Per parecchio tempo ho reso illeggibili queste informazioni utilizzando la funzione &lt;em&gt;sfumino&lt;/em&gt; (&lt;em&gt;smudge&lt;/em&gt;) di Pixelmator, come si può vedere qui sotto.&lt;/p&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2021-08-07-come-nascondere-in-modo-sicuro-le-informazioni-riservate-di-un-file-pdf/iban-con-sfumino.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;Usare lo sfumino però è noioso, soprattutto se si deve ripetere il processo su un gran numero di documenti diversi. E allora a un certo punto, ideona!, ho pensato bene di &lt;strong&gt;utilizzare Anteprima per inserire dei rettangoli neri sopra le porzioni di testo da nascondere&lt;/strong&gt;, con il grosso vantaggio di poterli copiare ed incollare facilmente in tutti i documenti da mascherare.&lt;/p&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2021-08-07-come-nascondere-in-modo-sicuro-le-informazioni-riservate-di-un-file-pdf/iban-con-rettangolo.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;Ma, proprio come nel rapporto Calipari, &lt;strong&gt;questo metodo consente di recuperare le informazioni riservate con un semplice copia e incolla&lt;/strong&gt;, come potete verificare voi stessi con &lt;a href=&#34;https://melabit.files.wordpress.com/2021/08/documento-pdf-mascherato.pdf&#34;&gt;questo file&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;&lt;/p&gt;&#xA;&lt;p&gt;Tutto ciò succede perché, a partire dalla &lt;a href=&#34;https://www.prepressure.com/pdf/basics/version&#34;&gt;versione 1.5&lt;/a&gt;, &lt;strong&gt;un file PDF può memorizzare le informazioni su più livelli diversi&lt;/strong&gt;, più o meno come i file grafici di Photoshop (o simili). Nel caso specifico, i rettangoli aggiunti finiscono in un livello diverso da quello del cedolino originale e possono essere selezionati e modificati anche in un secondo momento con Anteprima o con Acrobat Reader.&lt;/p&gt;&#xA;&lt;hr style = &#34;border: none; &#xA;            border-top: 3px double #333; &#xA;            color: #333; &#xA;            overflow: visible; &#xA;            height: 5px; &#xA;            width: 50%; &#xA;            margin-left: auto; &#xA;            margin-right: auto;&#34;&#xA;&gt;&#xA;&#xA;&lt;p&gt;&lt;strong&gt;Combinare i livelli di un file PDF è facile&lt;/strong&gt;, basta usare il servizio &amp;ldquo;Salva come PDF&amp;hellip;&amp;rdquo; raggiungibile dal menu File &amp;gt; Stampa&amp;hellip; di Anteprima (o di qualunque altra applicazione per macOS). Questo servizio simula la stampa del file PDF originale, salvandolo invece in un nuovo documento PDF. Poiché una stampante non può gestire i livelli multipli del file originale, l&amp;rsquo;effetto finale è quello di fondere tutti i livelli in uno solo, rendendo il documento non più modificabile (come ci si può accorgere facilmente se si prova a selezionare i rettangoli neri di &lt;a href=&#34;https://static.233.196.69.159.clients.your-server.de/img/2021-08-07-come-nascondere-in-modo-sicuro-le-informazioni-riservate-di-un-file-pdf/documento-pdf-mascherato.pdf&#34;&gt;questo file&lt;/a&gt; dopo averlo &lt;a href=&#34;https://static.233.196.69.159.clients.your-server.de/img/2021-08-07-come-nascondere-in-modo-sicuro-le-informazioni-riservate-di-un-file-pdf/documento-pdf-mascherato-e-stampato.pdf&#34;&gt;stampato virtualmente&lt;/a&gt; come appena descritto).&lt;/p&gt;&#xA;&lt;p&gt;Ho sempre pensato che tutto ciò bastasse a nascondere efficacemente le informazioni riservate, ma purtroppo non è così: anche se i rettangoli neri aggiunti al file PDF non possono essere più modificati, è ancora possibile selezionare e copiare il testo sottostante (provare con il &lt;a href=&#34;https://static.233.196.69.159.clients.your-server.de/img/2021-08-07-come-nascondere-in-modo-sicuro-le-informazioni-riservate-di-un-file-pdf/documento-pdf-mascherato-e-stampato.pdf&#34;&gt;file di sopra&lt;/a&gt; per credere).&lt;/p&gt;&#xA;&lt;p&gt;Per fortuna il problema può essere risolto sia tramite il solito Anteprima che con il Terminale. Anteprima va benissimo se abbiamo a che fare con uno o due file PDF, mentre la potenza del Terminale viene fuori alla grande quando i file da gestire sono parecchi.&lt;/p&gt;&#xA;&lt;hr style = &#34;border: none; &#xA;            border-top: 3px double #333; &#xA;            color: #333; &#xA;            overflow: visible; &#xA;            height: 5px; &#xA;            width: 50%; &#xA;            margin-left: auto; &#xA;            margin-right: auto;&#34;&#xA;&gt;&#xA;&#xA;&lt;p&gt;&lt;strong&gt;Metodo numero 1&lt;/strong&gt;. Usare Anteprima è di gran lunga il modo più facile per nascondere in modo sicuro le informazioni riservate presenti in un file PDF, ma richiede due passaggi manuali e la creazione di un file intermedio che va poi buttato via, per cui è consigliabile solo a chi deve rendere sicuri solo pochi file PDF (oppure a chi ha molta pazienza).&lt;/p&gt;&#xA;&lt;p&gt;Per procedere bisogna aprire con Anteprima il file PDF contenente le informazioni riservate ancora in chiaro e inserire i soliti rettangoli neri sopra le parti di testo da nascondere. Arrivati a questo punto si esporta il file PDF in un formato grafico, che può essere indifferentemente HEIC, PNG o TIFF (non JPEG, perché questo formato supporta solo documenti di una pagina). Basta ora aprire questo file grafico con Anteprima ed esportarlo di nuovo in PDF (o ancora meglio stamparlo virtualmente in PDF) per avere un file a prova di bomba, nel quale non è più possibile selezionare il testo del documento. Il file rimane sicuro anche se lo si sottopone ad un processo di riconoscimento ottico dei caratteri (OCR) con uno dei tanti software disponibili (io uso con soddisfazione una vecchia versione di PDFpenPro ma ce n&amp;rsquo;è davvero per tutti i gusti), che ora non può andare a leggere &lt;em&gt;dietro&lt;/em&gt; le pecette nere.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Metodo numero 2&lt;/strong&gt;. &lt;a href=&#34;https://www.ghostscript.com/&#34;&gt;Ghostscript&lt;/a&gt; è probabilmente lo strumento software più diffuso per la gestione dei file PostScript e PDF dal Terminale, può fare cose complicatissime ma richiede un grosso sforzo per padroneggiarlo a dovere. Ghostscript non è presente di default in macOS ma può essere installato facilmente &lt;a href=&#34;https://discussions.apple.com/thread/8584571&#34;&gt;tramite Homebrew&lt;/a&gt; oppure installando &lt;a href=&#34;http://www.tug.org/mactex/&#34;&gt;MacTeX&lt;/a&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; la distribuzione più diffusa di LaTeX per macOS.&lt;/p&gt;&#xA;&lt;p&gt;Una volta che abbiamo Ghostscript sul Mac, possiamo usarlo per trasformare in un solo colpo il documento PDF da mascherare in un documento sicuro tramite questo comando da eseguire nel Terminale di macOS&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ gs -dPDF -dBATCH -dNOPAUSE -dNOSUBSTDEVICECOLORS -sDEVICE=pdfwrite \&#xA;-sOutputFile=documento_sicuro.pdf documento_da_mascherare.pdf&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;I nomi dei due file PDF presenti nell&amp;rsquo;ultima riga del comando sono autoesplicativi e vanno sostituiti con i nomi veri dei nostri documenti. Ricordo come al solito che il carattere &lt;code&gt;$&lt;/code&gt; indica il prompt del Terminale di macOS e non fa parte del comando vero e proprio.&lt;/p&gt;&#xA;&lt;p&gt;Ghoscript funziona bene ma è un po&amp;rsquo; lento e tante opzioni sono davvero oscure. Molto meglio secondo me utilizzare il prossimo metodo.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Metodo numero 3&lt;/strong&gt;. Anche &lt;a href=&#34;https://imagemagick.org&#34;&gt;ImageMagick&lt;/a&gt; è un peso massimo fra gli strumenti da Terminale, specializzato nella creazione, modifica o conversione dei file grafici di praticamente &lt;a href=&#34;https://imagemagick.org/script/formats.php&#34;&gt;qualunque formato&lt;/a&gt; ci venga in mente. ImageMagick mette a disposizione una marea sterminata di comandi e di opzioni fra i quali è facile perdersi, però la natura più moderna del programma lo rende più facile da usare, almeno al livello base che ci serve qui. Anche ImageMagick va &lt;a href=&#34;https://imagemagick.org/script/download.php#macosx&#34;&gt;installato sul Mac tramite Homebrew&lt;/a&gt;, e comunque richiede la presenza di Ghostscript per funzionare (che è poi il motivo principale per cui ho deciso di presentare anche il metodo numero 2).&lt;/p&gt;&#xA;&lt;p&gt;Per convertire il documento PDF da mascherare in un documento sicuro con ImageMagick basta eseguire da Terminale il comando&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ magick convert -density 300 documento_da_mascherare.pdf documento_sicuro.pdf&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;eventualmente anche senza il comando iniziale &lt;code&gt;magick&lt;/code&gt;&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ convert -density 300 documento_da_mascherare.pdf documento_sicuro.pdf&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;L&amp;rsquo;opzione &lt;code&gt;density&lt;/code&gt; indica la risoluzione (in punti per pollice, dpi) del documento finale, 300 dpi vanno benissimo per i documenti stampati ma possono essere tranquillamente ridotti a 150 o anche 96 dpi se il file sicuro viene utilizzato solo sul computer (e quindi, come piace tanto dire ai nostri burocrati, è &lt;em&gt;dematerializzato&lt;/em&gt;).&lt;/p&gt;&#xA;&lt;p&gt;Come dicevo prima, l&amp;rsquo;utilità di usare il Terminale viene fuori soprattutto quando abbiamo un gran numero di file da rendere sicuri. Per farlo possiamo usare questo script in &lt;code&gt;bash&lt;/code&gt; che va copiato nella cartella contenente i file PDF da processare (oppure in una &lt;a href=&#34;https://melabit.com/it/2019/04/12/script-per-tutti-i-giorni-lo-script-e-il-comando/&#34;&gt;cartella presente nel &lt;code&gt;PATH&lt;/code&gt;&lt;/a&gt;) dandogli un nome significativo (io uso &lt;code&gt;secure_pdf&lt;/code&gt; ma potete usare quello che preferite), lanciandolo da Terminale dopo averlo reso eseguibile con &lt;code&gt;chmod&lt;/code&gt; (i dettagli di come si fa &lt;a href=&#34;https://melabit.com/it/2019/04/12/script-per-tutti-i-giorni-lo-script-e-il-comando/&#34;&gt;li trovate qui&lt;/a&gt;).&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;#!/bin/bash&#xA;&#xA;OUTDIR=&amp;#34;./secured&amp;#34;&#xA;&#xA;if [[ ! -d $OUTDIR ]]; then&#xA;    mkdir &amp;#34;$OUTDIR&amp;#34;&#xA;fi&#xA; &#xA;for f in *.pdf; do&#xA;    fout=&amp;#34;$OUTDIR/$f&amp;#34;&#xA;    echo &amp;#34;Converting &amp;#39;$f&amp;#39; to &amp;#39;$fout&amp;#39;&amp;#34;&#xA;    convert -density 300 &amp;#34;$f&amp;#34; &amp;#34;$fout&amp;#34;&#xA;done&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Lo script converte tutti i PDF che trova nella cartella dove viene eseguito, salvandoli in una nuova cartella &lt;code&gt;secured&lt;/code&gt; con lo stesso nome del documento PDF originale. Se volete che i file sicuri abbiano un nome diversi e magari finiscano nella stessa cartella dei file originali, basta aggiungere o modificare un paio di righe ed è fatto.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;#!/bin/bash&#xA;&#xA;OUTDIR=&amp;#34;.&amp;#34;&#xA;SUFFIX=&amp;#34;-SECURE&amp;#34;&#xA;&#xA;if [[ ! -d $OUTDIR ]]; then&#xA;    mkdir &amp;#34;$OUTDIR&amp;#34;&#xA;fi&#xA; &#xA;for f in *.pdf; do&#xA;    fname=`basename &amp;#34;$f&amp;#34; &amp;#34;.pdf&amp;#34;`&#xA;    fout=&amp;#34;$OUTDIR/$fname $SUFFIX.pdf&amp;#34;&#xA;    echo &amp;#34;Converting &amp;#39;$f&amp;#39; to &amp;#39;$fout&amp;#39;&amp;#34;&#xA;    convert -density 300 &amp;#34;$f&amp;#34; &amp;#34;$fout&amp;#34;&#xA;done&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;Altri metodi&lt;/strong&gt;. Naturalmente quelli elencato non sono gli unici metodi validi per rendere sicuro un PDF. Chi usa Acrobat Pro può fare tutto da questo programma &lt;a href=&#34;https://helpx.adobe.com/it/acrobat/using/removing-sensitive-content-pdfs.html&#34;&gt;utilizzando gli strumenti integrati di redazione del testo&lt;/a&gt;. Personalmente trovo inutile pagare 20 euro al mese per un editor di PDF (il migliore, è vero, ma sono sempre 240 euro all&amp;rsquo;anno), ma per chi ha già una licenza Adobe può essere l&amp;rsquo;opzione migliore.&lt;/p&gt;&#xA;&lt;p&gt;Un&amp;rsquo;altra alternativa molto meno costosa è quella di usare uno strumento come il mai troppo apprezzato &lt;a href=&#34;https://apps.apple.com/it/app/pdf-toolkit/id545164971&#34;&gt;PDF Toolkit+&lt;/a&gt;, con il quale è possibile tramite interfaccia grafica esportare un documento PDF in vari formati grafici e a svariate risoluzioni, dove ogni pagina del PDF finisce in un file diverso, e &lt;em&gt;rimontare&lt;/em&gt; poi le singole pagine in un unico file PDF. Niente che non si possa fare con Anteprima, ma qui abbiamo una maggiore flessibilità, ad esempio perché possiamo decidere di cambiare l&amp;rsquo;ordine delle pagine o di escluderne alcune dal documento finale. In ogni caso PDF Toolkit+ vale molto di più dei due caffè che costa, io ad esempio lo trovo perfetto per ridurre le dimensioni dei file PDF scannerizzati.&lt;/p&gt;&#xA;&lt;p&gt;Direi che questi 5 metodi possano bastare, ma se qualche lettore ne conosce altri sarebbe bello se li descrivesse nei commenti.&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;Non sperate di trovare il mio IBAN, è solo la versione in PDF della prima pagina di questo post.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:2&#34;&gt;&#xA;&lt;p&gt;Qualcuno potrà chiedersi che senso abbia installare i quasi 5 GB di MacTeX solo per avere Ghostscript. Vista così può davvero sembrare una cosa insensata, ma il valore aggiunto di avere LaTeX sul Mac è, a mio avviso, inestimabile.&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>Come riconoscere di nuovo la tastiera del Mac</title>
      <link>https://static.233.196.69.159.clients.your-server.de/it/2021/01/18/come-riconoscere-di-nuovo-la-tastiera-del-mac/</link>
      <pubDate>Mon, 18 Jan 2021 06:00:00 +0000</pubDate>
      <guid>https://static.233.196.69.159.clients.your-server.de/it/2021/01/18/come-riconoscere-di-nuovo-la-tastiera-del-mac/</guid>
      <description>&lt;p&gt;Ne succedono di cose strane! La settimana scorsa ho voluto provare sul mio Mac principale la &lt;a href=&#34;https://store.hp.com/ItalyStore/Merch/Product.aspx?id=4CE97AA&amp;amp;opt=ABZ&amp;amp;sel=ACC&#34;&gt;tastiera HP Pavilion 400&lt;/a&gt;, che mi sembrava interessante come tastiera di scorta per i tanti ammennicoli che ormai affollano la mia scrivania di casa, che è ormai anche la mia scrivania principale di lavoro (prima o poi ne parlerò più diffusamente).&lt;/p&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2021-01-18-come-riconoscere-di-nuovo-la-tastiera-del-mac/hp-pavilion-400.jpg&#34; alt=&#34;&#34;&gt;&lt;p&gt;La tastiera però l&amp;rsquo;ho tenuta pochissimo: va bene spendere poco, ma i tasti erano troppo &lt;em&gt;leggeri&lt;/em&gt; e instabili per i miei gusti, mentre il mouse che arriva insieme alla tastiera è semplicemente tremendo, se dovessi fare una classifica dei peggiori mouse che ho avuto per le mani, questo occuperebbe di sicuro uno degli ultimi posti. In più, nonostante il layout della tastiera fosse italiano, il tasto corrispondente alla barra rovesciata e alla &lt;em&gt;pipe&lt;/em&gt; (cioè &lt;code&gt;\&lt;/code&gt;  e &lt;code&gt;|&lt;/code&gt;) era scambiato con quello con i simboli di maggiore e minore, finendo così per trovarsi in basso fra la &lt;code&gt;Maiuscola&lt;/code&gt; sinistra e la &lt;code&gt;z&lt;/code&gt; invece che, come sarebbe normale, in alto e alla sinistra dell&amp;rsquo;&lt;code&gt;1&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Io non sono un bravo dattilografo (come si dice in italiano &lt;em&gt;touch typist&lt;/em&gt;?), ma una certa memoria muscolare ce l&amp;rsquo;ho, e poi questi tasti sono fondamentali quando uso il Terminale o programmo in R. Per cui dopo pochi minuti ho scollegato senza rimpianti la tastiera HP e sono tornato alla mia solita Logitech con tutti i tasti al posto giusto.&lt;/p&gt;&#xA;&lt;hr style = &#34;border: none; &#xA;            border-top: 3px double #333; &#xA;            color: #333; &#xA;            overflow: visible; &#xA;            height: 5px; &#xA;            width: 50%; &#xA;            margin-left: auto; &#xA;            margin-right: auto;&#34;&#xA;&gt;&#xA;&#xA;&lt;p&gt;Purtroppo, per qualche motivo che mi sfugge, la configurazione della tastiera sul Mac aveva conservato la &lt;em&gt;memoria&lt;/em&gt; dei due tasti scambiati: ogni volta che premevo il tasto &lt;code&gt;&amp;lt;&lt;/code&gt; veniva fuori la barra rovesciata (poco male, visto che in pratica serve solo su Windows). Purtroppo però per inserire un &lt;em&gt;backtick&lt;/em&gt; (cioè il simbolo &lt;code&gt;`&lt;/code&gt;), dovevo premere &lt;code&gt;ALT + &amp;lt;&lt;/code&gt; invece che &lt;code&gt;ALT + \&lt;/code&gt;, come sarebbe normale. Sembra un problema da poco, ma il backtick lo uso spesso quando scrivo in Markdown (e non solo), ad esempio solo in questo articolo ho inserito finora una ventina di backtick.&lt;/p&gt;&#xA;&lt;p&gt;La prima cosa che ho fatto per tornare al layout giusto è stata, lo ammetto, piuttosto contorta. Sono andato nelle &lt;code&gt;Preferenze di Sistema&lt;/code&gt; del Mac, ho aperto l&amp;rsquo;impostazione della &lt;code&gt;Tastiera&lt;/code&gt; e ho aggiunto la tastiera USA alle &lt;code&gt;Sorgenti di input&lt;/code&gt;, in modo da poter rimuovere la tastiera italiana (ho dovuto fare così perché il sistema operativo richiede che ci sia almeno una tastiera, ooops! una sorgente di input, sempre attiva). Subito dopo ho riattivato la tastiera italiana e rimosso quella USA.&lt;/p&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2021-01-18-come-riconoscere-di-nuovo-la-tastiera-del-mac/sorgenti-di-input.jpg&#34; alt=&#34;&#34; title=&#34;Scelta della sorgente di input dalle Preferenze di Sistema&#34;&gt;&lt;p&gt;Ma non è successo niente, i tasti continuavano ad essere scambiati. Ho anche provato a rifare lo stesso giochetto riavviando il Mac prima di attivare di nuovo la tastiera italiana. Niente.&lt;/p&gt;&#xA;&lt;p&gt;In fondo tutto quello che volevo era far comparire il solito Assistente di configurazione della tastiera, che chiede di identificare la tastiera premendo il tasto a destra della Maiuscola sinistra. Ma come?&lt;/p&gt;&#xA;&lt;p&gt;Solo dopo il riavvio mi sono accorto che nelle impostazioni della Tastiera delle &lt;code&gt;Preferenze di Sistema&lt;/code&gt; era (ri)comparso il pulsante &lt;code&gt;Modifica tipo di tastiera...&lt;/code&gt;, che serve proprio ad eseguire l&amp;rsquo;Assistente di configurazione della tastiera. E con quello è andato tutto subito a posto.&lt;/p&gt;&#xA;&lt;!-- [![](img/2021-01-18-come-riconoscere-di-nuovo-la-tastiera-del-mac/preferenze-tastiera.png)](img/2021-01-18-come-riconoscere-di-nuovo-la-tastiera-del-mac/preferenze-tastiera.png &#34;Impostazioni della Tastiera nelle Preferenze di Sistema&#34;)&#xA;{class=&#34;gallery-3-left&#34;}&#xA;[![](img/2021-01-18-come-riconoscere-di-nuovo-la-tastiera-del-mac/assistente-tastiera-1.png)](img/2021-01-18-come-riconoscere-di-nuovo-la-tastiera-del-mac/assistente-tastiera-1.png &#34;Impostazione assistita della tastiera: schermata iniziale&#34;)&#xA;{class=&#34;gallery-3-center&#34;}&#xA;[![](img/2021-01-18-come-riconoscere-di-nuovo-la-tastiera-del-mac/assistente-tastiera-2.png)](img/2021-01-18-come-riconoscere-di-nuovo-la-tastiera-del-mac/assistente-tastiera-2.png &#34;Impostazione assistita della tastiera: identificazione della tastiera&#34;)&#xA;{class=&#34;gallery-3-right&#34;} --&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2021-01-18-come-riconoscere-di-nuovo-la-tastiera-del-mac/preferenze-tastiera.png&#34; alt=&#34;&#34; class=&#34;gallery-3-left&#34;&gt;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2021-01-18-come-riconoscere-di-nuovo-la-tastiera-del-mac/assistente-tastiera-1.png&#34; alt=&#34;&#34; class=&#34;gallery-3-center&#34;&gt;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2021-01-18-come-riconoscere-di-nuovo-la-tastiera-del-mac/assistente-tastiera-2.png&#34; alt=&#34;&#34; class=&#34;gallery-3-right&#34;&gt;&lt;p&gt;Il problema è che questo pulsante sembra un po&amp;rsquo; &lt;em&gt;ballerino&lt;/em&gt;, a volte appare e a volte scompare dalle impostazioni della &lt;code&gt;Tastiera&lt;/code&gt;, senza che si riesca bene a capire il perché. Ad esempio, come si può vedere qui sotto, su un altro Mac in questo momento il pulsante non c&amp;rsquo;è (qui è installato High Sierra, ma da quanto ho capito non è una questione di sistema operativo).&lt;/p&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2021-01-18-come-riconoscere-di-nuovo-la-tastiera-del-mac/preferenze-tastiera-senza-tasto-assistente.png&#34; alt=&#34;&#34; title=&#34;Configurazione della tastiera del Mac (manca il tasto Assistente)&#34;&gt;&lt;p&gt;E anche quando il pulsante c&amp;rsquo;è, non è detto che premendolo compaia l&amp;rsquo;Assistente. Non mi chiedete il perché, sarà uno di quei piccoli bachi &lt;a href=&#34;https://tidbits.com/2019/10/21/six-reasons-why-ios-13-and-catalina-are-so-buggy/&#34;&gt;che si trascinano da una versione di macOS all&amp;rsquo;altra&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;hr style = &#34;border: none; &#xA;            border-top: 3px double #333; &#xA;            color: #333; &#xA;            overflow: visible; &#xA;            height: 5px; &#xA;            width: 50%; &#xA;            margin-left: auto; &#xA;            margin-right: auto;&#34;&#xA;&gt;&#xA;&#xA;&lt;p&gt;Per fortuna esiste una soluzione relativamente semplice per forzare macOS ad eseguire l&amp;rsquo;Assistente di configurazione della tastiera. Basta andare sul disco dove è installato macOS, cliccare su &lt;code&gt;Libreria&lt;/code&gt; e poi su &lt;code&gt;Preferenze&lt;/code&gt;, cancellare il file &lt;code&gt;com.apple.keyboardtype.plist&lt;/code&gt; e riavviare. Una volta rientrati nel proprio account l&amp;rsquo;Assistente desiderato comparirà automaticamente. È un po&amp;rsquo; tortuoso e purtroppo richiede il riavvio del computer, ma funziona sempre.&lt;/p&gt;&#xA;&lt;p&gt;Da Terminale è perfino più facile. Basta eseguire il comando&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ sudo rm /Library/Preferences/com.apple.keyboardtype.plist&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;inserire la propria password e riavviare il Mac. Per farlo bisogna usare un account con privilegi di amministratore del sistema, ma se il Mac, come succede spesso, ha un unico account, questo è necessariamente un account di tipo amministrativo.&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>Il CNR è anche questo: un po&#39; di codice</title>
      <link>https://static.233.196.69.159.clients.your-server.de/it/2020/12/01/il-cnr-e-anche-questo-un-po-di-codice/</link>
      <pubDate>Tue, 01 Dec 2020 06:00:00 +0000</pubDate>
      <guid>https://static.233.196.69.159.clients.your-server.de/it/2020/12/01/il-cnr-e-anche-questo-un-po-di-codice/</guid>
      <description>&lt;img src=&#34;https://imgs.xkcd.com/comics/good_code.png&#34; alt=&#34;&#34; title=&#34;XKCD, Good code&#34;&gt;&lt;ul&gt;&#xA;&lt;li&gt;&lt;em&gt;XKCD, &lt;a href=&#34;https://xkcd.com/844/&#34;&gt;Good code&lt;/a&gt;&lt;/em&gt;.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Per concludere nel miglior modo possibile questa serie di articoli (qui la &lt;a href=&#34;https://melabit.wordpress.com/2020/10/25/il-cnr-e-anche-questo-concorsi-senza-frontiere/&#34;&gt;prima&lt;/a&gt; e la &lt;a href=&#34;https://melabit.wordpress.com/2020/11/08/il-cnr-e-anche-questo-concorsi-in-latex/&#34;&gt;seconda&lt;/a&gt; parte), cosa ci può essere di meglio di un po&amp;rsquo; di codice?&lt;/p&gt;&#xA;&lt;h4 id=&#34;estrarre-il-testo-da-un-file-pdf&#34;&gt;Estrarre il testo da un file PDF&lt;/h4&gt;&#xA;&lt;p&gt;Cominciamo dallo script in R, &lt;code&gt;pdf2csv.R&lt;/code&gt;, che estrae il testo da un file PDF, (che in questo caso specifico ho usato per &lt;a href=&#34;https://melabit.wordpress.com/2020/11/08/il-cnr-e-anche-questo-concorsi-in-latex/&#34;&gt;estrarre i dati&lt;/a&gt; dalla domanda di partecipazione ad un concorso precedente). Qui sotto trovate l&amp;rsquo;immagine dello script, realizzata con &lt;a href=&#34;https://carbon.now.sh/&#34;&gt;Carbon&lt;/a&gt; (perché così è molto più bello), su GitHub c&amp;rsquo;è il &lt;a href=&#34;https://github.com/sabinomaggi/melabit/tree/main/un-po-di-codice&#34;&gt;sorgente vero e proprio&lt;/a&gt;, per chi voglia provare ad usarlo.&lt;/p&gt;&#xA;&lt;img src=&#34;https://melabit.files.wordpress.com/2020/11/pdf2csv-1.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;Per eseguire lo script è necessario aver installato sul proprio computer,  non importa se è un Mac o un PC con Linux o Windows, &lt;a href=&#34;https://www.r-project.org/&#34;&gt;l&amp;rsquo;ambiente R&lt;/a&gt; (in questo momento è disponibile la versione 4.0.3), meglio ancora se accompagnato da &lt;a href=&#34;https://rstudio.com/products/rstudio/&#34;&gt;RStudio Desktop&lt;/a&gt;, che è di gran lunga il migliore sistema integrato di sviluppo (IDE) che abbia mai usato, oltre che uno strumento efficacissimo per affacciarsi all&amp;rsquo;uso di R.&lt;/p&gt;&#xA;&lt;p&gt;Il codice è molto semplificato, ho tolto tutto ciò che non è strettamente necessario a far funzionare lo script. La chiave di tutto è la libreria &lt;a href=&#34;https://cran.r-project.org/web/packages/pdftools/index.html&#34;&gt;pdftools&lt;/a&gt; per R.  Di librerie per estrarre dati dai file PDF ne ho provate moltissime, sia per R che per Python, ma &lt;code&gt;pdftools&lt;/code&gt; le batte tutte per potenza, semplicità e velocità. Ci sono dei &lt;em&gt;tool&lt;/em&gt; che convertono un PDF in testo al ritmo di una pagina al minuto, &lt;code&gt;pdftools&lt;/code&gt; riesce a convertire (molto bene, peraltro) un file di 400 pagine &lt;a href=&#34;https://www.snpambiente.it/2018/02/24/rapporto-controlli-ambientali-del-snpa-aia-seveso-edizione-2017/&#34;&gt;come questo&lt;/a&gt; in appena 5-6 secondi. C&amp;rsquo;è altro da aggiungere?&lt;/p&gt;&#xA;&lt;p&gt;Lo script può essere utilizzato dalla linea di comando (per capirci, dal Terminale), lasciandolo esattamente com&amp;rsquo;è ed eseguendo il comando &lt;code&gt;pdf2csv.R&lt;/code&gt; seguito dal nome dal file da convertire (se il nome del file contiene degli spazi va scritto fra virgolette),&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&#x9;./pdf2csv.R file-da-convertire.pdf&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;che produrrà due file &lt;code&gt;.csv&lt;/code&gt; contenenti il testo estratto dal file PDF. Il primo, con lo stesso nome del file di partenza, ha le righe numerate e cerca di riprodurre per quanto è possibile il &lt;em&gt;layout&lt;/em&gt; del file originale. Nel secondo, salvato con il suffisso &lt;code&gt;-clean&lt;/code&gt;, mancano i numeri di linea e vengono rimossi tutti gli spazi in eccesso, rendendolo più adatto ad una analisi automatica, in particolare quando il testo si estende per tutta la pagina (il primo file, invece, è molto più utile quando il testo è organizzato in colonne).&lt;/p&gt;&#xA;&lt;p&gt;Prima di usare per la prima volta &lt;code&gt;pdf2csv.R&lt;/code&gt; bisogna renderlo eseguibile tramite il comando &lt;code&gt;chmod&lt;/code&gt; (ne ho già scritto diffusamente &lt;a href=&#34;https://melabit.wordpress.com/2018/12/30/script-per-tutti-i-giorni-shell-e-parametri/&#34;&gt;qui&lt;/a&gt;).&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&#x9;chmod u+x pdf2csv.R&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;In alternativa si può lanciare lo script tramite il comando &lt;code&gt;Rscript&lt;/code&gt; installato con R, senza che sia necessario renderlo eseguibile.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&#x9;Rscript ./pdf2csv.R file-da-convertire.pdf&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;È preferibile che il file PDF da convertire si trovi nella stessa cartella di &lt;code&gt;pdf2csv.R&lt;/code&gt;. In caso contrario il testo estratto viene comunque salvato nella cartella dove si trova la script (ve l&amp;rsquo;avevo detto che lo script era molto semplificato!).&lt;/p&gt;&#xA;&lt;p&gt;Per eseguire &lt;code&gt;pdf2csv.R&lt;/code&gt; all&amp;rsquo;interno di RStudio bisogna commentare la linea &lt;code&gt;12&lt;/code&gt; (basta aggiungere un &lt;code&gt;#&lt;/code&gt; all&amp;rsquo;inizio della riga) e attivare la riga 14 o 15 (ma solo da una delle due) togliendo il &lt;code&gt;#&lt;/code&gt; iniziale. Se si attiva la riga 14, si deve anche modificare la stringa &lt;code&gt;file-da-convertire.pdf&lt;/code&gt;, sostituendola con il nome del file da convertire. Se invece si attiva la riga numero 15, al momento dell&amp;rsquo;esecuzione dello script comparirà una finestra grafica da cui selezionare il file PDF desiderato.&lt;/p&gt;&#xA;&lt;p&gt;Nel &lt;a href=&#34;https://github.com/sabinomaggi/melabit/tree/main/un-po-di-codice&#34;&gt;repository su GitHub&lt;/a&gt; di questo articolo ho inserito dei file PDF di complessità crescente con cui fare qualche prova, fra cui un documento di quasi 1000 pagine (un vecchio manuale di riferimento del formato PDF, potevo scegliere qualcosa di diverso?), che può essere utile per valutare la velocità di conversione dello script. Non è necessario farlo a mano, il tempo di esecuzione di un qualunque programma o script si può misurare in modo preciso dal Terminale anteponendo il comando di sistema &lt;code&gt;time&lt;/code&gt;, come mostrato qui sotto.&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;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&#x9;time ./pdf2csv.R PDFReference.pdf&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Come piccola chicca finale, ho aggiunto al repository su GitHub un file PDF contenente del testo (apparentemente) nascosto, provate a convertirlo e vi accorgerete di quanto sia banale recuperare il testo completo.&lt;/p&gt;&#xA;&lt;h4 id=&#34;generare-automaticamente-dei-documenti-con-awk&#34;&gt;Generare automaticamente dei documenti con AWK&lt;/h4&gt;&#xA;&lt;p&gt;Tirar fuori il testo contenuto in un file PDF è quasi sempre solo il primo passo del lavoro, perché quello che vogliamo veramente è filtrare il contenuto del documento mantenendo solo le informazioni che ci interessano. Nel &lt;a href=&#34;https://melabit.wordpress.com/2020/11/08/il-cnr-e-anche-questo-concorsi-in-latex/&#34;&gt;caso specifico&lt;/a&gt;, io avevo bisogno di selezionare dalla domanda di concorso precedente solo i dati relativi ad una specifica tipologia di attività (ad esempio tutti gli articoli scientifici pubblicati), salvandoli in un file &lt;em&gt;ad hoc&lt;/em&gt;. E, già che c&amp;rsquo;ero, volevo anche costruire una tabella LaTeX per ciascun articolo. Una cosa abbastanza facile da fare con &lt;a href=&#34;https://www.grymoire.com/Unix/Awk.html&#34;&gt;AWK&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Di AWK ho già parlato &lt;a href=&#34;https://melabit.wordpress.com/2019/02/18/script-per-tutti-i-giorni-entra-in-scena-awk/&#34;&gt;tempo fa&lt;/a&gt; e non mi ripeterò, dirò solo che è un linguaggio ideale per analizzare un file di testo una riga alla volta, verificando se si presentano determinate condizioni ed eseguendo le operazioni programmate corrispondenti.&lt;/p&gt;&#xA;&lt;p&gt;Nonostante i suoi tanti pregi, AWK ha una limitazione piuttosto seria: per come è strutturato, AWK deve per forza di cose esaminare tutto il file senza poter &lt;em&gt;tornare indietro&lt;/em&gt;, e quindi è piuttosto difficile fargli eseguire delle operazioni basate su condizioni multiple complesse. È molto meglio (quando è possibile) scrivere più &lt;em&gt;script&lt;/em&gt; AWK, da eseguire in sequenza sullo stesso file di partenza o sull&amp;rsquo;output generato dallo script precedente, piuttosto che cercare di combattere con le limitazioni del linguaggio, complicando a dismisura il codice.&lt;/p&gt;&#xA;&lt;p&gt;In una prima versione di questo articolo avevo pensato di utilizzare un breve estratto della mia domanda di concorso precedente per descrivere il funzionamento degli script in AWK. Ma mentre scrivevo mi sono accorto che il discorso sarebbe stato così specifico da essere quasi inutile. Ho preferito quindi preparare un piccolo file PDF tratto dagli ultimi post pubblicati su Melabit, con l&amp;rsquo;intestazione in &lt;a href=&#34;https://blog.stackpath.com/yaml/&#34;&gt;YAML&lt;/a&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; di ciascun post seguita dalla prima frase del testo in &lt;a href=&#34;https://daringfireball.net/projects/markdown/&#34;&gt;Markdown&lt;/a&gt; e, quando c&amp;rsquo;è, dal link all&amp;rsquo;immagine iniziale. L&amp;rsquo;ho scelto perché la struttura di questo file assomiglia moltissimo a quella della mia domanda di concorso ma, allo stesso tempo, può essere uno schema di partenza applicabile a casi più generali.&lt;/p&gt;&#xA;&lt;div style = &#34;border-style: solid; border-width: 0px 0px 0px 4px; border-color: midnightblue; background-color: aliceblue; padding: 1em;&#34;&gt;&#xA;Questo file PDF può essere considerato come la stampa di un piccolo _database_ di informazioni correlate, dove ogni post è un _record_, suddiviso a sua volta nei vari _campi_, rappresentati dalle righe di intestazione e dalla frase di testo.&#xA;&lt;/div&gt;&#xA;&lt;p&gt;Il file PDF si chiama &lt;code&gt;Melabit ultimi post.pdf&lt;/code&gt; e, come gli altri file PDF, è disponibile nel &lt;a href=&#34;https://github.com/sabinomaggi/melabit/tree/main/un-po-di-codice&#34;&gt;repository su GitHub&lt;/a&gt; di questo articolo. Se lo aprite con Anteprima, noterete subito che ci sono delle righe vuote che separano chiaramente un post (nel linguaggio dei database, un &lt;em&gt;record&lt;/em&gt;) dall&amp;rsquo;altro. Ma convertendo il file in testo,&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&#x9;./pdf2csv.R &amp;#34;Melabit ultimi post.pdf&amp;#34;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;(le virgolette sono necessarie perché il nome del file contiene degli spazi), le righe vuote scompaiono e le uniche interruzioni presenti nei due file CSV prodotti dallo script di conversione corrispondono al cambio pagina. Non so se questo sia un baco o una caratteristica voluta di &lt;code&gt;pdftools&lt;/code&gt;, ma sta di fatto che è una particolarità con la quale dobbiamo fare i conti se vogliamo analizzare il testo con AWK.&lt;/p&gt;&#xA;&lt;p&gt;Sembra una sciocchezza, ma senza le giuste interruzioni non è immediato riconoscere la fine di un record &lt;em&gt;prima&lt;/em&gt; di iniziare ad esaminare quello successivo, in modo da chiudere correttamente la tabella LaTeX corrispondente al record appena esaminato e ad aprire quella relativa al record successivo. Inoltre, mentre in questo caso specifico la struttura del file PDF è volutamente molto semplice e ripetibile, nella maggior parte dei casi reali il documento da cui estrarre i dati può contenere informazioni strutturate in modi diversi, i campi da analizzare possono essere distribuiti in modo irregolare o mancare del tutto e ci possono essere incongruenze nella loro denominazione. Gestire tutti i casi possibili con un unico script lo renderebbe rapidamente troppo complesso.&lt;/p&gt;&#xA;&lt;p&gt;Molto meglio affrontare il problema un pezzetto alla volta, utilizzando uno script specifico per ciascun tipo di informazione da estrarre (io ho avuto bisogno di 6 script AWK per eseguire tutto il lavoro di esportazione dei dati, o meglio &lt;em&gt;quasi tutto&lt;/em&gt; il lavoro, perché per i casi meno frequenti ho preferito il buon vecchio copia-incolla manuale). In fondo è la stessa logica di Unix, che mette a disposizione un gran numero di strumenti semplici che messi insieme, come tanti mattoncini Lego, riescono a fare cose incredibili.&lt;/p&gt;&#xA;&lt;p&gt;Un primo script, &lt;code&gt;addblanklines.awk&lt;/code&gt;, può servire per inserire nel file CSV di partenza una riga vuota &lt;em&gt;prima&lt;/em&gt; di ogni record (una cosa piuttosto semplice da fare in questo caso, dato che ogni post inizia sempre con la stringa &amp;ldquo;layout: post&amp;rdquo;). Lo script, appena quindici linee di codice, lo trovate &amp;ldquo;in bella&amp;rdquo; nell&amp;rsquo;immagine qui sotto (ma anche in questo caso il &lt;a href=&#34;https://github.com/sabinomaggi/melabit/tree/main/un-po-di-codice&#34;&gt;sorgente&lt;/a&gt; è su GitHub).&lt;/p&gt;&#xA;&lt;img src=&#34;https://melabit.files.wordpress.com/2020/11/addblanklines-1.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;Bastano solo due linee di codice, la #4 e la #9, per aggiungere le righe vuote al posto giusto. Ma già che ci siamo, è conveniente dare anche una &lt;em&gt;ripulita&lt;/em&gt; al file CSV togliendo le righe inutili, come quelle che contengono il numero di pagina o la stringa &lt;code&gt;---&lt;/code&gt; che segna l&amp;rsquo;inizio e la fine dell&amp;rsquo;intestazione in YAML (linee #5 e #12). Eseguendo lo script sul file CSV originale, si ottiene un nuovo file CSV con i vari record ben separati uno dall&amp;rsquo;altro.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&#x9;./addblanklines.awk &amp;#34;Melabit ultimi post-clean.csv&amp;#34; &amp;gt; file-con-righe-vuote.csv&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Fatto questo, il passo successivo è semplice. Basta scansionare il file CSV appena generato, &lt;code&gt;file-con-righe-vuote.csv&lt;/code&gt;, in cerca della stringa &lt;em&gt;target&lt;/em&gt; &lt;code&gt;layout: post&lt;/code&gt; e, ogni volta che se ne trova una, generare una nuova tabella LaTeX riempiendola con i dati tratti dalle voci (o più propriamente &lt;em&gt;campi&lt;/em&gt;) successive. Il codice del secondo script, &lt;code&gt;cvs2table.awk&lt;/code&gt;, è visibile nell&amp;rsquo;immagine qui sotto (mentre il &lt;a href=&#34;https://github.com/sabinomaggi/melabit/tree/main/un-po-di-codice&#34;&gt;sorgente&lt;/a&gt; è sempre su GitHub).&lt;/p&gt;&#xA;&lt;img src=&#34;https://melabit.files.wordpress.com/2020/11/cvs2table-1.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;Lo script è relativamente lungo, sono più di 80 linee di codice, compresi commenti e righe vuote, ma una gran parte serve per implementare la funzione (linee #3-25) che riarrangia le informazioni presenti su più linee consecutive del file CSV in modo che vengano stampate su un&amp;rsquo;unica riga, e per generare la struttura di base del documento LaTeX (linee #35-42 e #83).&lt;/p&gt;&#xA;&lt;p&gt;Tolte queste, il resto del codice è semplice, si tratta più che altro di scrivere le stringe giuste al momento giusto e di tenere conto dei casi in cui le informazioni si estendono su più linee consecutive (come succede ad esempio alle linee #61-62 e #66-73). Non entrerò nei dettagli di come funziona lo script, questo non è un corso di AWK (né tantomeno di R), basterà per ora dire che è scritto in modo da essere facilmente adattato a gestire esigenze analoghe. Per usarlo, si deve eseguire lo script usando come file di input &lt;code&gt;file-con-righe-vuote.csv&lt;/code&gt; e salvando il risultato dell&amp;rsquo;elaborazione in un file LaTeX, che qui sotto ho chiamato (con la mia solita scarsa fantasia) &lt;code&gt; lista-articoli.tex&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&#x9;./cvs2table.awk file-con-righe-vuote.csv &amp;gt; lista-articoli.tex&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h4 id=&#34;mettere-tutto-insieme&#34;&gt;Mettere tutto insieme&lt;/h4&gt;&#xA;&lt;p&gt;Proviamo allora ad eseguire tutti insieme gli script presentati in questo articolo, in modo da ottenere il risultato finale desiderato. Dobbiamo prima di tutto convertire il file PDF in CSV con&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&#x9;./pdf2csv.R &amp;#34;Melabit ultimi post.pdf&amp;#34;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;che genera automaticamente il file &amp;ldquo;Melabit ultimi post-clean.csv&amp;rdquo;. Fatto questo, si eseguono in sequenza i due script AWK, salvando l&amp;rsquo;output del primo in un file intermedio.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&#x9;./addblanklines.awk &amp;#34;Melabit ultimi post-clean.csv&amp;#34; &amp;gt; file-con-righe-vuote.csv&#xA;&#x9;./cvs2table.awk file-con-righe-vuote.csv &amp;gt; lista-articoli.tex&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Il risultato finale è un file LaTeX ben ordinato con una tabella per ogni articolo, come quello mostrato nella figura qui sotto la cui regolarità, messa in evidenza dai colori delle parole chiave, fa pensare ad uno spartito musicale.&lt;/p&gt;&#xA;&lt;img src=&#34;https://melabit.files.wordpress.com/2020/11/lista-articoli-1.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;Ma ha senso creare un file intermedio solo per trasferire l&amp;rsquo;output del primo script al secondo? Molto meglio usare il &lt;a href=&#34;https://www.geeksforgeeks.org/piping-in-unix-or-linux/&#34;&gt;meccanismo di &lt;em&gt;piping&lt;/em&gt;&lt;/a&gt; tipico in Unix, con il quale si può trasferire automaticamente il risultato dell&amp;rsquo;esecuzione di un comando all&amp;rsquo;ingresso di quello successivo, collegandoli con il carattere &lt;code&gt;|&lt;/code&gt; (&lt;em&gt;pipe&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; Con il &lt;em&gt;piping&lt;/em&gt;, i due comandi AWK precedenti possono essere eseguiti uno dopo l&amp;rsquo;altro in questo modo,&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&#x9;./addblanklines.awk &amp;#34;Melabit ultimi post-clean.csv&amp;#34; | ./cvs2table.awk &amp;gt; lista-articoli.tex&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;evitando l&amp;rsquo;uso di un file intermedio. In questo caso non fa molta differenza, ma quando si devono trattare file molto grossi, il &lt;em&gt;piping&lt;/em&gt; è molto più efficiente (con i velocissimi dischi SSD odierni non ce ne accorgiamo più, ma ai tempi dei dischi meccanici la scrittura di grossi file sul disco era un vero collo di bottiglia) e, cosa che non guasta mai, evita di intasare il disco rigido con un gran numero di file inutili.&lt;/p&gt;&#xA;&lt;p&gt;E poi il &lt;em&gt;piping&lt;/em&gt; è un meccanismo intrinsecamente elegante, che non a caso è stato adottato anche in alcuni &lt;a href=&#34;http://leetschau.github.io/pipe-operator-in-functional-programming-languages.html&#34;&gt;linguaggi di programmazione odierni&lt;/a&gt;, come si può vedere nello script R mostrato nella prima parte di questo articolo (linee #24-25 e #35-37), dove il simbolo &lt;code&gt;|&lt;/code&gt; usato in Unix è sostituito dalla strana combinazione di caratteri &lt;code&gt;%&amp;amp;#62;%&lt;/code&gt;, piuttosto fastidiosa da scrivere con una tastiera italiana (io almeno sbaglio sempre qualcosa).&lt;/p&gt;&#xA;&lt;h4 id=&#34;conclusioni&#34;&gt;Conclusioni&lt;/h4&gt;&#xA;&lt;p&gt;Chi ha l&amp;rsquo;occhio allenato si accorgerà facilmente che il file LaTeX risultante contiene alcuni errori piuttosto evidenti. Li ho lasciati apposta non solo per non complicare ulteriormente il codice, ma anche per mostrare quanto sia complicato il lavoro di estrazione automatica dei dati da file strutturati in modo non perfettamente regolare. Non è certo un caso che in questo campo ci sia una grossa attività di ricerca che prova a superare gli ostacoli e a rendere il tutto il più semplice e il più efficiente possibile.&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;Il comando &lt;code&gt;time&lt;/code&gt; è presente di default nei sistemi operativi Unix come Linux e macOS. Su Windows &lt;code&gt;time&lt;/code&gt; non esiste, ma si possono usare degli &lt;a href=&#34;https://qastack.it/superuser/228056/windows-equivalent-to-unix-time-command&#34;&gt;strumenti equivalenti&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;YAML è un linguaggio di &lt;em&gt;markup&lt;/em&gt; particolarmente adatto per definire dei file di configurazione e, in generale, per rappresentare informazioni strutturate in modo semplice e leggibile, molto più facile da usare di strumenti più noti come XML e JSON.&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:3&#34;&gt;&#xA;&lt;p&gt;Il &lt;em&gt;piping&lt;/em&gt; è uno dei meccanismi principali che rendono Unix una specie di Lego informatico.&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>Il CNR è anche questo: concorsi in LaTeX</title>
      <link>https://static.233.196.69.159.clients.your-server.de/it/2020/11/08/il-cnr-e-anche-questo-concorsi-in-latex/</link>
      <pubDate>Sun, 08 Nov 2020 06:00:00 +0000</pubDate>
      <guid>https://static.233.196.69.159.clients.your-server.de/it/2020/11/08/il-cnr-e-anche-questo-concorsi-in-latex/</guid>
      <description>&lt;p&gt;Nella &lt;a href=&#34;https://melabit.wordpress.com/2020/10/25/il-cnr-e-anche-questo-concorsi-senza-frontiere/&#34;&gt;puntata precedente&lt;/a&gt; ho raccontato della mia corsa contro il tempo dell&amp;rsquo;estate, una prova assurda come quelle di &lt;a href=&#34;https://curiosando708090.altervista.org/giochi-senza-frontiere-19651982-19881999/&#34;&gt;Giochi senza frontiere&lt;/a&gt;, ma senza allegria.&lt;/p&gt;&#xA;&lt;p&gt;Inutile però dilungarsi ancora in dettagli poco comprensibili ai non addetti ai lavori. Meglio parlare invece di cosa ho fatto io per superare questa prova, cercando di sfruttare quel poco che so di LaTeX e di programmazione.&lt;/p&gt;&#xA;&lt;p&gt;Perché, l&amp;rsquo;ho già detto ma mi ripeto, qualche nozione di programmazione può aiutare a cavarsela meglio con le tante &lt;em&gt;&lt;a href=&#34;https://www.treccani.it/magazine/lingua_italiana/speciali/Montalbano/Nichil_arrabbiato.html&#34;&gt;rotture di cabasisi&lt;/a&gt;&lt;/em&gt; che dobbiamo affrontare ogni giorno.&lt;/p&gt;&#xA;&lt;hr style = &#34;border: none; &#xA;            border-top: 3px double #333; &#xA;            color: #333; &#xA;            overflow: visible; &#xA;            height: 5px; &#xA;            width: 50%; &#xA;            margin-left: auto; &#xA;            margin-right: auto;&#34;&#xA;&gt;&#xA;&#xA;&lt;p&gt;Se c&amp;rsquo;è una cosa sulla quale sin dal primo momento non ho avuto il minimo dubbio, è che non avrei usato Word per preparare il curriculum professionale. Word non mi piace, si sa, ma in questa scelta non c&amp;rsquo;era nessuna prevenzione, era solo un modo per preservare la mia salute mentale.&lt;/p&gt;&#xA;&lt;p&gt;Word ha grosse difficoltà a gestire strutture complesse come le tabelle. Una, due, tre, dieci tabelle vanno ancora bene, ma qui si trattava di creare centinaia e centinaia di tabelle diverse, una per ogni &lt;a href=&#34;https://melabit.wordpress.com/2020/10/25/il-cnr-e-anche-questo-concorsi-senza-frontiere/&#34;&gt;titolo&lt;/a&gt; &amp;ndash; articolo, progetto, software, brevetto, insegnamento, incarico &amp;ndash; inserito nel curriculum professionale. Dopo un po&amp;rsquo; Word sarebbe letteralmente &lt;em&gt;impazzito&lt;/em&gt; nel maneggiare tutte quelle tabelle, facendomi perdere un sacco di tempo prezioso.&lt;/p&gt;&#xA;&lt;p&gt;Con &lt;a href=&#34;https://www.latex-project.org/&#34;&gt;LaTeX&lt;/a&gt; il problema non si pone. Un documento LaTeX è un normale file di testo e il fatto che contenga tabelle, liste o semplici paragrafi non fa molta differenza, sono solo delle porzioni di testo strutturate in modo diverso. Il peggio che può capitare è che il &lt;a href=&#34;https://www.overleaf.com/learn/latex/Choosing_a_LaTeX_Compiler&#34;&gt;compilatore LaTeX&lt;/a&gt; impieghi qualche secondo in più a convertire il documento LaTeX in PDF.&lt;/p&gt;&#xA;&lt;p&gt;Il fatto che i documenti LaTeX siano dei file di testo mi permetteva anche di generare automaticamente le tabelle relative a ciascun titolo inserito nel curriculum professionale, una cosa impossibile da fare con Word e che ha velocizzato moltissimo tutto il lavoro.&lt;/p&gt;&#xA;&lt;p&gt;Già perché, non l&amp;rsquo;ho detto prima, il curriculum professionale andava sì scritto in Word, ma poi la sottomissione andava fatta in PDF,&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; utilizzando (ci credete?) la &lt;a href=&#34;https://selezionionline.cnr.it/jconon/?lang=it&#34;&gt;piattaforma online&lt;/a&gt; per i concorsi dismessa così improvvidamente. In pratica il &lt;a href=&#34;https://figshare.com/account/articles/13076858&#34;&gt;modello in Word&lt;/a&gt; fornito dall&amp;rsquo;amministrazione serviva solo come indicazione di massima di come dovesse essere organizzato il curriculum, ma niente impediva di utilizzare altri strumenti. L&amp;rsquo;unica cosa davvero importante è che il &lt;em&gt;layout&lt;/em&gt; del file PDF corrispondesse a quello previsto dall&amp;rsquo;amministrazione.&lt;/p&gt;&#xA;&lt;p&gt;Riprodurre in LaTeX il modello originale in Word non è stato difficile: la classe &lt;a href=&#34;https://www.ctan.org/pkg/memoir&#34;&gt;memoir&lt;/a&gt; è molto flessibile ed è particolarmente adatta a produrre tutti quei documenti che escono dai canoni classici di LaTeX, mentre i package &lt;a href=&#34;https://ctan.org/pkg/geometry&#34;&gt;geometry&lt;/a&gt;, &lt;a href=&#34;https://www.ctan.org/pkg/booktabs&#34;&gt;booktabs&lt;/a&gt;, &lt;a href=&#34;https://ctan.org/pkg/multirow&#34;&gt;multirow&lt;/a&gt; e &lt;a href=&#34;https://www.ctan.org/pkg/titlesec&#34;&gt;titlesec&lt;/a&gt; permettono di regolare finemente i dettagli del documento finale.&lt;/p&gt;&#xA;&lt;p&gt;Sia chiaro, preparare un modello di documento LaTeX partendo da zero non è mai facile, a meno di non essere dei veri esperti. Per fortuna avevo già fatto delle cose simili in passato e mi è bastato modificare qualche dettaglio per ottenere quello che mi serviva.&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;hr style = &#34;border: none; &#xA;            border-top: 3px double #333; &#xA;            color: #333; &#xA;            overflow: visible; &#xA;            height: 5px; &#xA;            width: 50%; &#xA;            margin-left: auto; &#xA;            margin-right: auto;&#34;&#xA;&gt;&#xA;&#xA;&lt;p&gt;Il modello LaTeX era però il problema minore, ciò che importava davvero era riuscire a riutilizzare il più possibile il lavoro fatto in passato. Come già detto nel &lt;a href=&#34;https://melabit.wordpress.com/2020/10/25/il-cnr-e-anche-questo-concorsi-senza-frontiere/&#34;&gt;post precedente&lt;/a&gt;, i soloni che ci governano non avevano previsto nessuna possibilità di esportare i dati già presenti sulla piattaforma online. L&amp;rsquo;unica possibilità era quella di partire dal curriculum in PDF preparato per un concorso precedente (del 2013, ben sette anni fa).&lt;/p&gt;&#xA;&lt;p&gt;Per fortuna ho una certa esperienza nell&amp;rsquo;estrazione di dati dai documenti PDF, un problema molto attuale dato che tante istituzioni, non solo nazionali ma anche internazionali, sono molto restie a condividere i loro dati in formati standard utilizzabili da chi, come me, si occupa di estrarre informazioni dalle serie temporali di misure. Quando va bene il meglio che si riesce ad ottenere sono dei file PDF contenenti delle tabelle mal strutturate, che bisogna ingegnarsi a convertire in formati usabili per le analisi. Mi è bastato quindi adattare uno script in R sviluppato per altri scopi per riuscire a convertire la domanda in PDF in un &lt;a href=&#34;https://www.html.it/articoli/file-csv-cosa-sono-come-si-aprono-e-come-crearli/&#34;&gt;file CSV&lt;/a&gt; ben ordinato.&lt;/p&gt;&#xA;&lt;p&gt;Partendo dal file CSV e con qualche semplice &lt;a href=&#34;https://melabit.wordpress.com/2019/02/18/script-per-tutti-i-giorni-entra-in-scena-awk/&#34;&gt;script in AWK&lt;/a&gt; (un&amp;rsquo;altro &lt;em&gt;tool&lt;/em&gt; di base di cui non potrei mai fare a meno) è stato quasi un gioco da ragazzi estrarre i dati relativi ai titoli già presentati in quel concorso, salvandoli in file differenti in base alla &lt;a href=&#34;https://melabit.wordpress.com/2020/10/25/il-cnr-e-anche-questo-concorsi-senza-frontiere/&#34;&gt;tipologia&lt;/a&gt; in modo che poi fosse più semplice aggiungere uno ad uno i titoli mancanti (dal 2013 ad oggi ce ne sono state di novità!). Il modello LaTeX si occupava poi di importare questi file nella sequenza corretta producendo il curriculum completo.&lt;/p&gt;&#xA;&lt;p&gt;Già che c&amp;rsquo;ero, con gli stessi script potevo anche costruire automaticamente le tabelle LaTeX dove incasellare ciascun titolo. È una cosa più difficile da spiegare che da fare, ma che ha rappresentato un vantaggio incomparabile rispetto a creare le tabelle una ad una con Word.&lt;/p&gt;&#xA;&lt;p&gt;Devo ammettere che gli script AWK non erano perfetti, purtroppo me ne sono accorto solo dopo aver iniziato il lavoro di inserimento dei nuovi titoli. Ma dato che questi script mi servivano solo una volta, ho preferito correggere a mano gli errori piuttosto che perdere altro tempo a perfezionarli.&lt;/p&gt;&#xA;&lt;hr style = &#34;border: none; &#xA;            border-top: 3px double #333; &#xA;            color: #333; &#xA;            overflow: visible; &#xA;            height: 5px; &#xA;            width: 50%; &#xA;            margin-left: auto; &#xA;            margin-right: auto;&#34;&#xA;&gt;&#xA;&#xA;&lt;p&gt;Lavorare con file diversi per ciascuna tipologia (o &lt;em&gt;fattispecie&lt;/em&gt;, il termine preferito dai nostri vertici amministrativi) aveva un altro grosso vantaggio. Avendo separato il modello LaTeX, che gestiva l&amp;rsquo;aspetto generale del curriculum professionale, dai dati riportati nei diversi file, potevo velocizzare parecchio la fase di (diciamo così) &lt;em&gt;debugging&lt;/em&gt; del documento finale. In altre parole, se lavoravo sugli articoli scientifici scritti nel corso della mia carriera, potevo importare nel modello generale LaTeX solo il file relativo, lasciando fuori tutto ciò che riguardava le altre attività svolte. Analogamente per le altre tipologie di documenti. Sembra una cosa da niente, ma quando si passano le giornate ad inserire i dati di decine di nuovi documenti, avere a disposizione un file PDF più snello e poter controllare più rapidamente di non aver fatto errori e di non aver dimenticato niente può davvero fare la differenza.&lt;/p&gt;&#xA;&lt;hr style = &#34;border: none; &#xA;            border-top: 3px double #333; &#xA;            color: #333; &#xA;            overflow: visible; &#xA;            height: 5px; &#xA;            width: 50%; &#xA;            margin-left: auto; &#xA;            margin-right: auto;&#34;&#xA;&gt;&#xA;&#xA;&lt;p&gt;Un altro aspetto chiave dell&amp;rsquo;usare LaTeX al posto di Word è stato il fatto di poter numerare a piacere le singole tabelle. Su questo la confusione era massima. Il principio generale era chiaro, i vari titoli delle &lt;a href=&#34;https://melabit.wordpress.com/2020/10/25/il-cnr-e-anche-questo-concorsi-senza-frontiere/&#34;&gt;Categorie A e B&lt;/a&gt; andavano inseriti rispettando un ordine temporale inverso, dal più recente al più vecchio, assegnando un numero progressivo a ciascuna tabella. Quello che non era affatto chiaro era il &lt;em&gt;come&lt;/em&gt;.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://melabit.files.wordpress.com/2020/10/categoria-a.png&#34; alt=&#34;&#34;&gt;&#xA;&lt;em&gt;Modello di curriculum professionale: titoli della Categoria A.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://melabit.files.wordpress.com/2020/10/categoria-b.png&#34; alt=&#34;&#34;&gt;&#xA;&lt;em&gt;Modello di curriculum professionale: titoli della Categoria B.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;C&amp;rsquo;era chi affermava che si dovessero numerare progressivamente i documenti della &lt;strong&gt;Categoria A&lt;/strong&gt;, gli ormai famosi &lt;strong&gt;Prodotti della Ricerca&lt;/strong&gt;, indipendentemente dalla loro tipologia ma tendendo conto solo della data, ricominciando la numerazione dal principio una volta passati ai titoli della &lt;strong&gt;Categoria B&lt;/strong&gt;, dove invece i titoli andavano raggruppati in base alla tipologia. Altri pensavano che fosse preferibile raggruppare tutti i titoli della Categoria A per tipologia (prima tutti gli articoli, poi i capitoli di libri e gli atti di congressi, poi i brevetti, e così via), ordinandoli dal più recente al più vecchio e numerandoli progressivamente, continuando la numerazione con gli stessi criteri una volta passati alla Categoria B. Altri volevano numerare anche le tipologie, un po&amp;rsquo; come si fa con i capitoli di un libro tecnico. Insomma, ogni partecipante al concorso aveva la sua idea.&lt;/p&gt;&#xA;&lt;p&gt;Come ha scritto qualcuno in un gruppo WhatsApp, &lt;em&gt;&amp;ldquo;le migliori menti del Paese non riuscivano a interpretare le istruzioni del bando di concorso&amp;rdquo;&lt;/em&gt;. Non so se al CNR ci siano davvero le &lt;em&gt;migliori menti del Paese&lt;/em&gt;, ma è evidente che tutta questa confusione derivava dalla difficoltà di interpretare un gergo burocratico astruso e inconsistente, incomprensibile per chi è abituato per professione ad essere preciso e rigoroso. A ciò si aggiungeva un motivo più banale, il timore di fare degli errori nella stesura del curriculum e di essere penalizzati per questo dalle commissioni di valutazione.&lt;/p&gt;&#xA;&lt;p&gt;Io non avevo scelta. Avendo raggruppato tutti i miei titoli in file differenti in base alla tipologia e importando i file uno dopo l&amp;rsquo;altro nel modello generale LaTeX, non potevo fare altro che numerare tutti i titoli della stessa tipologia in base alla data (dal più recente al più vecchio), proseguendo la numerazione una volta passato ad un&amp;rsquo;altra tipologia e continuando a numerare progressivamente allo stesso modo anche i titoli della Categoria B.&lt;/p&gt;&#xA;&lt;p&gt;Mi sembrava anche la cosa più logica da fare, perché questo ordinamento facilitava il lavoro della commissione, che così trovava raggruppati prima tutti gli articoli scientifici (che sono senza ombra di dubbio i titoli più importanti per un ricercatore), poi tutti i capitoli di libri o gli atti di congresso, poi i brevetti, e così via. Se l&amp;rsquo;ordinamento primario per tipologia era previsto esplicitamente per la Categoria B, perché non fare lo stesso anche per la Categoria A? Se poi alla commissione non piacerà, pazienza!&lt;/p&gt;&#xA;&lt;hr style = &#34;border: none; &#xA;            border-top: 3px double #333; &#xA;            color: #333; &#xA;            overflow: visible; &#xA;            height: 5px; &#xA;            width: 50%; &#xA;            margin-left: auto; &#xA;            margin-right: auto;&#34;&#xA;&gt;&#xA;&#xA;&lt;p&gt;Inutile dire che ho usato &lt;a href=&#34;https://git-scm.com&#34;&gt;git&lt;/a&gt; &amp;ndash; il sistema di controllo delle versioni che è ormai uno standard di fatto nel mondo dello sviluppo &amp;ndash; per gestire le revisioni di tutti i file che mi servivano per produrre il curriculum professionale finale: il modello generale in LaTeX, gli script in R e AWK e tutti i file CSV e LaTeX generati dagli script.&lt;/p&gt;&#xA;&lt;p&gt;Con il sistema di controllo delle versioni potevo aggiornare i vari file LaTeX dei titoli sapendo di poter tornare indietro anche in caso di errori troppo gravi per essere recuperati a colpi di &lt;em&gt;undo&lt;/em&gt;. Per fare un esempio, a un certo punto mi sono accorto che avrei dovuto scambiare due righe in tutte le tabelle del file relativo agli articoli (si veda la figura qui sotto). Con un buon editor di testo è una cosa che si fa in cinque minuti, ma sapere di poter usare &lt;code&gt;git&lt;/code&gt; anche per &lt;a href=&#34;https://git-scm.com/book/en/v2/Git-Tools-Interactive-Staging&#34;&gt;annullare ogni singola modifica&lt;/a&gt; è una cosa che si apprezza solo dopo essersi spupazzati una ad una un migliaio di righe di codice LaTeX.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://melabit.files.wordpress.com/2020/10/git-latex.png&#34; alt=&#34;&#34;&gt;&#xA;&lt;em&gt;Interfaccia grafica di &lt;code&gt;git&lt;/code&gt; con la quale è possibile accettare o annullare ogni singola modifica ad un file.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;Git è troppo complicato? Può darsi, ma un sistema di controllo delle versioni è come un backup, finché va tutto bene non si capisce a cosa serva, ma quando si presenta un problema si ringrazia il cielo di averlo usato.&lt;/p&gt;&#xA;&lt;hr style = &#34;border: none; &#xA;            border-top: 3px double #333; &#xA;            color: #333; &#xA;            overflow: visible; &#xA;            height: 5px; &#xA;            width: 50%; &#xA;            margin-left: auto; &#xA;            margin-right: auto;&#34;&#xA;&gt;&#xA;&#xA;&lt;p&gt;Guardando a ritroso mi accorgo che la preparazione di questo curriculum professionale è stata in parte un lavoro di programmazione, tutto sommato abbastanza divertente, seguita da una lunga e noiosissima fase di inserimento dei nuovi dati e di controllo che tutto fosse a posto, una cosa che sembrava non dovesse finire mai. Lavorando una decina di ore al giorno ho impiegato quasi un mese per completare il lavoro, un pelo in anticipo rispetto alla scadenza prevista. Uno spreco di tempo assurdo per quello che dovrebbe essere un evento normalissimo nella vita professionale di chi fa questo mestiere.&lt;/p&gt;&#xA;&lt;p&gt;La versione finale del mio curriculum ha 248 pagine, un numero che per un matematico (o un programmatore) ha un certo significato.&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; Chissà se la commissione che lo giudicherà sarà dello stesso avviso.&lt;/p&gt;&#xA;&lt;p&gt;(&lt;a href=&#34;https://melabit.wordpress.com/2020/12/01/il-cnr-e-anche-questo-un-po-di-codice/&#34;&gt;Continua&amp;hellip;&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;Una cosa più che ragionevole, visto che un file PDF è molto più difficile da manipolare del corrispettivo in Word.&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;Detto fra parentesi, se c&amp;rsquo;è interesse per l&amp;rsquo;argomento, potrei scrivere dei post specifici su LaTeX e dintorni, toccando non solo le basi ma anche argomenti più avanzati come questo.&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;Ammetto che arrivare a 271 o a 314 pagine sarebbe stato meglio, ma ci proverò la prossima volta.&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>Spotlight e il riquadro fastidioso</title>
      <link>https://static.233.196.69.159.clients.your-server.de/it/2020/03/09/spotlight-e-il-riquadro-fastidioso/</link>
      <pubDate>Mon, 09 Mar 2020 06:00:00 +0000</pubDate>
      <guid>https://static.233.196.69.159.clients.your-server.de/it/2020/03/09/spotlight-e-il-riquadro-fastidioso/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;https://melabit.files.wordpress.com/2020/03/sony-kusuma-estri-rkxeborijlo-unsplash.jpg&#34; alt=&#34;&#34;&gt;&lt;br&gt;&#xA;&amp;ndash; &lt;em&gt;Fonte: &lt;a href=&#34;https://unsplash.com/@sonykusuma123&#34;&gt;sony kusuma estri&#xA;&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;Non so voi, ma a me ogni tanto succede che qualche scritta spuria rimanga come &lt;em&gt;appiccicata&lt;/em&gt; sullo schermo del Mac. Capita soprattutto con l&amp;rsquo;anteprima del nome completo di un file, il pop-up che compare spostando il mouse sul nome di un file senza fare click.&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;img src=&#34;https://melabit.files.wordpress.com/2020/03/filename-popup.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;In genere Il pop-up scompare appena si muove il mouse. Ma qualche volta, chissà perché, rimane come incollato sullo schermo sovrapponendosi alle altre finestre, e non c&amp;rsquo;è verso di farlo andare via. La strategia più efficace per rimuoverlo è quella di uscire e rientrare nell&amp;rsquo;account, che è una vera seccatura quando si hanno parecchie applicazioni aperte.&lt;/p&gt;&#xA;&lt;h4 id=&#34;un-riquadro-fastidioso&#34;&gt;Un riquadro fastidioso&lt;/h4&gt;&#xA;&lt;p&gt;Ieri ne è successa una nuova su un Mac con High Sierra. Questa volta, dopo aver usato Spotlight, è rimasto sullo schermo un riquadro molto sottile, quasi invisibile, ma proprio per questo ancora più fastidioso.&lt;/p&gt;&#xA;&lt;img src=&#34;https://melabit.files.wordpress.com/2020/03/window-frame.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;Le ho provate tutte. Ho cambiato lo sfondo. Ho cambiato la risoluzione dello schermo. Ho aperto Mission Control e ho rimosso il Desktop &lt;em&gt;incriminato&lt;/em&gt;. Niente, non c&amp;rsquo;era verso di far andare via quel dannato riquadro, e più provavo a toglierlo e più mi dava fastidio.&lt;/p&gt;&#xA;&lt;p&gt;Uscire e rientrare nell&amp;rsquo;account era fuori discussione, avevo troppe applicazioni aperte, terminali, sessioni &lt;code&gt;ssh&lt;/code&gt; remote. E anche se al login macOS riapre automaticamente tutte le applicazioni attive, ricostruire la disposizione esatta dei vari Desktop sarebbe stato un vero lavoraccio.&lt;/p&gt;&#xA;&lt;h4 id=&#34;quick-look-e-spotlight&#34;&gt;Quick Look e Spotlight&lt;/h4&gt;&#xA;&lt;p&gt;Dopo un po&amp;rsquo; di ricerche in rete ho scoperto che &lt;a href=&#34;https://developer.apple.com/design/human-interface-guidelines/macos/system-capabilities/search-and-spotlight/&#34;&gt;Spotlight&lt;/a&gt; su High Sierra ha dei problemi a causa di &lt;code&gt;QuickLookUIService&lt;/code&gt;, un processo che viene lanciato quando si usa &lt;a href=&#34;https://developer.apple.com/design/human-interface-guidelines/macos/system-capabilities/quick-look/&#34;&gt;Quick Look&lt;/a&gt;, la funzione di macOS che permette di vedere l&amp;rsquo;anteprima di parecchi tipi di file premendo semplicemente la barra spaziatrice.&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;Chissà, magari QuickLookUIService era responsabile anche del riquadro che continuavo a vedere sullo schermo?&lt;/p&gt;&#xA;&lt;p&gt;La cosa più semplice da fare era aprire Monitoraggio Attività, selezionare tutti i processi QuickLookUIService attivi e provare a chiuderli premendo il bottone con il simbolo della &lt;code&gt;X&lt;/code&gt; che si trova all&amp;rsquo;estremità sinistra della barra degli strumenti di Monitoraggio Attività.&lt;/p&gt;&#xA;&lt;img src=&#34;https://melabit.files.wordpress.com/2020/03/activity-monitor-quicklookui.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;Ha funzionato perfettamente. Appena chiusi tutti i processi &lt;code&gt;QuickLookUlService&lt;/code&gt;, anche il riquadro sottile che mi dava tanto fastidio è scomparso.&lt;/p&gt;&#xA;&lt;p&gt;A questo punto sarei molto curioso di verificare se questo metodo funziona anche con i pop-up dei nomi dei file. Ma ora che ho trovato un metodo per rimuoverli senza fatica, ci sarà di sicuro qualche corollario della legge di Murphy che impedirà ai nuovi pop-up di comparire per un po&#39;!&lt;/p&gt;&#xA;&lt;h4 id=&#34;per-chi-usa-il-terminale&#34;&gt;Per chi usa il Terminale&lt;/h4&gt;&#xA;&lt;p&gt;Ma non c&amp;rsquo;è solo l&amp;rsquo;interfaccia grafica, tutto quello che si può fare da Monitoraggio Attività può essere fatto (e meglio) anche dal Terminale di macOS. Chi preferisce usare il Terminale può cercare il processo (o i processi) &lt;em&gt;QuickLookUIService&lt;/em&gt; attivi con &lt;code&gt;grep&lt;/code&gt;,&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ ps axu | grep QuickLookUI&#xA;maggi&#x9;10149&#x9;0.0&#x9;0.2&#x9;4565600&#x9;32816&#x9;??&#x9;Ss&#x9;3:43PM&#x9;0:00.37&#x9;/System/Library/Frameworks/Quartz.framework/Versions/A/Frameworks/QuickLookUl.framework/Versions/A/XPCServices/QuickLookUlService.xpc/Contents/MacOS/QuickLookUlService&#xA;maggi&#x9;10725&#x9;0.0&#x9;0.0&#x9;4267768&#x9;840&#x9;  s006&#x9;S+&#x9;4:04PM&#x9;0:00.00&#x9;grep QuickLookUl&#xA;maggi&#x9;10673&#x9;0.0&#x9;0.2&#x9;4676576&#x9;40256&#x9;??&#x9;Ss&#x9;4:02PM&#x9;0:00.80&#x9;/System/Library/Frameworks/Quartz.framework/Versions/A/Frameworks/QuickLookUl.framework/Versions/A/XPCServices/QuickLookUlService.xpc/Contents/MacOS/QuickLookUlService&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;che stamperà una serie piuttosto criptica di informazioni relative ai processi che contengono nel nome o nel percorso la stringa cercata (fra cui anche il processo associato al comando &lt;code&gt;grep&lt;/code&gt; che abbiamo appena eseguito). Di queste ci interessa solo il &lt;code&gt;PID&lt;/code&gt;, il numero riportato nella seconda colonna della risposta subito dopo il &lt;code&gt;nome breve&lt;/code&gt; dell&amp;rsquo;utente del Mac (come si può vedere nell&amp;rsquo;immagine precedente, il PID è riportato anche nella penultima colonna di Monitoraggio Attività).&lt;/p&gt;&#xA;&lt;p&gt;Ora possiamo &lt;em&gt;uccidere&lt;/em&gt; il processo (o i processi) QuickLookUlService con il comando &lt;code&gt;kill -9&lt;/code&gt; seguito dal PID,&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ kill -9 10673&#xA;$ kill -9 10725&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;o anche scrivendo tutti i PID sulla stessa riga&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ kill -9 10673T10725:00&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;img src=&#34;https://melabit.files.wordpress.com/2020/03/terminal-quicklookui.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;In alternativa si può usare &lt;code&gt;killall&lt;/code&gt; seguito dal nome del processo da chiudere&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ killall QuickLookUlService&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Io preferisco usare &lt;code&gt;kill -9&lt;/code&gt; al posto di &lt;code&gt;killall&lt;/code&gt; perché quest&amp;rsquo;ultimo, anche se in teoria è più semplice da usare, a volte non funziona come ci si aspetta (e francamente non ho mail capito il perché).&lt;/p&gt;&#xA;&lt;p&gt;Per essere sicuri di aver &lt;em&gt;ucciso&lt;/em&gt; veramente tutti i processi &lt;code&gt;QuickLookUlService&lt;/code&gt; ci basta ripetere il comando &lt;code&gt;grep&lt;/code&gt;&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ ps axu | grep QuickLookUI&#xA;maggi&#x9;10734&#x9;0.0&#x9;0.0&#x9;4267768&#x9;840&#x9;  s006&#x9;S+&#x9;4:04PM&#x9;0:00.00&#x9;grep QuickLookUl&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;verificando che restituisca solo il processo associato a sé stesso (domanda per i più attenti: perché il PID cambia ogni volta che esegue &lt;code&gt;grep&lt;/code&gt;?).&lt;/p&gt;&#xA;&lt;p&gt;Ma appena usiamo di nuovo Spotlight o Quick Look il sistema operativo lancerà di nuovo uno o più processi &lt;code&gt;QuickLookUlService&lt;/code&gt;, come potremo verificare facilmente con Monitoraggio Attività o eseguendo di nuovo &lt;code&gt; ps axu | grep QuickLookUI&lt;/code&gt; nel Terminale.&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 tipica finezza Apple che all&amp;rsquo;inizio sembra superflua, ma dopo un po&amp;rsquo; ti accorgi di non poterne più fare a meno.&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;Spotlight e Quick Look sono strettamente connessi: i documenti trovati da Spotlight vengono visualizzati nella finestra di anteprima tramite Quick Look e non è certo un caso che Quick Look venga attivato dallo Spazio e Spotlight da ⌘-Spazio.&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>Come creare una chiavetta USB per installare macOS</title>
      <link>https://static.233.196.69.159.clients.your-server.de/it/2020/01/07/come-creare-una-chiavetta-usb-per-installare-macos/</link>
      <pubDate>Tue, 07 Jan 2020 06:00:00 +0000</pubDate>
      <guid>https://static.233.196.69.159.clients.your-server.de/it/2020/01/07/come-creare-una-chiavetta-usb-per-installare-macos/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;https://melabit.files.wordpress.com/2020/01/ferdinand-stohr-rza7zui8m5o-unsplash.jpg&#34; alt=&#34;&#34;&gt;&lt;br&gt;&#xA;&amp;ndash; &lt;em&gt;Fonte: &lt;a href=&#34;https://unsplash.com/@fellowferdi&#34;&gt;Ferdinand Stöhr&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;Nell&amp;rsquo;articolo precedente, &lt;a href=&#34;https://melabit.wordpress.com/2019/11/08/come-scaricare-le-versioni-meno-recenti-di-macos-un-anno-dopo/&#34;&gt;Come scaricare le versioni meno recenti di macOS: un anno dopo&lt;/a&gt;, abbiamo visto che da qualche mese Apple ha messo a disposizione delle versioni aggiornate dei programmi di installazione di macOS, da 10.10 Yosemite a 10.15 Catalina, utilizzando due diversi formati di file. Le versioni più recenti di macOS (High Sierra, Mojave e Catalina) sono disponibili solo come normali applicazioni per il Mac (formato &lt;code&gt;.app&lt;/code&gt;), quella più vecchia (Yosemite) si può scaricare solo in formato immagine (o &lt;code&gt;.dmg&lt;/code&gt;), mentre le due versioni intermedie sono disponibili sia come applicazioni che come immagini.&lt;/p&gt;&#xA;&lt;p&gt;Ma una volta finito di scaricare uno dei programmi di installazione di macOS disponibili, come si fa ad installarlo sul Mac?&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;Aggiornare macOS non è difficile, ma cosa dobbiamo fare se vogliamo partire da zero? È sufficiente aprire il Terminale e seguire &lt;a href=&#34;https://support.apple.com/it-it/HT201372&#34;&gt;queste istruzioni&lt;/a&gt; per creare una chiavetta USB avviabile da cui eseguire una installazione &lt;em&gt;pulita&lt;/em&gt; di macOS. Ma prima di farlo è meglio chiarire la differenza fra i due tipi di programmi di installazione di macOS messi a disposizione da Apple.&lt;/p&gt;&#xA;&lt;h4 id=&#34;due-formati-convergenti&#34;&gt;Due formati convergenti&lt;/h4&gt;&#xA;&lt;p&gt;I programmi di installazione disponibili come normali &lt;strong&gt;applicazioni per il Mac&lt;/strong&gt; vengono scaricati nella cartella &lt;code&gt;Applicazioni&lt;/code&gt; e si aprono automaticamente; con questi è possibile aggiornare in pochi minuti la versione di macOS installata sul Mac seguendo le semplici istruzioni che compaiono sullo schermo. Se invece vogliamo effettuare una nuova installazione di macOS, dobbiamo chiudere il programma (dal menu o con la combinazione di tasti ⌘-Q) ed eseguire un semplice comando di Terminale che trasferisce il programma di installazione presente in &lt;code&gt;Applicazioni&lt;/code&gt; su una chiavetta USB, da cui avviare il Mac ed eseguire l&amp;rsquo;installazione di macOS.&lt;/p&gt;&#xA;&lt;p&gt;Di contro, questo tipo di programmi di installazione richiedono il collegamento all&amp;rsquo;App Store e possono essere scaricati solo &lt;a href=&#34;https://melabit.wordpress.com/2019/11/08/come-scaricare-le-versioni-meno-recenti-di-macos-un-anno-dopo/&#34;&gt;da chi lo ha già fatto in passato&lt;/a&gt;, quando erano disponibili sull’App Store, utilizzando &lt;a href=&#34;https://melabit.wordpress.com/2019/11/08/come-scaricare-le-versioni-meno-recenti-di-macos-un-anno-dopo/&#34;&gt;un Mac compatibile&lt;/a&gt; con la versione di macOS desiderata (fa eccezione Catalina, la versione più recente di macOS, che è scaricabile liberamente dall&amp;rsquo;App Store da chiunque sia in possesso di un Mac compatibile).&lt;/p&gt;&#xA;&lt;p&gt;I programmi di installazione in &lt;strong&gt;formato immagine&lt;/strong&gt;, invece, possono essere scaricati liberamente dal sito di Apple senza passare dall&amp;rsquo;App Store, indipendentemente dal fatto che possano girare o no sul Mac usato per scaricarli. Una volta completato lo scaricamento, basta fare doppio click sul file &lt;code&gt;.dmg&lt;/code&gt; per &lt;em&gt;montare&lt;/em&gt; il file immagine sul Desktop del Mac e aprire una cartella contenente un tipico pacchetto (&lt;em&gt;package&lt;/em&gt;) di installazione di macOS (l&amp;rsquo;analogo per il Mac dei ben più noti pacchetti di installazione per Windows o per Linux). Nella figura qui sotto è mostrato quello relativo a El Capitan, che  utilizza ancora la vecchia denominazione &amp;ldquo;Mac OS X&amp;rdquo;,&lt;/p&gt;&#xA;&lt;img src=&#34;https://melabit.files.wordpress.com/2020/01/install-macosx-el-capitan.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;questo invece è relativo a Sierra.&lt;/p&gt;&#xA;&lt;img src=&#34;https://melabit.files.wordpress.com/2020/01/install-macos-sierra.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;Un doppio click sul file &lt;code&gt;.pkg&lt;/code&gt; fa partire l&amp;rsquo;installatore vero e proprio, che verifica che il programma in questione possa essere eseguito sul Mac,&lt;/p&gt;&#xA;&lt;img src=&#34;https://melabit.files.wordpress.com/2020/01/install-macosx-check.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;e poi esegue la procedura di installazione standard di un &lt;em&gt;package&lt;/em&gt; per macOS,&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://melabit.files.wordpress.com/2020/01/install-macosx-location.png&#34; alt=&#34;&#34;&gt;&#xA;&lt;img src=&#34;https://melabit.files.wordpress.com/2020/01/install-macosx-package-installation.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;alla fine della quale troveremo in &lt;code&gt;Applicazioni&lt;/code&gt; il programma vero e proprio di installazione di macOS, nella forma di una normale applicazione per il Mac, proprio come nel caso precedente.&lt;/p&gt;&#xA;&lt;img src=&#34;https://melabit.files.wordpress.com/2020/01/install-macosx-application.png&#34; alt=&#34;&#34;&gt;&lt;h4 id=&#34;aggiornare-o-partire-da-zero&#34;&gt;Aggiornare o partire da zero?&lt;/h4&gt;&#xA;&lt;p&gt;In definitiva, qualunque sia il formato che decidiamo di scaricare, alla fine ritroveremo sempre in &lt;code&gt;Applicazioni&lt;/code&gt; una applicazione per il Mac contenente il programma di installazione di macOS, e sarà questa che utilizzeremo per i passi successivi.&lt;/p&gt;&#xA;&lt;p&gt;Se non si è già aperto automaticamente, possiamo fare doppio click sul programma di installazione presente in &lt;code&gt;Applicazioni&lt;/code&gt; per aggiornare macOS alla versione desiderata, senza toccare le applicazioni e i documenti già presenti sul Mac.&lt;/p&gt;&#xA;&lt;p&gt;Ma ci sono casi in cui si vuole ripartire da zero, ad esempio perché si è cambiato il disco di avvio del Mac, perché si è acquistato un Mac usato o perché, al contrario, si desidera vendere il Mac cancellando tutti i nostri dati e programmi dal sistema ma fornendo all&amp;rsquo;acquirente un computer con il sistema operativo preinstallato, utilizzabile sin dal primo momento. Oppure semplicemente perché abbiamo fatto dei pasticci e vogliamo ripartire da un sistema &lt;em&gt;pulito&lt;/em&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Qualunque sia la ragione, per installare macOS da zero abbiamo davanti due alternative: la prima prevede di &lt;a href=&#34;https://melabit.wordpress.com/2019/08/01/come-utilizzare-macos-recovery-per-reinstallare-il-sistema-operativo-del-mac/&#34;&gt;utilizzare macOS Recovery&lt;/a&gt; per installare l&amp;rsquo;ultima versione di macOS compatibile con il nostro modello di Mac, scaricandola eventualmente dalla rete.&lt;/p&gt;&#xA;&lt;p&gt;L&amp;rsquo;altra alternativa richiede invece l&amp;rsquo;utilizzo di una chiavetta USB avviabile, sulla quale trasferire il programma di installazione di macOS scaricato. Una volta avviato il Mac dalla chiavetta USB si potrà installare macOS sul disco interno del Mac o eventualmente su un disco esterno collegato ad una porta USB3, Thunderbird o, per chi ce l&amp;rsquo;ha ancora, FireWire.&lt;/p&gt;&#xA;&lt;h4 id=&#34;creare-una-chiavetta-usb-avviabile&#34;&gt;Creare una chiavetta USB avviabile&lt;/h4&gt;&#xA;&lt;p&gt;Utilizzare una chiavetta USB è molto più flessibile, perché a differenza di macOS Recovery ci permette di installare qualunque versione di macOS compatibile con il modello di Mac che stiamo utilizzando, senza nemmeno dover accedere alla rete o inserire i nostri dati personali per scaricare macOS. Avviare il Mac dalla chiavetta USB permette anche di cancellare preventivamente il disco rigido di avvio, partendo quindi da un sistema &lt;em&gt;pulito&lt;/em&gt;. Altro aspetto a volte non trascurabile è che possiamo ripetere rapidamente l&amp;rsquo;intero processo di installazione su più Mac, senza dover attendere ogni volta lo scaricamento del programma di installazione.&lt;/p&gt;&#xA;&lt;p&gt;Questa flessibilità ha un piccolo costo, perché richiede l&amp;rsquo;utilizzo del Terminale, ma basta seguire le istruzioni seguenti con un minimo di attenzione per non avere problemi.&lt;/p&gt;&#xA;&lt;p&gt;Serve una chiavetta USB da almeno 8 GB (da almeno 16 GB per Catalina), &lt;strong&gt;vuota o contenente dei file che non servono più&lt;/strong&gt;, perché nei passi successivi sarà cancellata completamente, senza troppe possibilità di recupero dei dati pre-esistenti. Per cui &lt;strong&gt;fate attenzione!&lt;/strong&gt;, perché potreste perdere dei dati importanti.&lt;/p&gt;&#xA;&lt;p&gt;Bisogna rinominare la chiavetta USB in modo che abbia un nome standard, che verrà usato in tutte le istruzioni successive. Il nome in sé non è importante, tanto sarà modificato nel corso del trasferimento del programma di installazione di macOS sulla chiavetta, ma usarne uno standard semplifica la scrittura dei comandi da Terminale. Per cui chiamiamola &amp;ldquo;InstallazioneUSB&amp;rdquo;, senza spazi, e non pensiamoci più.&lt;/p&gt;&#xA;&lt;p&gt;La chiavetta USB deve essere formattata in formato &lt;code&gt;Mac OS esteso&lt;/code&gt; con &lt;code&gt;Mappa partizione GUID&lt;/code&gt;, se non siamo sicuri che sia già nel formato giusto lanciamo Utility Disco (si trova in &lt;code&gt;Applicazioni &amp;amp;#8594; Utility&lt;/code&gt;) e selezioniamo le stesse opzioni mostrate nella figura qui sotto. Anche il nome da dare alla chiavetta può essere inserito in questo momento.&lt;/p&gt;&#xA;&lt;p&gt;Ogni volta che si usa Utility Disco, &lt;strong&gt;bisogna stare molto attenti a non formattare per sbaglio un altro disco collegato al Mac&lt;/strong&gt;, ma basta guardare la dimensione del disco da formattare, ben visibile in un riquadro in alto a destra della finestra di Utility Disco, per non sbagliare.&lt;/p&gt;&#xA;&lt;img src=&#34;https://melabit.files.wordpress.com/2020/01/format-usb-stick.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;A questo punto si può lanciare il &lt;code&gt;Terminale&lt;/code&gt; di macOS (anche questo si trova in &lt;code&gt;Applicazioni &amp;amp;#8594; Utility&lt;/code&gt;) ed eseguire &lt;code&gt;createinstallmedia&lt;/code&gt;, un programma &lt;em&gt;nascosto&lt;/em&gt; da Apple in tutte le versioni gratuite dei programmi di installazione di macOS distribuite tramite l&amp;rsquo;App Store, che permette di trasferire sulla chiavetta USB i file di installazione di macOS. Le opzioni necessarie per il corretto funzionamento di &lt;code&gt;createinstallmedia&lt;/code&gt; variano leggermente a seconda della versione di macOS e qui sotto è riportato il comando completo da utilizzare per ciascuna versione di macOS che è possibile trasferire sulla chiavetta.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Catalina&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ sudo /Applications/Install\ macOS\ Catalina.app/Contents/Resources/createinstallmedia --volume /Volumes/InstallazioneUSB &amp;amp;#38;&amp;amp;#38; osascript -e &#39;display notification &amp;quot;Trasferimento completato.&amp;quot; with title &amp;quot;Terminale&amp;quot;&#39;&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;&lt;strong&gt;Mojave&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ sudo /Applications/Install\ macOS\ Mojave.app/Contents/Resources/createinstallmedia --volume /Volumes/InstallazioneUSB &amp;amp;#38;&amp;amp;#38; osascript -e &#39;display notification &amp;quot;Trasferimento completato.&amp;quot; with title &amp;quot;Terminale&amp;quot;&#39;&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;&lt;strong&gt;High Sierra&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ sudo /Applications/Install\ macOS\ High\ Sierra.app/Contents/Resources/createinstallmedia --volume /Volumes/InstallazioneUSB &amp;amp;#38;&amp;amp;#38; osascript -e &#39;display notification &amp;quot;Trasferimento completato.&amp;quot; with title &amp;quot;Terminale&amp;quot;&#39;&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;&lt;strong&gt;Sierra&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ sudo /Applications/Install\ macOS\ Sierra.app/Contents/Resources/createinstallmedia --volume /Volumes/InstallazioneUSB --applicationpath /Applications/Install\ macOS\ Sierra.app &amp;amp;#38;&amp;amp;#38; osascript -e &#39;display notification &amp;quot;Trasferimento completato.&amp;quot; with title &amp;quot;Terminale&amp;quot;&#39;&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;&lt;strong&gt;El Capitan&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ sudo /Applications/Install\ OS\ X\ El\ Capitan.app/Contents/Resources/createinstallmedia --volume /Volumes/InstallazioneUSB --applicationpath /Applications/Install\ OS\ X\ El\ Capitan.app &amp;amp;#38;&amp;amp;#38; osascript -e &#39;display notification &amp;quot;Trasferimento completato.&amp;quot; with title &amp;quot;Terminale&amp;quot;&#39;&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;&lt;strong&gt;Yosemite&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ sudo /Applications/Install\ OS\ X\ Yosemite.app/Contents/Resources/createinstallmedia --volume /Volumes/InstallazioneUSB --applicationpath /Applications/Install\ OS\ X\ Yosemite.app --nointeraction &amp;amp;#38;&amp;amp;#38; osascript -e &#39;display notification &amp;quot;Trasferimento completato.&amp;quot; with title &amp;quot;Terminale&amp;quot;&#39;&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Anche &lt;strong&gt;Mavericks&lt;/strong&gt; può essere trasferito su una chiavetta USB con lo stesso metodo, sempre ammesso che si riesca a trovare da qualche parte il programma di installazione di questa versione del sistema operativo desktop di Apple.&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ sudo /Applications/Install\ OS\ X\ Mavericks.app/Contents/Resources/createinstallmedia --volume /Volumes/InstallazioneUSB --applicationpath /Applications/Install\ OS\ X\ Mavericks.app --nointeraction &amp;amp;#38;&amp;amp;#38; osascript -e &#39;display notification &amp;quot;Trasferimento completato.&amp;quot; with title &amp;quot;Terminale&amp;quot;&#39;&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Come sempre il simbolo &lt;code&gt;$&lt;/code&gt; indica il &lt;a href=&#34;https://melabit.wordpress.com/le-parole-per-dirlo/&#34;&gt;prompt del Terminale&lt;/a&gt; di macOS e non fa parte del comando.&lt;/p&gt;&#xA;&lt;p&gt;I comandi elencati vanno eseguiti da un account di tipo &lt;code&gt;Amministratore&lt;/code&gt;; se siete l&amp;rsquo;unico utente del Mac siete automaticamente un amministratore del sistema, altrimenti dovete fare login in un account di questo tipo e riprovare oppure dovete chiedere all&amp;rsquo;amministratore del vostro Mac di eseguirlo per voi. Subito dopo aver premuto &lt;code&gt;Invio&lt;/code&gt; vi verrà chiesta la password di login del vostro account, seguita da una richiesta di conferma dell&amp;rsquo;operazione di trasferimento del programma di installazione di macOS sulla chiavetta USB.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://melabit.files.wordpress.com/2020/01/transfer-macos-start.png&#34;&gt;&lt;img src=&#34;https://melabit.files.wordpress.com/2020/01/transfer-macos-start.png&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Il trasferimento del programma di installazione di macOS sulla chiavetta USB dura parecchio, almeno cinque minuti e spesso molto di più, a seconda della velocità di scrittura della chiavetta USB. Nel frattempo potete tranquillamente fare altro: una volta concluso positivamente il processo di trasferimento, il Mac provvederà a notificarcelo direttamente sul Desktop e farà anche ricomparire il prompt del Terminale.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://melabit.files.wordpress.com/2020/01/transfer-macos-end.png&#34;&gt;&lt;img src=&#34;https://melabit.files.wordpress.com/2020/01/transfer-macos-end.png&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Chi preferisce un avviso sonoro può sostituire la seconda parte del comando, da &lt;code&gt;osascript -e ...&lt;/code&gt; fino alla fine della linea, con &lt;code&gt;say &amp;quot;Trasferimento completato&amp;quot;&lt;/code&gt;. Assicuratevi di aver installato il supporto per le voci in italiano (tramite &lt;code&gt;Preferenze di Sistema &amp;amp;#8594; Accessibilità &amp;amp;#8594; Voce&lt;/code&gt; oppure &lt;code&gt;Preferenze di Sistema &amp;amp;#8594; Dettatura e voce &amp;amp;#8594; Testo da pronunciare&lt;/code&gt;, a seconda della versione di macOS presente sul Mac) altrimenti vi sembrerà di sentire &lt;a href=&#34;https://it.wikipedia.org/wiki/Stanlio_e_Ollio&#34;&gt;Ollio&lt;/a&gt;, ma in ogni caso un avviso sonoro sembra qui più efficace di una notifica.&lt;/p&gt;&#xA;&lt;h4 id=&#34;per-chi-vuole-uno-strumento-grafico&#34;&gt;Per chi vuole uno strumento grafico&lt;/h4&gt;&#xA;&lt;p&gt;Il Terminale è un strumento potentissimo, ma tanti utenti del Mac vengono messi a disagio dalla sua interfaccia spartana a linea di comando, e hanno quasi paura di usarlo temendo di fare danni. In questo caso specifico è molto difficile, se si seguono attentamente le istruzioni è impossibile sbagliare. Ma visto che ci sono due buoni strumenti che permettono di trasferire un programma di installazione di macOS su una chiavetta USB tramite una interfaccia grafica, perché non segnalarli?&lt;/p&gt;&#xA;&lt;p&gt;Tanto è facile, sono solo due, &lt;a href=&#34;https://macdaddy.io/install-disk-creator/&#34;&gt;Install Disk Creator&lt;/a&gt; e &lt;a href=&#34;https://diskmakerx.com/&#34;&gt;DiskMaker X&lt;/a&gt;, entrambe gratuiti (la versione Pro di DiskMaker X serve solo a chi deve installare macOS su un gran numero di Mac diversi o si occupa di supporto tecnico). Ammetto di non averli mai usate perché con il Terminale faccio prima, ma sono entrambi degli strumenti noti e notoriamente affidabili, chi decidesse di usarli non avrà problemi. E nel caso, c&amp;rsquo;è sempre il Terminale&amp;hellip;&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;Per semplicità nel testo dell’articolo userò sempre il termine &amp;ldquo;macOS&amp;rdquo; anche per indicare le versioni che in origine si chiamavano OS X.&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>Buon Natale dal Terminale</title>
      <link>https://static.233.196.69.159.clients.your-server.de/it/2019/12/25/buon-natale-dal-terminale/</link>
      <pubDate>Wed, 25 Dec 2019 00:00:00 +0000</pubDate>
      <guid>https://static.233.196.69.159.clients.your-server.de/it/2019/12/25/buon-natale-dal-terminale/</guid>
      <description>&lt;p&gt;C&amp;rsquo;è gente che con il Terminale sarebbe in grado di far volare un Boeing. Oppure che sa costruire un &lt;a href=&#34;https://github.com/sergiolepore/ChristBASHTree&#34;&gt;alberello di Natale pieno di lucine colorate&lt;/a&gt;, come questo.&lt;/p&gt;&#xA;&lt;img src=&#34;https://melabit.files.wordpress.com/2019/12/buon-natale-2019.gif&#34; alt=&#34;&#34;&gt;&lt;p&gt;Se lo volete anche voi, vi basta aprire il Terminale ed eseguire&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ curl https://raw.githubusercontent.com/sergiolepore/ChristBASHTree/master/tree-EN.sh | bash&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;oppure, se preferite la versione tradotta in italiano,&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ curl https://raw.githubusercontent.com/sabinomaggi/ChristBASHTree/master/tree-IT.sh | bash&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;(come sempre il &lt;code&gt;$&lt;/code&gt; rappresenta il prompt del terminale e non fa parte del comando).&lt;/p&gt;&#xA;&lt;p style=&#34;text-align:center; color:#1abc9c; font-size:250%; font-family:cursive;&#34;&gt;Buon Natale!!!&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>Come cambiare la data in macOS</title>
      <link>https://static.233.196.69.159.clients.your-server.de/it/2019/12/18/come-cambiare-la-data-in-macos/</link>
      <pubDate>Wed, 18 Dec 2019 06:00:00 +0000</pubDate>
      <guid>https://static.233.196.69.159.clients.your-server.de/it/2019/12/18/come-cambiare-la-data-in-macos/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;https://melabit.files.wordpress.com/2019/12/d838r_d838l_d838b_d838w_d838g_grande.jpg&#34; alt=&#34;&#34;&gt;&lt;br&gt;&#xA;&amp;ndash; &lt;em&gt;Fonte: &lt;a href=&#34;https://www.justhourglasses.com&#34;&gt;JustHourglasses&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;&amp;ldquo;Ma stai scherzando? Perché ci vuoi propinare uno dei tuoi soliti lunghissimi articoli solo per insegnarci a cambiare la data in macOS? Non lo sai che basta essere collegati ad internet e il Mac fa tutto da solo?&amp;rdquo;&lt;/em&gt;&lt;/p&gt;&#xA;&lt;h4 id=&#34;data-e-ora-in-macos&#34;&gt;Data e ora in macOS&lt;/h4&gt;&#xA;&lt;p&gt;Avete ragione, macOS (così come qualunque sistema operativo moderno) è perfettamente in grado di gestire da solo la data e l&amp;rsquo;ora. Gli basta collegarsi ai server Apple sui quali gira il &lt;a href=&#34;http://www.ntp.org/&#34;&gt;servizio NTP (Network Time Protocol)&lt;/a&gt; per sincronizzare l&amp;rsquo;orologio interno del Mac con l&amp;rsquo;ora &lt;em&gt;ufficiale&lt;/em&gt; di uno degli orologi atomici sparsi nel mondo.&lt;/p&gt;&#xA;&lt;p&gt;Però ci sono &lt;strong&gt;almeno due casi&lt;/strong&gt; in cui dobbiamo impostare data (e ora) a mano.&lt;/p&gt;&#xA;&lt;p&gt;Il primo si verifica quando vogliamo aggiornare o installare &lt;em&gt;ex-novo&lt;/em&gt; macOS utilizzando un &lt;a href=&#34;https://melabit.wordpress.com/2019/11/08/come-scaricare-le-versioni-meno-recenti-di-macos-un-anno-dopo/&#34;&gt;programma di installazione scaricato prima della data fatidica del 24 ottobre di quest&amp;rsquo;anno&lt;/a&gt;, data nella quale Apple ha aggiornato la firma digitale di tutte le versioni di mac OS distribuite attraverso l&amp;rsquo;App Store (cioè da Lion in poi).&lt;/p&gt;&#xA;&lt;p&gt;Il secondo caso si presenta quando la batteria montata sulla scheda madre del Mac invecchia e non riesce più a conservare le impostazioni del sistema, fra cui proprio la data e l&amp;rsquo;ora. Non potendo più contare sulla batteria interna, ad ogni riavvio la data del Mac si resetta al primo gennaio del 1970, al 2000 o a qualche altro giorno ormai lontano nel tempo.&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; Se proviamo ad aggiornare o ad installare macOS senza aver prima corretto la data, il Mac si può rifiutare categoricamente di procedere, con dei messaggi di errore così criptici da essere praticamente inutili, come questo di El Capitan,&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://melabit.files.wordpress.com/2019/12/el-capitan-wrong-date-it.png&#34;&gt;&lt;img src=&#34;https://melabit.files.wordpress.com/2019/12/el-capitan-wrong-date-it.png&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;o quest&amp;rsquo;altro di Sierra.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://melabit.files.wordpress.com/2019/12/sierra-wrong-date-it.png&#34;&gt;&lt;img src=&#34;https://melabit.files.wordpress.com/2019/12/sierra-wrong-date-it.png&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;Le schermate di sopra sono state ottenute provando a installare macOS in &lt;a href=&#34;https://www.parallels.com/it/&#34;&gt;Parallels&lt;/a&gt;. Con High Sierra e Mojave la data sbagliata non impedisce di completare il processo di installazione, ma non so dire se è una correzione inserita volutamente da Apple in queste versioni più recenti di macOS oppure è un effetto dell&amp;rsquo;emulatore.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;Per impostare a mano la data possiamo usare due procedure diverse: una usa l&amp;rsquo;interfaccia grafica del Mac, l&amp;rsquo;altra ha bisogno del Terminale. Possiamo utilizzare la prima se abbiamo già macOS funzionante e vogliamo solo aggiornarlo, l&amp;rsquo;altra invece è necessaria quando dobbiamo installare macOS da zero, ad esempio perché macOS non riesce ad avviarsi (rarissimo, ma può succedere) o perché abbiamo cambiato il disco rigido del Mac.&lt;/p&gt;&#xA;&lt;h4 id=&#34;quando-macos-è-già-installato&#34;&gt;Quando macOS è già installato&lt;/h4&gt;&#xA;&lt;p&gt;Se macOS è già installato sul Mac e vogliamo aggiornarlo utilizzando un &lt;a href=&#34;https://melabit.wordpress.com/2019/11/08/come-scaricare-le-versioni-meno-recenti-di-macos-un-anno-dopo/&#34;&gt;programma di installazione scaricato prima del 24 ottobre&lt;/a&gt; &amp;ndash; perché siamo pigri e non vogliamo scaricare di nuovo il programma di installazione di macOS oppure perché non troviamo più sull&amp;rsquo;App Store la versione di macOS che ci interessa &amp;ndash; possiamo continuare a farlo con un trucco semplicissimo, che risale quasi alla notte dei tempi (informatici). Basta cambiare la data del Mac facendo in modo che sia precedente al 24 ottobre. Una volta concluso il processo di installazione potremo ripristinare senza problemi la data reale.&lt;/p&gt;&#xA;&lt;p&gt;Un altro scenario possibile si presenta quando la batteria montata sulla scheda madre non riesce a conservare le impostazioni di data ed ora. In questo caso, per motivi che mi sfuggono, i server NTP non riescono a reimpostare automaticamente la data e l&amp;rsquo;ora corretta e bisogna per forza di cose fare a mano.&lt;/p&gt;&#xA;&lt;p&gt;Qualunque sia la ragione, cambiare a mano la data del Mac dall&amp;rsquo;interfaccia grafica è facilissimo, come si vede nelle schermate seguenti.&lt;/p&gt;&#xA;&lt;p&gt;Bisogna aprire le &lt;code&gt;Preferenze di Sistema&lt;/code&gt; e fare doppio click sulle impostazioni di &lt;code&gt;Data e Ora&lt;/code&gt;,&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://melabit.files.wordpress.com/2019/12/preferenze-di-sistema.png&#34; alt=&#34;&#34;&gt;&#xA;&lt;img src=&#34;https://melabit.files.wordpress.com/2019/12/data-e-ora.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;cliccare sull&amp;rsquo;icona del lucchetto per abilitare le modifiche e inserire nome utente e password (e no, le mie password non sono solo di quattro caratteri!),&lt;/p&gt;&#xA;&lt;img src=&#34;https://melabit.files.wordpress.com/2019/12/autenticazione-modifiche.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;deselezionare l&amp;rsquo;opzione che imposta automaticamente la data e l&amp;rsquo;ora e inserire nei campi sottostanti la data e l&amp;rsquo;ora desiderata, premendo il tasto &lt;code&gt;Salva&lt;/code&gt; per confermare le modifiche,&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://melabit.files.wordpress.com/2019/12/impostazione-automatica.png&#34; alt=&#34;&#34;&gt;&#xA;&lt;img src=&#34;https://melabit.files.wordpress.com/2019/12/impostazione-manuale.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;e infine selezionare di nuovo l&amp;rsquo;opzione che imposta automaticamente la data e l&amp;rsquo;ora.&lt;/p&gt;&#xA;&lt;img src=&#34;https://melabit.files.wordpress.com/2019/12/impostazione-automatica-fine.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;Se volete fare i fini potete anche impostare, al posto dei server NTP gestiti da Apple, uno dei &lt;a href=&#34;https://www.inrim.it/node/643&#34;&gt;server NTP ufficiali del nostro paese&lt;/a&gt;, &lt;code&gt;ntp1.inrim.it&lt;/code&gt;, &lt;code&gt;ntp2.inrim.it&lt;/code&gt;, &lt;code&gt;time.inrim.it&lt;/code&gt;, premendo poi il tasto &lt;code&gt;Invio&lt;/code&gt; per confermare la nuova impostazione,&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://melabit.files.wordpress.com/2019/12/impostazione-ntp.png&#34; alt=&#34;&#34;&gt;&#xA;&lt;img src=&#34;https://melabit.files.wordpress.com/2019/12/impostazione-ntp-fine.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;e cliccando poi sull&amp;rsquo;icona del lucchetto per disabilitare ulteriori modifiche.&lt;/p&gt;&#xA;&lt;img src=&#34;https://melabit.files.wordpress.com/2019/12/modifiche-disabilitate.png&#34; alt=&#34;&#34;&gt;&lt;h4 id=&#34;quando-dobbiamo-partire-da-zero&#34;&gt;Quando dobbiamo partire da zero&lt;/h4&gt;&#xA;&lt;p&gt;Tutti i PC permettono di modificare la data e l&amp;rsquo;ora del sistema tramite il BIOS, senza aver bisogno di avviare il sistema operativo (i PC moderni, e anche il Mac, ormai usano l&amp;rsquo;EFI, &lt;em&gt;Extensible Firmware Interface&lt;/em&gt;, ma il termine BIOS è rimasto scolpito nella memoria).&lt;/p&gt;&#xA;&lt;p&gt;Anche i Mac con processore PowerPC potevano modificare data ed ora tramite l&amp;rsquo;&lt;a href=&#34;https://hints.macworld.com/article.php?story=20060814075952448&#34;&gt;Open Firmware&lt;/a&gt;, una specie di BIOS potenziato sviluppato da Sun e utilizzato da Apple per tutti i suoi Mac prima del passaggio ai processori Intel.&lt;/p&gt;&#xA;&lt;p&gt;Sui Mac moderni, invece, l&amp;rsquo;unica possibilità per impostare a mano la data e l&amp;rsquo;ora senza utilizzare il sistema operativo è tramite la funzione di &lt;a href=&#34;https://melabit.wordpress.com/2019/08/01/come-utilizzare-macos-recovery-per-reinstallare-il-sistema-operativo-del-mac/&#34;&gt;macOS Recovery&lt;/a&gt;, che normalmente viene richiamata premendo i tasti CMD (⌘) ed R all&amp;rsquo;avvio del Mac. Se sul disco rigido è già presente una partizione dedicata a macOS Recovery (normalmente invisibile ai normali strumenti di gestione dei file), l’utility verrà caricata da questa partizione, altrimenti il Mac provvederà a scaricare macOS Recovery da Internet e ad installarla sul disco di avvio del Mac.&lt;/p&gt;&#xA;&lt;p&gt;Un&amp;rsquo;altra possibilità per accedere a macOS Recovery è quella di utilizzare una chiavetta USB avviabile che contiene un programma di installazione di macOS.&lt;/p&gt;&#xA;&lt;p&gt;In tutti i casi, una volta avviato macOS Recovery e selezionata la lingua dell&amp;rsquo;interfaccia,&lt;/p&gt;&#xA;&lt;img src=&#34;https://melabit.files.wordpress.com/2019/12/selezione-lingua.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;comparirà la schermata principale dell&amp;rsquo;utility di ripristino di macOS.&lt;/p&gt;&#xA;&lt;img src=&#34;https://melabit.files.wordpress.com/2019/12/macos-recovery.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;A questo punto bisogna selezionare il Terminale dal menu Utility,&lt;/p&gt;&#xA;&lt;img src=&#34;https://melabit.files.wordpress.com/2019/12/menu-utility.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;e aspettare qualche secondo che compaia il Terminale al posto dell&amp;rsquo;interfaccia principale di macOS Recovery (si noti che, anche se abbiamo impostato l&amp;rsquo;italiano come lingua del sistema, il Terminale &lt;em&gt;parla&lt;/em&gt; sempre e solo in inglese).&lt;/p&gt;&#xA;&lt;img src=&#34;https://melabit.files.wordpress.com/2019/12/terminale-macos-recovery.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;Per impostare la data e l&amp;rsquo;ora bisogna utilizzare il comando &lt;code&gt;date&lt;/code&gt; seguito dalla data e dall&amp;rsquo;ora in un formato piuttosto astruso, &lt;code&gt;MMDDhhmmYYYY&lt;/code&gt;, dove &lt;code&gt;MM&lt;/code&gt; indica il mese (scritto sempre con due cifre, premettendo eventualmente lo zero), &lt;code&gt;DD&lt;/code&gt; il giorno (sempre con due cifre), &lt;code&gt;hh&lt;/code&gt; e &lt;code&gt;mm&lt;/code&gt; l&amp;rsquo;ora e il minuto da impostare (c&amp;rsquo;è bisogno di dire che anche questi vanno scritti sempre con due cifre?) e infine &lt;code&gt;YYYY&lt;/code&gt; indica l&amp;rsquo;anno. Qui sotto, ad esempio, ho impostato il mese di dicembre (&lt;code&gt;12&lt;/code&gt;), il giorno &lt;code&gt;11&lt;/code&gt;, le ore &lt;code&gt;18&lt;/code&gt; e &lt;code&gt;10&lt;/code&gt; minuti e l&amp;rsquo;anno corrente (&lt;code&gt;2019&lt;/code&gt;).&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://melabit.files.wordpress.com/2019/12/impostazione-data.png&#34;&gt;&lt;img src=&#34;https://melabit.files.wordpress.com/2019/12/impostazione-data.png&#34; alt=&#34;&#34;&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Se invece vogliamo impostare la data e l&amp;rsquo;ora del nostro Mac alle nove e trentacinque del mattino del quindici luglio 2018, dovremo scrivere nel Terminale&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;date 071509352018&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Una volta impostata la data possiamo chiudere il Terminale e ritornare alla schermata principale di macOS Recovery, per proseguire l&amp;rsquo;installazione di macOS oppure riavviare il Mac senza installare nulla.&lt;/p&gt;&#xA;&lt;h4 id=&#34;conclusioni&#34;&gt;Conclusioni&lt;/h4&gt;&#xA;&lt;p&gt;Scrivere questo articolo è stato piuttosto noioso e questo fatto, insieme a svariati impegni lavorativi e familiari, ha contribuito ad allungare a dismisura i tempi di pubblicazione.&lt;/p&gt;&#xA;&lt;p&gt;Ma anche se l&amp;rsquo;argomento trattato non è dei più interessanti, ho voluto pubblicarlo lo stesso perché la prima volta che non sono riuscito ad installare macOS a causa della data &lt;em&gt;sbagliata&lt;/em&gt; ho dovuto faticare parecchio per capire cosa stesse succedendo. Se risparmierò questa fatica a qualche lettore del blog ne sarà valsa la pena.&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;Il 1 gennaio 1970 è la &lt;a href=&#34;https://ask.metafilter.com/5202/Why-does-the-clock-on-my-Macintosh-reset-to-1969&#34;&gt;data in cui è iniziato il tempo&lt;/a&gt;, almeno secondo UNIX.&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: 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>Script per tutti i giorni: semplici modifiche alle stringhe di testo</title>
      <link>https://static.233.196.69.159.clients.your-server.de/it/2018/11/23/script-per-tutti-i-giorni-semplici-modifiche-alle-stringhe-di-testo/</link>
      <pubDate>Fri, 23 Nov 2018 18:00:00 +0000</pubDate>
      <guid>https://static.233.196.69.159.clients.your-server.de/it/2018/11/23/script-per-tutti-i-giorni-semplici-modifiche-alle-stringhe-di-testo/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;https://farm3.staticflickr.com/2472/3797070188_ece79b25b3_b.jpg&#34; alt=&#34;&#34;&gt;&#xA;&amp;ndash; Foto: &lt;a href=&#34;https://www.flickr.com/photos/telwink/&#34;&gt;telwink&lt;/a&gt; su Flickr.&lt;/p&gt;&#xA;&lt;p&gt;Succede più spesso di quanto mi renda conto. Devo rinominare dei file, modificare un testo o fare altri pasticci con i miei documenti. Potrei usare una delle tante applicazioni &lt;em&gt;ad hoc&lt;/em&gt; fatte per fare &lt;em&gt;proprio quello&lt;/em&gt;. Ma perché perdere tempo ad installare ed imparare ad usare l&amp;rsquo;ennesima applicazione se con il Terminale posso fare prima (e meglio)?&lt;/p&gt;&#xA;&lt;p&gt;Basta qualche comando ben piazzato nel Terminale, a volte qualche piccolo script in &lt;code&gt;bash&lt;/code&gt; o in &lt;code&gt;python&lt;/code&gt;, e si possono fare cose bellissime con poco sforzo.&lt;/p&gt;&#xA;&lt;p&gt;E una volta fatte, perché tenerli per se e non condividerli, magari proprio qui? L&amp;rsquo;impulso iniziale me l&amp;rsquo;ha dato Federico &amp;ldquo;frix&amp;rdquo; Morchio durante una discussione sul canale &lt;a href=&#34;https://goedel.slack.com&#34;&gt;Goedel&lt;/a&gt; di &lt;a href=&#34;https://slack.com/&#34;&gt;Slack&lt;/a&gt; gestito dal sempre ottimo &lt;a href=&#34;http://macintelligence.org/&#34;&gt;Lucio Bragagnolo&lt;/a&gt; (aka&amp;hellip; oops, &lt;a href=&#34;http://blog.terminologiaetc.it/2017/12/18/significato-abbreviazione-inglese-aka/&#34;&gt;noto anche come&lt;/a&gt; Lux, Loox e tanti altri alias).&lt;/p&gt;&#xA;&lt;p&gt;Attenzione! Questo e i futuri post sull&amp;rsquo;argomento &lt;strong&gt;non saranno&lt;/strong&gt; delle introduzioni a &lt;code&gt;bash&lt;/code&gt;, a &lt;code&gt;python&lt;/code&gt;, al Terminale di macOS (tendo sempre a dimenticare che non si chiama più OS X!), per quelle ci sono un sacco di ottime guide in rete. Chi vuole fare in fretta può iniziare leggendo la mia piccola guida a &lt;code&gt;bash&lt;/code&gt; di qualche anno fa, &lt;a href=&#34;https://melabit.wordpress.com/2014/11/06/script-di-shell-in-os-x/&#34;&gt;Script di shell in OS X&lt;/a&gt; e magari anche &lt;a href=&#34;https://melabit.wordpress.com/2016/12/18/compleanno-con-permessi/&#34;&gt;Compleanno con permessi&lt;/a&gt;, la ripresa di un vecchio post sull&amp;rsquo;ormai defunto &lt;a href=&#34;https://web.archive.org/web/20120102191652/http://www.macworld.it/ping&#34;&gt;Ping&lt;/a&gt; che di fatto mi ha fatto iniziare l&amp;rsquo;esperienza di blogger.&lt;/p&gt;&#xA;&lt;p&gt;Cominciamo con un antipasto veloce, una cosa apparentemente inutile (o quasi), ma che serve a dare una idea delle potenzialità di &lt;code&gt;bash&lt;/code&gt; e di come, partendo da un&amp;rsquo;idea semplice, si possa trasformarla a poco a poco in qualcosa di più pratico e adatto ad un uso quotidiano.&lt;/p&gt;&#xA;&lt;h4 id=&#34;manipolare-i-nomi-dei-file&#34;&gt;Manipolare i nomi dei file&lt;/h4&gt;&#xA;&lt;p&gt;La prima cosa che faccio quando inizio a scrivere un nuovo post è creare un file Markdown con i &lt;em&gt;metadati&lt;/em&gt; (titolo, data di pubblicazione, categoria e tag, chi usa Jekyll o Octopress sa di cosa parlo), a cui assegno un nome temporaneo. Una volta deciso il titolo definitivo, rinomino il file in un modo più razionale, in modo che possa ritrovarlo facilmente.&lt;/p&gt;&#xA;&lt;p&gt;Per farlo seguo la &lt;a href=&#34;https://jekyllrb.com/docs/posts/&#34;&gt;convenzione sui nomi dei file&lt;/a&gt; di Jekyll,&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; secondo la quale il nome del file deve essere scritto come &lt;code&gt;YYYY-MM-DD-titolo-del-post.md&lt;/code&gt;, dove &lt;code&gt;YYYY&lt;/code&gt; indica l&amp;rsquo;anno, &lt;code&gt;MM&lt;/code&gt; il mese e &lt;code&gt;DD&lt;/code&gt; il giorno di pubblicazione (espressi rispettivamente con quattro e due cifre) e parole e numeri vanno separati con un trattino invece che con uno spazio. Sembra una cosa inutilmente complicata, ma permette di tenere ordinati i file in base alla data anche quando se ne modifica il contenuto in un secondo tempo. E comunque, evitare di utilizzare gli spazi nei nomi dei file è ancora oggi la cosa più razionale da fare nei sistemi basati su Unix come macOS.&lt;/p&gt;&#xA;&lt;p&gt;Per la data non ci sono problemi, nei metadati è già scritta nel formato &lt;em&gt;giusto&lt;/em&gt;, per cui è sufficiente copiarla ed incollarla direttamente nel nome del file tramite il Finder. Ma il titolo? Potrei usare il Finder anche per il titolo, inserendolo dopo la data nel nome del file e sostituendo a mano gli spazi con i trattini. Però è facile sbagliare, soprattutto quando il titolo è lungo. Ancora più facile è non essere consistenti, usando ogni volta una forma leggermente diversa e mandando a pallino i vantaggi dati dall&amp;rsquo;utilizzare nomi di file ben definiti.&lt;/p&gt;&#xA;&lt;p&gt;E poi, vuoi mettere il divertimento di farlo fare a &lt;code&gt;bash&lt;/code&gt;?&lt;/p&gt;&#xA;&lt;h4 id=&#34;un-pezzo-alla-volta&#34;&gt;Un pezzo alla volta&lt;/h4&gt;&#xA;&lt;p&gt;Prendiamo come esempio il titolo di un &lt;a href=&#34;https://melabit.wordpress.com/2018/01/20/la-privacy-al-tempo-dell-internet-of-things-gran-finale/&#34;&gt;post&lt;/a&gt; di qualche mese fa, &amp;ldquo;La privacy al tempo dell&amp;rsquo;Internet of Things: gran finale&amp;rdquo;. Per trasformare il titolo originale in una sequenza di parole separate da trattini è sufficiente lanciare il Terminale ed eseguire il comando&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ echo &amp;quot;La privacy al tempo dell&#39;Internet of Things: gran finale&amp;quot; | sed &amp;quot;s/ /-/g&amp;quot;&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;dove &lt;code&gt;echo&lt;/code&gt; scrive la stringa nel Terminale e la invia tramite il &lt;code&gt;|&lt;/code&gt; (&lt;em&gt;pipe&lt;/em&gt;) a &lt;code&gt;sed&lt;/code&gt;, che si occupa di cercare tutti gli spazi e di sostituirli con un trattino, ottenendo&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;La-privacy-al-tempo-dell&#39;Internet-of-Things:-gran-finale&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Non male, ma ci sono due o tre cosette da sistemare.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Problema numero 1 (banale)&lt;/strong&gt;. Il formato di Jekyll prevede implicitamente che il nome del file sia scritto tutto in minuscolo. Personalmente trovo che questa forma sia più gradevole, ma è anche utile a semplificare e a rendere univoco l&amp;rsquo;ordinamento dei file (una fissazione, lo so, ma quando si maneggiano tantissimi file ogni giorno diventa una cosa fondamentale per lavorare meglio). Si può fare così&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ echo &amp;quot;La privacy al tempo dell&#39;Internet of Things: gran finale&amp;quot; | tr &amp;quot;[:upper:]&amp;quot; &amp;quot;[:lower:]&amp;quot;&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;dove &lt;code&gt;tr&lt;/code&gt; trasforma i caratteri maiuscoli (&lt;code&gt;[:upper:]&lt;/code&gt;) in minuscoli (&lt;code&gt;[:lower:]&lt;/code&gt;), ottenendo&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;la privacy al tempo dell&#39;internet of things: gran finale&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;&lt;em&gt;Domanda #1: cosa succede se nel comando precedente si usa &lt;code&gt;tr &amp;quot;[:lower:]&amp;quot; &amp;quot;[:upper:]&amp;quot;&lt;/code&gt;?&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Problema numero 2 (importante)&lt;/strong&gt;. Nei nomi dei file è preferibile usare solo lettere non accentate, numeri e alcuni caratteri di separazione: trattino, underscore e (se proprio dobbiamo) spazio. Se possibile è meglio evitare di usare il punto, che normalmente serve per separare il nome del file vero e proprio dall&amp;rsquo;estensione (caratteristica che è stata usata parecchio per distribuire file contenti virus ma che apparivano legittimi). Tutto gli altri caratteri devono essere rigorosamente evitati, perché spesso hanno significati speciali per il sistema operativo e creano solo guai.&lt;/p&gt;&#xA;&lt;p&gt;Per togliere la punteggiatura possiamo usare la stessa tecnica di sopra,&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ echo &amp;quot;La privacy al tempo dell&#39;Internet of Things: gran finale&amp;quot; | sed &amp;quot;s/[[:punct:]]//g&amp;quot;&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;dove in questo caso &lt;code&gt;sed&lt;/code&gt; cerca tutti i caratteri di punteggiatura (&lt;code&gt;[[:punct:]]&lt;/code&gt;) e li sostituisce con&amp;hellip; niente (cioè li toglie), ottenendo in uscita&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;La privacy al tempo dellInternet of Things gran finale&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;&lt;strong&gt;Problema numero 3 (specifico)&lt;/strong&gt;. Il comando di prima rimuove anche gli apostrofi (che è sempre bene evitare di mettere nei nomi dei file, perché potrebbero dare problemi su sistemi operativi meno &lt;em&gt;liberali&lt;/em&gt; di macOS).&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt; Piuttosto che buttarli via, è preferibile però sostituirli con un trattino, usando ancora una volta &lt;code&gt;sed&lt;/code&gt;&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ echo &amp;quot;La privacy al tempo dell&#39;Internet of Things: gran finale&amp;quot; | sed &amp;quot;s/&#39;/-/g&amp;quot;&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;che da in uscita&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;La privacy al tempo dell-Internet of Things: gran finale&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;h4 id=&#34;mettiamo-tutto-insieme&#34;&gt;Mettiamo tutto insieme&lt;/h4&gt;&#xA;&lt;p&gt;Usare &lt;code&gt;bash&lt;/code&gt; (o qualunque altra shell di Unix) è un po&amp;rsquo; come usare il Lego dove, mettendo insieme dei piccoli mattoncini di forme e colori diversi, si può costruire una portaerei (o quasi). Con &lt;code&gt;bash&lt;/code&gt; si prendono dei semplici comandi come quelli visti prima, si mettono nell&amp;rsquo;ordine giusto, si collega l&amp;rsquo;output di un comando con l&amp;rsquo;input di quello successivo tramite il &lt;code&gt;|&lt;/code&gt; (&lt;em&gt;pipe&lt;/em&gt;), e alla fine si riescono a fare delle cose anche piuttosto sofisticate.&lt;/p&gt;&#xA;&lt;p&gt;In questo caso, il comando&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ echo &amp;quot;La privacy al tempo dell&#39;Internet of Things: gran finale&amp;quot; | tr &amp;quot;[:upper:]&amp;quot; &amp;quot;[:lower:]&amp;quot; | sed &amp;quot;s/&#39;/ /g&amp;quot; | sed &amp;quot;s/[[:punct:]]//g&amp;quot; | sed &amp;quot;s/ /-/g&amp;quot;&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;genera la stringa&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;la-privacy-al-tempo-dell-internet-of-things-gran-finale&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;pronta per essere utilizzata come nome del file.&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;Domanda #2: Cosa succede se cambio l&amp;rsquo;ordine dei comandi? Perché questo è l&amp;rsquo;ordine migliore per convertire un titolo nel formato desiderato?&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;Domanda #3: Perché nel primo &lt;code&gt;sed&lt;/code&gt; questa volta ho sostituito l&amp;rsquo;apostrofo &lt;code&gt;&#39;&lt;/code&gt; con uno spazio (mentre nella descrizione del problema numero 3 avevo usato un trattino)?&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;Chi ha avuto la pazienza di leggere fin qui, si starà chiedendo che senso abbia complicarsi la vita con il Terminale e con &lt;code&gt;bash&lt;/code&gt;, quando è molto più veloce modificare il titolo a mano nel Finder.&lt;/p&gt;&#xA;&lt;p&gt;Tutto vero, ma è altrettanto vero che il post è stato più che altro una scusa per introdurre due comandi come &lt;code&gt;sed&lt;/code&gt; e &lt;code&gt;tr&lt;/code&gt;, molto utili ma anche molto poco conosciuti. E poi, partendo da questa base si possono costruire delle cose molto più utili, ma questo lo vedremo la prossima volta.&lt;/p&gt;&#xA;&lt;h5 id=&#34;revisioni&#34;&gt;Revisioni&lt;/h5&gt;&#xA;&lt;p&gt;&lt;strong&gt;3-12-2018&lt;/strong&gt;: Corretta una incongruenza nel testo originale, nel quale veniva usato una volta &lt;code&gt;sed&lt;/code&gt; e un&amp;rsquo;altra &lt;code&gt;tr&lt;/code&gt; per rimuovere i caratteri di punteggiatura.&lt;/p&gt;&#xA;&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;&#xA;&lt;hr&gt;&#xA;&lt;ol&gt;&#xA;&lt;li id=&#34;fn:1&#34;&gt;&#xA;&lt;p&gt;Che poi è praticamente la stessa convenzione che usa Wordpress per generare i nomi dei post.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:2&#34;&gt;&#xA;&lt;p&gt;La gestione generale dei caratteri accentati nei nomi dei file è un problema molto più complesso, che è meglio rimandare ad un post specifico sull&amp;rsquo;argomento, ammesso che ci sia interesse per l&amp;rsquo;argomento.&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/div&gt;&#xA;</description>
    </item>
    <item>
      <title>Script per tutti i giorni: ricapitoliamo</title>
      <link>https://static.233.196.69.159.clients.your-server.de/it/2018/01/30/script-per-tutti-i-giorni-ricapitoliamo/</link>
      <pubDate>Tue, 30 Jan 2018 18:00:00 +0000</pubDate>
      <guid>https://static.233.196.69.159.clients.your-server.de/it/2018/01/30/script-per-tutti-i-giorni-ricapitoliamo/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;https://farm4.staticflickr.com/3691/10922273715_cfd864963f_b.jpg&#34; alt=&#34;&#34;&gt;&#xA;&amp;ndash; Foto: &lt;a href=&#34;https://www.flickr.com/photos/ul_digital_library/&#34;&gt;Glucksman Library at Limerick&lt;/a&gt; su Flickr.&lt;/p&gt;&#xA;&lt;p&gt;Prima di proseguire con questa serie dedicata alla scrittura di piccoli script in &lt;code&gt;bash&lt;/code&gt; e affini, mi sembra utile ricapitolare i concetti principali delle prime tre puntate (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;h4 id=&#34;case-e-cartelle&#34;&gt;Case e cartelle&lt;/h4&gt;&#xA;&lt;p&gt;Come tutti i sistemi basati su Unix, anche macOS è progettato per essere usato da più utenti, anche in contemporanea. Nella pratica non è così, nella maggior parte dei casi il Mac è usato da un solo utente e solo di rado vengono attivati degli account per più di tre o quattro utenti, però la funzionalità c&amp;rsquo;è.&lt;/p&gt;&#xA;&lt;p&gt;Di conseguenza ciascun utente del Mac dispone di un&amp;rsquo;area personale dove salvare tutti i documenti, dati e file di configurazione, nettamente separata da quelle degli eventuali altri utenti del sistema. Non a caso quest&amp;rsquo;area personale è denominata &lt;code&gt;Home&lt;/code&gt;, la &lt;em&gt;casa&lt;/em&gt; dell&amp;rsquo;utente.&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;Dal punto di vista pratico l&amp;rsquo;area personale di ciascun utente è costituita da una cartella, rappresentata dall&amp;rsquo;icona di una casetta e denominata con il &lt;code&gt;nome account&lt;/code&gt; (o &lt;code&gt;nome breve&lt;/code&gt;), cioè con il nome utilizzato per fare il login sul Mac, che viene assegnato all&amp;rsquo;utente una volta per tutte al momento della creazione dell&amp;rsquo;account. All&amp;rsquo;interno di questa cartella principale ci sono un certo numero di cartelle standard gestite automaticamente dal sistema operativo,&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 niente impedisce di definire delle ulteriori cartelle personali. Io ad esempio uso la cartella &lt;code&gt;Documenti&lt;/code&gt; solo per i file generati automaticamente da certe applicazioni e conservo tutti i miei documenti in alcune cartelle ben definite contenute nella mia &lt;code&gt;Home&lt;/code&gt;, dentro le quali ci sono un gran numero di sottocartelle più specifiche.&lt;/p&gt;&#xA;&lt;p&gt;Una delle cartelle contenute nella mia &lt;code&gt;Home&lt;/code&gt; è &lt;code&gt;Development&lt;/code&gt;, che uso  da sempre per salvare i progetti generici relativi allo sviluppo software (quelli più strettamente collegati alla mia attività lavorativa sono altrove). Proprio per questo ho preferito salvare in questa cartella anche tutti i piccoli programmi proposti nel corso di questa serie, consigliando i lettori di fare altrettanto in modo da seguire più facilmente gli esempi riportati. Chi preferisce usare una cartella diversa dovrà ricordarsi di modificare di conseguenza i percorsi dei comandi.&lt;/p&gt;&#xA;&lt;p&gt;Già che siamo in tema di &lt;em&gt;cartelle&lt;/em&gt;, ribadisco quello che ho scritto nella terza puntata. I termini &lt;em&gt;directory&lt;/em&gt; e &lt;em&gt;cartella&lt;/em&gt; sono perfettamente equivalenti, io preferisco usare il primo ma so benissimo che nell&amp;rsquo;uso comune prevale nettamente il secondo, non a caso in tutte le interfacce grafiche l&amp;rsquo;icona che rappresenta la directory è proprio quella di una cartella di documenti. Ho deciso quindi di uniformarmi all&amp;rsquo;uso comune e usare il termine &amp;ldquo;cartella&amp;rdquo; nel testo discorsivo degli articoli, ma di continuare ad utilizzare &amp;ldquo;directory&amp;rdquo; quando il discorso si fa più tecnico, ad esempio ogni volta che tratterò di comandi dei &lt;code&gt;bash&lt;/code&gt; e del Terminale.&lt;/p&gt;&#xA;&lt;h4 id=&#34;il-terminale-di-macos&#34;&gt;Il Terminale di macOS&lt;/h4&gt;&#xA;&lt;p&gt;Chi legge i miei post sa che uso moltissimo il Terminale, l&amp;rsquo;interfaccia  a linea di comando di macOS, e lo considero uno strumento insostituibile quando si tratta di eseguire compiti complessi e ripetitivi. Provate ad usare un programma con interfaccia grafica per convertire un centinaio di immagini da un formato ad un altro, sovrapponendo a ciascuna immagine una scritta variabile e poi ditemi.&lt;/p&gt;&#xA;&lt;p&gt;In macOS il Terminale si trova nella cartella &lt;code&gt;Utility&lt;/code&gt;, posta all&amp;rsquo;interno della cartella &lt;code&gt;Applicazioni&lt;/code&gt;, un percorso che possiamo scrivere in modo più compatto come &lt;code&gt;Applicazioni &amp;amp;#62; Utility&lt;/code&gt;, dove il simbolo &lt;code&gt;&amp;amp;#62;&lt;/code&gt; indica il passaggio da una cartella ad un&amp;rsquo;altra contenuta al suo interno. Se lo usate spesso e vi secca doverlo andare a cercare ogni volta, aggiungetelo al Dock e vi basterà un click per lanciarlo.&lt;/p&gt;&#xA;&lt;p&gt;La prima (o la prossima) volta che usate il Terminale fatevi un favore e cambiate un paio di cosette nella sua configurazione standard.&lt;/p&gt;&#xA;&lt;p&gt;Innanzi tutto lanciate le Preferenze del Terminale, scegliete un profilo più gradevole di quello tutto bianco di base e rendetelo il profilo di default (io preferisco Ocean o Homebrew, ma è una questione di gusti personali). Per farlo, cliccate sull&amp;rsquo;icona Profili situata nella barra degli strumenti, selezionate dal pannello laterale sinistro il profilo che preferite e infine cliccate sul tasto &lt;code&gt;Default&lt;/code&gt; posto proprio in fondo al pannello. Se volete provare i vari profili prima di decidere quale vi piace di più, vi basta fare un doppio click sulle anteprime situate nel pannello laterale.&lt;/p&gt;&#xA;&lt;p&gt;Chissà perché Apple ha scelto per il Terminale una impostazione di default di appena 80 caratteri per 24 righe (80x24), forse voleva ricordarci come poteva essere lavorare sullo schermo di un &lt;a href=&#34;https://it.wikipedia.org/wiki/Apple_II&#34;&gt;Apple II&lt;/a&gt; (già in versione &amp;ldquo;espansa&amp;rdquo;)! Ma siamo in pieni anni 2000 e un Terminale più grande è decisamente più comodo. Per cui, una volta selezionato il profilo grafico preferito, potete cambiare le dimensioni della finestra del Terminale selezionando il pannello &lt;code&gt;Finestra&lt;/code&gt; nell&amp;rsquo;area centrale delle Preferenze del Terminale e inserendo le dimensioni che preferite, in termini di righe e colonne. Io in genere uso finestre di Terminale da 120 colonne per 40 righe (120x40), forse mi ricorda qualcosa ma comunque mi sembra un buon equilibrio fra ingombro sullo schermo e comodità d&amp;rsquo;uso.&lt;/p&gt;&#xA;&lt;p&gt;Se non avete idea di quanto queste dimensioni in righe e colonne si traducano in dimensioni reali sullo schermo, rilanciate il Terminale (per attivare il profilo di default) e allargate la finestra finché non diventa grande abbastanza per i vostri gusti, esattamente come fareste con qualunque altra applicazione per macOS. Per rendere queste dimensioni le nuove impostazioni di default, non dimenticate di cliccare sulla voce &lt;code&gt;Utilizza impostazioni come default&lt;/code&gt; del menu &lt;code&gt;Shell&lt;/code&gt; (che potrei scrivere anche come &lt;code&gt;Shell &amp;amp;#62; Utilizza impostazioni come default&lt;/code&gt;, dove il simbolo &lt;code&gt;&amp;amp;#62;&lt;/code&gt; serve in questo caso a separare le voci di menu da selezionare in sequenza).&lt;/p&gt;&#xA;&lt;h4 id=&#34;il-prompt-del-terminale&#34;&gt;Il prompt del Terminale&lt;/h4&gt;&#xA;&lt;p&gt;Se l&amp;rsquo;avete chiuso, lanciate di nuovo il Terminale e guardate con attenzione la finestra che appare. È praticamente vuota, tranne due brevi righe di testo. Se non avete fatto altre modifiche alla configurazione del Terminale rispetto a quelle proposte qui sopra, nella prima riga c&amp;rsquo;è la data e l&amp;rsquo;ora correnti con l&amp;rsquo;indicazione del numero del terminale virtuale correntemente aperto, &lt;code&gt;ttys001&lt;/code&gt;, &lt;code&gt;ttys002&lt;/code&gt; e così via. Il Terminale di macOS, infatti, non è altro che un emulatore software dei terminali &lt;em&gt;fisici&lt;/em&gt; con i quali, fino agli anni &amp;lsquo;80, ci si collegava ai grossi computer delle università o delle aziende mediante un protocollo di comunicazione seriale analogo a quello delle &lt;a href=&#34;https://it.wikipedia.org/wiki/Telescrivente&#34;&gt;telescriventi&lt;/a&gt;. In inglese la telescrivente si chiama &lt;em&gt;Teletype&lt;/em&gt; o &lt;em&gt;TTY&lt;/em&gt; e l&amp;rsquo;acronimo è rimasto ancora in uso per indicare appunto i terminali, ormai diventati solo &lt;em&gt;virtuali&lt;/em&gt;, dei sistemi Unix come Linux e macOS.&lt;/p&gt;&#xA;&lt;p&gt;Nella seconda riga invece compare il nome del vostro Mac, quello che avete definito nel pannello &lt;code&gt;Condivisione&lt;/code&gt; delle &lt;code&gt;Preferenze di Sistema&lt;/code&gt;, seguito dai due punti e dal nome della directory corrente, che in questo momento dovrebbe essere la &lt;code&gt;Home&lt;/code&gt; del vostro account, rappresentata dal simbolo tilde, &lt;code&gt;~&lt;/code&gt; (in macOS la tilde si scrive premendo ALT-5). Subito dopo il nome della directory corrente c&amp;rsquo;è uno spazio, il vostro &lt;code&gt;nome account&lt;/code&gt; e infine il simbolo del dollaro, &lt;code&gt;$&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;nome-computer:directory nome-account$ &#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Questa riga si chiama il &lt;code&gt;prompt&lt;/code&gt; del Terminale, riesce a dare parecchie informazioni utili in modo compatto e, volendo, può essere &lt;a href=&#34;http://osxdaily.com/2006/12/11/how-to-customize-your-terminal-prompt/&#34;&gt;modificata a piacere&lt;/a&gt; (mai capito perché, però se queste cose vi piacciono potete usare questo &lt;a href=&#34;http://bashrcgenerator.com/&#34;&gt;generatore online&lt;/a&gt;).&lt;/p&gt;&#xA;&lt;p&gt;Quando si descrivono i comandi della shell (che quasi sempre è &lt;code&gt;bash&lt;/code&gt;), il prompt del Terminale viene rappresentato spesso con il solo simbolo &lt;code&gt;$&lt;/code&gt;, tralasciando tutto quello che c&amp;rsquo;è prima. Non bisogna mai dimenticare che il &lt;code&gt;$&lt;/code&gt; (o l&amp;rsquo;intero prompt) serve solo a mettere in evidenza che stiamo usando il Terminale ma non fa parte dei comandi della shell, per cui non dobbiamo mai scriverlo quando interagiamo con il Terminale, magari copiando i comandi dagli articoli di questa serie.&lt;/p&gt;&#xA;&lt;h4 id=&#34;pillole-di-bash&#34;&gt;Pillole di bash&lt;/h4&gt;&#xA;&lt;p&gt;E veniamo finalmente ad alcuni fra i comandi principali di &lt;code&gt;bash&lt;/code&gt;. Primo fra tutti &lt;code&gt;cd&lt;/code&gt; che permette di muoversi fra le directory del disco rigido. Il comando &lt;code&gt;cd&lt;/code&gt; deve essere seguito dal percorso completo da seguire per arrivare alla directory desiderata, per cui&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ cd Development&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;ci fa passare nella cartella &lt;code&gt;Development&lt;/code&gt; (supponendo di partire dalla &lt;code&gt;Home&lt;/code&gt;), mentre&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ cd Music/iTunes&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;ci fa andare direttamente nella cartella &lt;code&gt;iTunes&lt;/code&gt; contenuta all&amp;rsquo;interno di &lt;code&gt;Music&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Se ci sentiamo persi, possiamo usare&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ cd&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;per tornare nella nostra &lt;code&gt;Home&lt;/code&gt;, oppure&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ pwd&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;per stampare nel Terminale il percorso completo della directory in cui ci troviamo. Tutti i percorsi riportati da &lt;code&gt;pwd&lt;/code&gt; partono dalla directory &lt;code&gt;/&lt;/code&gt;, la &lt;em&gt;radice&lt;/em&gt; (o &lt;em&gt;root&lt;/em&gt;) del disco rigido,&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; per cui se ci troviamo nella &lt;code&gt;Home&lt;/code&gt; dell&amp;rsquo;utente &lt;code&gt;alice&lt;/code&gt;, l&amp;rsquo;esecuzione di &lt;code&gt;pwd&lt;/code&gt; restituirà&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ pwd&#xA;/Users/alice&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;dove, come abbiamo già visto, &lt;code&gt;alice&lt;/code&gt; è il &lt;code&gt;nome account&lt;/code&gt; dell&amp;rsquo;utente che ha effettuato il login sul Mac. Da notare che in macOS tutte le &lt;code&gt;Home&lt;/code&gt; degli utenti si trovano all&amp;rsquo;interno della directory &lt;code&gt;/Users&lt;/code&gt;, a differenza della maggior parte degli altri sistemi operativi basati su Unix (Linux e i vari BSD) che sono più banali ed usano &lt;code&gt;/home&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;E per sapere qual&amp;rsquo;è il nostro &lt;code&gt;nome account&lt;/code&gt;? C&amp;rsquo;è un comando anche per questo,&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ whoami&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;forse scritto da qualche filosofo esistenzialista.&lt;/p&gt;&#xA;&lt;p&gt;Con il comando &lt;code&gt;cd&lt;/code&gt; si utilizzano spesso delle abbreviazioni molto comode: &lt;code&gt;~&lt;/code&gt; che indica la nostra directory &lt;code&gt;Home&lt;/code&gt;, &lt;code&gt;.&lt;/code&gt; che indica la directory corrente (quella riportata da &lt;code&gt;pwd&lt;/code&gt;) e &lt;code&gt;..&lt;/code&gt; che invece indica la directory che contiene la directory corrente. Se in questo momento ci troviamo nella directory &lt;code&gt;~/Music/iTunes&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;ci fa fare un passo &lt;em&gt;indietro&lt;/em&gt;  tornando a &lt;code&gt;~/Music&lt;/code&gt;, mentre&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ cd ~&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;ci fa tornare nella nostra &lt;code&gt;Home&lt;/code&gt; (ma basta anche il solo &lt;code&gt;cd&lt;/code&gt;).&lt;/p&gt;&#xA;&lt;p&gt;Un altro comando fondamentale di &lt;code&gt;bash&lt;/code&gt; è &lt;code&gt;echo&lt;/code&gt;, che stampa una stringa sul Terminale&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ echo &amp;quot;questa è una stringa&amp;quot;&#xA;questa è una stringa&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Non è nemmeno necessario racchiudere la stringa fra virgolette, &lt;code&gt;echo&lt;/code&gt; stamperà sul Terminale tutto ciò che viene immediatamente dopo il comando, quindi va altrettanto bene scrivere&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ echo questa è una stringa&#xA;questa è una stringa&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;È molto comune utilizzare &lt;code&gt;echo&lt;/code&gt; per scrivere direttamente in un file invece che sul Terminale tramite l&amp;rsquo;operatore di redirezione &lt;code&gt;&amp;amp;#62;&lt;/code&gt;&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ echo &amp;quot;questa è una stringa&amp;quot; &amp;amp;#62; file.txt&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Se il file &lt;code&gt;file.txt&lt;/code&gt; non esiste, &lt;code&gt;echo&lt;/code&gt; lo crea da zero e ci scrive dentro la stringa, altrimenti sovrascrive il contenuto precedente di &lt;code&gt;file.txt&lt;/code&gt; e lo sostituisce con la nuova stringa. Se vogliamo che il nome del file da creare contenga degli spazi lo dobbiamo racchiudere fra virgolette, non importa se semplici o doppie&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ echo &amp;quot;questa è una stringa&amp;quot; &amp;amp;#62; &amp;quot;file con spazi.txt&amp;quot;&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Per scrivere con &lt;code&gt;echo&lt;/code&gt; in un file senza perdere il contenuto già esistente, dobbiamo usare l&amp;rsquo;operatore &lt;code&gt;&amp;amp;#62;&amp;amp;#62;&lt;/code&gt; che aggiunge (&lt;em&gt;append&lt;/em&gt;) una nuova stringa alla fine del file &lt;code&gt;file.txt&lt;/code&gt;&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ echo &amp;quot;questa è una stringa&amp;quot; &amp;amp;#62;&amp;amp;#62; file.txt&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Anche in questo caso, se il file &lt;code&gt;file.txt&lt;/code&gt; non esiste &lt;code&gt;echo&lt;/code&gt; lo crea da zero e ci scrive dentro la stringa.&lt;/p&gt;&#xA;&lt;p&gt;Gli operatori di redirezione &lt;code&gt;&amp;amp;#62;&lt;/code&gt; e &lt;code&gt;&amp;amp;#62;&amp;amp;#62;&lt;/code&gt; assomigliano moltissimo ad un altro operatore che abbiamo incontrato più volte nel corso delle puntate precedenti, il &lt;code&gt;|&lt;/code&gt; (&lt;em&gt;pipe&lt;/em&gt;), che serve a fare in modo che l’output di un comando venga utilizzato come input del comando successivo. Come in questo caso&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ echo &amp;quot;questa è una stringa&amp;quot; | tr &amp;quot;[:lower:]&amp;quot; &amp;quot;[:upper:]&amp;quot;&#xA;QUESTA È UNA STRINGA&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;dove il primo comando &lt;code&gt;echo&lt;/code&gt; scrive una stringa e la invia a &lt;code&gt;tr&lt;/code&gt; che a sua volta la converte in caratteri maiuscoli e stampa il risultato finale sullo schermo.&lt;/p&gt;&#xA;&lt;p&gt;Sempre restando in tema di file, ci sono due comandi importantissimi ma piuttosto complicati, &lt;code&gt;chmod&lt;/code&gt; e &lt;code&gt;chown&lt;/code&gt;, che permettono rispettivamente di cambiare i permessi di lettura (&lt;code&gt;r&lt;/code&gt;), scrittura (&lt;code&gt;w&lt;/code&gt;) ed esecuzione (&lt;code&gt;x&lt;/code&gt;) dei file, e di assegnare la &lt;em&gt;proprietà&lt;/em&gt; di un file ad un determinato utente o gruppo di utenti. In questo momento non ha senso entrare nei dettagli dei due comandi, per ora basterà sapere che&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ chmod u+x script.sh&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;rende lo script &lt;code&gt;script.sh&lt;/code&gt; eseguibile da parte dell&amp;rsquo;utente corrente del Mac, mentre&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ chmod u-x script.sh&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;rimuove l&amp;rsquo;autorizzazione precedente. Invece&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ chmod a+x script.sh&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;rende lo script eseguibile da tutti gli utenti e il suo contrario&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ chmod a-x script.sh&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;impedisce a tutti gli utenti, quindi anche a noi stessi!, di eseguire lo script in questione.&lt;/p&gt;&#xA;&lt;p&gt;Per quanto riguarda &lt;code&gt;chown&lt;/code&gt;&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ chown alice file.txt&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;rende &lt;code&gt;file.txt&lt;/code&gt; di proprietà dell&amp;rsquo;utente &lt;code&gt;alice&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;I permessi di un file si possono verificare tramite &lt;code&gt;ls&lt;/code&gt;, un comando utilizzato di continuo in una qualunque sessione del Terminale per mostrare il contenuto di una directory, cioè tutti i file e le directory (per Unix non c&amp;rsquo;è differenza) che si trovano all&amp;rsquo;interno di una directory data. La directory su cui deve operare &lt;code&gt;ls&lt;/code&gt; va indicata subito dopo il comando, se non scriviamo niente &lt;code&gt;ls&lt;/code&gt; mostra il contenuto della directory corrente.&lt;/p&gt;&#xA;&lt;p&gt;Il comando &lt;code&gt;ls&lt;/code&gt; &lt;em&gt;liscio&lt;/em&gt; mostra il contenuto di una directory in forma di tabella, e l&amp;rsquo;unico modo per distinguere i file dalle directory è tramite l&amp;rsquo;estensione: normalmente i nomi dei file terminano con una estensione costituita da un punto e da tre lettere mentre le directory non hanno estensione (ma non è detto che sia sempre così). Ad esempio&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ ls ~&#xA;Applications  Documentation Library       My Documents  Public        Tmp&#xA;Desktop       Documents     Movies        Papers        Research      bin&#xA;Development   Downloads     Music         Pictures      Sites&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;elenca tutte i file e le directory contenuti nella &lt;code&gt;Home&lt;/code&gt; del mio Mac (in effetti compaiono solo delle directory). Usato così, &lt;code&gt;ls&lt;/code&gt; serve a poco. Molto meglio&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ ls -l&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;che mostra il contenuto di una directory in forma di lista invece che di tabella, riportando in più una serie di informazioni dettagliate su ciascun file (o directory).&lt;/p&gt;&#xA;&lt;p&gt;In particolare, la prima colonna contiene una sequenza di 10 simboli &amp;ndash; in genere &lt;code&gt;-&lt;/code&gt;, &lt;code&gt;d&lt;/code&gt;, &lt;code&gt;r&lt;/code&gt;, &lt;code&gt;w&lt;/code&gt;, &lt;code&gt;x&lt;/code&gt;, qualche rara volta anche &lt;code&gt;s&lt;/code&gt; o &lt;code&gt;S&lt;/code&gt; &amp;ndash; che ci dicono se abbiamo a che fare con un file o una directory e quali sono i permessi associati al file stesso (o alla directory).&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;  Il trattino, &lt;code&gt;-&lt;/code&gt;, indica che il permesso corrispondente non è assegnato. I dettagli possono essere &lt;a href=&#34;https://en.wikibooks.org/wiki/A_Quick_Introduction_to_Unix/Permissions&#34;&gt;letti qui&lt;/a&gt; o su una qualsiasi guida introduttiva a &lt;code&gt;bash&lt;/code&gt;, come quelle riportate nella Bibliografia qui sotto. A noi basta sapere che la &lt;code&gt;d&lt;/code&gt; in prima posizione indica una directory e che se troviamo una &lt;code&gt;x&lt;/code&gt; nella quarta, settima o decima posizione significa che il file è eseguibile rispettivamente dall&amp;rsquo;utente corrente, dagli utenti che fanno parte del suo stesso gruppo o infine da tutti gli utenti del Mac.&lt;/p&gt;&#xA;&lt;p&gt;Facciamo un esempio pratico: supponiamo di aver creato nella cartella &lt;code&gt;Development&lt;/code&gt; lo script &lt;code&gt;script.sh&lt;/code&gt;, contenente una serie di comandi &lt;code&gt;bash&lt;/code&gt;; appena creato lo script ha i permessi attribuiti di default a un file generico&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ ls -al script.sh &#xA;-rw-r--r--  1 nome-account  staff  0 Jan 25T22:07:00 script.sh&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;e poiché non troviamo nessuna &lt;code&gt;x&lt;/code&gt;, significa che non può essere eseguito da nessun utente. Per renderlo eseguibile dall&amp;rsquo;utente attuale del Mac&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ chmod u+x script.sh&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;come si vede eseguendo di nuovo &lt;code&gt;ls&lt;/code&gt;&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ ls -al script.sh &#xA;-rwxr--r--  1 nome-account  staff  0 Jan 25T22:07:00 script.sh&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;e notando che il &lt;code&gt;-&lt;/code&gt; in quarta posizione è diventato una &lt;code&gt;x&lt;/code&gt;. Se invece rendiamo il file eseguibile a tutti gli utenti con&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ chmod a+x script.sh&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;l&amp;rsquo;output di &lt;code&gt;ls&lt;/code&gt; sarà&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ ls -al script.sh &#xA;-rwxr-xr-x  1 nome-account  staff  0 Jan 25T22:07:00 script.sh&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;dove si vede che i trattini in quarta, settima o decima posizione sono diventati delle &lt;code&gt;x&lt;/code&gt;. Per riportare tutto alla situazione iniziale&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ chmod a-x script.sh &#xA;$ ls -al script.sh &#xA;-rw-r--r--  1 nome-account  staff  0 Jan 25T22:07:00 script.sh&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Prima di concludere questa lunghissima introduzione a &lt;code&gt;bash&lt;/code&gt;, ecco alcuni comandi relativi alla creazione e cancellazione di file e directory. Per creare un file ci sono cento modi diversi, abbiamo già visto come farlo con &lt;code&gt;echo&lt;/code&gt;, ma possiamo utilizzare anche il comando &lt;code&gt;touch&lt;/code&gt;, che crea un file vuoto da utilizzare in un secondo momento, per cui&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ touch new_file.txt&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;crea il file vuoto &lt;code&gt;new_file.txt&lt;/code&gt; nella directory corrente.&lt;/p&gt;&#xA;&lt;p&gt;Per rimuovere un file si usa invece &lt;code&gt;rm&lt;/code&gt; seguito dal nome del file, quindi&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ rm new_file.txt&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;cancella il file che abbiamo appena creato con &lt;code&gt;touch&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Analogamente, per creare una directory si usa &lt;code&gt;mkdir&lt;/code&gt; (abbreviazione di &lt;em&gt;make directory&lt;/em&gt;), per rimuoverla &lt;code&gt;rmdir&lt;/code&gt; (abbreviazione di &lt;em&gt;remove directory&lt;/em&gt;), seguiti in entrambi i casi dal nome della directory da creare o da rimuovere&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ mkdir nuova_directory&#xA;$ rmdir nuova_directory&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Anche in questo caso, se il nome della directory da creare (o da rimuovere) contiene degli spazi, deve essere racchiuso fra virgolette semplici o doppie. Per evitare errori che potrebbero essere disastrosi, si può rimuovere una directory solo se è vuota, cioè se non contiene altri file o altre directory.&lt;/p&gt;&#xA;&lt;p&gt;Credo che per ora possa bastare&amp;hellip;&lt;/p&gt;&#xA;&lt;h4 id=&#34;conclusioni&#34;&gt;Conclusioni&lt;/h4&gt;&#xA;&lt;p&gt;Questo articolo è cresciuto ben oltre le previsioni iniziali. Purtroppo era necessario farlo, sia per ricapitolare in modo organico le cose dette nelle prime tre puntate, sia per creare un linguaggio di base che permettesse di andare avanti più spediti, evitando di perdersi in troppi dettagli che rallentano e rendono più pesante l&amp;rsquo;esposizione. Alla prossima puntata con qualche cosa di nuovo e, spero, di interessante!&lt;/p&gt;&#xA;&lt;h4 id=&#34;bibliografia&#34;&gt;Bibliografia&lt;/h4&gt;&#xA;&lt;p&gt;I titoli su &lt;code&gt;bash&lt;/code&gt; si sprecano. Fra questi vorrei segnalare due guide in italiano e due in inglese. Purtroppo il materiale di qualità in italiano è scarso e le traduzioni dall&amp;rsquo;inglese sono per forza di cose molto più datate delle versioni originali (lo potete notare chiaramente confrontando le date delle versioni più recenti in italiano e in inglese della guida di Cooper), per cui è quasi sempre preferibile consultare i manuali e i tutorial originali in inglese. Per fortuna l&amp;rsquo;inglese &lt;em&gt;tecnico&lt;/em&gt; è molto comprensibile e non ci vuole molto per riuscire a leggerlo in modo fluido. Certo, se la scuola non facesse di tutto per renderlo odioso, le cose sarebbero più semplici per tutti.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Garrels, &lt;a href=&#34;http://codex.altervista.org/guidabash/guidabash_1_11.pdf&#34;&gt;La guida di Bash per i principianti&lt;/a&gt;, 2008.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Cooper, &lt;a href=&#34;http://www.pluto.it/sites/default/files/ildp/guide/abs/index.html&#34;&gt;Guida avanzata di scripting Bash&lt;/a&gt;, rev. 4.1, 2006.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Cooper, &lt;a href=&#34;https://www.tldp.org/LDP/abs/html/index.html&#34;&gt;Advanced Bash-Scripting Guide&lt;/a&gt;, rev. 10, 2014.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Wikibooks, &lt;a href=&#34;https://en.wikibooks.org/wiki/A_Quick_Introduction_to_Unix&#34;&gt;A Quick Introduction to Unix&lt;/a&gt;.&lt;/p&gt;&#xA;&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;Purtroppo nella versione italiana di macOS è stata tradotta con &lt;code&gt;Inizio&lt;/code&gt;, che non rende altrettanto bene l&amp;rsquo;idea. Io non posso soffrire il termine &lt;code&gt;inizio&lt;/code&gt; e userò sempre &lt;code&gt;Home&lt;/code&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;Fra cui &lt;code&gt;Filmati&lt;/code&gt;, &lt;code&gt;Immagini&lt;/code&gt; e &lt;code&gt;Musica&lt;/code&gt; per i file multimediali, &lt;code&gt;Download&lt;/code&gt; per i file scaricati da internet, &lt;code&gt;Documenti&lt;/code&gt; per i file personali e &lt;code&gt;Scrivania&lt;/code&gt; per i (troppi) file buttati alla rinfusa sul Desktop, cioè sulla scrivania virtuale del Mac.&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;O meglio, del &lt;em&gt;file system&lt;/em&gt; del disco rigido. Il disco rigido in sé è solo un oggetto hardware che non serve a molto finché non lo si &lt;em&gt;formatta&lt;/em&gt;, creando una struttura dati (il &lt;em&gt;file system&lt;/em&gt;, appunto) che possa essere utilizzata dal sistema operativo per memorizzare i file.&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;In macOS possono anche essere presenti i simboli &lt;code&gt;+&lt;/code&gt; o &lt;code&gt;@&lt;/code&gt; nell&amp;rsquo;undicesima posizione della colonna.&amp;#160;&lt;a href=&#34;#fnref:4&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/div&gt;&#xA;</description>
    </item>
    <item>
      <title>Divertirsi con il terminale</title>
      <link>https://static.233.196.69.159.clients.your-server.de/it/2017/02/12/divertirsi-con-il-terminale/</link>
      <pubDate>Sun, 12 Feb 2017 06:05:00 +0000</pubDate>
      <guid>https://static.233.196.69.159.clients.your-server.de/it/2017/02/12/divertirsi-con-il-terminale/</guid>
      <description>&lt;img src=&#34;https://c1.staticflickr.com/1/756/32436572466_37a142d66a_z.jpg&#34; alt=&#34;&#34; title=&#34;Paul Brouns, Imaginary Symphony&#34;&gt;&lt;p&gt;Siete dei fanatici della linea di comando? Volete mettere alla prova la vostra conoscenza del terminale &amp;ndash; l&amp;rsquo;interfaccia a linea di comando di Linux o di macOS/OS X &amp;ndash; e della shell &lt;code&gt;bash&lt;/code&gt;?&lt;/p&gt;&#xA;&lt;p&gt;Se avete risposto &amp;lsquo;si&amp;rsquo; ad entrambe le domande, fatevi un giretto su &lt;a href=&#34;https://cmdchallenge.com/&#34;&gt;Commandline Challenge&lt;/a&gt; e mettete alla prova le vostre capacità, risolvendo le sfide proposte.&lt;/p&gt;&#xA;&lt;p&gt;Alcune &lt;a href=&#34;https://about.cmdchallenge.com/&#34;&gt;possibili soluzioni&lt;/a&gt; sono molto più involute ed intricate di quanto sarebbe normale, ma dimostrano allo stesso tempo una maestria con i comandi della shell che rasenta l&amp;rsquo;arte.&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;Post Scriptum&lt;/em&gt;. Non prendetevela con me se la vostra produttività crolla vertiginosamente dopo aver letto questo post!&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>Command line fun</title>
      <link>https://static.233.196.69.159.clients.your-server.de/it/2017/02/12/command-line-fun/</link>
      <pubDate>Sun, 12 Feb 2017 06:00:00 +0000</pubDate>
      <guid>https://static.233.196.69.159.clients.your-server.de/it/2017/02/12/command-line-fun/</guid>
      <description>&lt;img src=&#34;https://farm8.staticflickr.com/7403/26761999542_7864fda90e_z.jpg&#34; alt=&#34;&#34; title=&#34;Paul Brouns, London Symphony&#34;&gt;&lt;p&gt;Are you a fan of the command line? Do you wish to test your knowledge of the terminal &amp;ndash; the command line interface of Linux or macOS/OS X &amp;ndash; and of the &lt;code&gt;bash&lt;/code&gt; shell?&lt;/p&gt;&#xA;&lt;p&gt;If you answered &amp;lsquo;yes&amp;rsquo; to the questions above, head your browser to &lt;a href=&#34;https://cmdchallenge.com/&#34;&gt;Commandline Challenge&lt;/a&gt; and test your skills trying to solve the challenges proposed there.&lt;/p&gt;&#xA;&lt;p&gt;Some of the &lt;a href=&#34;https://about.cmdchallenge.com/&#34;&gt;possible solutions&lt;/a&gt; are much more convoluted than normal, but they also show a technical mastery that resembles art.&lt;/p&gt;&#xA;&lt;p&gt;Disclaimer. It is not &lt;em&gt;my&lt;/em&gt; fault if your productivity sinks after reading this post!&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>FTP con caffé e cornetto</title>
      <link>https://static.233.196.69.159.clients.your-server.de/it/2016/12/28/ftp-con-caffe-e-cornetto/</link>
      <pubDate>Wed, 28 Dec 2016 18:00:00 +0000</pubDate>
      <guid>https://static.233.196.69.159.clients.your-server.de/it/2016/12/28/ftp-con-caffe-e-cornetto/</guid>
      <description>&lt;p&gt;Ha senso oggi trasferire file tramite FTP (l&amp;rsquo;acronimo sta per &lt;em&gt;File Trasfer Protocol&lt;/em&gt;)?&lt;/p&gt;&#xA;&lt;p&gt;Il protocollo FTP è stato ideato nei primi anni &amp;lsquo;70, agli albori di internet, quando solo pochissimi ricercatori usavano la rete e i problemi di sicurezza erano sconosciuti. Riuscire a trasferire file in modo efficiente ed affidabile da un punto all&amp;rsquo;altro della rete era un&amp;rsquo;esigenza fondamentale, in un&amp;rsquo;epoca di collegamenti lenti ed effettuati per lo più tramite la rete telefonica. Se questo comportava dover trasmettere i propri dati in chiaro attraverso la rete, pazienza, al massimo significava (allora!) dover subire qualche scherzo più o meno divertente.&lt;/p&gt;&#xA;&lt;p&gt;Oggi FTP è sempre meno usato, anche nella versione più &lt;em&gt;sicura&lt;/em&gt; SFTP basata su &lt;a href=&#34;https://it.wikipedia.org/wiki/Secure_shell&#34;&gt;&lt;code&gt;ssh&lt;/code&gt; (Secure SHell)&lt;/a&gt;. Ormai il protocollo è integrato nei browser web (provate ad esempio questo link, &lt;a href=&#34;#ZgotmplZ&#34;&gt;ftp://ftp.debian.org/debian/&lt;/a&gt;), mentre i servizi cloud hanno reso sempre inutile mettere su un server FTP per condividere grossi file con colleghi ed amici (un vecchio classico: mettere a disposizione le foto di qualche manifestazione o festa).&lt;/p&gt;&#xA;&lt;p&gt;Ma ci sono casi in cui può ancora servire, in particolare se vogliamo trasferire file di grosse dimensioni, meglio ancora intere directory, oppure se sviluppiamo siti e applicazioni web e vogliamo poter sincronizzare facilmente le modifiche effettuate sul nostro computer con un server remoto.&lt;/p&gt;&#xA;&lt;p&gt;Sia FTP che SFTP sono presenti in tutti i sistemi Unix come applicazioni da riga di comando. Il Mac non fa eccezione: i programmi &lt;code&gt;ftp&lt;/code&gt; e &lt;code&gt;sftp&lt;/code&gt; sono installati di default in macOS/OS X e possono essere usati dal Terminale.&lt;/p&gt;&#xA;&lt;p&gt;Ma anche un appassionato del Terminale come me si rende conto che  per gestire i file un&amp;rsquo;interfaccia grafica è  in tanti casi molto più comoda di una a riga di comando.&lt;/p&gt;&#xA;&lt;p&gt;Per fortuna sul Mac i programmi grafici per FTP/SFTP non mancano di certo e tanti implementano anche protocolli meno diffusi ma altrettanto utili come &lt;code&gt;rsync&lt;/code&gt;, per mantenere sincronizzati singoli file e intere directory su due o più computer senza dover usare un servizio cloud, o &lt;code&gt;WebDAV&lt;/code&gt;, che permette di modificare file remoti tramite il comune protocollo &lt;code&gt;http&lt;/code&gt; utilizzato dai browser web.&lt;/p&gt;&#xA;&lt;p&gt;Negli anni ne ho usati parecchi, sia i pesi massimi commerciali &lt;a href=&#34;http://www.binarynights.com/forklift/&#34;&gt;ForkLift&lt;/a&gt; e &lt;a href=&#34;http://www.panic.com/transmit/&#34;&gt;Transmit&lt;/a&gt; che l&amp;rsquo;open source &lt;a href=&#34;https://cyberduck.io/&#34;&gt;CyberDuck&lt;/a&gt;, che per tanto tempo è stato il mio preferito e che poteva essere usato anche dal Terminale. Ho provato brevemente &lt;a href=&#34;http://fivedetails.com/flow/&#34;&gt;Flow&lt;/a&gt; e pure &lt;a href=&#34;http://www.rbrowser.com/&#34;&gt;RBrowser&lt;/a&gt; e &lt;a href=&#34;http://fetchsoftworks.com/fetch/&#34;&gt;Fetch&lt;/a&gt;, i cui siti web hanno ormai un aspetto &lt;em&gt;vintage&lt;/em&gt;, ma ormai da tempo uso solo &lt;a href=&#34;http://www.yummysoftware.com/&#34;&gt;Yummy FTP Pro&lt;/a&gt;, che secondo me ha il miglior equilibrio fra potenza e facilità d&amp;rsquo;uso.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://melabit.files.wordpress.com/2016/12/yummy_ftp_pro_opening.png&#34;&gt;&lt;img src=&#34;https://melabit.files.wordpress.com/2016/12/yummy_ftp_pro_opening.png&#34; alt=&#34;Schermata di apertura di Yummy FTP Pro&#34; class=&#34;aligncenter&#34; /&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Il pannello di configurazione può mettere in soggezione, ma le opzioni di default sono scelte con molta cura ed in genere non è necessario modificarle. Dopo anni di uso credo di aver cambiato solo la directory su cui salvare i file trasferiti. Allo stesso tempo, il fatto di poter configurare il programma in modo così dettagliato può permettere di risolvere i casi più &lt;em&gt;difficili&lt;/em&gt; senza penare troppo.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://melabit.files.wordpress.com/2016/12/yummy_ftp_pro_configuration.png&#34;&gt;&lt;img src=&#34;https://melabit.files.wordpress.com/2016/12/yummy_ftp_pro_configuration.png&#34; alt=&#34;Pannello di configurazione di Yummy FTP Pro&#34; class=&#34;aligncenter&#34; /&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Comodissima è anche la possibilità di salvare i &lt;em&gt;bookmark&lt;/em&gt; dei server a cui si accede più spesso, con tutte le opzioni di connessione relative, e di sincronizzarli fra tutti i Mac tramite Dropbox, iCloud Drive o Google Drive.&lt;/p&gt;&#xA;&lt;p&gt;In questi giorni &lt;a href=&#34;https://itunes.apple.com/app/yummy-ftp/id492068728&#34;&gt;Yummi FTP Pro&lt;/a&gt; ha un prezzo imbattibile sull&amp;rsquo;App Store, costa praticamente quanto un caffé e cornetto. Fatevi un favore e non fatevelo sfuggire. Anche se non usate spesso FTP/SFTP, a questo prezzo è una applicazione che non può mancare sul vostro Mac.&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>Auguri dal Terminale</title>
      <link>https://static.233.196.69.159.clients.your-server.de/it/2016/12/25/auguri-dal-terminale/</link>
      <pubDate>Sun, 25 Dec 2016 00:00:00 +0000</pubDate>
      <guid>https://static.233.196.69.159.clients.your-server.de/it/2016/12/25/auguri-dal-terminale/</guid>
      <description>&lt;pre style=&#34;font-size:60%; font-weight: bold; color:yellow; background-color:black; text-align:left; white-space:pre;&#34;&gt;&#xA;&#xA;  ########    ###    ##    ## ######## ####       ###    ##     ##  ######   ##     ## ########  ####  &#xA;     ##      ## ##   ###   ##    ##     ##       ## ##   ##     ## ##    ##  ##     ## ##     ##  ##   &#xA;     ##     ##   ##  ####  ##    ##     ##      ##   ##  ##     ## ##        ##     ## ##     ##  ##   &#xA;     ##    ##     ## ## ## ##    ##     ##     ##     ## ##     ## ##   #### ##     ## ########   ##   &#xA;     ##    ######### ##  ####    ##     ##     ######### ##     ## ##    ##  ##     ## ##   ##    ##   &#xA;     ##    ##     ## ##   ###    ##     ##     ##     ## ##     ## ##    ##  ##     ## ##    ##   ##   &#xA;     ##    ##     ## ##    ##    ##    ####    ##     ##  #######   ######    #######  ##     ## ####  &#xA;  &#xA;  ########  ######## ########     ##     ## ##    ##  #######   &#xA;  ##     ## ##       ##     ##    ##     ## ###   ## ##     ##  &#xA;  ##     ## ##       ##     ##    ##     ## ####  ## ##     ##  &#xA;  ########  ######   ########     ##     ## ## ## ## ##     ##  &#xA;  ##        ##       ##   ##      ##     ## ##  #### ##     ##  &#xA;  ##        ##       ##    ##     ##     ## ##   ### ##     ##  &#xA;  ##        ######## ##     ##     #######  ##    ##  #######   &#xA;  &#xA;   ######  ########  ##       ######## ##    ## ########  #### ########   #######   &#xA;  ##    ## ##     ## ##       ##       ###   ## ##     ##  ##  ##     ## ##     ##  &#xA;  ##       ##     ## ##       ##       ####  ## ##     ##  ##  ##     ## ##     ##  &#xA;   ######  ########  ##       ######   ## ## ## ##     ##  ##  ##     ## ##     ##  &#xA;        ## ##        ##       ##       ##  #### ##     ##  ##  ##     ## ##     ##  &#xA;  ##    ## ##        ##       ##       ##   ### ##     ##  ##  ##     ## ##     ##  &#xA;   ######  ##        ######## ######## ##    ## ########  #### ########   #######   &#xA;  &#xA;  ##    ##    ###    ########    ###    ##       ######## ####  &#xA;  ###   ##   ## ##      ##      ## ##   ##       ##       ####  &#xA;  ####  ##  ##   ##     ##     ##   ##  ##       ##       ####  &#xA;  ## ## ## ##     ##    ##    ##     ## ##       ######    ##   &#xA;  ##  #### #########    ##    ######### ##       ##             &#xA;  ##   ### ##     ##    ##    ##     ## ##       ##       ####  &#xA;  ##    ## ##     ##    ##    ##     ## ######## ######## ####  &#xA;&#xA;&lt;/pre&gt;&#xA;</description>
    </item>
  </channel>
</rss>
