<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Launchd on Melabit</title>
    <link>https://static.233.196.69.159.clients.your-server.de/it/tags/launchd/</link>
    <description>Recent content in Launchd on Melabit</description>
    <generator>Hugo</generator>
    <language>it</language>
    <lastBuildDate>Sun, 18 Dec 2016 06:00:00 +0000</lastBuildDate>
    <atom:link href="https://static.233.196.69.159.clients.your-server.de/it/tags/launchd/index.xml" rel="self" type="application/rss+xml" />
    <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>Automatizzare il Mac dal Terminale - Ancora Launchd</title>
      <link>https://static.233.196.69.159.clients.your-server.de/it/2015/04/28/automatizzare-il-mac-dal-terminale-ancora-launchd/</link>
      <pubDate>Tue, 28 Apr 2015 06:00:00 +0000</pubDate>
      <guid>https://static.233.196.69.159.clients.your-server.de/it/2015/04/28/automatizzare-il-mac-dal-terminale-ancora-launchd/</guid>
      <description>&lt;p&gt;A volte bisogna saper ammettere i propri errori. Questa è una di quelle volte.&lt;/p&gt;&#xA;&lt;p&gt;Nel mio &lt;a href=&#34;https://melabit.wordpress.com/2014/12/11/automatizzare-il-mac-dal-terminale-una-soluzione-targata-apple/&#34;&gt;post su launchd&lt;/a&gt; di qualche mese fa non avevo nascosto il mio scetticismo per una soluzione molto lontana dai &lt;a href=&#34;http://www.faqs.org/docs/artu/ch01s06.html&#34;&gt;canoni di Unix&lt;/a&gt; e troppo complicata per essere usata al posto di cron, il programma che nei sistemi operativi derivati da Unix è incaricato di eseguire periodicamente dei comandi o degli interi script in modo automatico.&lt;/p&gt;&#xA;&lt;p&gt;Leggendo però &lt;a href=&#34;http://www.macstories.net/tutorials/how-i-control-my-mac-with-automatic-ifttt-dropbox/&#34;&gt;questo post su MacStories&lt;/a&gt;, mi sono reso conto dell&amp;rsquo;esistenza di una ulteriore opzione di launchd, &lt;code&gt;QueueDirectories&lt;/code&gt;, che permette di di tenere sotto controllo una (o più) &lt;a href=&#34;https://melabit.wordpress.com/le-parole-per-dirlo/&#34;&gt;directory&lt;/a&gt; del Mac e di eseguire automaticamente un comando ogni qualvolta si aggiunge un file alla directory osservata.&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;Oltre a questa esiste una opzione più generale, &lt;code&gt;WatchPaths&lt;/code&gt;, che permette di tenere sotto controllo uno o più file (o directory) ed eseguire un comando quando uno di questi file (o directory) viene modificato.&lt;/p&gt;&#xA;&lt;p&gt;Con queste due nuove (almeno per me!) opzioni si può estendere notevolmente il campo di applicazione di launchd, facendogli eseguire un comando o uno script non solo in modo periodico (in sostituzione di cron), ma anche al verificarsi di un evento come l&amp;rsquo;aggiunta di un file ad una directory o la modifica di un determinato file.&lt;/p&gt;&#xA;&lt;h4 id=&#34;launchd-losservatore&#34;&gt;Launchd, l&amp;rsquo;osservatore&lt;/h4&gt;&#xA;&lt;p&gt;Riprendiamo quindi il &lt;a href=&#34;http://en.wikipedia.org/wiki/Property_list&#34;&gt;file plist&lt;/a&gt; di configurazione del &lt;a href=&#34;https://melabit.wordpress.com/2014/12/11/automatizzare-il-mac-dal-terminale-una-soluzione-targata-apple/&#34;&gt;post precedente&lt;/a&gt; e vediamo cosa possiamo fare se aggiungiamo l&amp;rsquo;opzione &lt;code&gt;QueueDirectories&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Il punto di partenza è &lt;a href=&#34;https://melabit.wordpress.com/2014/12/11/automatizzare-il-mac-dal-terminale-una-soluzione-targata-apple/&#34;&gt;sempre lo stesso&lt;/a&gt;: vogliamo eseguire automaticamente lo script &lt;code&gt;~/bin/makeblog&lt;/code&gt; e &lt;a href=&#34;http://melabit.wordpress.com/2014/11/06/automatizzare-il-mac-dal-terminale-il-comando-at/&#34;&gt;rigenerare automaticamente il blog&lt;/a&gt; &amp;ldquo;Pazzi per la mela&amp;rdquo;.&lt;/p&gt;&#xA;&lt;p&gt;Questa volta però vogliamo rigenerare il blog non ad un&amp;rsquo;ora ben definita ed immutabile, ma solo quando inseriamo un nuovo post nella directory &lt;code&gt;~/Dropbox/blog/&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;In questo caso usare Dropbox (o un qualunque servizio analogo, &lt;a href=&#34;https://www.box.com/&#34;&gt;Box&lt;/a&gt;, &lt;a href=&#34;https://www.copy.com&#34;&gt;Copy&lt;/a&gt;, &lt;a href=&#34;https://www.google.com/drive/&#34;&gt;Google Drive&lt;/a&gt;, o perfino &lt;a href=&#34;https://onedrive.live.com&#34;&gt;OneDrive&lt;/a&gt; di Microsoft) è particolarmente utile, perché permette di aggiungere il post anche lontano dal Mac, magari dopo averlo preparato sull&amp;rsquo;iPad o sull&amp;rsquo;iPhone.&lt;/p&gt;&#xA;&lt;p&gt;Il file plist di configurazione &lt;a href=&#34;https://melabit.wordpress.com/2014/12/11/automatizzare-il-mac-dal-terminale-una-soluzione-targata-apple/&#34;&gt;del post precedente&lt;/a&gt; diventa&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-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;UTF-8&amp;#34;?&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;!DOCTYPE plist PUBLIC &amp;#34;-//Apple//DTD PLIST 1.0//EN&amp;#34; &amp;#34;http://www.apple.com/DTDs/PropertyList-1.0.dtd&amp;#34;&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;plist&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;version=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;1.0&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;dict&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;key&amp;gt;&lt;/span&gt;Label&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;string&amp;gt;&lt;/span&gt;it.pazziperlamela.makeblog&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;key&amp;gt;&lt;/span&gt;Program&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;string&amp;gt;&lt;/span&gt;/Users/utente/bin/makeblog&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;key&amp;gt;&lt;/span&gt;QueueDirectories&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;array&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &#x9;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;string&amp;gt;&lt;/span&gt;/Users/utente/Dropbox/blog/&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/array&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;key&amp;gt;&lt;/span&gt;StandardOutPath&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;string&amp;gt;&lt;/span&gt;/Users/utente/Documenti/makeblog.log&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;key&amp;gt;&lt;/span&gt;StandardErrorPath&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;string&amp;gt;&lt;/span&gt;/Users/utente/Documenti/makeblog.err&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;key&amp;gt;&lt;/span&gt;RunAtLoad&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;false/&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/dict&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/plist&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Per attivarlo, come abbiamo già visto, basta salvarlo nella directory &lt;code&gt;~/Library/LaunchAgents/&lt;/code&gt; del proprio account (dove il &lt;a href=&#34;https://melabit.wordpress.com/2014/11/06/script-di-shell-in-os-x/&#34;&gt;simbolo &lt;code&gt;~&lt;/code&gt; indica la cartella &lt;code&gt;Inizio&lt;/code&gt;&lt;/a&gt; o &lt;code&gt;home&lt;/code&gt; dell&amp;rsquo;utente che sta usando il Mac) con il nome &lt;code&gt;it.pazziperlamela.makeblog.plist&lt;/code&gt; (il nome del file deve essere uguale a quello senza estensione utilizzato alla riga 6 del file plist), ed eseguirlo una prima volta dal Terminale con il comando&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ launchctl load it.pazziperlamela.makeblog.plist&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Ai successivi riavvii sarà il sistema operativo ad eseguire periodicamente lo script.&lt;/p&gt;&#xA;&lt;h4 id=&#34;conclusioni&#34;&gt;Conclusioni&lt;/h4&gt;&#xA;&lt;p&gt;Devo ammettere che le opzioni &lt;code&gt;QueueDirectories&lt;/code&gt; e  &lt;code&gt;WatchPaths&lt;/code&gt; rendono launchd molto più interessante di quanto mi sia mai reso conto, permettendo di eseguire dei comandi di sistema o degli interi script in modo asincrono, al verificarsi di eventi particolari come la scrittura o la modifica di un file in una directory.&lt;/p&gt;&#xA;&lt;p&gt;Intendiamoci, le mie riserve sulla complessità di launchd rimangono intatte. Inoltre continua a non piacermi il fatto che sia uno strumento confinato al solo OS X, con poche prospettive di diffusione al di fuori del mondo Apple fra i sistemi operativi derivati da Unix, come &lt;a href=&#34;http://www.linux.org/&#34;&gt;Linux&lt;/a&gt; e &lt;a href=&#34;http://www.bsd.org/&#34;&gt;BSD&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Però pragmaticamente mi rendo conto che in certe circostanze launchd può rivelarsi uno strumento utilissimo e senza eguali. Basta solo usarlo con moderazione.&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;Qualcosa di simile alle cosiddette &amp;ldquo;Folder Actions&amp;rdquo;, introdotte già da parecchi anni in OS X senza troppo successo, che istruivano il sistema operativo a tenere sotto controllo una directory e ad eseguire dei comandi AppleScript o Automator ogni volta che un file veniva aggiunto o rimosso da quella directory, oppure quando quest&amp;rsquo;ultima veniva aperta, chiusa o spostata.&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>Automatizzare il Mac dal Terminale - Una soluzione targata Apple</title>
      <link>https://static.233.196.69.159.clients.your-server.de/it/2014/12/11/automatizzare-il-mac-dal-terminale-una-soluzione-targata-apple/</link>
      <pubDate>Thu, 11 Dec 2014 06:00:00 +0000</pubDate>
      <guid>https://static.233.196.69.159.clients.your-server.de/it/2014/12/11/automatizzare-il-mac-dal-terminale-una-soluzione-targata-apple/</guid>
      <description>&lt;p&gt;Dopo i programmi di derivazione Unix, &lt;a href=&#34;https://melabit.wordpress.com/2014/11/06/automatizzare-il-mac-dal-terminale-il-comando-at/&#34;&gt;&lt;code&gt;at&lt;/code&gt;&lt;/a&gt; e &lt;a href=&#34;https://melabit.wordpress.com/2014/11/22/automatizzare-il-mac-dal-terminale-sua-maesta-cron/&#34;&gt;&lt;code&gt;cron&lt;/code&gt;&lt;/a&gt;, è la volta di parlare di &lt;a href=&#34;http://launchd.info&#34;&gt;&lt;code&gt;launchd&lt;/code&gt;&lt;/a&gt;, una soluzione sviluppata dalla Apple per OS X.&lt;/p&gt;&#xA;&lt;h4 id=&#34;launchd&#34;&gt;Launchd&lt;/h4&gt;&#xA;&lt;p&gt;Launchd è il programma che, a partire dalla versione 10.4 (Tiger) di OS X, esegue tutti &lt;a href=&#34;http://en.wikipedia.org/wiki/Launchd&#34;&gt;i processi di avvio del sistema operativo&lt;/a&gt; e che, come se non bastasse, può anche svolgere i compiti eseguiti da cron.&lt;/p&gt;&#xA;&lt;p&gt;Launchd è stato sviluppato dalla Apple e, dopo qualche incomprensione, è stato rilasciato sotto la licenza open source Apache, con l&amp;rsquo;intento di promuoverne l&amp;rsquo;adozione anche sotto &lt;a href=&#34;https://github.com/freebsd/openlaunchd&#34;&gt;Linux e BSD&lt;/a&gt;.&#xA;Finora però &lt;a href=&#34;http://lwn.net/Articles/202779/&#34;&gt;l&amp;rsquo;accoglienza al di fuori di OS X&lt;/a&gt; è stata tiepida, se non peggio, e quindi al momento launchd rimane confinato al solo Mac.&lt;/p&gt;&#xA;&lt;p&gt;La cosa non mi stupisce.&lt;/p&gt;&#xA;&lt;p&gt;Al di là degli &lt;a href=&#34;http://www.reddit.com/r/debian/comments/1vm9ng/if_systemd_for_linux_why_not_launchd_for_kfreebsd/&#34;&gt;aspetti tecnici&lt;/a&gt; relativi al porting su altre piattaforme e focalizzando l&amp;rsquo;attenzione solo sull&amp;rsquo;utilizzo di launchd al posto di cron, sono perfettamente d&amp;rsquo;accordo con quanto è stato scritto tempo fa su &lt;a href=&#34;http://lowendmac.com&#34;&gt;Low End Mac&lt;/a&gt;, con il titolo significativo &lt;a href=&#34;http://lowendmac.com/2010/apples-launchd-is-anti-unix/&#34;&gt;Apple’s launchd Is Anti-Unix&lt;/a&gt; (&lt;em&gt;Launchd di Apple è anti-Unix&lt;/em&gt;).&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;One of the great things about Unix-like systems is that most of your skills, programs, dot files, and highly polished shell scripts are portable. I brought them with me to OS X after dragging them through a dozen or so Linux distributions…&lt;br&gt;&#xA;Consequently, I was distressed when launchd emerged from the dark side of One Infinite Loop…&lt;br&gt;&#xA;Merging periodically run jobs into the main system process doesn’t make sense. Replacing a simple /etc/crontab text file with multiple, awkwardly named XML plist files scattered among no less than four different directories is taking two big steps toward complexity.&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;Credo sia abbastanza chiaro anche così, ma lo traduco qui sotto perché ne condivido ogni parola.&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;em&gt;Una delle cose migliori dei sistemi Unix è che la maggior parte delle competenze, dei programmi sviluppati, dei file di configurazione [detti &amp;ldquo;dot file&amp;rdquo; perché il nome di questi file inizia in genere con un punto] e degli &lt;a href=&#34;https://melabit.wordpress.com/2014/11/06/script-di-shell-in-os-x/&#34;&gt;script di shell&lt;/a&gt; sono portatili [su piattaforme differenti]. Io me li sono portati dietro su OS X dopo averli fatti transitare per una dozzina di distribuzioni diverse di Linux&amp;hellip;&lt;br&gt;&#xA;Di conseguenza mi preoccupa vedere launchd emergere dalla faccia oscura di &lt;a href=&#34;https://www.google.it/maps/place/Infinite&amp;#43;Loop,&amp;#43;Cupertino,&amp;#43;CA&amp;#43;95014,&amp;#43;Stati&amp;#43;Uniti/data=!4m2!3m1!1s0x808fb5b6e7b4b9fb:0x697a4332574f50d9?sa=X&amp;amp;ei=wb-GVK_rBYbAOazIgXA&amp;amp;ved=0CCcQ8gEwAA&#34;&gt;One Infinite Loop&lt;/a&gt; [l&amp;rsquo;indirizzo della Apple]&amp;hellip;&lt;br&gt;&#xA;Non ha senso mescolare processi eseguiti periodicamente con il processo principale [di inizializzazione] del sistema operativo. Sostituire un semplice file di testo /etc/crontab con una serie di file plist in formato XML con nomi assurdi e distribuiti su almeno quattro directory diverse è un bel passo avanti [sarebbero due, ma in italiano non viene bene] verso la complessità&amp;hellip;&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;h4 id=&#34;launchd-contro-cron&#34;&gt;Launchd contro cron&lt;/h4&gt;&#xA;&lt;p&gt;Se consideriamo il semplice obiettivo di rendere automatiche certe attività ripetitive sul Mac, la chiave del discorso sta proprio nell&amp;rsquo;ultima frase citata:&#xA;&amp;ldquo;&lt;em&gt;Sostituire un semplice file di testo /etc/crontab con una serie di file plist in formato XML con nomi assurdi, distribuiti su almeno quattro directory diverse è un bel passo avanti verso la complessità&lt;/em&gt;&amp;rdquo;.&lt;/p&gt;&#xA;&lt;p&gt;Launchd è molto più complicato di cron, inutilmente più complicato. Basta usarlo un po&amp;rsquo; per accorgersene.&lt;/p&gt;&#xA;&lt;p&gt;Proviamo a sostituire launchd a cron per eseguire lo script &lt;code&gt;~/bin/makeblog&lt;/code&gt; e &lt;a href=&#34;http://melabit.wordpress.com/2014/11/06/automatizzare-il-mac-dal-terminale-il-comando-at/&#34;&gt;rigenerare automaticamente il blog&lt;/a&gt; &amp;ldquo;Pazzi per la mela&amp;rdquo; alle 2:00 di ogni notte.&lt;/p&gt;&#xA;&lt;p&gt;Con cron basta solo aggiungere &lt;a href=&#34;https://melabit.wordpress.com/2014/11/22/automatizzare-il-mac-dal-terminale-sua-maesta-cron/&#34;&gt;al file crontab&lt;/a&gt; la riga seguente&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;Se invece si vuole utilizzare launchd, bisogna creare un &lt;a href=&#34;http://en.wikipedia.org/wiki/Property_list&#34;&gt;file plist&lt;/a&gt; di configurazione in &lt;a href=&#34;http://en.wikipedia.org/wiki/XML&#34;&gt;linguaggio XML&lt;/a&gt; più o meno come questo,&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-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;UTF-8&amp;#34;?&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;!DOCTYPE plist PUBLIC &amp;#34;-//Apple//DTD PLIST 1.0//EN&amp;#34; &amp;#34;http://www.apple.com/DTDs/PropertyList-1.0.dtd&amp;#34;&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;plist&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;version=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;1.0&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;dict&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;key&amp;gt;&lt;/span&gt;Label&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;string&amp;gt;&lt;/span&gt;it.pazziperlamela.makeblog&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;key&amp;gt;&lt;/span&gt;ProgramArguments&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;array&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;string&amp;gt;&lt;/span&gt;/Users/utente/bin/makeblog&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/array&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;key&amp;gt;&lt;/span&gt;StartCalendarInterval&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;dict&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;key&amp;gt;&lt;/span&gt;Hour&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;integer&amp;gt;&lt;/span&gt;02&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/integer&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;key&amp;gt;&lt;/span&gt;Minute&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;integer&amp;gt;&lt;/span&gt;00&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/integer&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/dict&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;key&amp;gt;&lt;/span&gt;StandardOutPath&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;string&amp;gt;&lt;/span&gt;/Users/utente/Documenti/makeblog.log&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;key&amp;gt;&lt;/span&gt;StandardErrorPath&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;string&amp;gt;&lt;/span&gt;/Users/utente/Documenti/makeblog.err&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;key&amp;gt;&lt;/span&gt;RunAtLoad&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;false/&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/dict&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;/plist&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;salvarlo nella directory &lt;code&gt;~/Library/LaunchAgents/&lt;/code&gt; del proprio account (&lt;a href=&#34;https://melabit.wordpress.com/2014/11/06/script-di-shell-in-os-x/&#34;&gt;la &lt;code&gt;~&lt;/code&gt; indica la cartella &lt;code&gt;Inizio&lt;/code&gt;&lt;/a&gt; o &lt;code&gt;home&lt;/code&gt; dell&amp;rsquo;utente che sta usando il Mac) usando obbligatoriamente il nome &lt;code&gt;it.pazziperlamela.makeblog.plist&lt;/code&gt; (il nome del file deve essere uguale a quello senza estensione utilizzato alla riga 6 del file plist), e infine eseguirlo una prima volta dal Terminale con il comando&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ launchctl load it.pazziperlamela.makeblog.plist&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Per fortuna ai successivi riavvii ci pensa il sistema operativo ad eseguire periodicamente lo script.&lt;/p&gt;&#xA;&lt;h4 id=&#34;un-brevissimo-tutorial&#34;&gt;Un brevissimo tutorial&lt;/h4&gt;&#xA;&lt;p&gt;Può essere utile descrivere brevemente le informazioni essenziali da inserire nel file plist di configurazione, in modo che il processo automatico gestito da launchd funzioni correttamente. Per ulteriori informazioni, consiglio la lettura di &lt;a href=&#34;http://launchd.info&#34;&gt;quest&amp;rsquo;ottimo tutorial&lt;/a&gt; e delle specifiche dettagliate &lt;a href=&#34;https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man5/launchd.plist.5.html&#34;&gt;del formato del file plist&lt;/a&gt; usato da launchd.&lt;/p&gt;&#xA;&lt;p&gt;Le prime tre righe del file specificano tipo e versione dei formati xml e plist utilizzati, e vanno copiate esattamente come sono scritte nell&amp;rsquo;esempio precedente.&lt;/p&gt;&#xA;&lt;p&gt;Il file plist deve contenere tre chiavi obbligatorie. La prima, &lt;code&gt;Label&lt;/code&gt; (riga 5), serve per specificare il nome del file plist stesso, senza estensione. Nel nostro caso il nome del file è &lt;code&gt;it.pazziperlamela.makeblog&lt;/code&gt; (riga 6).&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;La chiave &lt;code&gt;ProgramArguments&lt;/code&gt; (riga 8) serve invece per specificare il percorso e il nome dello script di shell da eseguire. Qui è &lt;code&gt;/Users/utente/bin/makeblog&lt;/code&gt;, dove al posto di &lt;code&gt;utente&lt;/code&gt; bisogna sostituire il nome breve del proprio account. Il modo più semplice per ottenere il proprio nome breve è eseguire da Terminale il comando &lt;code&gt;whoami&lt;/code&gt; (oppure &lt;code&gt;id -un&lt;/code&gt;).&lt;/p&gt;&#xA;&lt;p&gt;L&amp;rsquo;ultima chiave obbligatoria, &lt;code&gt;StartCalendarInterval&lt;/code&gt; (riga 13), definisce ora e minuto (oltre che eventualmente giorno della settimana, giorno e mese) in cui launchd deve eseguire lo script di shell. In alternativa si può usare la chiave &lt;code&gt;StartInterval&lt;/code&gt;, che lancia invece lo script ogni certo numero di secondi, a partire dalla prima esecuzione del processo tramite launchctl.&lt;/p&gt;&#xA;&lt;p&gt;Due ulteriori chiavi opzionali, &lt;code&gt;StandardOutPath&lt;/code&gt; e &lt;code&gt;StandardErrorPath&lt;/code&gt; (righe 21 e 24), definiscono rispettivamente il percorso dei file da usare per salvare l&amp;rsquo;output completo generato dal comando e gli eventuali messaggi di errore. Anche in questo caso bisogna sostituire nel percorso dei file il proprio nome breve al posto dell&amp;rsquo;&lt;code&gt;utente&lt;/code&gt; generico.&lt;/p&gt;&#xA;&lt;p&gt;Un&amp;rsquo;altra utile chiave opzionale è &lt;code&gt;RunAtLoad&lt;/code&gt; (riga 27), che specifica se lo script di shell deve essere eseguito al momento del caricamento da parte di launchctl.&#xA;Questa opzione è inutile se, come in questo caso, si definiscono esattamente gli orari di esecuzione del processo tramite la chiave &lt;code&gt;StartCalendarInterval&lt;/code&gt;.&#xA;Se invece si usa la chiave &lt;code&gt;StartInterval&lt;/code&gt;, bisogna impostare&#xA;&lt;code&gt;RunAtLoad&lt;/code&gt; al valore &lt;code&gt;true/&lt;/code&gt;, in modo da fissare il tempo iniziale da cui far partire il conteggio dei secondi.&lt;/p&gt;&#xA;&lt;h4 id=&#34;due-comandi-utili&#34;&gt;Due comandi utili&lt;/h4&gt;&#xA;&lt;p&gt;Per elencare tutti i processi gestiti da launchd in un dato momento si esegue da Terminale il comando&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ launchctl list&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Il Mac su cui sto scrivendo questo post elenca ben 294 processi, considerando sia i processi attivi che quelli ormai terminati.&lt;/p&gt;&#xA;&lt;p&gt;Per smettere di eseguire automaticamente lo script &lt;code&gt; it.pazziperlamela.makeblog.plist&lt;/code&gt;, si deve eseguire il comando&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ launchctl unload ~/Library/LaunchAgents/it.pazziperlamela.makeblog.plist&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;e poi cancellare (o spostare) il file &lt;code&gt;it.pazziperlamela.makeblog.plist&lt;/code&gt; dalla directory &lt;code&gt;~/Library/LaunchAgents/&lt;/code&gt;. In caso contrario, lo script tornerà ad essere lanciato automaticamente al prossimo riavvio.&lt;/p&gt;&#xA;&lt;h4 id=&#34;conclusioni&#34;&gt;Conclusioni&lt;/h4&gt;&#xA;&lt;p&gt;È evidente che non mi piace l&amp;rsquo;idea di usare launchd al posto di cron. Troppo complicato e troppo proprietario. Una vera pugnalata ad uno dei principi cardini di Unix (e del software ben fatto): fare una cosa sola ma farla bene e in modo efficiente.&lt;/p&gt;&#xA;&lt;p&gt;Intendiamoci, launchd va benissimo per gestire l&amp;rsquo;avvio del sistema e i servizi automatici (i &lt;em&gt;demoni&lt;/em&gt;) gestiti dal sistema operativo e dalla sua introduzione in (Mac) OS X 10.4/Tiger ha reso molto più veloce il processo di avvio di OS X. Ma sostituire launchd a cron introduce un livello di complessità inutile ed insensato.&lt;/p&gt;&#xA;&lt;p&gt;Nonostante tutto c&amp;rsquo;è &lt;a href=&#34;http://paul.annesley.cc/2012/09/mac-os-x-launchd-is-cool/&#34;&gt;qualcuno a cui launchd piace&lt;/a&gt; anche per questo scopo. Contento lui, io finché posso preferisco tenermi stretto il buon vecchio cron.&lt;/p&gt;&#xA;&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;&#xA;&lt;hr&gt;&#xA;&lt;ol&gt;&#xA;&lt;li id=&#34;fn:1&#34;&gt;&#xA;&lt;p&gt;Il formato consigliato per il nome del file plist è il cosiddetto &lt;a href=&#34;https://developer.apple.com/library/mac/documentation/FileManagement/Conceptual/understanding_utis/understand_utis_conc/understand_utis_conc.html&#34;&gt;&lt;code&gt;Uniform Type Identifier&lt;/code&gt; (UTI)&lt;/a&gt;, una struttura simile a quella di un &lt;a href=&#34;http://it.wikipedia.org/wiki/Domain_Name_System&#34;&gt;dominio web&lt;/a&gt; inverso. In questo caso è stato preso il nome dello script da eseguire &lt;code&gt;makeblog&lt;/code&gt;, lo si è aggiunto all&amp;rsquo;indirizzo del (presunto) sito web del progetto &lt;code&gt;pazziperlamela.it&lt;/code&gt;, e infine si è invertito l&amp;rsquo;ordine della stringa risultante, &lt;code&gt;makeblog.pazziperlamela.it&lt;/code&gt;, ottenendo il nome del file plist.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/div&gt;&#xA;</description>
    </item>
  </channel>
</rss>
