<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Bash on Melabit</title>
    <link>https://static.233.196.69.159.clients.your-server.de/it/tags/bash/</link>
    <description>Recent content in Bash on Melabit</description>
    <generator>Hugo</generator>
    <language>it</language>
    <lastBuildDate>Tue, 16 May 2023 06:00:00 +0000</lastBuildDate>
    <atom:link href="https://static.233.196.69.159.clients.your-server.de/it/tags/bash/index.xml" rel="self" type="application/rss+xml" />
    <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>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>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>Compleanno con permessi</title>
      <link>https://static.233.196.69.159.clients.your-server.de/it/2016/12/18/compleanno-con-permessi/</link>
      <pubDate>Sun, 18 Dec 2016 06:00:00 +0000</pubDate>
      <guid>https://static.233.196.69.159.clients.your-server.de/it/2016/12/18/compleanno-con-permessi/</guid>
      <description>&lt;p&gt;Oggi &lt;a href=&#34;https://melabit.wordpress.com/&#34;&gt;melabit&lt;/a&gt; compie tre anni. Per l&amp;rsquo;occasione ho chiesto all&amp;rsquo;amico Lux il permesso di ripubblicare un mio vecchio intervento sul suo (bellissimo) blog &lt;a href=&#34;http://web.archive.org/web/20120102191652/http://www.macworld.it/ping&#34;&gt;Ping&lt;/a&gt;, chiuso purtroppo con la cessazione della pubblicazione dell&amp;rsquo;edizione italiana di Macworld.&lt;/p&gt;&#xA;&lt;p&gt;Perché pubblicare di nuovo questo articolo dopo più di sei anni?&lt;/p&gt;&#xA;&lt;p&gt;Innanzi tutto perché quello che c&amp;rsquo;è scritto è ancora attuale e, come ha scritto a suo tempo Lux con il suo stile inimitabile, può essere utile per &amp;ldquo;&lt;em&gt;avvicinarsi agli incantesimi Unix che danno vita al mondo magico di Mac OS X&lt;/em&gt;&amp;rdquo;, una cosa a cui tengo sempre moltissimo. Magari oggi &lt;a href=&#34;https://melabit.wordpress.com/2015/04/28/automatizzare-il-mac-dal-terminale-ancora-launchd/&#34;&gt;proporrei di usare sul Mac&lt;/a&gt; &lt;code&gt;launchd&lt;/code&gt; al posto di &lt;code&gt;cron&lt;/code&gt;, anche se quest&amp;rsquo;ultimo rimane la soluzione più generica, valida su un qualunque sistema Unix.&lt;/p&gt;&#xA;&lt;p&gt;C&amp;rsquo;è poi un motivo più personale: proprio dopo questo intervento ho cominciato a pensare che tenere un blog non fosse un&amp;rsquo;idea proprio fuori dal mondo. Ci ho messo un po&amp;rsquo; (come sempre!) a realizzarla, ma dopo tre anni devo ammettere che è stata un&amp;rsquo;ottima decisione, le soddisfazioni non sono mancate.&lt;/p&gt;&#xA;&lt;h4 id=&#34;introduzione&#34;&gt;Introduzione&lt;/h4&gt;&#xA;&lt;p&gt;L&amp;rsquo;articolo rispondeva all&amp;rsquo;esigenza di un lettore di Ping di cambiare automaticamente i permessi di determinati tipi di file contenuti in una cartella del Mac. Cosa ci può essere di meglio del Terminale per fare queste cose?&lt;/p&gt;&#xA;&lt;p&gt;Ho lasciato praticamente inalterato il testo originale, limitandomi a correggere alcune imprecisioni e ad aggiungere qualche dettaglio qui e là.&lt;/p&gt;&#xA;&lt;h4 id=&#34;me-li-do-io-i-permessi&#34;&gt;Me li do io i permessi&lt;/h4&gt;&#xA;&lt;p&gt;&lt;strong&gt;Premessa #1&lt;/strong&gt;: il Terminale in Mac OS X si trova in &lt;code&gt;Applicazioni &amp;amp;#062; Utility&lt;/code&gt;. Una volta lanciato può essere configurato in molti modi (tramite le Preferenze) perdendo quell’aspetto un po&amp;rsquo; triste e troppo serioso che spaventa l’utente normale.&lt;/p&gt;&#xA;&lt;p&gt;Dopo l&amp;rsquo;avvio, il Terminale presenta il cosiddetto &lt;em&gt;prompt&lt;/em&gt;, che su OS X mostra tipicamente il nome del computer, la cartella dove ci si trova e il nome dell’utente. L’ultimo carattere del prompt è normalmente il &lt;code&gt;$&lt;/code&gt;. Nel Terminale i comandi vengono inseriti dopo il simbolo &lt;code&gt;$&lt;/code&gt; su quella che viene definita la &lt;em&gt;riga di comando&lt;/em&gt; e si eseguono premendo il tasto &lt;code&gt;Invio&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Il Terminale di OS X esegue di default la cosiddetta &lt;a href=&#34;https://tiswww.case.edu/php/chet/bash/bashref.html#Introduction&#34;&gt;&lt;em&gt;shell&lt;/em&gt; &lt;code&gt;bash&lt;/code&gt;&lt;/a&gt;, uno strumento potentissimo per interagire con il sistema operativo. La shell &lt;code&gt;bash&lt;/code&gt; può essere usata direttamente, scrivendo i comandi uno ad uno sulla riga di comando e leggendone il risultato direttamente nel Terminale.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://melabit.files.wordpress.com/2016/12/terminal.png&#34;&gt;&lt;img src=&#34;https://melabit.files.wordpress.com/2016/12/terminal.png&#34; alt=&#34;Il Terminale di OS X&#34; class=&#34;aligncenter&#34; /&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Oppure si possono scrivere degli &lt;code&gt;script&lt;/code&gt;, piccoli programmi nel linguaggio di &lt;code&gt;bash&lt;/code&gt; nei quali si inseriscono in sequenza i comandi da far eseguire alla shell, che si dimostrano molto utili per automatizzare delle operazioni che eseguiamo ripetutamente sul Mac.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Premessa #2&lt;/strong&gt;: perché usare i comandi di &lt;code&gt;bash&lt;/code&gt; invece di Automator o di AppleScript? Beh, innanzitutto perché &lt;code&gt;bash&lt;/code&gt; è multipiattaforma e quindi funziona su Linux e, volendo, anche su Windows. E poi semplicemente perché &lt;code&gt;bash&lt;/code&gt; mi piace!&lt;/p&gt;&#xA;&lt;p&gt;Lanciamo quindi il Terminale (magari configurandolo prima, io consiglio almeno di aumentare le dimensioni della finestra a circa 100×40 per stare comodi e di scegliere un tema grafico più accattivante di quello bianco e un po&amp;rsquo; spento di default) e iniziamo a lavorare.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://melabit.files.wordpress.com/2016/12/bash_profiles.png&#34;&gt;&lt;img src=&#34;https://melabit.files.wordpress.com/2016/12/bash_profiles.png&#34; alt=&#34;Configurazione di bash&#34; class=&#34;aligncenter&#34; /&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Creiamo innanzi tutto una cartella &lt;code&gt;~/bin&lt;/code&gt;, dove il carattere &lt;code&gt;~&lt;/code&gt; (tilde, ALT+5) indica per convenzione sui sistemi basati su Unix la cartella &lt;code&gt;Inizio&lt;/code&gt; (detta anche &lt;code&gt;Home&lt;/code&gt;) dell’utente che sta usando il computer in questo momento. Per farlo da Terminale, digitiamo (ATTENZIONE, come già detto &lt;code&gt;$&lt;/code&gt; indica solo l’ultimo carattere del prompt e &lt;strong&gt;NON&lt;/strong&gt; va mai inserito nei comandi seguenti):&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ cd&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ mkdir bin&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ chflags hidden bin&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ cd bin&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Il primo comando serve per essere sicuri di partire dalla &lt;code&gt;Home&lt;/code&gt;, il secondo crea una nuova cartella &lt;code&gt;bin&lt;/code&gt; nella &lt;code&gt;Home&lt;/code&gt;, il terzo la nasconde al Finder e l’ultimo comando ci fa spostare nella cartella &lt;code&gt;bin&lt;/code&gt; appena creata.&lt;/p&gt;&#xA;&lt;p&gt;In teoria siamo liberi di salvare i nostri comandi &lt;code&gt;bash&lt;/code&gt; in una qualunque cartella del Mac e possiamo anche usarne una già esistente. Ma usare la cartella &lt;code&gt;bin&lt;/code&gt; nella nostra &lt;code&gt;Home&lt;/code&gt; rispetta le convenzioni dei sistemi Unix e mi sembra preferibile.&lt;/p&gt;&#xA;&lt;p&gt;A questo punto usiamo &lt;code&gt;nano&lt;/code&gt; (un editor testuale molto semplice installato di default sul Mac) per editare lo &lt;em&gt;script&lt;/em&gt; &lt;code&gt;bash&lt;/code&gt; &lt;code&gt;cambia_permessi&lt;/code&gt;, nel quale inseriremo i comandi veri e propri che ci servono per cambiare i permessi dei file contenuti nella cartella nella quale verrà eseguito lo script:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ nano cambia_permessi&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Non preoccupatevi per l’interfaccia un po&amp;rsquo; ostica di &lt;code&gt;nano&lt;/code&gt;, qui ci basta usare solo due comandi, &lt;code&gt;CTRL+O&lt;/code&gt; per salvare il file editato e &lt;code&gt;CTRL+X&lt;/code&gt; per uscire da nano. Dimenticavo: &lt;code&gt;CTRL+O&lt;/code&gt; significa premere contemporaneamente il tasto &lt;code&gt;CTRL&lt;/code&gt;, l’ultimo in basso a sinistra sulle tastiere Mac (nei portatili è a fianco di fn), e il tasto &lt;code&gt;O&lt;/code&gt;. Analogamente per &lt;code&gt;CTRL+X&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Torniamo al nostro file &lt;code&gt;cambia_permessi&lt;/code&gt;. A questo punto bisognerebbe copiare a mano le linee mostrate qui sotto. Ma OS X è furbo e il copia e incolla funziona anche nella finestra del Terminale, per cui è sufficiente selezionare tutte le linee mostrate qui sotto, copiarle e poi incollarle nella finestra del Terminale dove è attivo &lt;code&gt;nano&lt;/code&gt;:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;#!/bin/bash&#xA;#&#xA;DIR=~/scansioni/&#xA;FILES=*&#xA;PERM=u+rw&#xA;#&#xA;if [ -d $DIR ]; then&#xA;&#x9;cd $DIR&#xA;&#x9;chmod -R $PERM $FILES&#xA;&#x9;cd&#xA;fi&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Salviamo lo script premendo &lt;code&gt;CTRL+O&lt;/code&gt; ed usciamo da &lt;code&gt;nano&lt;/code&gt; con &lt;code&gt;CTRL+X&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Cosa significano questi comandi? Il più importante è &lt;code&gt;chmod&lt;/code&gt;, che cambia i permessi di tutti i file contenuti nella cartella ``~/scansioni/` in modo che siano leggibili e scrivibili dall&amp;rsquo;utente attuale del Mac. Il resto è solo roba di contorno.&lt;/p&gt;&#xA;&lt;p&gt;Quello che è ancora più importante è che lo script è totalmente parametrico: basta cambiare i valori di &lt;code&gt;DIR&lt;/code&gt;, &lt;code&gt;FILES&lt;/code&gt; e &lt;code&gt;PERM&lt;/code&gt; per adattarlo alle proprie esigenze.&lt;/p&gt;&#xA;&lt;p&gt;Per esempio, se la cartella &lt;code&gt;~/scansioni/&lt;/code&gt; contenesse vari tipi di file e si volessero cambiare i permessi dei soli file &lt;code&gt;pdf&lt;/code&gt; lasciando gli altri file invariati, la riga &lt;code&gt;FILES=*&lt;/code&gt; diventerebbe &lt;code&gt;FILES=*.pdf&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Non è finita. Controlliamo prima di tutto di avere veramente fatto tutto bene con il comando:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ cat cambia_permessi&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;che dovrebbe mostrare sullo schermo lo script appena inserito.&lt;/p&gt;&#xA;&lt;p&gt;Per semplificarci la vita, rendiamo lo script eseguibile con il comando:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ chmod u+x cambia_permessi&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Bisogna notare che con questo comando abbiamo reso eseguibile lo script solo per l’utente attuale del Mac. I motivi li tralascio per brevità, ma credetemi, è decisamente meglio fare così.&lt;/p&gt;&#xA;&lt;p&gt;Un ultimo passo necessario. In questo momento, per cambiare i permessi dei file nella cartella &lt;code&gt;~/scansioni/&lt;/code&gt; bisogna eseguire a mano il comando dal Terminale:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ ~/bin/cambia_permessi&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;(anche se, per come è configurato di default OS X, usare soltanto &lt;code&gt;$ cambia_permessi&lt;/code&gt;, senza scrivere esplicitamente il percorso dove è salvato lo script basta e avanza).&lt;/p&gt;&#xA;&lt;p&gt;Ciò è sicuramente molto più comodo di cambiare uno ad uno i permessi dei file, ma si può fare di meglio.&lt;/p&gt;&#xA;&lt;p&gt;Qui entra in gioco &lt;code&gt;cron&lt;/code&gt;, uno strumento che esegue dei comandi stabiliti dall’utente a intervalli di tempo predefiniti. Sembra una cosa un po&amp;rsquo; cretina, ma in realtà permette di far fare al computer un mare di cose automaticamente. Purtoppo la sintassi di cron è orrenda. E questo post sta diventando troppo lungo.&lt;/p&gt;&#xA;&lt;p&gt;Cercherò di sintetizzare ma se qualcuno è interessato posso scrivere qualcosa in proposito. (Nel frattempo l&amp;rsquo;ho fatto, chi fosse interessato può leggere questo &lt;a href=&#34;https://melabit.wordpress.com/2014/11/22/automatizzare-il-mac-dal-terminale-sua-maesta-cron/&#34;&gt;articolo dettagliato su cron&lt;/a&gt;.)&lt;/p&gt;&#xA;&lt;p&gt;Diciamo che vogliamo che ogni cinque minuti lo script &lt;code&gt;cambia_permessi&lt;/code&gt; venga eseguito automaticamente. Dal solito Terminale dobbiamo allora eseguire i comandi:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ export EDITOR&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;/usr/bin/nano&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ crontab -e&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;La prima riga serve ad evitare di usare l’editor preimpostato, &lt;code&gt;vi&lt;/code&gt;, vn vero reperto archeologico che sarebbe bene dimenticare una volta per tutte. Dovrebbe invece aprirsi il solito &lt;code&gt;nano&lt;/code&gt;, in cui dobbiamo incollare &lt;strong&gt;esattamente&lt;/strong&gt; la riga seguente:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;*/5 * * * * ~/bin/cambia_permessi&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;(prima e dopo ciascun asterisco è presente una tabulazione), eventualmente aggiungendola in coda ai comandi già presenti.&lt;/p&gt;&#xA;&lt;p&gt;Salviamo con &lt;code&gt;CTRL+O&lt;/code&gt; e usciamo da &lt;code&gt;crontab&lt;/code&gt; con &lt;code&gt;CTRL+X&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Ovviamente se vogliamo che lo script venga eseguito più o meno frequentemente, basta cambiare il valore &lt;code&gt;*/5&lt;/code&gt; in, diciamo, &lt;code&gt;*/2&lt;/code&gt; o &lt;code&gt;*/15&lt;/code&gt; (per eseguire lo script ogni 2 o 15 minuti). Per casi più complicati &lt;a href=&#34;https://melabit.wordpress.com/2014/11/22/automatizzare-il-mac-dal-terminale-sua-maesta-cron/&#34;&gt;basta leggere qui&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Abbiamo finito. Sembra complicato, ma credetemi, è molto più lungo da leggere (e da scrivere!) che da mettere in pratica.&lt;/p&gt;&#xA;&lt;h4 id=&#34;nota-finale&#34;&gt;Nota finale&lt;/h4&gt;&#xA;&lt;p&gt;Per chi ha paura del Terminale e soprattutto di &lt;code&gt;cron&lt;/code&gt;, un programma potente ma, bisogna ammetterlo, ben poco &lt;em&gt;user-friendly&lt;/em&gt;, ecco una soluzione aggiuntiva, farina di Lux.&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Aggiungo solo una piccola nota per gli inesperti di Terminale che si scontrano con &lt;code&gt;cron&lt;/code&gt; (e, su Snow Leopard, con &lt;code&gt;launchd&lt;/code&gt;). Una scorciatoia artigianale consiste nel definire un evento ricorrente dentro iCal e, nelle informazioni relative, stabilire che in occasione dell’evento va eseguito uno script.&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;Molto pratica se si ha bisogno di ripetere uno &lt;em&gt;script&lt;/em&gt; una o due volte al giorno al massimo, in tutti gli altri casi temo che finirebbe per riempire all&amp;rsquo;inverosimile il proprio Calendario, con conseguenze che francamente mi sfuggono.&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>Duecento</title>
      <link>https://static.233.196.69.159.clients.your-server.de/it/2016/07/05/duecento/</link>
      <pubDate>Tue, 05 Jul 2016 06:00:00 +0000</pubDate>
      <guid>https://static.233.196.69.159.clients.your-server.de/it/2016/07/05/duecento/</guid>
      <description>&lt;p&gt;Con il post di sabato scorso siamo arrivati a 200. Due anni e mezzo di melabit e duecento post, in media uno ogni quattro giorni e mezzo. Non male, se si considerano i tanti impegni di ogni giorno, che mi impediscono di dare una periodicità più serrata al blog.&lt;/p&gt;&#xA;&lt;p&gt;Poiché questo in fondo è un blog dedicato alla programmazione e ai sistemi operativi (anche se me ne dimentico spesso), invece di celebrare l&amp;rsquo;evento preferisco prendere la palla al balzo e descrivere alcuni semplici comandi di Terminale, che userò per fare una piccola analisi dei post scritti finora.&lt;/p&gt;&#xA;&lt;p&gt;Lancio il Terminale (chi segue con continuità il blog dovrebbe sapere come fare, per gli altri il Terminale si trova in Applicazioni &amp;gt; Utility) e mi sposto nella cartella (&lt;em&gt;directory&lt;/em&gt;) che contiene tutti i miei post,&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ cd ~/cartella/del/blog/&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Per prima cosa voglio controllare di aver scritto veramente 200 post.&lt;/p&gt;&#xA;&lt;p&gt;Sin dall&amp;rsquo;inizio ho deciso di usare per i nomi dei file sorgenti dei post il formato &lt;code&gt;anno-mese-giorno-titolo-separato-da-trattini.md&lt;/code&gt;, dove &lt;code&gt;anno-mese-giorno&lt;/code&gt; indica la data di pubblicazione, ad esempio &lt;code&gt;2016-07-05&lt;/code&gt; per questo post, e &lt;code&gt;.md&lt;/code&gt; è l&amp;rsquo;estensione standard dei documenti scritti in &lt;a href=&#34;https://lwn.net/Articles/610884/&#34;&gt;Markdown&lt;/a&gt;, il linguaggio di formattazione per il web che uso per scrivere questi post. La cartella contiene altri file e cartelle, ma solo i post completi hanno il nome in questo formato. Per contare i post contenuti nella cartella mi basta quindi eseguire il comando,&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ ls 20*.md | wc&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;che con &lt;code&gt;ls&lt;/code&gt; (&lt;em&gt;list&lt;/em&gt;) elenca tutti i file il cui nome inizia con il secolo corrente e termina con il suffisso &lt;code&gt;.md&lt;/code&gt;. L&amp;rsquo;output di &lt;code&gt;ls&lt;/code&gt; viene inviato tramite il simbolo &lt;code&gt;|&lt;/code&gt; (&lt;em&gt;pipe&lt;/em&gt;) ad un ulteriore comando del Terminale (in realtà della shell &lt;code&gt;bash&lt;/code&gt;, ma oggi non voglio essere troppo pignolo), &lt;code&gt;wc&lt;/code&gt; (&lt;em&gt;word count&lt;/em&gt;), che conta il numero di linee, parole e caratteri (e volendo anche di byte) di un file o, come in questo caso, dell&amp;rsquo;output del comando precedente.&lt;/p&gt;&#xA;&lt;p&gt;La risposta del Terminale è&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;201     202    8704&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;dove il primo numero rappresenta il numero di linee dell&amp;rsquo;output di &lt;code&gt;ls&lt;/code&gt;, cioè il numero dei file elencati da &lt;code&gt;ls&lt;/code&gt;  che rispettano le specifiche stabilite dal comando (e di conseguenza il numero dei post).&lt;/p&gt;&#xA;&lt;p&gt;Il Terminale quindi mi dice che finora ho scritto 201 post. &lt;em&gt;201&lt;/em&gt;? Certo, i post sono 201 perché nella lista c&amp;rsquo;è anche &lt;em&gt;questo post&lt;/em&gt; (potrei fare in modo da non considerarlo, ma renderebbe tutto inutilmente più complicato).&lt;/p&gt;&#xA;&lt;p&gt;C&amp;rsquo;è però un dettaglio che non torna. Il secondo numero, 202, indica il numero di parole dell&amp;rsquo;output di &lt;code&gt;ls&lt;/code&gt;. Poichè, come già notato, il nome dei file è nel formato &lt;code&gt;anno-mese-giorno-titolo-separato-da-trattini.md&lt;/code&gt;, che per &lt;code&gt;wc&lt;/code&gt; equivale ad una parola singola, i primi due numeri restituiti da &lt;code&gt;wc&lt;/code&gt; dovrebbero essere identici. Se il Terminale indica che c&amp;rsquo;è una parola in più, significa che uno dei file contiene nel nome (per sbaglio) uno spazio al posto del trattino.&lt;/p&gt;&#xA;&lt;p&gt;Per cercare il file in questione, eseguo questa volta&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ ls 20*.md | grep &amp;quot; &amp;quot;&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;inviando l&amp;rsquo;output di &lt;code&gt;ls&lt;/code&gt; a &lt;code&gt;grep&lt;/code&gt;, uno dei tool più importanti del Terminale, che serve per cercare una o più stringhe di testo in un file. Normalmente la ricerca viene effettuata usando una &lt;a href=&#34;http://regexone.com/&#34;&gt;espressione regolare&lt;/a&gt;, ma in questo caso è più che sufficiente limitarsi a cercare la presenza di un semplice spazio nell&amp;rsquo;output di &lt;code&gt;ls&lt;/code&gt;. La risposta è,&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ 2015-12-23-first-draft-la prova.md&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;dove manca effettivamente il trattino fra &amp;ldquo;la&amp;rdquo; e &amp;ldquo;prova&amp;rdquo;. Correggo subito, eseguo di nuovo&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ ls 20*.md | wc&#xA;     201     201    8704&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;e questa volta ottengo il risultato che mi aspetto.&lt;/p&gt;&#xA;&lt;p&gt;Ora che ci siamo &lt;em&gt;scaldati&lt;/em&gt;, proviamo qualcosa di più divertente. Voglio sapere quante parole in tutto ho scritto finora in questi famosi 200 post. Facile, basta sostituire ad &lt;code&gt;ls&lt;/code&gt; il comando &lt;code&gt;cat&lt;/code&gt; (&lt;em&gt;concatenate&lt;/em&gt;), che stampa sul Terminale il contenuto dei file indicati dopo il comando. Eseguendo&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ cat 20*.md&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;non faccio altro che stampare sullo schermo uno dietro l&amp;rsquo;altro il contenuto di tutti i file dei post. La stampa dei file è velocissima, ma scrollando all&amp;rsquo;indietro nel Terminale si può verificare che ci sono veramente tutti. Se volessi potrei usare &lt;code&gt;less&lt;/code&gt;,&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ cat 20*.md | less&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;per stampare i file riempiendo una pagina alla volta del Terminale (e potendo anche tornare indietro). Ma non mi interessa, preferisco inviare l&amp;rsquo;output di &lt;code&gt;cat&lt;/code&gt; a &lt;code&gt;wc&lt;/code&gt;,&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ cat 20*.md | wc&#xA;   10639  113141  836099&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;da cui risulta che i 200 (anzi 201) post scritti finora sono composti in tutto da 10639 linee (che equivalgono in pratica ai paragrafi, separati fra loro da un a capo) e da ben 113141 parole.&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;Ogni post è quindi composto in media da&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ echo &amp;quot;113183 / 200&amp;quot; | bc&#xA;565&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;ben 565 parole.&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt; Per calcolare la media ho usato &lt;code&gt;bc&lt;/code&gt;, la calcolatrice integrata nel Terminale, un oggetto poco conosciuto ma a volte molto comodo. Anche in questo caso ho utilizzato il &lt;em&gt;pipe&lt;/em&gt; (&lt;code&gt;|&lt;/code&gt;) per inviare alla calcolatrice l&amp;rsquo;outupt di &lt;code&gt;echo&lt;/code&gt;, il comando che stampa su schermo la stringa (o le stringhe) che lo segue. Volendo avrei anche potuto usare &lt;code&gt;bc&lt;/code&gt; in modo interattivo,&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ bc&#xA;bc 1.06&#xA;Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc.&#xA;...&#xA;113183 / 200&#xA;565&#xA;quit&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Il risultato non è precisissimo, ogni file dei post ha anche una intestazione che non compare su Wordpress e che contiene titolo, data, categoria e tag, e così via. E poi non bisogna dimenticare che c&amp;rsquo;è di mezzo anche questo 201-esimo post, che è già ben più lungo di 565 parole. Ma insomma, ad occhio dovremmo essere più o meno sulle 520-530 parole &lt;em&gt;effettive&lt;/em&gt; per post.&lt;/p&gt;&#xA;&lt;p&gt;Ma c&amp;rsquo;è modo di vedere quante parole ci sono in ciascuno dei post? Certo, basta racchiudere i comandi precedenti in un ciclo &lt;code&gt;for&lt;/code&gt;,&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ for i in `ls 20*.md`; do echo $i; cat $i | wc -w; done&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;dove &lt;code&gt;i&lt;/code&gt; è l&amp;rsquo;indice del ciclo &lt;code&gt;for&lt;/code&gt;, a cui viene associato di volta in volta uno dei nomi di file stampati da &lt;code&gt;ls&lt;/code&gt;. Nel corpo del ciclo &lt;code&gt;do... done&lt;/code&gt;, per ogni valore di &lt;code&gt;$i&lt;/code&gt; (in bash, ogni volta che si &lt;em&gt;usa&lt;/em&gt; una variabile, le si antepone il &lt;code&gt;$&lt;/code&gt;), si stampa con &lt;code&gt;echo $i&lt;/code&gt; prima il valore della variabile (cioè il nome del file), poi si usa &lt;code&gt; cat $i | wc -w&lt;/code&gt; per stampare il contenuto del file e inviarlo al &lt;em&gt;contatore&lt;/em&gt; &lt;code&gt;wc&lt;/code&gt;. L&amp;rsquo;opzione &lt;code&gt;-w&lt;/code&gt; (&lt;em&gt;word&lt;/em&gt;) di &lt;code&gt;wc&lt;/code&gt; serve per contare solo le parole. Eseguendo il ciclo ottengo&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ for i in `ls 20*.md`; do echo $i; cat $i | wc -w; done&#xA;2013-12-18-il-migliore-spot.md&#xA;     238&#xA;2013-12-18-melabit-il-blog.md&#xA;     497&#xA;2013-12-19-una-pinta-di-tablet.md&#xA;     346&#xA;2013-12-20-la-dogana.md&#xA;     165&#xA;2013-12-21-rinominare-i-file-con-il-terminale.md&#xA;     669&#xA;...&#xA;2016-05-24-rapidweaver-7-in-anteprima.md&#xA;     729&#xA;2016-05-27-cartellino-rosso-su-facebook.md&#xA;    1385&#xA;2016-05-28-la-matematica-di-facebook.md&#xA;     356&#xA;2016-06-05-playlist-per-bora-bora-brian-boru.md&#xA;     278&#xA;2016-07-02-da-latex-a-word-e-ritorno.md&#xA;    2278&#xA;2016-07-05-duecento.md&#xA;     987&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Per analizzare i dati è più comodo salvare la lista su un file, facendo in modo che il titolo del post e il conteggio delle parole stiano sulla stessa linea.&lt;/p&gt;&#xA;&lt;p&gt;Facile, per salvare l&amp;rsquo;output di un comando di Terminale su un file si usa il simbolo &lt;code&gt;&amp;amp;#62;&lt;/code&gt; seguito dal nome del file (&lt;a href=&#34;https://www.freebsd.org/doc/it/books/unix-introduction/special-features-file-redir.html&#34;&gt;ricapitolando&lt;/a&gt;, il simbolo &lt;code&gt;|&lt;/code&gt; invia l&amp;rsquo;output di un comando ad un altro comando, mentre il simbolo &lt;code&gt;&amp;amp;#62;&lt;/code&gt; lo invia ad un file). Per stampare titolo e conteggio sulla stessa linea, è sufficiente aggiungere al comando &lt;code&gt;echo&lt;/code&gt; l&amp;rsquo;opzione &lt;code&gt;-n&lt;/code&gt; (&lt;em&gt;no newline&lt;/em&gt;).&lt;/p&gt;&#xA;&lt;p&gt;Eseguendo il comando così modificato,&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ for i in `ls 20*.md`; do echo -n $i; cat $i | wc -w; done &amp;amp;#62; ~/Desktop/words.dat&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;compare sul Desktop il file &lt;code&gt;words.dat&lt;/code&gt;, le cui prime 5 righe sono,&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ head -5 ~/Desktop/words.dat&#xA;2013-12-18-il-migliore-spot.md     238&#xA;2013-12-18-melabit-il-blog.md     497&#xA;2013-12-19-una-pinta-di-tablet.md     346&#xA;2013-12-20-la-dogana.md     165&#xA;2013-12-21-rinominare-i-file-con-il-terminale.md     669&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;esattamente come richiesto. Partendo da questi dati, è facile calcolare la distribuzione del numero di post in funzione del numero di parole,&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://melabit.files.wordpress.com/2016/07/words.png&#34;&gt;&lt;img src=&#34;https://melabit.files.wordpress.com/2016/07/words.png&#34; alt=&#34;Distribuzione del numero di post in funzione del numero di parole&#34; width=&#34;600&#34; height=&#34;432&#34; class=&#34;aligncenter size-full wp-image-2645&#34; /&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;da cui è evidente che quasi la metà dei post contiene non più di 300 parole.&lt;/p&gt;&#xA;&lt;p&gt;Più specificatamente, si trova che la mediana è uguale a 346, che significa che metà dei post contiene meno di 346 parole e l&amp;rsquo;altra metà ne contiene di più. Forse non sono poi così prolisso come ho sempre pensato.&lt;/p&gt;&#xA;&lt;p&gt;Domanda (facoltativa): Perché c&amp;rsquo;è questa grossa differenza fra la media e la mediana del numero di parole che compongono i miei post?&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;Si noti che se l&amp;rsquo;output di un comando che stampa qualcosa sul Terminale viene inviato ad un altro comando per un&amp;rsquo;ulteriore elaborazione, l&amp;rsquo;output stesso viene &lt;em&gt;risucchiato&lt;/em&gt; dal secondo comando e non compare più sullo schermo.&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;Forse sono troppo prolisso, 565 equivalgono a più di una pagina (densa) di un libro di formato medio-grande.&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>Automatizzare il Mac dal Terminale - Sua maestà cron</title>
      <link>https://static.233.196.69.159.clients.your-server.de/it/2014/11/22/automatizzare-il-mac-dal-terminale-sua-maesta-cron/</link>
      <pubDate>Sat, 22 Nov 2014 06:00:00 +0000</pubDate>
      <guid>https://static.233.196.69.159.clients.your-server.de/it/2014/11/22/automatizzare-il-mac-dal-terminale-sua-maesta-cron/</guid>
      <description>&lt;p&gt;Nella &lt;a href=&#34;https://melabit.wordpress.com/2014/11/06/automatizzare-il-mac-dal-terminale-il-comando-at/&#34;&gt;prima parte di questa serie&lt;/a&gt; abbiamo visto come usare il comando &lt;code&gt;at&lt;/code&gt; per automatizzare determinate attività sul Mac dal Terminale.&lt;/p&gt;&#xA;&lt;p&gt;At è utile ogni volta che si vuole eseguire un comando automaticamente una sola volta e in un momento ben definito&lt;/p&gt;&#xA;&lt;p&gt;Ma at ha anche parecchi limiti e non è adatto a svolgere una attività periodica in modo trasparente, come richiesto da Lucio Bragagnolo nel &lt;a href=&#34;http://macintelligence.org/blog/2014/10/11/facciamo-finta-che/&#34;&gt;post da cui ha preso spunto questa serie&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;h4 id=&#34;un-demone-chiamato-cron&#34;&gt;Un demone chiamato cron&lt;/h4&gt;&#xA;&lt;p&gt;Lo strumento più adatto a questo scopo è &lt;code&gt;cron&lt;/code&gt;, il cui nome deriva dal greco &lt;code&gt;chronos&lt;/code&gt; (tempo). Cron permette di eseguire comandi singoli o &lt;a href=&#34;https://melabit.wordpress.com/2014/11/06/script-di-shell-in-os-x/&#34;&gt;interi script&lt;/a&gt;, in modo automatico ad una data e ora stabilita, con una precisione che arriva fino al minuto.&lt;/p&gt;&#xA;&lt;p&gt;Cron è nel gergo di Unix un &lt;code&gt;demone&lt;/code&gt;, un comando eseguito automaticamente all&amp;rsquo;avvio di OS X (o di Linux) che rimane sempre attivo in sottofondo e agisce senza necessità di alcun intervento da parte dell&amp;rsquo;utente.&#xA;Cron si attiva ogni minuto ed esegue (quando serve) i comandi contenuti nel file &lt;code&gt;crontab&lt;/code&gt; di configurazione.&lt;/p&gt;&#xA;&lt;p&gt;Ogni utente del Mac ha a disposizione un proprio file crontab, ma esiste anche un file crontab di sistema gestito dall&amp;rsquo;amministratore, normalmente il primo utente creato al momento della installazione di OS X. I file crontab degli utenti sono contenuti nella directory &lt;code&gt;/usr/lib/cron/tabs/&lt;/code&gt; e si chiamano con il &lt;a href=&#34;http://www.macitynet.it/modificare-il-nome-dellaccount-utente-di-os-x-o-della-cartella-inizio/&#34;&gt;nome account (o nome breve) dell&amp;rsquo;utente&lt;/a&gt;, quello di sistema è &lt;code&gt;/etc/crontab&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Non c&amp;rsquo;è bisogno di precipitarsi a controllare, nelle nuove versioni di OS X il file &lt;code&gt;/etc/crontab&lt;/code&gt; non esiste più, come vedremo la prossima volta.&lt;/p&gt;&#xA;&lt;p&gt;Dal Terminale, si può visualizzare il contenuto del proprio file crontab con il comando&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ crontab -l&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;mentre per modificarlo bisogna &lt;em&gt;necessariamente&lt;/em&gt; usare&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ crontab -e&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;e mai un editor di testo (cosa fra l&amp;rsquo;altro impossibile senza essere amministratore del Mac).&lt;/p&gt;&#xA;&lt;p&gt;Infine il comando per cancellare il proprio file crontab è&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ crontab -r&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;h4 id=&#34;comè-fatto-crontab&#34;&gt;Com&amp;rsquo;è fatto crontab&lt;/h4&gt;&#xA;&lt;p&gt;Ma come è fatto un file crontab? È piuttosto semplice: un file crontab è composto da una o più righe contenenti ciascuna sei campi (colonne) separati da spazi&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;*&#x9;*&#x9;*&#x9;*&#x9;*&#x9;comando&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Nei primi cinque campi si inseriscono le indicazioni di data ed ora, sostituendole agli asterischi, nell&amp;rsquo;ultimo campo il comando o il nome dello script da eseguire. Ad esempio,&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;05&#x9;*&#x9;*&#x9;*&#x9;*&#x9;echo &amp;quot;Tanti saluti da cron!&amp;quot;&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;stamperà sul Terminale al quinto minuto di ogni ora la stringa &amp;ldquo;Tanti saluti da cron!&amp;rdquo;&lt;/p&gt;&#xA;&lt;p&gt;In realtà sul Terminale non viene mai stampato nulla. Infatti, &lt;a href=&#34;https://melabit.wordpress.com/2014/11/06/automatizzare-il-mac-dal-terminale-il-comando-at/&#34;&gt;analogamente ad  at&lt;/a&gt;, ogni volta che cron esegue un comando definito nel file crontab di un utente, provvede ad inviargli una email con l&amp;rsquo;output completo generato dal comando stesso, email che può essere letta dal Terminale con (chi ci avrebbe mai pensato!) &lt;code&gt;mail&lt;/code&gt;.&#xA;La ragione è semplice: cron potrebbe agire dietro le quinte per mesi od anni, effettuando azioni periodiche come il backup in rete di determinate directory o la pulizia del sistema da certi file inutili. È più razionale inviare all&amp;rsquo;utente interessato una email che gli permetta di controllare, quando ne ha tempo e voglia, che tutto vada bene, invece di disturbarlo periodicamente mentre sta usando il Terminale con l&amp;rsquo;output delle azioni eseguite da cron.&lt;/p&gt;&#xA;&lt;p&gt;Per disabilitare l&amp;rsquo;invio della email mandando l&amp;rsquo;output del comando eseguito da cron sul file &lt;code&gt;output.txt&lt;/code&gt; sul Desktop, si può utilizzare la tecnica standard di Unix di redirezione dell&amp;rsquo;output&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;&lt;pre&gt;&#xA;05&#x9;*&#x9;*&#x9;*&#x9;*&#x9;echo &amp;ldquo;Tanti saluti da cron!&amp;rdquo; &amp;raquo; ~/Desktop/output.txt&#xA;&lt;/pre&gt;&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;dove il simbolo &lt;code&gt;&amp;raquo;&lt;/code&gt; aggiunge l&amp;rsquo;output del comando eseguito da cron alla fine del file &lt;code&gt;output.txt&lt;/code&gt; (usando un solo &lt;code&gt;&amp;gt;&lt;/code&gt; si sovrascrive ogni volta il contenuto precedente del file).&lt;/p&gt;&#xA;&lt;h4 id=&#34;data-e-ora-in-cron&#34;&gt;Data e ora in cron&lt;/h4&gt;&#xA;&lt;p&gt;Rimane da definire come sono codificate le indicazioni della data e dell&amp;rsquo;ora a cui eseguire cron. Non è molto difficile, almeno se ci si limita ai casi più comuni. La figura seguente mostra il significato dei campi del file crontab.&lt;/p&gt;&#xA;&lt;p&gt;[caption id=&amp;ldquo;attachment_1418&amp;rdquo; align=&amp;ldquo;aligncenter&amp;rdquo; width=&amp;ldquo;500&amp;rdquo;]&lt;img src=&#34;https://melabit.files.wordpress.com/2014/11/cron1.png&#34; alt=&#34;Significato dei campi di una riga del file crontab.&#34; width=&#34;500&#34; /&gt; Significato dei campi di una riga del file crontab.[/caption]&lt;/p&gt;&#xA;&lt;p&gt;Quindi per eseguire un comando al quindicesimo minuto di ogni ora bisogna inserire la riga&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;15&#x9;*&#x9;*&#x9;*&#x9;*&#x9;comando&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;mentre per farlo alle 2:00 di ogni lunedì&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;00&#x9;02&#x9;*&#x9;*&#x9;1&#x9;comando&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Alcuni simboli permettono di specificare dei valori multipli in un campo. Il trattino &amp;ldquo;-&amp;rdquo; indica un intervallo, per cui la riga&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;30 07&#x9;*&#x9;*&#x9;1-5&#x9;comando&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;esegue il comando alle 7:30 dal lunedì al venerdì.&lt;/p&gt;&#xA;&lt;p&gt;La virgola &amp;ldquo;,&amp;rdquo; indica una lista di valori. Quindi&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;00&#x9;08&#x9;1,15,30&#x9;&#x9;*&#x9;*&#x9;comando&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;esegue il comando specificato il giorno 1, 15 e 30 di ogni mese.&lt;/p&gt;&#xA;&lt;p&gt;L&amp;rsquo;asterisco equivale a selezionare tutti i valori consentiti per il campo a cui si riferisce. Una riga come questa&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;*&#x9;*&#x9;*&#x9;*&#x9;*&#x9;echo &amp;quot;Tanti saluti da cron!&amp;quot;&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;istruisce cron ad eseguire il comando &lt;code&gt;echo &amp;quot;Tanti saluti da cron!&amp;quot;&lt;/code&gt; una volta al minuto e per sempre!&lt;/p&gt;&#xA;&lt;p&gt;Infine la barra &amp;ldquo;/&amp;rdquo; indica l&amp;rsquo;incremento del campo numerico, per cui&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;*&#x9;*/3&#x9;*&#x9;*&#x9;*&#x9;echo &amp;quot;Tanti saluti da cron!&amp;quot;&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;equivale a far eseguire il comando ogni 3 ore.&lt;/p&gt;&#xA;&lt;p&gt;Tutto qui. Ci sono delle finezze ulteriori, ma chi fosse interessato può leggere qualche articolo specifico su cron, come &lt;a href=&#34;http://en.wikipedia.org/wiki/Cron&#34;&gt;questa pagina su Wikipedia&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;, o &lt;a href=&#34;https://help.ubuntu.com/community/CronHowto&#34;&gt;questo tutorial molto dettagliato&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;h4 id=&#34;cron-online&#34;&gt;Cron online&lt;/h4&gt;&#xA;&lt;p&gt;Per i più pigri esiste un servizio online che &lt;a href=&#34;http://crontab-generator.org/&#34;&gt;genera automaticamente la riga del file crontab&lt;/a&gt; corrispondente alle date e ore specificate tramite l&amp;rsquo;interfaccia web. Ma si fa prima ad imparare la sintassi di cron che ad orientarsi nella miriade di opzioni del servizio.&lt;/p&gt;&#xA;&lt;p&gt;Molto più utile mi sembra il &lt;a href=&#34;http://www.cronsandbox.com/&#34;&gt;Cron Sandbox&lt;/a&gt;, un altro servizio online che consente di verificare che la lista di date e ore generate da una particolare riga del file crontab corrisponda a quanto ci si attende.&lt;/p&gt;&#xA;&lt;h4 id=&#34;al-lavoro&#34;&gt;Al lavoro&lt;/h4&gt;&#xA;&lt;p&gt;Se vogliamo usare il comando cron per &lt;a href=&#34;http://melabit.wordpress.com/2014/11/06/automatizzare-il-mac-dal-terminale-il-comando-at/&#34;&gt;eseguire lo script &lt;code&gt;~/bin/makeblog&lt;/code&gt;&lt;/a&gt; e rigenerare automaticamente il blog &amp;ldquo;Pazzi per la mela&amp;rdquo; alle 2:00 di ogni notte, dobbiamo inserire nel file crontab la riga&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;00&#x9;02&#x9;*&#x9;*&#x9;*&#x9;~/bin/makeblog&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;e dimenticarci subito dopo della sua stessa esistenza. Cron lavorerà per noi ogni notte, preciso ed instancabile senza infastidirci, a meno che non decidiamo di andare a controllare quello che sta combinando.&lt;/p&gt;&#xA;&lt;h4 id=&#34;e-lux&#34;&gt;E Lux?&lt;/h4&gt;&#xA;&lt;p&gt;Non mi sono dimenticato di Lux. &lt;a href=&#34;https://melabit.wordpress.com/2014/11/06/automatizzare-il-mac-dal-terminale-il-comando-at/&#34;&gt;Come già ricordato la volta scorsa&lt;/a&gt;, Lux vorrebbe poter scrivere i post &lt;a href=&#34;http://macintelligence.org&#34;&gt;del suo blog&lt;/a&gt; lasciando al sistema il compito di aggiornare i file html e di trasferirli sul server per la pubblicazione online. E vuole farlo indifferentemente dal Mac o dall&amp;rsquo;iPad (e perché no, anche dall&amp;rsquo;iPhone).&lt;/p&gt;&#xA;&lt;p&gt;Con cron è semplice. Basterà mettere la directory contenente i vari &lt;em&gt;pezzi&lt;/em&gt; del blog &lt;a href=&#34;http://octopress.org/&#34;&gt;Octopress&lt;/a&gt; dentro la cartella di &lt;a href=&#34;http://www.dropbox.com&#34;&gt;Dropbox&lt;/a&gt; del Mac &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; e creare lo script &lt;code&gt;makeblog&lt;/code&gt;, configurando cron in modo da eseguirlo automaticamente all&amp;rsquo;ora desiderata.&lt;/p&gt;&#xA;&lt;p&gt;Se Lux volesse poter aggiornare il blog quattro volte al giorno (esagerato!) alle ore 0, 6, 12 e 18, dovrebbe inserire in crontab la riga&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;00&#x9;*/6&#x9;*&#x9;*&#x9;*&#x9;~/bin/makeblog&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;oppure qualcosa di più &lt;em&gt;specifico&lt;/em&gt; come&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;30&#x9;1,5,12,19&#x9;*&#x9;*&#x9;*&#x9;~/bin/makeblog&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;adattando così gli orari di aggiornamento ai propri ritmi di lavoro.&lt;/p&gt;&#xA;&lt;p&gt;Ogni volta che Lux scrive un nuovo post con il Mac non dovrà fare altro che salvarlo nella directory &lt;em&gt;giusta&lt;/em&gt; della sua installazione di Octopress, né più né meno di come fa già ora. Se invece usa l&amp;rsquo;iPad o l&amp;rsquo;iPhone, deve solo ricordarsi di inviare il post a Dropbox, scegliendo la stessa directory che usa sul Mac.  Appena l&amp;rsquo;iPad si troverà connesso ad una rete, invierà il nuovo file a Dropbox, che lo spedirà a sua volta al Mac.&lt;/p&gt;&#xA;&lt;p&gt;Tutto automatico, senza Apple Script, Azioni Cartelle, e mal di testa.&lt;/p&gt;&#xA;&lt;h4 id=&#34;conclusioni&#34;&gt;Conclusioni&lt;/h4&gt;&#xA;&lt;p&gt;Con cron &lt;em&gt;the sky is the limit&lt;/em&gt;, o quasi. Io per anni ho fatto fare a cron il backup completo del contenuto di un sito web &lt;em&gt;professionale&lt;/em&gt;, contenente centinaia di documenti e di programmi da distribuire agli utenti registrati, e del relativo database MySQL. Una volta scritto lo script che eseguiva il backup vero e proprio (questa è stata la cosa veramente complicata, visto che volevo mantenere backup multipli orari, giornalieri e mensili), ho lasciato fare a cron e&amp;hellip; me ne sono letteralmente dimenticato.&lt;/p&gt;&#xA;&lt;p&gt;Ma non finisce qui. La prossima volta mi toccherà parlare di &lt;code&gt;launchd&lt;/code&gt;. Come potrei evitarlo, visto che questo blog è focalizzato (più o meno) sul Mac?&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;Poteva mai mancare un riferimento ad una pagina di Wikipedia? MA non è certo colpa mia se Wikipedia è una delle cose migliori del web e che tante pagine sono fatte veramente bene.&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;Si potrebbe anche &lt;a href=&#34;http://melabit.wordpress.com/2014/03/21/come-mettere-un-piolo-quadrato-in-un-buco-rotondo/&#34;&gt;usare un collegamento simbolico&lt;/a&gt; o un altro servizio di condivisione dei file, ma non generalizziamo troppo.&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>Automatizzare il Mac dal Terminale - Il comando at</title>
      <link>https://static.233.196.69.159.clients.your-server.de/it/2014/11/06/automatizzare-il-mac-dal-terminale-il-comando-at/</link>
      <pubDate>Thu, 06 Nov 2014 06:05:00 +0000</pubDate>
      <guid>https://static.233.196.69.159.clients.your-server.de/it/2014/11/06/automatizzare-il-mac-dal-terminale-il-comando-at/</guid>
      <description>&lt;p&gt;Qualche giorno fa Lucio &amp;ldquo;Lux&amp;rdquo; Bragagnolo ha pubblicato &lt;a href=&#34;http://macintelligence.org&#34;&gt;sul suo interessantissimo blog&lt;/a&gt; (da seguire assolutamente ogni giorno!), un post in cui poneva una domanda molto stimolante.&#xA;&lt;a href=&#34;http://macintelligence.org/blog/2014/10/11/facciamo-finta-che/&#34;&gt;Lascio a lui la parola&lt;/a&gt; per descrivere il problema:&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Octopress &amp;ndash; il motore di questo blog &amp;ndash; si basa su una cartella che risiede nel Mac. La cartella contiene sottocartelle varie che ospitano i pezzi del blog.  Pubblicare questo articolo significa creare un file e metterlo nella giusta cartella, per poi dare un comando di Terminale che genera una edizione aggiornata del blog e un altro comando di Terminale che deposita una copia dell’edizione dentro il server di pubblicazione.&lt;br&gt;&#xA;Spesso mi trovo a scrivere pezzi per il blog su iPad, lontano da Mac. Facciamo finta che il Mac rimanga irraggiungibile fisicamente per tutta la giornata. Qual è la strategia che richiede meno lavoro in assoluto per pubblicare il pezzo?&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;Detto in modo più generale, la domanda di Lux è:&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;quali strumenti possono essere usati sul Mac per automatizzare determinate attività nel modo più semplice e veloce possibile?&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;Nella discussione che è seguita sul blog il mio incontrollabile alter ego virtuale ha proposto velocemente due o tre possibili soluzioni, promettendo anche di approfondirle appena possibile.&lt;/p&gt;&#xA;&lt;p&gt;Credo che questo sia lo spazio migliore per farlo, tornando finalmente a discutere di argomenti connessi alla programmazione e alla amministrazione del Mac, dopo parecchio (troppo!) tempo dedicato a divagazioni più o meno lontane dal target principale del blog.&lt;/p&gt;&#xA;&lt;h4 id=&#34;introduzione&#34;&gt;Introduzione&lt;/h4&gt;&#xA;&lt;p&gt;Sul Mac sono disponibili diversi strumenti che permettono di automatizzare le operazioni effettuate sul sistema. Mi concentrerò qui sui comandi di derivazione Unix presenti di default in OS X, perché sono strumenti ben testati ed affidabili e sono utilizzabili anche su piattaforme diverse dal Mac.&lt;/p&gt;&#xA;&lt;p&gt;Avrei voluto concentrare la discussione in un unico post, ma mi sono accorto che raggiunto una lunghezza eccessiva e difficile da digerire in una sola volta.&lt;/p&gt;&#xA;&lt;p&gt;Ho deciso quindi di dividere la trattazione in più parti distinte. In questa prima parte mostrerò l&amp;rsquo;uso di &lt;code&gt;at&lt;/code&gt;, il comando più semplice disponibile su OS X per questo scopo.&lt;/p&gt;&#xA;&lt;p&gt;Nei prossimi post mostrerò l&amp;rsquo;utilizzo di strumenti più avanzati come &lt;code&gt;cron&lt;/code&gt; e &lt;code&gt;launchd&lt;/code&gt;. Cercherò poi di descrivere ulteriori prodotti di terze parti ed eventualmente anche una soluzione basata su Automator (ammesso che questa sia in grado di fare al meglio quanto richiesto, cosa di cui non sono troppo sicuro in questo momento).&lt;/p&gt;&#xA;&lt;p&gt;Per evitare di essere troppo vago cercherò di circoscrivere il problema, basandomi strettamente su quanto richiesto da Lux, ma provando anche a rendere facile l&amp;rsquo;estensione di quanto descritto a casi più generali.&lt;/p&gt;&#xA;&lt;h4 id=&#34;pazzi-per-la-mela&#34;&gt;Pazzi per la mela&lt;/h4&gt;&#xA;&lt;p&gt;Supponiamo di voler automatizzare la pubblicazioni dei nuovi post sul blog &amp;ldquo;Pazzi per la mela&amp;rdquo;, raggiungibile all&amp;rsquo;indirizzo IP &lt;a href=&#34;http://melabit.wordpress.com/pazzi-per-la-mela&#34;&gt;http://pazziperlamela.it&lt;/a&gt; (inutile cliccare sul link, il blog non esiste).&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://melabit.wordpress.com/pazzi-per-la-mela&#34;&gt;Pazzi per la mela&lt;/a&gt; utilizza &lt;a href=&#34;http://octopress.org&#34;&gt;Octopress&lt;/a&gt; per convertire i file di testo che costituiscono ciascun post in pagine html statiche, che devono essere poi copiate sul server remoto che gestisce il sito web del blog.&lt;/p&gt;&#xA;&lt;p&gt;Sul Mac, tutti i testi dei post e i file di configurazione del blog si trovano nella cartella &lt;code&gt;~/Documenti/pazziperlamela/&lt;/code&gt;, dove &lt;code&gt;~&lt;/code&gt; indica per convenzione la cartella &lt;code&gt;Inizio&lt;/code&gt; (o &lt;code&gt;home&lt;/code&gt;) dell&amp;rsquo;utente del Mac, identificata nel Finder dall&amp;rsquo;icona di una casetta.&lt;/p&gt;&#xA;&lt;p&gt;Ogni volta che si aggiungono nuovi post o si modificano quelli già esistenti, bisogna rigenerare le pagine html, eseguendo dal Terminale i comandi&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ cd Documenti/pazziperlamela/&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;per posizionarsi all&amp;rsquo;interno della cartella del blog, e poi&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ rake generate&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;per ricreare sul Mac le pagine html che costituiscono il sito web del blog. Un ulteriore comando&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ rake deploy&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://octopress.org/docs/deploying/rsync/&#34;&gt;sincronizza le pagine html modificate&lt;/a&gt; con il server remoto tramite &lt;a href=&#34;http://rsync.samba.org/&#34;&gt;&lt;code&gt;rsync&lt;/code&gt;&lt;/a&gt;, probabilmente il migliore strumento di sincronizzazione bidirezionale fra un server remoto e il sistema locale.&lt;/p&gt;&#xA;&lt;p&gt;Mettiamo insieme questi comandi creando un semplice &lt;a href=&#34;http://melabit.wordpress.com/2014/11/06/script-di-shell-in-os-x/&#34;&gt;script di shell&lt;/a&gt;,&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#75715e&#34;&gt;#!/bin/bash&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;cd ~/Documenti/pazziperlamela/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;rake generate&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;rake deploy&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;salviamolo in &lt;code&gt;~/bin&lt;/code&gt; con il nome &lt;code&gt;makeblog&lt;/code&gt; e rendiamolo eseguibile (le istruzioni dettagliate si trovano in &lt;a href=&#34;http://melabit.wordpress.com/2014/11/06/script-di-shell-in-os-x/&#34;&gt;Script di shell in OS X&lt;/a&gt;).&lt;/p&gt;&#xA;&lt;p&gt;E arriviamo finalmente alla parte centrale del post.&lt;/p&gt;&#xA;&lt;p&gt;Supponiamo di voler rigenerare automaticamente il blog &amp;ldquo;Pazzi per la mela&amp;rdquo; una volta al giorno, magari alle 2:00 di notte per evitare che troppi lettori siano collegati nel momento in cui vengono modificate le pagine del blog.&lt;/p&gt;&#xA;&lt;p&gt;Vediamo come farlo, usando il comando più semplice presente sul Mac&lt;/p&gt;&#xA;&lt;h4 id=&#34;un-comando-semplice-semplice&#34;&gt;Un comando semplice semplice&lt;/h4&gt;&#xA;&lt;p&gt;Lo strumento più semplice che possiamo usare sul Mac per automatizzare determinate operazioni è &lt;code&gt;at&lt;/code&gt;, che esegue uno o più comandi alla data e ora specificata. La sintassi di &lt;code&gt;at&lt;/code&gt; adatta a questo scopo è&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ at -f script -m ora data&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;dove &lt;code&gt;script&lt;/code&gt; è il nome dello &lt;a href=&#34;http://melabit.wordpress.com/2014/11/06/script-di-shell-in-os-x/&#34;&gt;script di shell&lt;/a&gt; contenente i comandi da eseguire, mentre ora e data possono essere specificate sia in modo assoluto, ad esempio &amp;ldquo;02:00&amp;rdquo; oppure &amp;ldquo;02:00 Nov 06&amp;rdquo; (senza virgolette), che in modo relativo, &amp;ldquo;now + 1 minute&amp;rdquo;, &amp;ldquo;tomorrow&amp;rdquo;.&lt;/p&gt;&#xA;&lt;p&gt;In alternativa si può specificare la data e l&amp;rsquo;ora in formato POSIX,&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ at -f comando -m -t YYYYMMDDhhmm&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;cioè scrivendola al contrario di come siamo abituati, iniziando dall&amp;rsquo;anno e finendo con i minuti. Qui YYYY indica l&amp;rsquo;anno, MM il numero del mese, DD il giorno, infine hh e mm l&amp;rsquo;ora e i minuti. Tutti gli elementi della data vanno inseriti usando due (o quattro) cifre e facendoli precedere eventualmente da uno zero. In questo formato, il 6 Novembre alle ore 2:00 diventa &amp;ldquo;201411060200&amp;rdquo;&lt;/p&gt;&#xA;&lt;p&gt;Per motivi che mi sfuggono, il comando &lt;code&gt;at&lt;/code&gt; è disabilitato di default in OS X. Per attivarlo bisogna eseguire da Terminale&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.atrun.plist&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;dopo di che il comando &lt;code&gt;at&lt;/code&gt; rimarrà disponibile anche riavviando il Mac.&lt;/p&gt;&#xA;&lt;p&gt;Si può ora utilizzare &lt;code&gt;at&lt;/code&gt; per eseguire automaticamente lo script di shell &lt;code&gt;makeblog&lt;/code&gt; all&amp;rsquo;ora desiderata, scrivendo nel Terminale&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ at -f ~/bin/makeblog -m 02:00 tomorrow&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Il Terminale (o meglio &lt;code&gt;bash&lt;/code&gt;) ci risponderà con l&amp;rsquo;indicazione della data e dell&amp;rsquo;ora completa alla quale verrà eseguito lo script. Dopo averlo completato, inoltre, &lt;code&gt;bash&lt;/code&gt; sarà tanto gentile da inviarci una email con l&amp;rsquo;output completo prodotto dallo script.&lt;/p&gt;&#xA;&lt;p&gt;A meno di non configurare opportunamente il servizio di posta elettronica &lt;em&gt;interno&lt;/em&gt; di OS X (una cosa che va ben oltre gli scopi di questo post), questa email però non riuscirà a raggiungere la nostra abituale casella di posta elettronica. Potrà però essere letta dal Terminale con il comando (poteva essere diversamente?) &lt;code&gt;mail&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;h4 id=&#34;troppo-semplice-per-essere-utile&#34;&gt;Troppo semplice per essere utile?&lt;/h4&gt;&#xA;&lt;p&gt;Purtroppo il comando &lt;code&gt;at&lt;/code&gt; non è adatto a soddisfare quanto richiesto da Lux.&lt;/p&gt;&#xA;&lt;p&gt;Infatti, dopo aver finito di scrivere un nuovo post, Lux dovrebbe comunque lanciare il Terminale e configurare &lt;code&gt;at&lt;/code&gt; in modo da fargli eseguire lo script &lt;code&gt;makeblog&lt;/code&gt; alle due della notte successiva. Se invece sta usando l&amp;rsquo;iPad, dovrebbe collegarsi tramite &lt;code&gt;ssh&lt;/code&gt; al Mac e fare la stessa cosa da remoto.&lt;/p&gt;&#xA;&lt;p&gt;Ma, avendo accesso al Terminale, e indipendentemente dal fatto che avvenga in locale o in remoto, è molto più semplice eseguire direttamente lo script &lt;code&gt;makeblog&lt;/code&gt;, senza complicarsi ulteriormente la vita.&lt;/p&gt;&#xA;&lt;p&gt;Quindi &lt;code&gt;at&lt;/code&gt; non serve a niente?&lt;/p&gt;&#xA;&lt;p&gt;Certo che &lt;code&gt;at&lt;/code&gt; serve (altrimenti che senso avrebbe avuto scrivere questo post?). Ma serve nei casi in cui si vuole eseguire una determinata attività sul Mac automaticamente e &lt;em&gt;una volta sola&lt;/em&gt;, mantenendo il pieno controllo del momento esatto in cui viene fatta partire.&lt;/p&gt;&#xA;&lt;p&gt;Se invece vogliamo eseguire un&amp;rsquo;attività periodicamente e quasi dimenticandocene, &lt;code&gt;at&lt;/code&gt; non serve e bisogna usare per forza di cose degli strumenti più avanzati.&lt;/p&gt;&#xA;&lt;h4 id=&#34;il-mio-incontro-con-at&#34;&gt;Il mio incontro con at&lt;/h4&gt;&#xA;&lt;p&gt;Sono sicuro di non aver mai usato finora &lt;code&gt;at&lt;/code&gt; su OS X, ma questo comando mi è stato utilissimo diversi anni fa, quando ho avuto accesso a delle favolose workstation Sun.&lt;/p&gt;&#xA;&lt;p&gt;All&amp;rsquo;epoca dovevo eseguire delle simulazioni che duravano parecchie ore. Un semplice PC era improponibile: non solo perché era troppo lento, ma anche perché c&amp;rsquo;era sempre qualcuno che, zelante, lo spegneva la sera passandoci davanti (nonostante tutti i cartelli di avviso che potevo mettere davanti al monitor).&lt;/p&gt;&#xA;&lt;p&gt;Un amico grande esperto di Unix (ho imparato i fondamenti da lui!) mi permise allora di usare le workstation Sun del laboratorio di elaborazione video che gestiva.&lt;/p&gt;&#xA;&lt;p&gt;Per ottimizzare l&amp;rsquo;uso delle macchine e non dare fastidio agli altri utenti, dovevo però lanciare le simulazioni di notte, quando i sistemi erano quasi inattivi. Passavo poi gran parte della giornata successiva a controllare e ad elaborare i dati prodotti durante la notte e a preparare i file di configurazione per le successive elaborazioni notturne.&lt;/p&gt;&#xA;&lt;p&gt;Questo ciclo, preparazione-calcolo-elaborazione, mi impediva di usare &lt;code&gt;cron&lt;/code&gt; (un comando che vedremo la prossima volta), che avrebbe eseguito ciecamente le simulazioni &lt;em&gt;ogni notte&lt;/em&gt; al momento stabilito, anche nei week-end o nei giorni in cui per qualche motivo non ero riuscito ad elaborare i dati.&lt;/p&gt;&#xA;&lt;p&gt;Invece &lt;code&gt;at&lt;/code&gt; era perfetto per questo scopo. Una volta completata la scrittura dei nuovi file di configurazione, li trasferivo tramite rete locale sulle Sun e configuravo &lt;code&gt;at&lt;/code&gt; in modo da eseguire un nuovo ciclo di simulazioni la notte successiva. Semplice e veloce.&lt;/p&gt;&#xA;&lt;h4 id=&#34;accessori-ma-sempre-utili&#34;&gt;Accessori ma sempre utili&lt;/h4&gt;&#xA;&lt;p&gt;Fra i comandi di supporto di &lt;code&gt;at&lt;/code&gt;, sono particolarmente utili &lt;code&gt;atq&lt;/code&gt;, che permette di elencare i comandi &lt;code&gt;at&lt;/code&gt; in attesa di essere eseguiti, e &lt;code&gt;atrm&lt;/code&gt; seguito da un numero intero, che cancella il comando &lt;code&gt;at&lt;/code&gt; in coda identificato dal numero intero associato. Ad esempio&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ atq&#xA;35&#x9;Thu Nov  6 02:00:00 2014&#xA;36&#x9;Thu Nov  6 06:00:00 2014&#xA;37&#x9;Sat Nov 15T12:15:00:00 2014&#xA;&#xA;$ atrm 36&#xA;$ atq&#xA;35&#x9;Thu Nov  6 02:00:00 2014&#xA;37&#x9;Sat Nov 15T12:15:00:00 2014&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Se si vuole disabilitare di nuovo &lt;code&gt;at&lt;/code&gt;, bisogna eseguire da Terminale&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.atrun.plist&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;h4 id=&#34;conclusioni&#34;&gt;Conclusioni&lt;/h4&gt;&#xA;&lt;p&gt;In questo lungo post abbiamo visto il più semplice comando che può essere utilizzato per automatizzare determinate attività sul Mac.&#xA;Nel prossimo post affronteremo &lt;code&gt;cron&lt;/code&gt;, il re indiscusso degli strumenti adatti a questo scopo.&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>Script di shell in OS X</title>
      <link>https://static.233.196.69.159.clients.your-server.de/it/2014/11/06/script-di-shell-in-os-x/</link>
      <pubDate>Thu, 06 Nov 2014 06:00:00 +0000</pubDate>
      <guid>https://static.233.196.69.159.clients.your-server.de/it/2014/11/06/script-di-shell-in-os-x/</guid>
      <description>&lt;p&gt;Nei sistemi operativi basati su Unix la &lt;code&gt;shell&lt;/code&gt; è una applicazione che permette di eseguire i comandi del sistema tramite una interfaccia testuale a linea di comando.&lt;/p&gt;&#xA;&lt;p&gt;La shell più popolare oggi è &lt;a href=&#34;http://it.wikipedia.org/wiki/Bash&#34;&gt;bash&lt;/a&gt;,  acronimo di &amp;ldquo;Bourne-Again Shell&amp;rdquo;, un gioco di parole fra Stephen Bourne, l&amp;rsquo;autore della shell &lt;code&gt;sh&lt;/code&gt; da cui deriva bash, e il termine &amp;ldquo;born&amp;rdquo; (nato). Bash significa quindi sia &amp;ldquo;la nuova shell di Bourne&amp;rdquo; che &amp;ldquo;la shell rinata&amp;rdquo;.&lt;/p&gt;&#xA;&lt;p&gt;Bash è la &lt;a href=&#34;http://www.gnu.org/software/bash/&#34;&gt;shell ufficiale del progetto GNU&lt;/a&gt;, ed è da tempo la shell di default in praticamente tutte le distribuzioni di Linux oltre che in OS X.&#xA;Per accedere a bash in OS X si utilizza il Terminale, una applicazione di cui si è già parlato più volte in questo blog. Il Terminale si trova in &lt;code&gt;Applicazioni&lt;/code&gt; &amp;gt; &lt;code&gt;Utility&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Bash permette di eseguire i comandi del sistema operativa sia in modo interattivo, scrivendoli uno alla volta sulla linea di comando, che tramite uno &lt;code&gt;script di shell&lt;/code&gt; (&lt;code&gt;shell script&lt;/code&gt;), un vero e proprio programma all&amp;rsquo;interno del quale è possibile usare variabili, strutture di controllo e funzioni, esattamente come in tutti i linguaggi di programmazione.&lt;/p&gt;&#xA;&lt;p&gt;Uno script di shell ben fatto può diventare quindi un vero e proprio comando specializzato, eseguibile dalla linea di comando e praticamente indistinguibile dai comandi intrinseci del sistema.&lt;/p&gt;&#xA;&lt;p&gt;Ma come si crea uno script di shell? Basta seguire alcune semplici regole.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Innanzi tutto lo script va scritto usando un editor, mai un wordprocessor come Word o Pages. Lo script deve infatti essere un semplice file di testo e non deve contenere i codici di formattazione o i caratteri speciali inseriti normalmente dai programmi di videoscrittura.&lt;br&gt;&#xA;Come editor si può usare TextEdit, preinstallato in tutte le versioni di OS X, ma vanno ancora meglio programmi gratuiti, come &lt;a href=&#34;http://www.barebones.com/products/textwrangler/&#34;&gt;TextWrangler&lt;/a&gt;, &lt;a href=&#34;http://macromates.com/&#34;&gt;TextMate 2.0&lt;/a&gt;, &lt;a href=&#34;http://brackets.io/&#34;&gt;Brackets&lt;/a&gt;, &lt;a href=&#34;https://atom.io/&#34;&gt;Atom&lt;/a&gt;, o commerciali, come il mostro sacro &lt;a href=&#34;http://www.barebones.com/products/bbedit/&#34;&gt;BBEdit&lt;/a&gt; e &lt;a href=&#34;http://www.sublimetext.com/&#34;&gt;Sublime Text&lt;/a&gt;. Tutti questi editor hanno il grande vantaggio rispetto al semplice TextEdit di evidenziare i comandi di bash e di supportare l&amp;rsquo;autocompletamento delle parole chiave riconosciute dall&amp;rsquo;editor.&lt;br&gt;&#xA;Volendo si possono usare anche &lt;a href=&#34;https://code.google.com/p/macvim/&#34;&gt;macvim&lt;/a&gt; o &lt;a href=&#34;http://aquamacs.org/&#34;&gt;emacs&lt;/a&gt;, ma chi è in grado di usarli non ha bisogno di sicuro di leggere queste note.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Per permettere al sistema operativo di identificare il file come uno script per la shell bash, gli script devono iniziare con la riga&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;code&gt;&lt;pre&gt;&#xA;#!/bin/bash&#xA;&lt;/pre&gt;&lt;/code&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;È buona regola salvare tutti i propri script in una cartella (&lt;code&gt;directory&lt;/code&gt;) comune, in modo che siano facilmente rintracciabili dal sistema operativo (ma dopo un po&amp;rsquo; di tempo anche da noi stessi!)&lt;br&gt;&#xA;Per uniformarci alle convenzioni di Unix, creiamo una directory &lt;code&gt;bin&lt;/code&gt; nella nostra cartella &lt;code&gt;Inizio&lt;/code&gt; (o directory &lt;code&gt;home&lt;/code&gt;), dove salveremo tutti gli script.&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&#xA;Lanciamo il Terminale ed eseguiamo i comandi&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;code&gt;&lt;pre&gt;&#xA;$ cd ~&#xA;$ mkdir bin&#xA;&lt;/pre&gt;&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;dove il simbolo &lt;code&gt;~&lt;/code&gt; indica per convenzione la cartella &lt;code&gt;home&lt;/code&gt; dell&amp;rsquo;utente.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Lo script deve essere reso eseguibile direttamente con il comando&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;code&gt;&lt;pre&gt;&#xA;$ chmod u+x scriptname &lt;br&gt;&#xA;&lt;/pre&gt;&lt;/code&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Aiutiamo il sistema operativo a trovare facilmente i nostri script aggiungendo la directory &lt;code&gt;bin&lt;/code&gt; appena creata alla variabile di ambiente &lt;code&gt;PATH&lt;/code&gt;, che definisce le directory dove il sistema operativo va a cercare i comandi del sistema. Torniamo al Terminale ed eseguiamo in sequenza i comandi&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;code&gt;&lt;pre&gt;&#xA;cp -p .bashrc .bashrc.ORIGINAL&#xA;echo &amp;ldquo;export PATH=~/bin:$PATH&amp;rdquo; &amp;raquo; .bashrc&#xA;&lt;/pre&gt;&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;Il primo comando duplica il file &lt;code&gt;.bashrc&lt;/code&gt; originale, mentre il secondo aggiunge la riga contenuta fra virgolette alla fine del file &lt;code&gt;.bashrc&lt;/code&gt;.&#xA;Bisogna stare molto attenti ad usare &lt;strong&gt;due simboli di maggiore&lt;/strong&gt; nel secondo comando altrimenti si rischia di sovrascrivere &lt;code&gt;.bashrc&lt;/code&gt; con effetti potenzialmente disastrosi (questo è il motivo per cui è bene  prima duplicare il file &lt;code&gt;.bashrc&lt;/code&gt; originale).&lt;/p&gt;&#xA;&lt;p&gt;Una volta chiuso e rilanciato il Terminale, la cartella &lt;code&gt;~/bin&lt;/code&gt; sarà aggiunta alla lista delle directory contenenti i comandi eseguiti da bash.&lt;/p&gt;&#xA;&lt;p&gt;Bisogna notare che la creazione della directory &lt;code&gt;~/bin&lt;/code&gt; e la sua aggiunta al PATH del sistema vanno eseguiti una sola volta per ogni utente del Mac.&lt;/p&gt;&#xA;&lt;p&gt;Vorrei infine sfatare una credenza ormai obsoleta: non è assolutamente necessario che il nome dello script termini con l&amp;rsquo;estensione &lt;code&gt;.sh&lt;/code&gt;. È una vecchia abitudine che ha l&amp;rsquo;unico vantaggio di rendere immediatamente riconoscibile uno script salvato in una directory qualunque del sistema. Ma è una pratica inutile se si segue il consiglio di tenere tutti gli script di shell in una directory predefinita come &lt;code&gt;~/bin&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;&#xA;&lt;hr&gt;&#xA;&lt;ol&gt;&#xA;&lt;li id=&#34;fn:1&#34;&gt;&#xA;&lt;p&gt;La cartella &lt;code&gt;Inizio&lt;/code&gt; in OS X è quella identificata dall&amp;rsquo;icona di una casetta.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/div&gt;&#xA;</description>
    </item>
    <item>
      <title>Aggiornato bash... finalmente!</title>
      <link>https://static.233.196.69.159.clients.your-server.de/it/2014/10/01/aggiornato-bash-finalmente/</link>
      <pubDate>Wed, 01 Oct 2014 06:00:00 +0000</pubDate>
      <guid>https://static.233.196.69.159.clients.your-server.de/it/2014/10/01/aggiornato-bash-finalmente/</guid>
      <description>&lt;p&gt;Apple ha &lt;a href=&#34;http://osxdaily.com/2014/09/29/os-x-bash-update-1-0-shellshock-patch/&#34;&gt;finalmente rilasciato&lt;/a&gt; l&amp;rsquo;aggiornamento per bash, un componente fondamentale dei sistemi operativi derivati da Unix, fra cui c&amp;rsquo;è lo stesso OS X.&lt;/p&gt;&#xA;&lt;p&gt;La settimana scorsa  si è sparsa la notizia della &lt;a href=&#34;https://securityblog.redhat.com/2014/09/24/bash-specially-crafted-environment-variables-code-injection-attack/&#34;&gt;scoperta di questa gravissima falla di sicurezza&lt;/a&gt; nella &lt;code&gt;shell&lt;/code&gt; bash, il componente software che interpreta ed esegue i comandi del Terminale, diventata ormai da anni la shell di default di OS X e di quasi tutte le distribuzioni di Linux.&lt;/p&gt;&#xA;&lt;p&gt;Per scoprire se il proprio sistema è affetto dalla falla (e se siete su OS X lo è di sicuro), basta lanciare il Terminale ed eseguire questo comando,&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ env x=&#39;() { :;}; echo vulnerable&#39; bash -c &amp;quot;echo this is a test&amp;quot;&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Se vengono stampate le due righe,&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;vulnerable&#xA;this is a test&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;la shell bash è affetto dalla vulnerabilità.&lt;/p&gt;&#xA;&lt;p&gt;Scaricando l&amp;rsquo;aggiornamento di bash dal sito di Apple (&lt;a href=&#34;http://support.apple.com/kb/DL1769&#34;&gt;quello di Mavericks è qui&lt;/a&gt;, ma ci sono anche le versioni per &lt;a href=&#34;http://support.apple.com/kb/DL1768&#34;&gt;Mountain Lion&lt;/a&gt; e per &lt;a href=&#34;http://support.apple.com/kb/DL1767&#34;&gt;Lion&lt;/a&gt;) ed installandolo sul proprio sistema, ci vuole un minuto in tutto, si dovrebbe riuscire a appare questa falla.&lt;/p&gt;&#xA;&lt;p&gt;Dopo l&amp;rsquo;installazione, eseguendo di nuovo dal Terminale il comando di sopra si ottiene soltanto&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ env x=&#39;() { :;}; echo vulnerable&#39; bash -c &amp;quot;echo this is a test&amp;quot;&#xA;this is a test&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;È un bene che Apple abbia rilasciato l&amp;rsquo;aggiornamento. Ma bisogna anche aggiungere: finalmente.&lt;/p&gt;&#xA;&lt;p&gt;Avrebbe dovuto essere più veloce, non trincerarsi dietro la pretesa assurda che la vulnerabilità colpisce solo pochi utenti. Perché non è vero. Anche chi non sa nemmeno cosa sia il terminale può benissimo usare programmi che usano bash &lt;em&gt;dietro le quinte&lt;/em&gt;, ritrovandosi a rischio senza nemmeno sospettarlo.&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>I limiti di Wordpress.com: generatori di siti web statici</title>
      <link>https://static.233.196.69.159.clients.your-server.de/it/2014/08/09/i-limiti-di-wordpress-com-generatori-di-siti-web-statici/</link>
      <pubDate>Sat, 09 Aug 2014 06:00:00 +0000</pubDate>
      <guid>https://static.233.196.69.159.clients.your-server.de/it/2014/08/09/i-limiti-di-wordpress-com-generatori-di-siti-web-statici/</guid>
      <description>&lt;p&gt;Come ho già scritto qualche giorno fa, ci sono letteralmente decine di &lt;a href=&#34;http://melabit.wordpress.com/2014/08/06/i-limiti-di-wordpress-com-una-nuova-piattaforma-per-il-blog/&#34;&gt;generatori di siti web statici&lt;/a&gt;, quasi quante sono le distribuzioni di Linux. Io nei miei bookmark ne ho una trentina.&lt;/p&gt;&#xA;&lt;p&gt;Come orientarsi in questa moltitudine?&lt;/p&gt;&#xA;&lt;p&gt;Per le distribuzioni di Linux esiste &lt;a href=&#34;http://distrowatch.com&#34;&gt;Distrowatch&lt;/a&gt;, un sito popolarissimo che cerca di classificarle tutte. Analogamente, esistono almeno due siti che cercano di elencare tutti i generatori di siti web statici: &lt;a href=&#34;https://www.staticgen.com/&#34;&gt;StaticGen&lt;/a&gt; e &lt;a href=&#34;http://staticsitegenerators.net/&#34;&gt;Static Site Generators&lt;/a&gt;.&#xA;L&amp;rsquo;approccio dei due è totalmente diverso anche se le informazioni riportate sono praticamente le stesse.&lt;/p&gt;&#xA;&lt;p&gt;Il primo ordina di default i generatori di siti statici in base alla popolarità, ma si possono applicare vari filtri basati sul linguaggio di programmazione, la valutazione degli utenti e persino gli &lt;em&gt;issue&lt;/em&gt;, i problemi riscontrati dagli utenti.&lt;/p&gt;&#xA;&lt;p&gt;L&amp;rsquo;altro è apparentemente una tabella ordinata alfabeticamente (in questo momento elenca ben 289 sistemi diversi!), ma cliccando sulle intestazioni si può ordinarla in base al linguaggio di programmazione, alla valutazione degli utenti o alla data in cui il sistema è stato aggiornato per l&amp;rsquo;ultima volta.&#xA;Quest&amp;rsquo;ultima è una informazione utilissima, se un sistema non è aggiornato da anni non vale la pena perderci tempo.&lt;/p&gt;&#xA;&lt;p&gt;Provando ad applicare un po&amp;rsquo; di filtri si copre che esiste perfino un generatore, &lt;a href=&#34;https://github.com/moebiuseye/skf&#34;&gt;StatiKiss Framework&lt;/a&gt;, basato su &lt;a href=&#34;http://www.gnu.org/software/bash/&#34;&gt;Bash&lt;/a&gt;, ma &lt;a href=&#34;http://skf.jeannedhack.org/&#34;&gt;il sito web ufficiale&lt;/a&gt; contenente la documentazione non risponde. In realtà esisteva un&amp;rsquo;altro sistema interessante basato su Bash, &lt;a href=&#34;http://nanoblogger.sourceforge.net/&#34;&gt;NanoBlogger&lt;/a&gt;, il cui sviluppo  è stato però sospeso all&amp;rsquo;inizio del 2013. Evidentemente Bash non va bene per sviluppare siti web.&lt;/p&gt;&#xA;&lt;p&gt;Si può trovare anche &lt;a href=&#34;https://github.com/nuex/zodiac&#34;&gt;Zodiac&lt;/a&gt;, un generatore di siti statici scritto in &lt;a href=&#34;http://en.wikipedia.org/wiki/AWK&#34;&gt;AWK&lt;/a&gt;, un linguaggio perfetto per la manipolazione di file di testo, sviluppato fra gli altri da &lt;a href=&#34;http://www.cs.princeton.edu/~bwk/&#34;&gt;Brian Kernighan&lt;/a&gt;, uno dei padri di Unix e del linguaggio C. A leggere il README Zodiac sembra semplice da usare, supporta markdown e la struttura delle directory in cui sono organizzati i documenti utilizzati per generare il sito è ragionevole.&#xA;Ma purtroppo la popolarità di Zodiac è scarsa, scarsissima. Si potrebbe di certo usare per un progetto personale e soprattutto per imparare, ma è impensabile volere sostituire Wordpress con qualcosa come Zodiac. A chi rivolgersi, dove cercare aiuto e documentazione se si volesse fare qualcosa di non previsto dal programmatore, ad esempio gestire un sistema di commenti?&lt;/p&gt;&#xA;&lt;p&gt;Fra i generatori di siti web statici ci sono persino due sistemi scritti in &lt;a href=&#34;http://www.microsoft.com/net&#34;&gt;.NET&lt;/a&gt;. Ma vogliamo farci veramente del male?&lt;/p&gt;&#xA;&lt;p&gt;Ma lasciamo perdere le curiosità. Quali sono invece i &lt;em&gt;top player&lt;/em&gt;? Quali sono i sistemi più popolari, più diffusi e, si spera, più affidabili? Facile, il primo in assoluto è &lt;a href=&#34;http://jekyllrb.com/&#34;&gt;Jekyll&lt;/a&gt;, un generatore sviluppato in &lt;a href=&#34;https://www.ruby-lang.org/en/&#34;&gt;Ruby&lt;/a&gt;, un linguaggio di programmazione che è più o meno la risposta giapponese a Python, molto diffuso per sviluppare applicazioni web.&#xA;Seguono &lt;a href=&#34;http://octopress.org/&#34;&gt;Octopress&lt;/a&gt; (un derivato &lt;em&gt;semplificato&lt;/em&gt; di Jekyll, il cui sviluppo però è fermo dal 2011), &lt;a href=&#34;http://blog.getpelican.com/&#34;&gt;Pelican&lt;/a&gt; in Python, &lt;a href=&#34;http://middlemanapp.com/&#34;&gt;Middleman&lt;/a&gt; ancora in Ruby e &lt;a href=&#34;http://hexo.io/&#34;&gt;Hexo&lt;/a&gt; in JavaScript.&lt;/p&gt;&#xA;&lt;p&gt;Ci sono comunque altri generatori interessanti, alcuni con nomi veramente curiosi, &lt;a href=&#34;http://ruhoh.com/&#34;&gt;Ruhoh&lt;/a&gt;, &lt;a href=&#34;http://hugo.spf13.com/&#34;&gt;Hugo&lt;/a&gt;, &lt;a href=&#34;http://picocms.org/&#34;&gt;Pico&lt;/a&gt;, &lt;a href=&#34;http://calepin.co/&#34;&gt;Calepin&lt;/a&gt;,  &lt;a href=&#34;http://www.droppages.com/&#34;&gt;DropPages&lt;/a&gt;, &lt;a href=&#34;https://pancake.io/&#34;&gt;Pancake&lt;/a&gt;, &lt;a href=&#34;http://anchorcms.com/&#34;&gt;Anchor CMS&lt;/a&gt;, &lt;a href=&#34;http://ringce.com/hyde&#34;&gt;Hyde&lt;/a&gt;, &lt;a href=&#34;https://sculpin.io/&#34;&gt;Sculpin&lt;/a&gt;, &lt;a href=&#34;http://www.htmly.com/&#34;&gt;HTMLy&lt;/a&gt;,&lt;a href=&#34;http://dropplets.com/&#34;&gt;Dropplets&lt;/a&gt;, &lt;a href=&#34;http://www.steve.org.uk/Software/chronicle/&#34;&gt;Chronicle&lt;/a&gt;. Esiste persino il venerabile (ha quasi 10 anni!) &lt;a href=&#34;http://www.dir2web.it/&#34;&gt;Dir2web&lt;/a&gt;, l&amp;rsquo;unico prodotto italiano che conosca.&lt;/p&gt;&#xA;&lt;p&gt;Non mancato anche i prodotti a pagamento come &lt;a href=&#34;http://getkirby.com/&#34;&gt;Kirby&lt;/a&gt; e &lt;a href=&#34;http://statamic.com/&#34;&gt;Statamic&lt;/a&gt;. O come &lt;a href=&#34;http://cactusformac.com/&#34;&gt;Cactus&lt;/a&gt;, che è pure specifico per il solo Mac.&lt;/p&gt;&#xA;&lt;p&gt;Per questi ultimi no grazie, il web nasce e deve rimanere multipiattaforma, sistemi sviluppati per uno specifico sistema operativo non mi vanno bene &lt;em&gt;a priori&lt;/em&gt;. E trovo pure irragionevole cercare di vendere questi prodotti: se devo pagare per Statamic, quanto dovrei dare agli sviluppatori di Apache? Sei uno sviluppatore e vuoi guadagnarci? Distribuisci gratis il prodotto, dimostra nei fatti che è buono, fai in modo che diventi il più popolare possibile e poi vendi il supporto. Cercare di vendere software come questi, che subiscono la concorrenza di sistemi equivalenti, gratuiti e di qualità analoga se non migliore, è veramente sciocco.&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>Amministratore pro tempore</title>
      <link>https://static.233.196.69.159.clients.your-server.de/it/2014/07/05/amministratore-pro-tempore/</link>
      <pubDate>Sat, 05 Jul 2014 06:00:00 +0000</pubDate>
      <guid>https://static.233.196.69.159.clients.your-server.de/it/2014/07/05/amministratore-pro-tempore/</guid>
      <description>&lt;p&gt;Qual&amp;rsquo;è la differenza fra semplice utente ed amministratore nei sistemi basati su Unix, come Linux o OS X? Non ho mai trovato una sintesi così perfetta come quella proposta dal &lt;a href=&#34;http://xkcd.com/149/&#34;&gt;geniale autore di xkcd&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;img src=&#34;http://imgs.xkcd.com/comics/sandwich.png&#34; width=&#34;360&#34; class=&#34;aligncenter&#34; /&gt;&#xA;&lt;p&gt;Il comando di terminale &lt;code&gt;sudo&lt;/code&gt; permette di diventare &amp;ndash; anche se solo temporaneamente &amp;ndash; l&amp;rsquo;amministratore (&lt;code&gt;root&lt;/code&gt;) onnipotente di un sistema Unix in grado persino, e senza ripensamenti, di cancellare completamente il contenuto del disco rigido.&lt;/p&gt;&#xA;&lt;p&gt;Un comando da usare con molta attenzione.&lt;/p&gt;&#xA;&lt;p&gt;Ma, guardando le cose al contrario, proprio la differenza rigida fra utente ed amministratore è uno dei fattori che rendono i sistemi basati su Unix molto più sicuri di Windows, in cui la differenza di ruoli è molto più sfumata e quasi (vedi XP) assente.&lt;/p&gt;&#xA;&lt;p&gt;Consentendo così a virus e &lt;em&gt;malware&lt;/em&gt; vario di scorrazzare liberamente nei meandri del disco rigido.&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>Sandboxing in iOS: usciamo dal recinto</title>
      <link>https://static.233.196.69.159.clients.your-server.de/it/2014/05/22/sandboxing-in-ios-usciamo-dal-recinto/</link>
      <pubDate>Thu, 22 May 2014 06:00:00 +0000</pubDate>
      <guid>https://static.233.196.69.159.clients.your-server.de/it/2014/05/22/sandboxing-in-ios-usciamo-dal-recinto/</guid>
      <description>&lt;img src=&#34;http://upload.wikimedia.org/wikipedia/commons/thumb/7/74/Sandpit.jpg/800px-Sandpit.jpg&#34; class=&#34;alignnone&#34; /&gt;&#xA;&lt;p&gt;Esiste una soluzione &lt;em&gt;semplice&lt;/em&gt; al &lt;a href=&#34;https://melabit.wordpress.com/2014/05/16/sandboxing-in-ios-un-recinto-troppo-stretto/&#34;&gt;problema del &lt;em&gt;sandboxing&lt;/em&gt; delle applicazioni per iOS&lt;/a&gt;, che non impatti sulla sicurezza del sistema ma che allo stesso tempo permetta a più applicazioni di aprire e modificare un dato documento, evitando inutili duplicazioni e, quel che è peggio, di dover tenere traccia delle modifiche effettuate da ciascuna applicazione?&lt;/p&gt;&#xA;&lt;p&gt;Soluzioni fattibili &amp;ndash; più o meno semplici e più o meno affidabili o sicure &amp;ndash; ce ne sono bizzeffe. Qui ne propongo una anch&amp;rsquo;io, che ha la caratteristica di sfruttare solo gli strumenti già esistenti in Unix e nei sistemi operativi derivati, fra cui anche iOS.&lt;/p&gt;&#xA;&lt;p&gt;Sia chiaro che non voglio sostituirmi agli ingegneri e ai programmatori della Apple, che conoscono molto meglio di me il sistema su cui lavorano. Quello che voglio è solo dare un contributo di principio e di dimostrarne la fattibilità pratica.&lt;/p&gt;&#xA;&lt;p&gt;L&amp;rsquo;eventuale (eventuale, non dimentichiamolo!) implementazione finale sarà di certo molto più brillante ed efficiente di questa.&lt;/p&gt;&#xA;&lt;p&gt;Per evitare ambiguità userò nel seguito un linguaggio standard, evitando le definizioni tipiche del mondo Apple: &lt;em&gt;directory&lt;/em&gt; al posto di &lt;em&gt;cartella&lt;/em&gt;, &lt;em&gt;file&lt;/em&gt; invece di &lt;em&gt;documento&lt;/em&gt;, &lt;em&gt;soft-link&lt;/em&gt; invece che &lt;em&gt;link simbolico&lt;/em&gt;, e ogni volta che mi riferirò a &lt;em&gt;Unix&lt;/em&gt; intenderò in effetti tutti sistemi operativi che derivano dalla base di Unix, come Linux, i vari BSD e ovviamente OS X e iOS.&lt;/p&gt;&#xA;&lt;h4 id=&#34;tutto-è-un-file&#34;&gt;Tutto è un file&lt;/h4&gt;&#xA;&lt;p&gt;Prima di proseguire il discorso bisogna ricordare alcuni concetti fondamentali sui file in Unix.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://en.wikipedia.org/wiki/Everything_is_a_file&#34;&gt;&lt;em&gt;Tutto è un file in Unix&lt;/em&gt;&lt;/a&gt;. Questo è uno dei primi mantra che si imparano quando ci si accosta a questo sistema operativo. Una directory è un file, persino la comunicazione fra i vari processi o con i dispositivi hardware avviene tramite file.&lt;/p&gt;&#xA;&lt;p&gt;Ma com&amp;rsquo;è fatto un file in Unix?&lt;/p&gt;&#xA;&lt;p&gt;Un file è composto da tre parti diverse e ben distinte fra loro: il &lt;em&gt;nome&lt;/em&gt; del file, il &lt;em&gt;contenuto&lt;/em&gt; del file e i &lt;em&gt;metadati&lt;/em&gt;, una serie di informazioni accessorie sul file che esamineremo meglio dopo.&lt;/p&gt;&#xA;&lt;img src=&#34;http://melabit.files.wordpress.com/2014/05/sandbox_2-1.png&#34; alt=&#34;File in Unix&#34; width=&#34;496&#34; height=&#34;379&#34; class=&#34;aligncenter size-full wp-image-946&#34; /&gt;&#xA;&lt;p&gt;Il contenuto del file è salvato in uno o più settori del disco rigido, i metadati sono memorizzati negli &lt;em&gt;inode&lt;/em&gt;, delle strutture dati create al momento della formattazione del disco rigido e numerate univocamente, e infine il nome del file si trova nella directory (anch&amp;rsquo;essa un file!) che lo contiene, in una tabella che associa ad ogni nome di file della directory il numero dell&amp;rsquo;inode in cui sono salvati i metadati corrispondenti.&lt;/p&gt;&#xA;&lt;img src=&#34;http://melabit.files.wordpress.com/2014/05/sandbox_2-2.png&#34; alt=&#34;Struttura di una directory&#34; width=&#34;588&#34; height=&#34;400&#34; class=&#34;aligncenter size-full wp-image-947&#34; /&gt;&#xA;&lt;p&gt;Ogni inode è una struttura dati (una specie di tabella un po&amp;rsquo; più complicata) contenente, fra l&amp;rsquo;altro, la dimensione del file, i permessi di accesso e di modifica, la data e l&amp;rsquo;ora in cui in cui il file è stato creato, modificato o semplicemente letto, i puntatori ai settori fisici del disco rigido in cui è salvato il contenuto vero e proprio del file ed infine, quello che ci interessa di più, un numero intero che serve a contare il numero di &lt;em&gt;copie&lt;/em&gt; (virtuali) del file stesso create tramite i cosiddetti &lt;em&gt;hard-link&lt;/em&gt;.&lt;/p&gt;&#xA;&lt;img src=&#34;http://melabit.files.wordpress.com/2014/05/sandbox_2-3.png?w=605&#34; alt=&#34;Struttura di un inode&#34; width=&#34;605&#34; height=&#34;306&#34; class=&#34;aligncenter size-large wp-image-948&#34; /&gt;&#xA;&lt;p&gt;Se a questo punto non vi gira già la testa potete continuare  a leggere&amp;hellip;&lt;/p&gt;&#xA;&lt;h4 id=&#34;hard-link-e-soft-link&#34;&gt;Hard-link e soft-link&lt;/h4&gt;&#xA;&lt;p&gt;In Unix è possibile riferirsi in modo indiretto ad un file mediante due diversi tipi di file: gli &lt;em&gt;hard-link&lt;/em&gt; e i &lt;em&gt;soft-link&lt;/em&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Dei soft-link &lt;a href=&#34;http://melabit.wordpress.com/2014/03/21/come-mettere-un-piolo-quadrato-in-un-buco-rotondo/&#34;&gt;ho già scritto in questo blog&lt;/a&gt;. Aggiungo che il soft-link crea un riferimento al &lt;em&gt;nome del file&lt;/em&gt;, e si usa principalmente per dare un nome diverso ad un file.&lt;/p&gt;&#xA;&lt;p&gt;Un hard-link crea invece un riferimento al &lt;em&gt;numero dell&amp;rsquo;inode&lt;/em&gt; che contiene i metadati del file di partenza. Il file creato tramite un hard-link appare quindi a tutti gli effetti una copia del file originale, anche se non è esattamente così. Quando si copia un file, il nuovo file ha nome ed inode diverso ed anche il contenuto del file originale viene copiato in un&amp;rsquo;altra area del disco rigido. Creando un hard-link, il nuovo file avrà solo un nome diverso ma &lt;em&gt;continuerà a riferirsi allo stesso inode&lt;/em&gt;, e quindi allo stesso contenuto, sul disco rigido.&lt;/p&gt;&#xA;&lt;img src=&#34;http://melabit.files.wordpress.com/2014/05/sandbox_2-4.png?w=605&#34; alt=&#34;Hard-link e soft-link&#34; width=&#34;605&#34; height=&#34;368&#34; class=&#34;aligncenter size-large wp-image-949&#34; /&gt;&#xA;&lt;p&gt;Qualunque operazione effettuata sull&amp;rsquo;hard-link &amp;ndash; modifica del contenuto del file, dei permessi, dell&amp;rsquo;ora di accesso al file &amp;ndash; appare come se fosse effettuata  anche sul file originale e su tutti i suoi hard-link: un hard-link è a tutti gli effetti &lt;em&gt;lo stesso file&lt;/em&gt;, ma con un nome diverso.&lt;/p&gt;&#xA;&lt;p&gt;A differenza del soft-link, però, che perde il riferimento al file originale e non serve più a nulla se quest&amp;rsquo;ultimo viene cancellato dal disco rigido, un hard-link continua ad essere valido anche se si cancella il file a cui fa riferimento.&lt;/p&gt;&#xA;&lt;p&gt;Un hard-link ad un file viene creato con il comando,&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ ln file hfile&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;dove &lt;code&gt;file&lt;/code&gt; è il file originale e &lt;code&gt;hfile&lt;/code&gt; è l&amp;rsquo;hard-link (ovviamente i due file possono anche essere in directory diverse). Per creare il soft-link &lt;code&gt;sfile&lt;/code&gt; basta aggiungere l&amp;rsquo;opzione &lt;code&gt;-s&lt;/code&gt; al comando precedente.&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ ln -s file sfile&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Ogni volta che si crea un nuovo file, il contatore delle copie del file contenuto nell&amp;rsquo;inode viene settato ad 1. Aggiungendo un hard-link a quel file, il sistema operativo incrementa di 1 il contatore, cancellando l&amp;rsquo;hard-link il contatore viene decrementato di 1. In effetti, tramite il contatore, il sistema operativo può sapere quanti hard-link sono presenti sul disco rigido oltre al file originale.&lt;/p&gt;&#xA;&lt;p&gt;Arrivati a questo punto, chi vuole può saltare la sezione seguente e andare direttamente &lt;a href=&#34;https://static.233.196.69.159.clients.your-server.de/it/2014/05/22/sandboxing-in-ios-usciamo-dal-recinto/#usciamo&#34;&gt;all&amp;rsquo;ultima parte del post&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;h4 id=&#34;un-po-di-pratica&#34;&gt;Un po&amp;rsquo; di pratica&amp;hellip;&lt;/h4&gt;&#xA;&lt;p&gt;Usiamo ora il Terminale di OS X per mettere in pratica quanto abbiamo appena visto.&lt;/p&gt;&#xA;&lt;p&gt;Il comando &lt;code&gt;touch&lt;/code&gt; crea un nuovo file, a cui aggiungiamo una riga di testo qualunque con &lt;code&gt;echo&lt;/code&gt; (un metodo quasi da hacker, si potrebbe benissimo farlo con un editor di testo).&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ touch file.txt&#xA;$ echo &amp;quot;Ho appena creato un file di testo.&amp;quot; &amp;gt;&amp;gt; file.txt&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Tramite &lt;code&gt;ls -l&lt;/code&gt; mostriamo il file appena creato e una parte dei metadati associati.&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ ls -l&#xA;-rw-r--r--  1 maggi  staff  35 May 19T22:53:00 file.txt&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Ci interessano qui due numeri in particolare. Quello contenuto nella seconda colonna è il contatore delle copie del file e vale &lt;code&gt;1&lt;/code&gt; poiché il file è stato appena creato. Il numero nella quinta colonna, &lt;code&gt;35&lt;/code&gt;, è invece la dimensione in byte del file, uguale al numero di lettere che compongono il testo aggiunto con &lt;code&gt;echo&lt;/code&gt; più il carattere (invisibile) di a capo.&lt;/p&gt;&#xA;&lt;p&gt;Creiamo ora un hard-link e un soft-link che puntano entrambi al file di testo &lt;code&gt;file.txt&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ ln file.txt hfile.txt&#xA;$ ln -s file.txt sfile.doc&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Eseguendo di nuovo &lt;code&gt;ls -l&lt;/code&gt;,&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ ls -l&#xA;-rw-r--r--  2 maggi  staff  35 May 19T22:53:00 file.txt&#xA;-rw-r--r--  2 maggi  staff  35 May 19T22:53:00 hfile.txt&#xA;lrwxr-xr-x  1 maggi  staff   8 May 19T22:54:00 sfile.doc -&amp;gt; file.txt&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;si notano alcune cose fondamentali: (1) l&amp;rsquo;hard-link appare come un file del tutto identico al file originale, dimensioni, permessi, data di creazione (o di accesso), (2) il soft-link ha invece date, dimensioni e permessi differenti, (3) ed è anche mostrato in modo diverso nel Terminale, con una freccia che punta la file originale e con una &lt;code&gt;l&lt;/code&gt; al posto del &lt;code&gt;-&lt;/code&gt; nel primo carattere della riga, (4) avendo creato un hard-link il contatore delle copie del file contenuto nell&amp;rsquo;inode viene incrementato di 1 e, poiché i due file si riferiscono allo stesso inode (e quindi allo stesso contatore), il valore del contatore è uguale per &lt;code&gt;file.txt&lt;/code&gt; e &lt;code&gt;hfile.txt&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;L&amp;rsquo;opzione &lt;code&gt;-i&lt;/code&gt; del comando &lt;code&gt;ls&lt;/code&gt; permette di stampare il numero dell&amp;rsquo;inode associato ad ogni file. Nel nostro esempio, si vede chiaramente che l&amp;rsquo;inode del file originale e quello dell&amp;rsquo;hard-link associato sono uguali.&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ ls -li&#xA;219115720 -rw-r--r--  2 maggi  staff  35 May 19T22:53:00 file.txt&#xA;219115720 -rw-r--r--  2 maggi  staff  35 May 19T22:53:00 hfile.txt&#xA;219115795 lrwxr-xr-x  1 maggi  staff   8 May 19T22:54:00 sfile.doc -&amp;gt; file.txt&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Creando un hard-link si incrementa il contatore del numero di file contenuto nell&amp;rsquo;inode,&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ ln file.txt h2file.dat&#xA;$&#xA;$ ls -li&#xA;219115720 -rw-r--r--  3 maggi  staff  35 May 19T22:53:00 file.txt&#xA;219115720 -rw-r--r--  3 maggi  staff  35 May 19T22:53:00 h2file.dat&#xA;219115720 -rw-r--r--  3 maggi  staff  35 May 19T22:53:00 hfile.txt&#xA;219115795 lrwxr-xr-x  1 maggi  staff   8 May 19T22:54:00 sfile.doc -&amp;gt; file.txt&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;mentre se si cancella un hard-link il contatore viene decrementato di 1.&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ rm hfile.txt&#xA;$&#xA;$ ls -li&#xA;219115720 -rw-r--r--  2 maggi  staff  35 May 19T22:53:00 file.txt&#xA;219115720 -rw-r--r--  2 maggi  staff  35 May 19T22:53:00 h2file.dat&#xA;219115795 lrwxr-xr-x  1 maggi  staff   8 May 19T22:54:00 sfile.doc -&amp;gt; file.txt&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;h4 id=&#34;usciamo&#34;&gt;Usciamo dal recinto&lt;/h4&gt;&#xA;&lt;p&gt;Per permettere a più applicazioni iOS di accedere alla stesso file, evitando allo stesso tempo la moltiplicazione dei file in diverso stato di &amp;ldquo;lavorazione&amp;rdquo;, serve un meccanismo che permetta di inserire tutti i documenti in un&amp;rsquo;area comune, riuscendo però a fare in modo che ciascuna applicazione continui ad accedere solo ai documenti che è autorizzata a gestire, cioè quelli contenuti nel suo &lt;em&gt;sandbox&lt;/em&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Ricordo che il &lt;em&gt;sandbox&lt;/em&gt; è un meccanismo che limita l&amp;rsquo;accesso di una applicazione ai file, alle preferenze, alle risorse di rete, all&amp;rsquo;hardware e così via, incapsulando ciascuna applicazione con i suoi documenti in una directory protetta.&lt;/p&gt;&#xA;&lt;p&gt;Proprio gli hard-link possono essere sfruttati per implementare questo meccanismo.&lt;/p&gt;&#xA;&lt;p&gt;In iOS (ma anche in OS X) le applicazioni ci appaiono come delle semplici icone. In realtà ogni applicazione è costituita da una directory che contiene al suo interno &lt;em&gt;tutto&lt;/em&gt; quello che le serve per funzionare: l&amp;rsquo;eseguibile, le librerie, i file di supporto e di configurazione, le immagini e le icone e i documenti creati con l’applicazione stessa.&lt;/p&gt;&#xA;&lt;p&gt;Immaginiamo ora di avere due applicazioni installate nel nostro dispositivo iOS. Se &lt;em&gt;guardiamo&lt;/em&gt; al loro interno, osserveremo una struttura delle directory simile a questa.&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ tree&#xA;.&#xA;├── appA&#xA;│   ├── appA.app&#xA;│   ├── documents&#xA;│   ├── library&#xA;│   └── tmp&#xA;└── appB&#xA;&#x9;├── appB.app&#xA;&#x9;├── documents&#xA;&#x9;├── library&#xA;&#x9;└── tmp&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;La directory con estensione &lt;code&gt;.app&lt;/code&gt; contiene il file eseguibile dell&amp;rsquo;applicazione, le altre non necessitano di spiegazioni.&#xA;Si noti che il comando &lt;code&gt;tree&lt;/code&gt; usato per mostrare la struttura delle directory delle due applicazioni non esiste di default in OS X, ma può essere &lt;a href=&#34;http://melabit.wordpress.com/2014/04/29/homebrew-software-per-il-mac-fatto-in-casa/&#34;&gt;installato sul Mac tramite Homebrew&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Aggiungiamo qualche file in ciascuna delle due applicazioni.&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ tree&#xA;.&#xA;├── appA&#xA;│   ├── appA.app&#xA;│   ├── documents&#xA;│   │   ├── file-AB.txt&#xA;│   │   └── file_A1.pdf&#xA;│   ├── library&#xA;│   └── tmp&#xA;└── appB&#xA;&#x9;├── appB.app&#xA;&#x9;├── documents&#xA;&#x9;│   ├── file-AB.txt&#xA;&#x9;│   ├── file_B1.pdf&#xA;&#x9;│   └── file_B2.txt&#xA;&#x9;├── library&#xA;&#x9;└── tmp&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Come abbiamo già visto, ognuna delle due applicazioni può gestire solo i documenti contenuti al suo interno. Le due applicazioni possono al massimo scambiarsi i file contenuti nella directory &lt;code&gt;documents&lt;/code&gt; di ciascuna, copiandoli integralmente da una applicazione all&amp;rsquo;altra. Nell&amp;rsquo;esempio precedente il file comune è &lt;code&gt;file-AB.txt&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Una volta completata la copia, le modifiche effettuata da &lt;code&gt;appA&lt;/code&gt; su &lt;code&gt;file-AB.txt&lt;/code&gt; sono del tutto indipendenti da quelle effettuate da &lt;code&gt;appB&lt;/code&gt; sul file omonimo contenuto nel suo sandbox. L&amp;rsquo;unico modo per mantenere il file sincronizzato fra le due applicazioni è quello di copiarlo dopo ogni modifica dal sandbox di una applicazione a quello dell&amp;rsquo;altra. Una cosa poco pratica e facilmente soggetta ad errori.&lt;/p&gt;&#xA;&lt;p&gt;Immaginiamo invece di creare una directory &lt;code&gt;pool&lt;/code&gt;, esterna alle due applicazioni, che agisca come spazio comune per tutti i documenti.&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ tree&#xA;.&#xA;├── appA&#xA;│   ├── appA.app&#xA;│   ├── documents&#xA;│   ├── library&#xA;│   └── tmp&#xA;├── appB&#xA;│   ├── appB.app&#xA;│   ├── documents&#xA;│   ├── library&#xA;│   └── tmp&#xA;└── pool&#xA;&#x9;├── file-AB.txt&#xA;&#x9;├── file_A1.pdf&#xA;&#x9;├── file_B1.pdf&#xA;&#x9;└── file_B2.txt&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Ma le applicazioni presuppongono che i documenti siano all&amp;rsquo;interno del loro sandbox. È possibile fare in modo che le applicazioni riescano comunque ad accedere ai file in &lt;code&gt;pool&lt;/code&gt;?&lt;/p&gt;&#xA;&lt;p&gt;Facile: basta creare degli hard-link che dalla directory &lt;code&gt;documents&lt;/code&gt; di ogni applicazione puntino ai file contenuti in &lt;code&gt;pool&lt;/code&gt;. Ricreando tramite hard-link il contenuto originale delle directory &lt;code&gt;documents&lt;/code&gt; delle due applicazioni si ottiene,&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ tree&#xA;.&#xA;├── appA&#xA;│   ├── appA.app&#xA;│   ├── documents&#xA;│   │   ├── hfile-AB.txt&#xA;│   │   └── hfile_A1.pdf&#xA;│   ├── library&#xA;│   └── tmp&#xA;├── appB&#xA;│   ├── appB.app&#xA;│   ├── documents&#xA;│   │   ├── hfile-AB.txt&#xA;│   │   ├── hfile_B1.pdf&#xA;│   │   └── hfile_B2.txt&#xA;│   ├── library&#xA;│   └── tmp&#xA;└── pool&#xA;&#x9;├── file-AB.txt&#xA;&#x9;├── file_A1.pdf&#xA;&#x9;├── file_B1.pdf&#xA;&#x9;└── file_B2.txt&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;dove, per chiarezza, gli hard-link sono indicati dal prefisso &lt;code&gt;h&lt;/code&gt; aggiunto al nome del file.&lt;/p&gt;&#xA;&lt;p&gt;Il vantaggio principale di questo meccanismo è che se una delle due applicazioni modifica il file &lt;code&gt;hfile-AB.txt&lt;/code&gt; contenuto nel suo sandbox (quindi all&amp;rsquo;interno della &lt;em&gt;sua&lt;/em&gt; directory &lt;code&gt;documents&lt;/code&gt;), tutte le modifiche fatte dall&amp;rsquo;applicazione valgono anche per il file originale e per l&amp;rsquo;hard-link corrispondente contenuto nel sandbox dell&amp;rsquo;altra applicazione.&lt;/p&gt;&#xA;&lt;p&gt;Ovviamente quanto detto finora è facilmente generalizzabile a un numero qualunque di applicazioni e di file.&lt;/p&gt;&#xA;&lt;p&gt;Un altro vantaggio, che dovrebbe essere evidente da quanto detto in questo lunghissimo articolo, è che un hard-link &lt;em&gt;non occupa altro spazio&lt;/em&gt; sul disco rispetto a quello occupato dal file originale. Si evita quindi di sprecare inutilmente spazio sul disco dell&amp;rsquo;iPhone e dell&amp;rsquo;iPad a causa della duplicazione dei file trasferiti da una applicazione all&amp;rsquo;altra. E si sa bene che lo spazio su &lt;em&gt;qualunque&lt;/em&gt; computer non basta &lt;em&gt;mai&lt;/em&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Ma come fa l&amp;rsquo;applicazione a inserire un nuovo documento in &lt;code&gt;pool&lt;/code&gt; e a creare l&amp;rsquo;hard-link corrispondente nella sua directory &lt;code&gt;documents&lt;/code&gt;? La risposta è semplice: non serve che lo faccia l&amp;rsquo;applicazione, il meccanismo immaginato qui può essere gestito dal solo sistema operativo. In altre parole, il meccanismo può essere implementato a livello del sistema operativo in modo del tutto trasparente alle applicazioni, che quindi non hanno bisogno essere modificate per funzionare correttamente.&lt;/p&gt;&#xA;&lt;p&gt;Quando l&amp;rsquo;applicazione &lt;code&gt;appA&lt;/code&gt; apre per la prima volta &lt;code&gt;file-AB.txt&lt;/code&gt;, è il sistema operativo che si occupa di inserire il file in &lt;code&gt;pool&lt;/code&gt; e di creare l&amp;rsquo;hard-link nel sandbox di &lt;code&gt;appA&lt;/code&gt;. Il tutto è assolutamente trasparente ad &lt;code&gt;appA&lt;/code&gt;, che non si accorge nemmeno di quello che è successo dietro le quinte. Se poi a un certo punto ho bisogno di inviare &lt;code&gt;file-AB.txt&lt;/code&gt; da &lt;code&gt;appA&lt;/code&gt; ad &lt;code&gt;appB&lt;/code&gt;, posso limitarmi a cliccare come succede già oggi sull&amp;rsquo;icona apposita in &lt;code&gt;appA&lt;/code&gt;, e sarà poi il sistema operativo ad intercettare la richiesta di copia del file, creando in realtà un nuovo hard-link in &lt;code&gt;appB&lt;/code&gt; che punta anch&amp;rsquo;esso a &lt;code&gt;file-AB.txt&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Infine, se si disinstalla una applicazione, supponiamo &lt;code&gt;appB&lt;/code&gt;, anche i suoi documenti vengono cancellati dal disco, compreso &lt;code&gt;hfile-AB.txt&lt;/code&gt; condiviso con &lt;code&gt;appA&lt;/code&gt;. Ma il documento originale e l&amp;rsquo;hard-link in &lt;code&gt;appA&lt;/code&gt; rimangono sul disco e non vengono persi inavvertitamente. Solo se si cancella anche &lt;code&gt;appA&lt;/code&gt;, il sistema operativo attraverso il contatore nell&amp;rsquo;inode, si accorge che non ci sono più hard-link a &lt;code&gt;file-AB.txt&lt;/code&gt; contenuto in &lt;code&gt;pool&lt;/code&gt; e può decidere di cancellare anche il file originale, magari chiedendo conferma esplicita al proprietario o dopo aver effettuato un backup di sicurezza sul Mac.&lt;/p&gt;&#xA;&lt;p&gt;E anche la cancellazione dei file può essere affidata senza problemi al sistema operativo e non deve essere gestita dalla singola applicazione.&lt;/p&gt;&#xA;&lt;p&gt;Detto questo, aspettiamo pazientemente la WWDC 2014 per sapere che diavolerie inventerà &lt;em&gt;veramente&lt;/em&gt; la Apple, in questo settore. Ammesso, naturalmente, che ne inventi qualcuna.&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>Homebrew: i comandi avanzati</title>
      <link>https://static.233.196.69.159.clients.your-server.de/it/2014/05/14/homebrew-i-comandi-avanzati/</link>
      <pubDate>Wed, 14 May 2014 06:00:00 +0000</pubDate>
      <guid>https://static.233.196.69.159.clients.your-server.de/it/2014/05/14/homebrew-i-comandi-avanzati/</guid>
      <description>&lt;p&gt;Dopo aver esaminato &lt;a href=&#34;https://melabit.wordpress.com/2014/05/08/homebrew-i-comandi-principali/&#34;&gt;i comandi principali per usare Homebrew&lt;/a&gt;, è ora di trattare i principali comandi avanzati. Prima però un breve ripasso del post precedente.&lt;/p&gt;&#xA;&lt;h4 id=&#34;aggiornamento&#34;&gt;Aggiornamento&lt;/h4&gt;&#xA;&lt;p&gt;Come abbiamo visto, per aggiornare Homebrew si usa la terna di comandi&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ brew update&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;che aggiorna il sistema Homebrew vero e proprio,&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ brew outdated&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;che elenca le nuove versioni disponibili dei package &lt;em&gt;già installati&lt;/em&gt; nel sistema (Figura 1),&lt;/p&gt;&#xA;&lt;figure style = &#34;align: center&#34;&gt;&#xA;    &lt;a href=&#34;https://melabit.files.wordpress.com/2014/05/homebrew_4-1.png&#34; target=&#34;_blank&#34;&gt;&#xA;    &lt;img src=&#34;https://melabit.files.wordpress.com/2014/05/homebrew_4-1.png&#34; alt=&#34;Figura 1. Elenco dei nuovi package disponibili.&#34; /&gt;&#xA;    &lt;/a&gt;&#xA;    &lt;figcaption style = &#34;font-style: italic; padding: 4px; text-align: center;&#34;&gt;&#xA;        Figura 1. Elenco dei nuovi package disponibili.&#xA;    &lt;/figcaption&gt;&#xA;&lt;/figure&gt; &#xA;&lt;p&gt;e infine&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ brew upgrade&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;che aggiorna i package installati alla versione più recente presente in Homebrew (Figura 2).&lt;/p&gt;&#xA;&lt;figure style = &#34;align: center&#34;&gt;&#xA;    &lt;a href=&#34;https://melabit.files.wordpress.com/2014/05/homebrew_4-2.png&#34; target=&#34;_blank&#34;&gt;&#xA;    &lt;img src=&#34;https://melabit.files.wordpress.com/2014/05/homebrew_4-2.png&#34; alt=&#34;Figura 2. Aggiornamento dei package installati.&#34; /&gt;&#xA;    &lt;/a&gt;&#xA;    &lt;figcaption style = &#34;font-style: italic; padding: 4px; text-align: center;&#34;&gt;&#xA;        Figura 2. Aggiornamento dei package installati.&#xA;    &lt;/figcaption&gt;&#xA;&lt;/figure&gt; &#xA;&lt;p&gt;Se si vuole aggiornare solo uno o più package (magari perché si sa a priori che qualche aggiornamento contiene dei bachi o è incompatibile con altri software installati sul Mac)&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ brew upgrade package1 [package2 ...]&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;dove &lt;em&gt;package1&lt;/em&gt;, &lt;em&gt;package2&lt;/em&gt;, indicano i nomi dei package da aggiornare.&lt;/p&gt;&#xA;&lt;h4 id=&#34;versioni&#34;&gt;Versioni&lt;/h4&gt;&#xA;&lt;p&gt;Quando si aggiorna un package, Homebrew ne mantiene anche le versioni precedenti. Il comando&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ brew list --versions&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;elenca i package installati con i relativi numeri di versione. Se un package è stato già aggiornato, tutte le versioni presenti nel sistema sono mostrate sulla stessa riga (Figura 3).&lt;/p&gt;&#xA;&lt;figure style = &#34;align: center&#34;&gt;&#xA;    &lt;a href=&#34;https://melabit.files.wordpress.com/2014/05/homebrew_4-3.png&#34; target=&#34;_blank&#34;&gt;&#xA;    &lt;img src=&#34;https://melabit.files.wordpress.com/2014/05/homebrew_4-3.png&#34; alt=&#34;Figura 3. Elenco dei package installati con i relativi numeri di versione. In evidenza un package di cui sono presenti due versioni diverse.&#34; /&gt;&#xA;    &lt;/a&gt;&#xA;    &lt;figcaption style = &#34;font-style: italic; padding: 4px; text-align: center;&#34;&gt;&#xA;        Figura 3. Elenco dei package installati con i relativi numeri di versione. In evidenza un package di cui sono presenti due versioni diverse.&#xA;    &lt;/figcaption&gt;&#xA;&lt;/figure&gt; &#xA;&lt;p&gt;Per  mettere in evidenza i package di cui esistono versioni multiple si aggiunge una ulteriore opzione a &lt;code&gt;brew list&lt;/code&gt; che, sul Mac con una installazione relativamente recente di Homebrew che sto usando, riporta soltanto&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ brew list --versions --multiple&#xA;git 1.9.2 1.9.3&#xA;readline 6.3.3 6.3.5&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Su un sistema più &lt;em&gt;vissuto&lt;/em&gt;, la lista dei package in versioni multiple può diventare molto lunga (Figura 4).&lt;/p&gt;&#xA;&lt;figure style = &#34;align: center&#34;&gt;&#xA;    &lt;a href=&#34;https://melabit.files.wordpress.com/2014/05/homebrew_4-4b.png&#34; target=&#34;_blank&#34;&gt;&#xA;    &lt;img src=&#34;https://melabit.files.wordpress.com/2014/05/homebrew_4-4b.png&#34; alt=&#34;Figura 4. Package in versioni multiple su un Mac con una installazione meno recente di Homebrew.&#34; /&gt;&#xA;    &lt;/a&gt;&#xA;    &lt;figcaption style = &#34;font-style: italic; padding: 4px; text-align: center;&#34;&gt;&#xA;        Figura 4. Package in versioni multiple su un Mac con una installazione meno recente di Homebrew.&#xA;    &lt;/figcaption&gt;&#xA;&lt;/figure&gt; &#xA;&lt;p&gt;Per rimuovere le vecchie versioni di un package, lasciando installata l&amp;rsquo;ultima versione&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ brew cleanup package&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;mentre per rimuovere in blocco le vecchie versioni di tutti i package installati&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ brew cleanup [-n]&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;dove l&amp;rsquo;opzione &lt;code&gt;-n&lt;/code&gt; serve ad eseguire un &lt;code&gt;dry-run&lt;/code&gt;, cioè mostra le operazioni che saranno svolte senza eseguirle realmente (Figura 5). Togliendo l&amp;rsquo;opzione &lt;code&gt;-n&lt;/code&gt; il sistema effettua la rimozione effettiva dei package più vecchi.&lt;/p&gt;&#xA;&lt;figure style = &#34;align: center&#34;&gt;&#xA;    &lt;a href=&#34;https://melabit.files.wordpress.com/2014/05/homebrew_4-5.png&#34; target=&#34;_blank&#34;&gt;&#xA;    &lt;img src=&#34;https://melabit.files.wordpress.com/2014/05/homebrew_4-5.png&#34; alt=&#34;Figura 5. Esecuzione del comando `brew cleanup` in modalità `dry-run`, cioè senza eseguire le operazioni previste dal comando.&#34; /&gt;&#xA;    &lt;/a&gt;&#xA;    &lt;figcaption style = &#34;font-style: italic; padding: 4px; text-align: center;&#34;&gt;&#xA;        Figura 5. Esecuzione del comando `brew cleanup` in modalità `dry-run`, cioè senza eseguire le operazioni previste dal comando.&#xA;    &lt;/figcaption&gt;&#xA;&lt;/figure&gt; &#xA;&lt;h4 id=&#34;disinstallazione&#34;&gt;Disinstallazione&lt;/h4&gt;&#xA;&lt;p&gt;Per disinstallare un package, come abbiamo visto, si usa&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ brew remove package&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;oppure&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ brew uninstall package&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;che mi sembra più facile da ricordare.&lt;/p&gt;&#xA;&lt;p&gt;Se sono presenti versioni multiple di un package, Homebrew disinstalla solo la versione più recente. Per rimuovere definitivamente un package di cui sono installate varie versioni è quindi consigliabile eseguire in sequenza&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ brew cleanup package&#xA;$ brew uninstall package&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Quando si installano i package i file di installazione, sia in forma di sorgenti da compilare che di &lt;em&gt;bottle&lt;/em&gt; precompilate, vengono salvati in una cartella ben definita, generalmente &lt;code&gt;/Library/Caches/Homebrew&lt;/code&gt;, detta la &lt;em&gt;cache&lt;/em&gt; di Homebrew. Il percorso della cache viene riportato dal comando&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ brew --cache&#xA;/Library/Caches/Homebrew&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Si noti fra parentesi che, se si racchiude un qualunque comando fra &lt;code&gt;$(...)&lt;/code&gt;, il Terminale (o meglio l&amp;rsquo;interprete dei comandi &lt;code&gt;bash&lt;/code&gt;) consente di usarne l&amp;rsquo;output come dato di ingresso di comandi successivi. Ad esempio, per elencare il contenuto della cache di Homebrew si può scrivere&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ ls -a /Library/Caches/Homebrew&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;oppure&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ ls -a $(brew --cache)&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;che è particolarmente comodo se si vogliono automatizzare determinate operazioni (Figura 6).&lt;/p&gt;&#xA;&lt;figure style = &#34;align: center&#34;&gt;&#xA;    &lt;a href=&#34;https://melabit.files.wordpress.com/2014/05/homebrew_4-6.png&#34; target=&#34;_blank&#34;&gt;&#xA;    &lt;img src=&#34;https://melabit.files.wordpress.com/2014/05/homebrew_4-6.png&#34; alt=&#34;Figura 6. Parte del contenuto della cache di una installazione di Homebrew.&#34; /&gt;&#xA;    &lt;/a&gt;&#xA;    &lt;figcaption style = &#34;font-style: italic; padding: 4px; text-align: center;&#34;&gt;&#xA;        Figura 6. Parte del contenuto della cache di una installazione di Homebrew.&#xA;    &lt;/figcaption&gt;&#xA;&lt;/figure&gt; &#xA;&lt;p&gt;Una volta installato il package, i file di installazione dei package di Homebrew non sono più strettamente necessari (analogamente ai file .dmg che in OS X contengono nella maggior parte dei casi le applicazioni da installare) ed occupano inutilmente spazio sul disco rigido. Inoltre, soprattutto dopo installazioni fallite, si può voler rimuovere il file di installazione e scaricare una nuova versione &lt;em&gt;pulita&lt;/em&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Per rimuovere dalla cache i file di installazione di uno o più package&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ rm -rf $(brew --cache package1 [package2 ...])&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;e per ripulire completamente la cache (naturalmente senza rimuovere i package installati)&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ rm -rf $(brew --cache)&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;h4 id=&#34;per-programmatori&#34;&gt;Per programmatori&lt;/h4&gt;&#xA;&lt;p&gt;Un comando utile a chi ha esperienza di programmazione quando si installano nuovi package è&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ brew options package&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;che mostra le (eventuali) opzioni non standard di installazione di un determinato package. Ad esempio&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ brew options pandoc&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;non riporta nulla, mentre eseguendo&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ brew options git&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;si ottiene&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;--with-blk-sha1&#xA;    ompile with the block-optimized SHA1 implementation&#xA;--with-brewed-curl&#xA;    Use Homebrew&#39;s version of cURL library&#xA;--with-brewed-openssl&#xA;    Build with Homebrew OpenSSL instead of the system version&#xA;--with-gettext&#xA;    Build with gettext support&#xA;--with-pcre&#xA;    Build with pcre support&#xA;--with-persistent-https&#xA;    Build git-remote-persistent-https from &amp;quot;contrib&amp;quot; directory&#xA;--without-completions&#xA;    Disable bash/zsh completions from &amp;quot;contrib&amp;quot; directory&#xA;--devel&#xA;    install development version 2.0.0.rc3&#xA;--HEAD&#xA;    install HEAD version&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Se si sa esattamente cosa si sta facendo, una o più di queste opzioni possono essere inserite nel comando di installazione del package, che verrà compilato con le opzioni prescelte e non con quelle di default. Ad esempio&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ brew install --with-brewed-openssl git&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;compila &lt;code&gt;git&lt;/code&gt; usando la libreria OpenSSL &amp;ndash; che tanto &lt;a href=&#34;https://gizmodo.com/how-heartbleed-works-the-code-behind-the-internets-se-1561341209&#34;&gt;ha fatto parlare di sé&lt;/a&gt; negli ultimi tempi &amp;ndash; contenuta in Homebrew e non quella installata in OS X (che è comunque immune all&amp;rsquo;&lt;a href=&#34;https://heartbleed.com&#34;&gt;Heartbleed Bug&lt;/a&gt;).&lt;/p&gt;&#xA;&lt;p&gt;Il comando &lt;code&gt;brew list&lt;/code&gt; seguito dal nome di un package&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ brew list [--verbose] package&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;elenca i file e le cartelle installati da quel package&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ brew list pandoc&#xA;/usr/local/Cellar/pandoc/1.12.3/bin/pandoc&#xA;/usr/local/Cellar/pandoc/1.12.3/etc/bash_completion.d/pandoc-completion.bash&#xA;/usr/local/Cellar/pandoc/1.12.3/share/doc/x86_64-osx-ghc-7.6.3/pandoc-1.12.3/COPYING&#xA;/usr/local/Cellar/pandoc/1.12.3/share/man/ (2 files)&#xA;/usr/local/Cellar/pandoc/1.12.3/share/x86_64-osx-ghc-7.6.3/ (38 files)&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;e, con l&amp;rsquo;opzione &lt;code&gt;--verbose&lt;/code&gt;, mostra i file contenuti in tutte le cartelle installate (l&amp;rsquo;elenco può essere davvero molto lungo).&lt;/p&gt;&#xA;&lt;h4 id=&#34;formule&#34;&gt;Formule&lt;/h4&gt;&#xA;&lt;p&gt;In tutti i miei post su Homebrew ho volutamente preferito usare il termine &lt;code&gt;package&lt;/code&gt; invece di &lt;code&gt;formula&lt;/code&gt;, come è più usuale in Homebrew e come si troverà scritto in tutta la documentazione disponibile.&lt;/p&gt;&#xA;&lt;p&gt;Un &lt;code&gt;package&lt;/code&gt; indica infatti il programma che vogliamo installare, mentre la &lt;code&gt;formula&lt;/code&gt; è la serie di comandi usati da Homebrew per installarlo, scritta in &lt;a href=&#34;https://www.ruby-lang.org/en/&#34;&gt;Ruby&lt;/a&gt;. In Homebrew i due significati si confondono, ma secondo me è più comprensibile mantenerli distinti.&lt;/p&gt;&#xA;&lt;p&gt;Se siamo curiosi di sapere come è fatta la &lt;code&gt;formula&lt;/code&gt; di un &lt;code&gt;package&lt;/code&gt; di Homebrew&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ brew cat package&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Ad esempio&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ brew cat pandoc&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;mostra la formula che serve a compilare ed installare il solito &lt;code&gt;pandoc&lt;/code&gt; (Figura 7).&lt;/p&gt;&#xA;&lt;figure style = &#34;align: center&#34;&gt;&#xA;    &lt;a href=&#34;https://melabit.files.wordpress.com/2014/05/homebrew_4-7.png&#34; target=&#34;_blank&#34;&gt;&#xA;    &lt;img src=&#34;https://melabit.files.wordpress.com/2014/05/homebrew_4-7.png&#34; alt=&#34;Figura 7. `Formula` per l&#39;installazione del package `pandoc`.&#34; /&gt;&#xA;    &lt;/a&gt;&#xA;    &lt;figcaption style = &#34;font-style: italic; padding: 4px; text-align: center;&#34;&gt;&#xA;        Figura 7. `Formula` per l&#39;installazione del package `pandoc`.&#xA;    &lt;/figcaption&gt;&#xA;&lt;/figure&gt; &#xA;&lt;p&gt;Quello che fa questa formula è abbastanza evidente, anche senza conoscere Ruby o altri linguaggi di programamzione.&lt;/p&gt;&#xA;&lt;p&gt;Ed è questa un&amp;rsquo;altra caratteristica utile di Homebrew: rende la vita facile non solo a chi si limita ad installare i package, ma anche agli sviluppatori che si occupano di prepararli.&lt;/p&gt;&#xA;&lt;p&gt;Uno degli aspetti che approfondiremo prossimamente.&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>Homebrew: installazione e disinstallazione</title>
      <link>https://static.233.196.69.159.clients.your-server.de/it/2014/05/04/homebrew-installazione-e-disinstallazione/</link>
      <pubDate>Sun, 04 May 2014 06:00:00 +0000</pubDate>
      <guid>https://static.233.196.69.159.clients.your-server.de/it/2014/05/04/homebrew-installazione-e-disinstallazione/</guid>
      <description>&lt;p&gt;Nel &lt;a href=&#34;https://melabit.wordpress.com/2014/04/29/homebrew-software-per-il-mac-fatto-in-casa/&#34;&gt;post precedente&lt;/a&gt; abbiamo fatto la conoscenza con &lt;a href=&#34;https://brew.sh/&#34;&gt;Homebrew&lt;/a&gt;, uno dei sistemi di gestione dei pacchetti software open source di derivazione Unix/Linux sviluppati per OS X.&lt;/p&gt;&#xA;&lt;p&gt;Dopo la lunga introduzione al sistema con i suoi pro e contro è ora di &lt;em&gt;sporcarsi le mani&lt;/em&gt; imparando ad installare (e, non si sa mai, a disinstallare) Homebrew.&lt;/p&gt;&#xA;&lt;p&gt;Homebrew può essere installato sui Mac con processore Intel ed è compatibile con le versioni di OS X più recenti fino a OS X 10.5.8 (Leopard). Esiste anche una &lt;a href=&#34;https://github.com/mistydemeo/tigerbrew&#34;&gt;versione sperimentale (Tigerbrew)&lt;/a&gt; per i vecchi processori PowerPC, compatibile con Leopard e perfino con Tiger.&lt;/p&gt;&#xA;&lt;h4 id=&#34;installazione-di-xcode&#34;&gt;Installazione di Xcode&lt;/h4&gt;&#xA;&lt;p&gt;Prima di installare Homebrew è necessario aver installato Xcode, lo strumento principale per sviluppare le applicazioni per OS X e iOS, o almeno i &lt;code&gt;Command Line Tools&lt;/code&gt;, gli strumenti a linea di comando che sono un sottoinsieme dell&amp;rsquo;Xcode completo.&lt;/p&gt;&#xA;&lt;p&gt;Il pacchetto Xcode compatibile con le versioni di OS X da Snow Leopard in poi può essere &lt;a href=&#34;https://itunes.apple.com/en/app/xcode/id497799835&#34;&gt;installato direttamente dall&amp;rsquo;App Store&lt;/a&gt;. Gli utenti di Leopard possono scaricare l&amp;rsquo;ultima versione compatibile (la 3.1.4) dopo essersi registrati gratuitamente sul sito &lt;a href=&#34;https://developer.apple.com&#34;&gt;Developer&lt;/a&gt; della Apple (si può anche usare il proprio Apple ID). Per trovare rapidamente il link al pacchetto di installazione basta inserire la stringa &amp;ldquo;xcode 3.1.4&amp;rdquo; nel campo di ricerca in alto a sinistra.&lt;/p&gt;&#xA;&lt;p&gt;La procedura esatta per installare i &lt;code&gt;Command Line Tools&lt;/code&gt; cambia purtroppo a seconda della versione di Xcode.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;I &lt;code&gt;Command Line Tools&lt;/code&gt; sono integrati in Xcode 3.1.4 e non si possono installare separatamente dal resto del pacchetto. Bisogna solo assicurarsi che siano selezionati nel corso dell&amp;rsquo;installazione di Xcode.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Con Xcode 4.x e 5.0, si deve eseguire l&amp;rsquo;applicazione, selezionare Preferenze dal menu di Xcode e, dopo aver cliccato sull&amp;rsquo;icona Downloads, selezionare l&amp;rsquo;installazione dei &lt;code&gt;Command Line Tools&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;A partire dalla versione 5.0.1 di Xcode, i &lt;code&gt;Command Line Tools&lt;/code&gt; non sono più integrati in Xcode e devono essere &lt;a href=&#34;https://developer.apple.com/downloads&#34;&gt;scaricati manualmente&lt;/a&gt; dal sito Developer della Apple.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;In alternativa, con le ultime versioni di OS X si può eseguire dal Terminale (si trova in /Applicazioni/Utility) il comando&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ sudo xcode-select --install&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Ricordo che il &lt;code&gt;$&lt;/code&gt; indica il prompt del Terminale e non va inserito.  Ricordo anche che &lt;code&gt;sudo&lt;/code&gt; permette ad un utente di OS X di eseguire i comandi del Terminale come se fosse l&amp;rsquo;onnipotente amministratore (&lt;code&gt;root&lt;/code&gt;) dei sistemi Unix/Linux. Non tutti gli utenti di un Mac possono eseguire &lt;code&gt;sudo&lt;/code&gt;, ma di sicuro può farlo almeno l&amp;rsquo;utente creato al momento dell&amp;rsquo;installazione di OS X &amp;ndash; a cui viene assegnato automaticamente il ruolo di amministratore del sistema &amp;ndash; ma solo   &lt;a href=&#34;https://support.apple.com/kb/HT4103?viewlocale=it_IT&#34;&gt;dopo aver protetto il proprio account con una password&lt;/a&gt; (preferibilmente decente).&lt;/p&gt;&#xA;&lt;p&gt;Dopo aver inserito la password associata al proprio account, comparirà la finestra mostrata in Figura 1.&lt;/p&gt;&#xA;&lt;figure style = &#34;align: center&#34;&gt;&#xA;    &lt;a href=&#34;https://melabit.files.wordpress.com/2014/05/homebrew_2-1.png&#34; target=&#34;_blank&#34;&gt;&#xA;    &lt;img src=&#34;https://melabit.files.wordpress.com/2014/05/homebrew_2-1.png&#34; alt=&#34;Figura 1. Installazione dei `Command Line Tools` dal Terminale.&#34; /&gt;&#xA;    &lt;/a&gt;&#xA;    &lt;figcaption style = &#34;font-style: italic; padding: 4px; text-align: center;&#34;&gt;&#xA;        Figura 1. Installazione dei `Command Line Tools` dal Terminale.&#xA;    &lt;/figcaption&gt;&#xA;&lt;/figure&gt; &#xA;&lt;p&gt;A questo punto si può premere &lt;code&gt;Install&lt;/code&gt; per installare i soli &lt;code&gt;Command Line Tools&lt;/code&gt;, oppure  premere &lt;code&gt;Get Xcode&lt;/code&gt; per installare Xcode dall&amp;rsquo;App Store. Io ho sempre installato l&amp;rsquo;Xcode completo sui miei Mac e non ho idea se la prima opzione possa creare dei problemi. In ogni caso, si può sempre installare anche in seguito l&amp;rsquo;intero Xcode dall&amp;rsquo;App Store (reinstallando eventualmente da zero Homebrew). Per maggiori dettagli, è utile &lt;a href=&#34;https://www.moncefbelyamani.com/how-to-install-xcode-homebrew-git-rvm-ruby-on-mac/&#34;&gt;consultare questa pagina web&lt;/a&gt; che purtroppo non è aggiornata a Mavericks.&lt;/p&gt;&#xA;&lt;h4 id=&#34;installazione-di-homebrew&#34;&gt;Installazione di Homebrew&lt;/h4&gt;&#xA;&lt;p&gt;Per installare Homebrew basta aprire il Terminale ed eseguire il comando&lt;/p&gt;&#xA;&lt;p&gt;&lt;del&gt;$ ruby -e &amp;ldquo;$(curl -fsSL &lt;a href=&#34;https://raw.github.com/Homebrew/homebrew/go/install%29%22&#34;&gt;https://raw.github.com/Homebrew/homebrew/go/install)&#34;&lt;/a&gt;&lt;/del&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;del&gt;$ ruby -e &amp;ldquo;$(curl -fsSL &lt;a href=&#34;https://raw.githubusercontent.com/Homebrew/install/master/install%29%22&#34;&gt;https://raw.githubusercontent.com/Homebrew/install/master/install)&#34;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;/bin/bash -c &amp;quot;$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)&amp;quot;&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;In pochi minuti Homebrew verrà scaricato ed installato automaticamente in &lt;code&gt;/usr/local/&lt;/code&gt; (Figura 2). Tutto qui.&lt;/p&gt;&#xA;&lt;figure style = &#34;align: center&#34;&gt;&#xA;    &lt;a href=&#34;https://melabit.files.wordpress.com/2014/05/homebrew_2-2.png&#34; target=&#34;_blank&#34;&gt;&#xA;    &lt;img src=&#34;https://melabit.files.wordpress.com/2014/05/homebrew_2-2.png&#34; alt=&#34;Figura 2. Installazione di Homebrew.&#34; /&gt;&#xA;    &lt;/a&gt;&#xA;    &lt;figcaption style = &#34;font-style: italic; padding: 4px; text-align: center;&#34;&gt;&#xA;        Figura 2. Installazione di Homebrew.&#xA;    &lt;/figcaption&gt;&#xA;&lt;/figure&gt; &#xA;&lt;p&gt;Subito dopo l&amp;rsquo;installazione è consigliabile eseguire immediatamente il comando&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ brew doctor&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;che, come indica il nome, controlla che non ci siano conflitti fra i file installati da Homebrew e quelli eventualmente già presenti in &lt;code&gt;/usr/local/&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Il controllo eseguito da &lt;code&gt;brew doctor&lt;/code&gt; è molto accurato, forse persino troppo, come mostrato in Figura 3, dove compaiono una serie di avvisi (&lt;code&gt;warning&lt;/code&gt;) dovuti alla presenza sul mio Mac dei file installati da &lt;a href=&#34;https://tug.org/mactex/&#34;&gt;MacTex&lt;/a&gt; in parallelo ad Homebrew. Questi avvisi non sono preoccupanti &amp;ndash; solo gli errori veri e propri lo sono &amp;ndash; ma ci vuole un po&amp;rsquo; per imparare a districarsi fra errori veri e propri e semplici avvisi.&lt;/p&gt;&#xA;&lt;figure style = &#34;align: center&#34;&gt;&#xA;    &lt;a href=&#34;https://melabit.files.wordpress.com/2014/05/homebrew_2-3.png&#34; target=&#34;_blank&#34;&gt;&#xA;    &lt;img src=&#34;https://melabit.files.wordpress.com/2014/05/homebrew_2-3.png&#34; alt=&#34;Figura 3. Ecco `brew doctor` in azione.&#34; /&gt;&#xA;    &lt;/a&gt;&#xA;    &lt;figcaption style = &#34;font-style: italic; padding: 4px; text-align: center;&#34;&gt;&#xA;        Figura 3. Ecco `brew doctor` in azione.&#xA;    &lt;/figcaption&gt;&#xA;&lt;/figure&gt; &#xA;&lt;h4 id=&#34;disinstallazione-di-homebrew&#34;&gt;Disinstallazione di Homebrew&lt;/h4&gt;&#xA;&lt;p&gt;Non si sa mai. Magari le cose non funzionano, magari Homebrew non ci piace e vogliamo tornare a MacPorts o Fink&amp;hellip; È sempre utile sapere come fare a &lt;em&gt;disinstallare&lt;/em&gt; Homebrew (o un qualunque altro pacchetto software) dal sistema.&lt;/p&gt;&#xA;&lt;p&gt;In due parole: bisogna eseguire nel Terminale lo script &lt;code&gt;bash&lt;/code&gt; contenuto nella pagina &lt;a href=&#34;https://gist.github.com/mxcl/1173223&#34;&gt;Uninstall Homebrew&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Chi ha conoscenze sufficienti del Terminale può finire di leggere qui. Per gli altri, ho cercato di elaborare una serie di istruzioni dettagliate da seguire passo passo.&lt;/p&gt;&#xA;&lt;p&gt;Innanzi tutto bisogna andare alla pagina web &lt;a href=&#34;https://gist.github.com/mxcl/1173223&#34;&gt;Uninstall Homebrew&lt;/a&gt;, cliccare sul tasto &lt;code&gt;Download Gist&lt;/code&gt; e salvare il file &lt;code&gt;gist1173223-afa922fc4ea5851578f4680c6ac11a54a84ff20c.tar.gz&lt;/code&gt; (questo è il nome attuale del file, nel vostro caso può essere diverso) in una qualunque cartella del disco rigido (ad esempio sulla Scrivania o, nel gergo del Terminale, sul &lt;code&gt;Desktop&lt;/code&gt;). Lanciare poi il Terminale ed eseguire i comandi&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ cd Desktop&#xA;$ tar -xzf gist1173223-afa922fc4ea5851578f4680c6ac11a54a84ff20c.tar.gz&#xA;$ cd gist1173223-afa922fc4ea5851578f4680c6ac11a54a84ff20c&#xA;$  sh ./uninstall_homebrew.sh&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;In pochi secondi Homebrew verrà rimosso dal sistema senza toccare gli eventuali altri file presenti in &lt;code&gt;/usr/local/&lt;/code&gt; (Figura 4).&lt;/p&gt;&#xA;&lt;p&gt;La sequenza di comandi serve a (1) spostarsi nella cartella &lt;code&gt;Desktop&lt;/code&gt; cioè sulla Scrivania del Mac, (2) scompattare il file compresso &lt;code&gt;gist....tar.gz&lt;/code&gt;, (3) spostarsi nella cartella creata dopo la decompressione del file (non serve scrivere il nome completo della cartella, è sufficiente inserire i primi caratteri e premere il tasto Tab e il sistema provvederà ad aggiungere il resto automaticamente) e infine (4) eseguire lo script &lt;code&gt;bash&lt;/code&gt; che effettua la disinstallazione vera e propria di Homebrew.&lt;/p&gt;&#xA;&lt;p&gt;Alla fine del processo di disinstallazione compare di nuovo nel Terminale il simbolo &lt;code&gt;$&lt;/code&gt;. Una volta chiuso il Terminale si può tranquillamente rimuovere dal Desktop il file &lt;code&gt;gist1173223-afa922fc4ea5851578f4680c6ac11a54a84ff20c.tar.gz&lt;/code&gt; e la cartella relativa.&lt;/p&gt;&#xA;&lt;figure style = &#34;align: center&#34;&gt;&#xA;    &lt;a href=&#34;https://melabit.files.wordpress.com/2014/05/homebrew_2-4.png&#34; target=&#34;_blank&#34;&gt;&#xA;    &lt;img src=&#34;https://melabit.files.wordpress.com/2014/05/homebrew_2-4.png&#34; alt=&#34;Figura 4. I comandi per disinstallare Homebrew.&#34; /&gt;&#xA;    &lt;/a&gt;&#xA;    &lt;figcaption style = &#34;font-style: italic; padding: 4px; text-align: center;&#34;&gt;&#xA;        Figura 4. I comandi per disinstallare Homebrew.&#xA;    &lt;/figcaption&gt;&#xA;&lt;/figure&gt; &#xA;&lt;p&gt;Credetemi, è molto più complicato descrivere la procedura nei dettagli che eseguirla!&lt;/p&gt;&#xA;&lt;p&gt;La prossima volta, prometto, sarà davvero la volta dei &lt;a href=&#34;https://melabit.wordpress.com/2014/05/08/homebrew-i-comandi-principali/&#34;&gt;comandi di base di Homebrew&lt;/a&gt;.&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>Gemelli o diversi?</title>
      <link>https://static.233.196.69.159.clients.your-server.de/it/2014/01/31/gemelli-o-diversi/</link>
      <pubDate>Fri, 31 Jan 2014 06:00:00 +0000</pubDate>
      <guid>https://static.233.196.69.159.clients.your-server.de/it/2014/01/31/gemelli-o-diversi/</guid>
      <description>&lt;p&gt;Mi capita spesso di ricevere o scaricare dei documenti senza riuscire a capire immediatamente se sono nuove versioni di file che ho già sul Mac o se ho solo prelevato lo stesso file con un nome diverso.&lt;/p&gt;&#xA;&lt;p&gt;La soluzione più immediata è quella di aprire i documenti in due finestre affiancate e confrontarli ad occhio nudo.&#xA;È una soluzione perfetta se i documenti sono &lt;em&gt;profondamente&lt;/em&gt; diversi, ma non funziona se le differenze sono limitate a poche parole sparse qua e là.&lt;/p&gt;&#xA;&lt;p&gt;Per essere sicuri al 100% che i file siano identici, basta utilizzare il Terminale di OS X. Il comando in questione è &lt;code&gt;md5&lt;/code&gt; che, in base al manuale, calcola una specie di firma digitale (detta &lt;a href=&#34;http://it.wikipedia.org/wiki/Hash&#34;&gt;hash&lt;/a&gt;) del file che gli viene fornito in ingresso. Il comando utilizza il ben noto algoritmo &lt;a href=&#34;http://it.wikipedia.org/wiki/MD5&#34;&gt;MD5&lt;/a&gt;, che è descritto nei dettagli nell&amp;rsquo;&lt;a href=&#34;http://tools.ietf.org/html/rfc1321&#34;&gt;RFC1321&lt;/a&gt;. La particolarità dell&amp;rsquo;algoritmo è che la probabilità che due file diversi producano lo stesso hash (la cosiddetta &lt;code&gt;collisione&lt;/code&gt;) è estremamente bassa.&lt;/p&gt;&#xA;&lt;p&gt;Questo algoritmo è stato ormai ampiamente superato nelle applicazioni crittografiche, ma per i nostri scopi va più che bene.&lt;/p&gt;&#xA;&lt;p&gt;Per controllare quindi che due file siano o meno identici, basta lanciare il Terminale (è in &lt;code&gt;Applicazioni ➔ Utility&lt;/code&gt;, ma sarebbe meglio trascinarne una volta per tutte l&amp;rsquo;icona nel Dock), scrivere &lt;code&gt;md5 -q&lt;/code&gt; seguito da uno spazio e trascinare una alla volta nel Terminale le icone dei (due o più) file da confrontare, premendo alla fine il tasto Invio. Il risultato è una serie di stringhe alfanumeriche, corrispondenti a ciascuno dei file controllati. Se le stringhe sono uguali lo sono di sicuro anche i file (a meno di casi eccezionali), in caso contrario possiamo essere certi che i file in ingresso differiscono fra loro, anche per &lt;em&gt;un solo carattere&lt;/em&gt;.&lt;/p&gt;&#xA;&lt;h4 id=&#34;un-esempio-pratico&#34;&gt;Un esempio pratico&lt;/h4&gt;&#xA;&lt;p&gt;Prendiamo un file PDF qualunque, &lt;code&gt;File_A1.pdf&lt;/code&gt;, trasciniamolo sul Desktop e duplichiamolo, rinominando la copia come &lt;code&gt;File_A2.pdf&lt;/code&gt;. Lanciamo il Terminale ed eseguiamo i seguenti comandi (notare che il &lt;code&gt;$&lt;/code&gt; è il prompt del Terminale e non va inserito):&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ cd ~/Desktop&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;per spostarci nella cartella del Desktop,&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ md5 -q File_A1.pdf File_A2.pdf&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;che produce in uscita le due stringhe&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;8610396351906b395de49dccc7470ebf&#xA;8610396351906b395de49dccc7470ebf&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;corrispondenti rispettivamente ai miei due file di partenza &lt;code&gt;File_A1.pdf&lt;/code&gt; e &lt;code&gt;File_A2.pdf&lt;/code&gt;. Le due stringhe sono identiche e quindi, come sappiamo, anche i file controllati sono identici (ovviamente usando altri file le stringhe di output saranno differenti da queste).&lt;/p&gt;&#xA;&lt;p&gt;Si noti che ho preferisco usare l&amp;rsquo;opzione &lt;code&gt;-q&lt;/code&gt; (quiet) per evitare che il comando &lt;code&gt;md5&lt;/code&gt; stampi il percorso completo dei file controllati, che rende molto più complicato trovare a prima vista la stringa di hash. Provare per credere.&lt;/p&gt;&#xA;&lt;p&gt;Duplichiamo ancora il file &lt;code&gt;File_A1.pdf&lt;/code&gt;, rinominandolo questa volta come &lt;code&gt;File_B.pdf&lt;/code&gt;. Lanciamo &lt;code&gt;Anteprima&lt;/code&gt; ed apriamo il file &lt;code&gt;File_B.pdf&lt;/code&gt;. Nelle ultime versioni di OS X Anteprima permette di modificare (parzialmente) il testo dei file pdf o di aggiungere evidenziazioni al testo. Per farlo, basta premere l&amp;rsquo;icona &lt;code&gt;Edit&lt;/code&gt; (l&amp;rsquo;ultima a destra sulla barra degli strumenti) oppure selezionare la voce corrispondente posta nel menu &lt;code&gt;Vista&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;img src=&#34;http://melabit.files.wordpress.com/2014/01/toolbar-anteprima.png&#34; alt=&#34;Barra degli strumenti di Anteprima&#34; title=&#34;Barra degli strumenti di Anteprima&#34;&gt;&lt;p&gt;Modifichiamo in qualche modo il file, ad esempio selezionando con un doppio click una parola ed evidenziandola con &lt;code&gt;Strumenti ➔ Annota ➔ Evidenzia il Testo&lt;/code&gt;, e salviamo il file modificato.&lt;/p&gt;&#xA;&lt;p&gt;Torniamo al Terminale ed eseguiamo il comando&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ md5 -q File_A1.pdf File_B.pdf&#xA;8610396351906b395de49dccc7470ebf&#xA;22908db2457cf64af17c1296cb5f37e1&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;che ci mostra immediatamente come ora il secondo file sia ora diverso da quello originale. La figura seguente mostra l&amp;rsquo;esecuzione completa dei comandi ne mio Terminale.&lt;/p&gt;&#xA;&lt;img src=&#34;http://melabit.files.wordpress.com/2014/01/md5-output.png&#34; alt=&#34;Esecuzione del comando md5 da Terminale&#34; title=&#34;Esecuzione del comando md5 da Terminale&#34;&gt;&lt;p&gt;Tre brevi commenti per concludere:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Il comando &lt;code&gt;md5&lt;/code&gt; è disponibile di default su OS X (ovviamente!) e su qualunque distribuzione moderna di Linux e Unix, dove però viene generalmente rinominato &lt;code&gt;md5sum&lt;/code&gt;. In Windows, invece, si può installare il &lt;a href=&#34;http://support.microsoft.com/kb/841290&#34;&gt;File Checksum Integrity Verifier (FCIV)&lt;/a&gt;, uno strumento semi-ufficiale della Microsoft, che permette di calcolare la firma digitale di un file mediante vari algoritmi, fra cui l&amp;rsquo;md5.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;La variante &lt;code&gt;md5 -s &amp;quot;Questa e&#39; una stringa&amp;quot;&lt;/code&gt; permette di calcolare l&amp;rsquo;hash di una stringa qualunque, aprendo la porta ad applicazioni nel campo della generazione casuale di password &lt;em&gt;forti&lt;/em&gt; a partire da stringhe facilmente memorizzabili.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;I programmi che trovano automaticamente i file duplicati sull&amp;rsquo;hard-disk &lt;a href=&#34;http://paper0k.wordpress.com/2007/07/04/come-ti-trovo-i-files-duplicati/&#34;&gt;funzionano più o meno su queste basi&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
    </item>
    <item>
      <title>Rinominare i file con il Terminale</title>
      <link>https://static.233.196.69.159.clients.your-server.de/it/2013/12/21/rinominare-i-file-con-il-terminale/</link>
      <pubDate>Sat, 21 Dec 2013 06:00:00 +0000</pubDate>
      <guid>https://static.233.196.69.159.clients.your-server.de/it/2013/12/21/rinominare-i-file-con-il-terminale/</guid>
      <description>&lt;p&gt;Tempo fa ho partecipato ad un sondaggio online del Ministero dell&amp;rsquo;Istruzione relativo al valore legale del titolo di studio. Mentre creavo l&amp;rsquo;account e compilavo il questionario, ho eseguito una serie di screenshot delle pagine del browser, a futura memoria e ho messo tutte le immagini in una cartella apposita.&lt;/p&gt;&#xA;&lt;p&gt;Alla fine di tutto mi sono trovato con parecchie immagini, chiamate &lt;code&gt;Screen shot anno-mese-giorno at ora.minuto.secondo&lt;/code&gt; contenenti quindi la data e l&amp;rsquo;ora del momento dell&amp;rsquo;acquisizione. Ovviamente volevo rinominarle in un modo più &lt;em&gt;comprensibile&lt;/em&gt;. Farlo a mano era fuori discussione.&lt;/p&gt;&#xA;&lt;p&gt;Ma sul Mac che stavo usando in quel momento non ho trovato nessun programma di rinominazione dei file, e non avevo voglia di andarne a cercare uno &lt;em&gt;affidabile&lt;/em&gt; in rete. E poi, se lo avessi fatto, come avrei potuto scrivere questo post?&lt;/p&gt;&#xA;&lt;p&gt;Ho deciso che &lt;code&gt;bash&lt;/code&gt; avrebbe fatto il lavoro sporco per me. Bash è l&amp;rsquo;interprete di comandi da terminale usato di default in Mac OS X, con il quale si possono lanciare comandi per copiare i file, rinominarli, creare cartelle (o più propriamente, &lt;code&gt;directory&lt;/code&gt;), eseguire ricerche di file o ricerche nel &lt;em&gt;contenuto&lt;/em&gt; dei file stessi, compiere cicli ripetitivi e decine di altre cose essenziali per un uso produttivo del computer.&lt;/p&gt;&#xA;&lt;p&gt;Ho lanciato il Terminale (sul Mac è in Applicazioni -&amp;gt; Utility) e mi sono spostato nella cartella (directory!) dove avevo salvato le immagini. Come?&lt;/p&gt;&#xA;&lt;p&gt;Con Mac OS X (e anche con Linux) è molto semplice. Basta per prima cosa andare alla cartella desiderata con il Finder. Poi lanciare il Terminale e scrivere, dopo il prompt di bash (cioè dopo il simbolo del $)&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ cd&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;seguito da uno spazio, poi tornare al Finder, selezionare la piccola con che simboleggia la cartella aperta, posta in alto al centro della barra del Finder, e trascinare l&amp;rsquo;icona sul Terminale aperto. Molto più complicato da scrivere che da fare.&lt;/p&gt;&#xA;&lt;p&gt;Insomma, se supponiamo di aver messo gli screenshot nella cartella &lt;code&gt;immagini&lt;/code&gt; sul Desktop, dopo questa operazione nel Terminale dovremmo vedere&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ cd /Users/nome_utente/Desktop/immagini&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;dove &lt;code&gt;nome_utente&lt;/code&gt; è il nome breve dell&amp;rsquo;utente che sta usando il Mac, stabilito alla prima esecuzione di OS X durante la configurazione del sistema operativo.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://melabit.files.wordpress.com/2013/12/rinominare-i-file-15.png&#34;&gt;&lt;img src=&#34;http://melabit.files.wordpress.com/2013/12/rinominare-i-file-15.png?w=605&#34; alt=&#34;Rinominare i file #1&#34; width=&#34;605&#34; height=&#34;428&#34; class=&#34;aligncenter size-large wp-image-83&#34; /&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Premiamo invio e andremo così &lt;em&gt;all&amp;rsquo;interno&lt;/em&gt; della directory desiderata.&lt;/p&gt;&#xA;&lt;p&gt;Per elencare i file contenuti nella cartella, basta eseguire il comando&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ ls -1&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;(&amp;ldquo;ls meno uno&amp;rdquo;) che mostrerà il solo elenco dei file, oppure&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ ls -l&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;(&amp;ldquo;ls meno elle&amp;rdquo;) con il quale otterremo parecchie informazioni in più, fra cui data e ora in cui i file sono stati creati.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://melabit.files.wordpress.com/2013/12/rinominare-i-file-25.png&#34;&gt;&lt;img src=&#34;http://melabit.files.wordpress.com/2013/12/rinominare-i-file-25.png?w=605&#34; alt=&#34;Rinominare i file #2&#34; width=&#34;605&#34; height=&#34;428&#34; class=&#34;aligncenter size-large wp-image-84&#34; /&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;A questo punto, scriviamo nel Terminale questo comando (attenzione, deve stare su un&amp;rsquo;unica riga)&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ cnt=0; find . -name &#34;*.png&#34; -print | while read i; do mv &#34;${i}&#34; immagine_$cnt; (( cnt++ )); done&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Voilà. I nostri file sono stati rinominati in &lt;code&gt;immagine_0&lt;/code&gt;, &lt;code&gt;immagine_1&lt;/code&gt;, etc. La rinominazione non è perfetta ma accontentiamoci, almeno per ora.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://melabit.files.wordpress.com/2013/12/rinominare-i-file-35.png&#34;&gt;&lt;img src=&#34;http://melabit.files.wordpress.com/2013/12/rinominare-i-file-35.png?w=605&#34; alt=&#34;Rinominare i file #3&#34; width=&#34;605&#34; height=&#34;428&#34; class=&#34;aligncenter size-large wp-image-85&#34; /&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Essere riusciti a rinominare i file con una sola riga di comandi &lt;code&gt;bash&lt;/code&gt; è per ora più che soddisfacente.&lt;/p&gt;&#xA;&lt;p&gt;Questa semplice riga di comandi contiene però una quantità inimmaginabile di strumenti e di concetti fondamentali, che cercheremo di approfondire nel corso del tempo.&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;P.S.: Quello che è particolarmente divertente è che ho potuto partecipare al cosiddetto &lt;em&gt;sondaggio&lt;/em&gt; del Ministero anche con &lt;a href=&#34;http://www.roars.it/online/?p=6710&#34; title=&#34;Università, al sondaggio vota anche Napoleone&#34;&gt;un nome totalmente inventato&lt;/a&gt;. Sono riuscito ad entrare senza trucchi nel sito, utilizzando solo un codice fiscale basato sulla mia identità fittizia e la password inviata dal Ministero ad un indirizzo email creato appositamente.&lt;/p&gt;&#xA;&lt;p&gt;Le immagini che ho catturato dalla finestra del browser lo testimoniano. Tanto per dimostrare quanto siano &lt;em&gt;affidabili&lt;/em&gt; certe applicazioni web.&lt;/p&gt;&#xA;&lt;p&gt;Ne riparleremo.&lt;/p&gt;&#xA;</description>
    </item>
  </channel>
</rss>
