<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Bbedit on Melabit</title>
    <link>https://static.233.196.69.159.clients.your-server.de/it/tags/bbedit/</link>
    <description>Recent content in Bbedit on Melabit</description>
    <generator>Hugo</generator>
    <language>it</language>
    <lastBuildDate>Mon, 28 Jul 2025 06:00:00 +0000</lastBuildDate>
    <atom:link href="https://static.233.196.69.159.clients.your-server.de/it/tags/bbedit/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Fare una Maggie</title>
      <link>https://static.233.196.69.159.clients.your-server.de/it/2025/07/28/fare-una-maggie/</link>
      <pubDate>Mon, 28 Jul 2025 06:00:00 +0000</pubDate>
      <guid>https://static.233.196.69.159.clients.your-server.de/it/2025/07/28/fare-una-maggie/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://melabit.com/it/2025/07/22/macos-tahoe-developer-beta-3/&#34;&gt;L&amp;rsquo;ultimo articolo&lt;/a&gt; mi ha fatto letteralmente impazzire. Non per la lunghezza, anche se scrivere un testo di più di tremila parole e ventimila caratteri in due lingue diverse non è una sciocchezza.&lt;/p&gt;&#xA;&lt;p&gt;Il vero problema è nato dal fatto che a un certo punto il file Markdown dell&amp;rsquo;articolo si è corrotto. Quando &lt;a href=&#34;https://melabit.com/it/2025/05/24/jeeeeeekyll-no-hugo/&#34;&gt;Hugo&lt;/a&gt; provava a convertirlo in &lt;code&gt;HTML&lt;/code&gt;, il file generato conteneva, al posto delle lettere accentate italiane, il &lt;a href=&#34;https://en.wikipedia.org/wiki/Specials_%28Unicode_block%29&#34;&gt;&lt;em&gt;carattere di sostituzione&lt;/em&gt;&lt;/a&gt; �, quel rombo nero con dentro un punto interrogativo bianco che abbiamo visto in tante email e pagine web.&lt;/p&gt;&#xA;&lt;p&gt;Ci ho perso ore prima di risolvere il problema.&lt;/p&gt;&#xA;&lt;h4 id=&#34;quando-un-file-markdown-si-corrompe&#34;&gt;Quando un file Markdown si corrompe&lt;/h4&gt;&#xA;&lt;p&gt;La prima ipotesi è stata che il file contenesse qualche carattere spurio, come uno spazio che non è davvero uno spazio, oppure una di quelle lettere &lt;em&gt;strane&lt;/em&gt; che qualche anno fa &lt;a href=&#34;https://eu.usatoday.com/story/news/factcheck/2021/04/30/fact-check-hackers-use-similar-looking-characters-phishing-schemes/4891437001/&#34;&gt;hanno creato un certo scompiglio&lt;/a&gt;. Un bel problema cercarle nel testo, per cui ho fatto il contrario e ho scritto una espressione regolare che cercasse &lt;strong&gt;tutto ciò che non era normale&lt;/strong&gt;, raffinandola via via che procedevo.&lt;/p&gt;&#xA;&lt;p&gt;Alla fine l&amp;rsquo;espressione regolare è diventata questa.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;[^a-zA-Z0-9àèéìòùÀÈÉÌÒÙ ,.;:`&amp;#39;&amp;#34;()\[\]\-^/_*#\n]&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Una cosa molto terra-terra, ma l&amp;rsquo;importante è che funzionasse. Purtroppo non ha trovato niente di strano.&lt;/p&gt;&#xA;&lt;p&gt;Per cercare di restringere il più possibile l&amp;rsquo;area che poteva contenere l&amp;rsquo;errore, ho iniziato a togliere parti di testo, prima poche righe e poi intere sezioni, ricompilando ogni volta il file tagliuzzato con Hugo. Niente, non c&amp;rsquo;era verso di togliere quegli stramaledetti rombi neri!&lt;/p&gt;&#xA;&lt;p&gt;E qui ho fatto la cosa davvero decisiva: dopo aver provato e riprovato senza successo, ho lasciato perdere e sono andato a cena.&lt;/p&gt;&#xA;&lt;p&gt;Sì, perché quando non si riesce a risolvere un problema &amp;ndash; che sia risolvere un difficile esercizio di matematica, far funzionare un programma o scrivere l&amp;rsquo;attacco di quel post che ci frulla in testa da ore &amp;ndash; la cosa migliore da fare è lasciare perdere e dedicarsi ad altro. Non so voi, ma con me funziona sempre alla grande.&lt;/p&gt;&#xA;&lt;p&gt;E dopo cena mi è venuta l&amp;rsquo;idea: ho fatto una &lt;em&gt;Maggie&lt;/em&gt; e tutto è andato a posto.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2025-07-28-fare-una-maggie/Gemini_Generated_Image_irhit8irhit8irhi.jpg&#34; alt=&#34;&#34;&gt;&#xA;&amp;ndash; &lt;em&gt;Immagine generata da &lt;a href=&#34;https://gemini.google.com&#34;&gt;Google Gemini&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;h4 id=&#34;fare-una-maggie&#34;&gt;Fare una &lt;em&gt;Maggie&lt;/em&gt;&lt;/h4&gt;&#xA;&lt;p&gt;&lt;em&gt;Maggie&lt;/em&gt; è il diminutivo di Margaret Secara, diventata famosa per un trucco, semplice ma molto efficace, per &lt;a href=&#34;https://tidbits.com/2013/03/28/avoid-and-fix-word-document-corruption/&#34;&gt;recuperare un documento Word corrotto&lt;/a&gt;: cliccare sull&amp;rsquo;icona &lt;code&gt;¶&lt;/code&gt; della Barra Multifunzione di Word per attivare la visualizzazione dei caratteri di formattazione (se la finestra di Word è stretta, l&amp;rsquo;icona potrebbe nascondersi all&amp;rsquo;interno della &lt;a href=&#34;https://static.233.196.69.159.clients.your-server.de/img/2025-07-28-fare-una-maggie/word-show-format-characters-narrow.png&#34;&gt;sezione dedicata ai paragrafi&lt;/a&gt;), poi selezionare tutto il testo &lt;strong&gt;tranne l&amp;rsquo;ultimo carattere di &lt;code&gt;Invio&lt;/code&gt;&lt;/strong&gt; (come mostrato in figura) e incollarlo in un nuovo documento vuoto.&lt;/p&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2025-07-28-fare-una-maggie/word-show-format-characters.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;Se non funziona, si può ripetere il procedimento copiando parti successive del testo in un nuovo documento, in modo da circoscrivere il più possibile la porzione corrotta.&lt;/p&gt;&#xA;&lt;p&gt;La prima volta che ho usato questo trucco stavo lavorando su un documento di più di cento pagine, passato per parecchi colleghi e differenti versioni di Word, che era diventato ingestibile: ogni nuovo carattere impiegava secondi per comparire sullo schermo e Word andava continuamente in crash. Con la procedura descritta ho risolto il problema in un battibaleno.&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;Il trucco di Maggie funziona perché i file Word hanno una doppia struttura. La prima è quella che mostrata sullo schermo del computer, fatta di testo, immagini e tabelle, con divisioni in capitoli, sezioni e paragrafi, con grassetti, italici, sottolineature, con interruzioni di pagina, liste, rientri, tutte cose messe lì un po&amp;rsquo; a casaccio dall&amp;rsquo;utente.&lt;/p&gt;&#xA;&lt;p&gt;La seconda struttura è quella del file XML sottostante, che dopo un po&amp;rsquo; di aggiunte, correzioni, cancellazioni, ripensamenti, diventa un fritto misto di tag XML innestati uno sull&amp;rsquo;altro, che rimangono però sempre invisibili all&amp;rsquo;utente e non vengono mai &lt;em&gt;ripuliti&lt;/em&gt; e ristrutturati in modo coerente dal programma.&lt;/p&gt;&#xA;&lt;p&gt;A meno di non farlo noi a mano, copiando tutto il testo in un nuovo documento, ma evitando come la peste l&amp;rsquo;ultimo carattere di &lt;code&gt;Invio&lt;/code&gt; che, per qualche motivo arcano, contiene la chiave di accesso alle porcherie nascoste del documento Word.&lt;/p&gt;&#xA;&lt;p&gt;Margaret &lt;em&gt;Maggie&lt;/em&gt; Secara avrà scoperto questo trucco per caso, ma si è rivelato così utile da trasformare il suo soprannome in una parola vera e propria, come Kleenex, Band-Aid, Post-It, Tupperware o Google.&lt;/p&gt;&#xA;&lt;h4 id=&#34;ma-sono-documenti-di-testo&#34;&gt;Ma sono documenti di testo!&lt;/h4&gt;&#xA;&lt;p&gt;Però i miei post li scrivo in Markdown, mica con Word. Ma anche così, ripartire da un documento &lt;em&gt;fresco&lt;/em&gt; e copiarci dentro il contenuto di quello corrotto può rivelarsi il metodo più veloce per risolvere tanti problemi.&lt;/p&gt;&#xA;&lt;p&gt;Ovviamente il trucco funziona con qualunque tipo di documento in testo puro, che sia scritto in Markdown, LaTeX, HTML, XML, JSON, Org mode&amp;hellip; o in qualsiasi altro formato più o meno arcano che vi venga in mente.&lt;/p&gt;&#xA;&lt;p&gt;Anzi, proprio perché, a differenza di Word, un documento di testo non nasconde nulla all&amp;rsquo;utente, non serve nemmeno evitare di copiare l&amp;rsquo;ultimo carattere di &lt;code&gt;Invio&lt;/code&gt;; si può selezionare tranquillamente tutto il testo, copiarlo e incollarlo in un nuovo file vuoto.&lt;/p&gt;&#xA;&lt;p&gt;Prima di farlo è sempre bene controllare che il testo non contenga dei caratteri spuri, utilizzando una espressione regolare simile a quella riportata più sopra.&lt;/p&gt;&#xA;&lt;p&gt;E con questo l&amp;rsquo;articolo è finito. Le due sezioni qui sotto sono riservate solo ai più curiosi, che vogliono sapere cosa mi era successo davvero.&lt;/p&gt;&#xA;&lt;h4 id=&#34;solo-per-i-più-curiosi&#34;&gt;Solo per i più curiosi&amp;hellip;&lt;/h4&gt;&#xA;&lt;h5 id=&#34;perché-il-metodo-funziona&#34;&gt;Perché il metodo funziona?&lt;/h5&gt;&#xA;&lt;p&gt;Una volta risolto il problema immediato, la curiosità ha avuto il sopravvento e mi sono chiesto &lt;em&gt;perché&lt;/em&gt; il metodo descritto funziona con i documenti di testo. Come succede spesso, lavorare dal Terminale aiuta a risolvere i problemi più spinosi.&lt;/p&gt;&#xA;&lt;p&gt;In un normale editor come BBedit o TextMate, il file corrotto appare perfettamente normale, ma se lo si visualizza nel Terminale con &lt;code&gt;cat&lt;/code&gt;, si nota subito che tutti i caratteri accentati vengono sostituiti da dei &lt;code&gt;?&lt;/code&gt;, più o meno come succede convertendolo in HTML.&lt;/p&gt;&#xA;&lt;p&gt;Il comando &lt;code&gt;file&lt;/code&gt; dà poi la risposta definitiva. Se lo applico al file corrotto, &lt;code&gt;file 2025-07-22-macos-tahoe-developer-beta-3.md&lt;/code&gt;, ottengo in risposta&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Non-ISO extended-ASCII text, with very long lines (1264)&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;mentre con un qualunque altro file Markdown il risultato è (come è giusto che sia)&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Unicode text, UTF-8 text, with very long lines (1264)&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;In altri termini, il file aveva perso la codifica &lt;code&gt;UTF-8&lt;/code&gt;, trasformandosi in un generico file di testo non-standard.&lt;/p&gt;&#xA;&lt;p&gt;Se me ne fossi accorto prima, avrei potuto usare &lt;code&gt;iconv&lt;/code&gt; per correggere la codifica del file, ma in questo caso non c&amp;rsquo;è dubbio che il copia-e-incolla è molto più pratico.&lt;/p&gt;&#xA;&lt;h5 id=&#34;cosè-successo-davvero&#34;&gt;Cos&amp;rsquo;è successo davvero?&lt;/h5&gt;&#xA;&lt;p&gt;Difficile a dirsi, ma ci sono degli indizi. Dato che l&amp;rsquo;&lt;a href=&#34;https://melabit.com/it/2025/07/22/macos-tahoe-developer-beta-3/&#34;&gt;articolo era molto lungo&lt;/a&gt;, l&amp;rsquo;ho scritto in più riprese un po&amp;rsquo; sul Mac Mini e un po&amp;rsquo; sull&amp;rsquo;Air.&lt;/p&gt;&#xA;&lt;p&gt;In genere copio i file di lavoro in locale e li sincronizzo solo in un secondo momento. Ma questa volta cambiavo continuamente computer, per cui ho preferito lavorare direttamente  sulla cartella sincronizzata (usando &lt;a href=&#34;https://melabit.com/it/2024/03/21/syncthing-ovvero-come-liberarsi-dalle-limitazioni-di-dropbox-e-affini/&#34;&gt;Syncthing&lt;/a&gt;, ma non credo che sia stato lui il responsabile; in quel caso avrei trovato dei file in conflitto, che invece non ci sono). Invece ci sono stati ogni tanto dei problemi di rete, e penso che sia stato proprio questo che ha finito per corrompere la codifica del file.&lt;/p&gt;&#xA;&lt;p&gt;La morale? Lavorare in locale e sincronizzare solo quando si è finito. Oppure lavorare direttamente in rete solo quando il collegamento è stabile.&lt;/p&gt;&#xA;&lt;p&gt;Ma quando non si può, meglio ricordarsi dei consigli della buona vecchia &lt;em&gt;Maggie&lt;/em&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;Pare che si possa recuperare un documento Word &lt;a href=&#34;https://learn.microsoft.com/en-us/answers/questions/5037456/how-to-maggie-a-corrupt-word-document-but-keep-all&#34;&gt;senza perdere traccia delle modifiche effettuate&lt;/a&gt;. La guida usa delle combinazioni di caratteri tipiche di Word per Windows, e quindi non è immediato applicarla alla versione per macOS.&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>SubEthaEdit, scrivere insieme in tempo reale</title>
      <link>https://static.233.196.69.159.clients.your-server.de/it/2023/10/30/subethaedit-scrivere-insieme-in-tempo-reale/</link>
      <pubDate>Mon, 30 Oct 2023 06:00:00 +0000</pubDate>
      <guid>https://static.233.196.69.159.clients.your-server.de/it/2023/10/30/subethaedit-scrivere-insieme-in-tempo-reale/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2023-10-30-subethaedit-scrivere-insieme-in-tempo-reale/annie-spratt-QckxruozjRg-unsplash.jpg&#34; alt=&#34;&#34;&gt;&#xA;&amp;ndash; &lt;em&gt;Fonte: &lt;a href=&#34;https://unsplash.com/@anniespratt&#34;&gt;Annie Spratt&lt;/a&gt; su &lt;a href=&#34;https://unsplash.com&#34;&gt;Unsplash&lt;/a&gt;&lt;/em&gt;.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://subethaedit.net/&#34;&gt;SubEthaEdit&lt;/a&gt; è in giro da un bel po&amp;rsquo; di tempo, se la memoria non mi inganna più o meno dai tempi di Tiger.&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; Quando uscì fece scalpore, perché per la prima volta dava la possibilità a più utenti di lavorare contemporaneamente allo stesso documento, con il limite che tutti i Mac dovevano essere connessi alla stessa rete locale.&lt;/p&gt;&#xA;&lt;p&gt;Oggi, fra &lt;a href=&#34;https://www.office.com&#34;&gt;Office 365&lt;/a&gt;, &lt;a href=&#34;https://www.microsoft.com/it-it/microsoft-teams&#34;&gt;Teams&lt;/a&gt;, &lt;a href=&#34;https://docs.google.com&#34;&gt;Google Documents&lt;/a&gt; (e naturalmente &lt;a href=&#34;https://it.overleaf.com/&#34;&gt;Overleaf&lt;/a&gt;), scrivere un testo in collaborazione fra vari utenti sparsi nel mondo sembra una cosa scontata,&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt; ma 20 anni fa era una funzione mai vista prima su un computer personale.&lt;/p&gt;&#xA;&lt;p&gt;Infatti, &lt;a href=&#34;https://web.archive.org/web/20130126195203/http://log.emonk.net/post/6539765532/a-short-and-slightly-biased-history-of-collaborative&#34;&gt;secondo uno degli autori&lt;/a&gt;, la scrittura collaborativa di un testo è stata inventata intorno alla metà degli anni &amp;lsquo;90 presso il solito Xerox PARC, ma fino a SubEthaEdit nessuno aveva pensato di applicarla ad un prodotto commerciale.&lt;/p&gt;&#xA;&lt;h4 id=&#34;leditor&#34;&gt;L&amp;rsquo;editor&lt;/h4&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://subethaedit.net/&#34;&gt;SubEthaEdit&lt;/a&gt; (SEE per gli amici) è un editor di testo puro, proprio come &lt;a href=&#34;https://macromates.com/&#34;&gt;TextMate&lt;/a&gt;, &lt;a href=&#34;https://www.barebones.com/products/bbedit/&#34;&gt;BBEdit&lt;/a&gt;, &lt;a href=&#34;https://www.sublimetext.com/&#34;&gt;Sublime Text&lt;/a&gt; o il defunto &lt;a href=&#34;https://github.com/atom/atom&#34;&gt;Atom&lt;/a&gt;, ormai soppiantato da &lt;a href=&#34;https://code.visualstudio.com/&#34;&gt;Visual Studio Code&lt;/a&gt;.&lt;sup id=&#34;fnref:3&#34;&gt;&lt;a href=&#34;#fn:3&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;3&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#xA;&lt;p&gt;SEE ha tutte le funzioni di base di un editor moderno, riconosce la sintassi dei principali linguaggi di programmazione (tranne R, accidenti!), così come di Markdown e di LaTeX, e può essere configurato in modo abbastanza dettagliato, per adattarsi al meglio ai gusti personali.&lt;/p&gt;&#xA;&lt;p&gt;A questo proposito, io preferisco visualizzare i caratteri nascosti (&lt;code&gt;Show: Invisible Characters&lt;/code&gt;) e sostituire i &lt;code&gt;tab&lt;/code&gt; con gli spazi (una abitudine da programmatore). Entrambe le modifiche si fanno nel pannelo &lt;code&gt;Editing&lt;/code&gt; delle Preferenze di SEE. Mi piace anche ingrandire leggermente il font di default a 12 punti e aumentare la spaziatura fra le linee al 110% per rendere il testo più leggibile e più consistente con gli altri editor che uso (pannello &lt;code&gt;Styles&lt;/code&gt;).&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2023-10-30-subethaedit-scrivere-insieme-in-tempo-reale/editing-custom.png&#34; alt=&#34;&#34;&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2023-10-30-subethaedit-scrivere-insieme-in-tempo-reale/styles-custom.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Rispetto ai mostri sacri citati prima, SEE manca di parecchie funzioni, fra cui alcune che ormai fanno parte del normale corredo di un editor moderno, come la possibilità di commentare rapidamente un blocco di codice, di aggiungere delle parentesi aperte e chiuse oppure dei simboli attorno ad un blocco di testo selezionato,&lt;sup id=&#34;fnref:4&#34;&gt;&lt;a href=&#34;#fn:4&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;4&lt;/a&gt;&lt;/sup&gt; oppure di effettuare una selezione per colonne, utile in particolare quando si lavora con le tabelle.&lt;sup id=&#34;fnref:5&#34;&gt;&lt;a href=&#34;#fn:5&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;5&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#xA;&lt;p&gt;SEE non ha nemmeno il completamento automatico del codice ma insomma, questa è una funzione supportata solo dagli editor più avanzati, quindi è un peccato veniale. Anche gli stili, i temi, o come volete chiamarli, sono pochi, ma almeno per me, che uso quasi sempre lo stile di default, questo è un non-problema.&lt;/p&gt;&#xA;&lt;p&gt;Peccato anche che non metta in evidenza automaticamente gli errori ortografici, ma che io sappia questo lo fa nativamente solo BBEdit ed è uno dei motivi per usarlo per scrivere dei testi in Markdowno o LaTeX.&lt;/p&gt;&#xA;&lt;p&gt;Molto utile, invece, la possibilità di avere visualizzazioni diverse dello stesso documento sia nella stessa finestra che in finestre separate, così come il conteggio in tempo reale del numero di caratteri, parole o linee di cui è composto un documento, una funzione che mi avrebbe aiutato moltissimo qualche mese fa.&lt;/p&gt;&#xA;&lt;p&gt;Per averlo, bisogna attivare dal menu &lt;code&gt;View&lt;/code&gt; la visualizzazione della barra di stato superiore e inferiore (che servirà fra poco), che riportano una serie di informazioni utili sul documento aperto fra cui, a destra della barra di stato superiore, proprio il numero di caratteri, parole o linee del documento. Cliccando sul numero si può cambiare ciclicamente il tipo di conteggio riportato.&lt;/p&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2023-10-30-subethaedit-scrivere-insieme-in-tempo-reale/view-status-bars.png&#34; alt=&#34;&#34;&gt;&lt;h4 id=&#34;scrittura-collaborativa&#34;&gt;Scrittura collaborativa&lt;/h4&gt;&#xA;&lt;p&gt;La caratteristica più interessante di SSE è il supporto nativo per la scrittura collaborativa, che permette a due o più utenti collegati alla stessa rete locale di lavorare contemporaneamente allo stesso documento.&lt;/p&gt;&#xA;&lt;p&gt;Prima di condividere un documento bisogna aprire il pannello &lt;code&gt;Collaboration&lt;/code&gt; delle Preferenze di SEE e assicurarsi di aver attivato l&amp;rsquo;opzione relativa (&lt;code&gt;Enable Collaboration&lt;/code&gt;) e di non essere invisibili agli altri utenti della rete (&lt;code&gt;Invisible to others on the Network&lt;/code&gt;).&lt;/p&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2023-10-30-subethaedit-scrivere-insieme-in-tempo-reale/collaboration-custom.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;È sufficiente ora cliccare sull&amp;rsquo;icona in basso a destra nella barra di stato (quella che assomiglia al simbolo del Wi-Fi ruotato) per rendere il documento disponibile agli altri utenti della rete. Questa circostanza viene indicata in modo evidente nella stessa barra di stato, dove compare una grossa icona colorata con le iniziali dell&amp;rsquo;utente che ha iniziato la condivisione. Per differenziare meglio i vari utenti è possibile personalizzare l&amp;rsquo;icona ed il colore associato a ciascun utente nel solito pannello &lt;code&gt;Collaboration&lt;/code&gt; delle Preferenze, come si può vedere nelle due immagini qui sotto.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2023-10-30-subethaedit-scrivere-insieme-in-tempo-reale/bottom-status-bar.png&#34; alt=&#34;&#34;&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2023-10-30-subethaedit-scrivere-insieme-in-tempo-reale/bottom-status-bar-custom-icon.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;A questo punto, se un altro utente esegue SubEthaEdit su un Mac collegato alla stessa rete locale, potrà accedere non solo alla lista dei suoi documenti locali più recenti, ma anche a quelli condivisi su cui può collaborare.&lt;/p&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2023-10-30-subethaedit-scrivere-insieme-in-tempo-reale/document-hub.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;Per farlo, dovrà cliccare sul nome del documento condiviso e aspettare di essere autorizzato a modificare o eventualmente soltanto a leggere il documento in questione, potendo così iniziare la sua attività di scrittura a quattro (o più) mani.&lt;/p&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2023-10-30-subethaedit-scrivere-insieme-in-tempo-reale/accept-sharing.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;Anche la barra di stato di SEE cambierà, mostrando le icone dei due (o più) utenti che stanno lavorando in contemporanea, con i colori associati a ciascun utente.&lt;/p&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2023-10-30-subethaedit-scrivere-insieme-in-tempo-reale/status-bar-collaboration-active.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;Questi colori sono fondamentali, perché permettono di valutare a colpo d&amp;rsquo;occhio chi ha effettuato ciascuna modifica. È anche possibile lavorare sulla stessa porzione di testo, correggendo e integrando ciò che ha scritto l&amp;rsquo;altro.&lt;/p&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2023-10-30-subethaedit-scrivere-insieme-in-tempo-reale/collaborative-editing.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;SEE non ha problemi nemmeno quando si prova a scrivere in contemporanea esattamente nello stesso punto, ma si limita ad inserire entrambi i caratteri, differenziandoli in base all&amp;rsquo;utente. Per quanto ci abbia provato non sono mai riuscito a mandarlo in crash con giochetti di questo tipo.&lt;/p&gt;&#xA;&lt;p&gt;In alternativa alla trafila di condivisione descritta prima, è anche possibile invitare esplicitamente a collaborare un altro utente che ha già aperto SEE sul suo Mac.&lt;/p&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2023-10-30-subethaedit-scrivere-insieme-in-tempo-reale/invite-collaboration.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;Inoltre, cliccando con il tasto destro del mouse sull&amp;rsquo;icona simil-Wi-Fi in basso a destra, è possibile definire a priori se il documento su cui si sta lavorando è modificabile dagli altri utenti, solo leggibile oppure è &lt;em&gt;bloccato&lt;/em&gt;. In quest&amp;rsquo;ultimo caso non viene condiviso in rete e potrà essere modificato solo in locale.&lt;/p&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2023-10-30-subethaedit-scrivere-insieme-in-tempo-reale/sharing-options.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;Insomma, le possibilità non mancano, ed anche se ormai dovremmo essere abituati a lavorare in rete sullo stesso file, qui tutto si svolge in modo molto fluido e intuitivo. Peccato solo per il limite della rete locale e per il fatto che SEE giri solo su macOS, due fattori che rendono il programma utile solo ad un numero piuttosto ristretto di utenti.&lt;/p&gt;&#xA;&lt;h4 id=&#34;conclusioni&#34;&gt;Conclusioni&lt;/h4&gt;&#xA;&lt;p&gt;SubEthaEdit è un discreto editor di testo per macOS, che diventa insostituibile quando si ha bisogno di utilizzare le sue funzioni di scrittura collaborativa. Devo ammettere, però, che finora ho sempre preferito i suoi fratelli maggiori, in particolare TextMate e BBEdit.&lt;/p&gt;&#xA;&lt;p&gt;Ma ultimammente ho scoperto una funzione piccola-piccola e molto specialistica di questo programma che, quando serve, si dimostra davvero insostituibile. Però di questo ne parlerò la &lt;a href=&#34;https://melabit.com/it/2023/11/27/modifiche-a-colpo-docchio-con-subethaedit/&#34;&gt;prossima volta&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;&#xA;&lt;hr&gt;&#xA;&lt;ol&gt;&#xA;&lt;li id=&#34;fn:1&#34;&gt;&#xA;&lt;p&gt;Mi sono sbagliato di poco, secondo &lt;a href=&#34;https://en.wikipedia.org/wiki/SubEthaEdit&#34;&gt;Wikipedia&lt;/a&gt; la prima versione di SubEthaEdit risale ai tempi di Panther (Mac OS X 10.3), il sistema operativo immediatamente precedente a Tiger (10.4).&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:2&#34;&gt;&#xA;&lt;p&gt;Ma conosco fin troppi utenti rimasti ancorati allo scambio via email di una sequenza interminabile di &lt;code&gt;documento_v1.docx&lt;/code&gt;,&lt;code&gt;documento_v2.docx&lt;/code&gt;, &lt;code&gt;documento_v2b.docx&lt;/code&gt;, &lt;code&gt;documento_v2b_ultima_versione.docx&lt;/code&gt;, seguiti inevitabilmente da &lt;code&gt;documento_v2b_straultimissima_versione.docx&lt;/code&gt; e da &lt;code&gt;documento_v2b_sara_la_volta_buona.docx&lt;/code&gt;&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:3&#34;&gt;&#xA;&lt;p&gt;Chi rimpiange Atom può provare &lt;a href=&#34;https://pulsar-edit.dev/&#34;&gt;Pulsar&lt;/a&gt;, un &lt;em&gt;fork&lt;/em&gt; open source di Atom che aspira ad essere una versione migliorata e più moderna del genitore, ma che su macOS ha sembra avere ancora problemi di prestazioni.&amp;#160;&lt;a href=&#34;#fnref:3&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:4&#34;&gt;&#xA;&lt;p&gt;Con gli altri editor quando scrivo in Markdown sono abituato a selezionare un blocco di testo e a scrivere &lt;code&gt;_&lt;/code&gt; o &lt;code&gt;**&lt;/code&gt; per circondarlo con i tag che lo fanno visualizzare rispettivamente in italico o in grassetto. Con SEE non funziona e questa mancanza mi ha fatto penare durante la scrittura di questo articolo.&amp;#160;&lt;a href=&#34;#fnref:4&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:5&#34;&gt;&#xA;&lt;p&gt;Ho proposto di &lt;a href=&#34;https://github.com/subethaedit/SubEthaEdit/issues/243&#34;&gt;aggiungere queste funzioni&lt;/a&gt; sul &lt;a href=&#34;https://github.com/subethaedit/SubEthaEdit&#34;&gt;repository GitHub&lt;/a&gt; del programma ma finora non ho ricevuto alcun feedback dagli sviluppatori. Vedo anche che la maggior parte delle richieste rimangono inascoltate ed è probabile che la mia farà la stessa fine.&amp;#160;&lt;a href=&#34;#fnref:5&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/div&gt;&#xA;</description>
    </item>
    <item>
      <title>Script per tutti i giorni: lo script è il comando</title>
      <link>https://static.233.196.69.159.clients.your-server.de/it/2019/04/12/script-per-tutti-i-giorni-lo-script-e-il-comando/</link>
      <pubDate>Fri, 12 Apr 2019 18:00:00 +0000</pubDate>
      <guid>https://static.233.196.69.159.clients.your-server.de/it/2019/04/12/script-per-tutti-i-giorni-lo-script-e-il-comando/</guid>
      <description>&lt;img src=&#34;http://storage.datormuseum.se/u/96935524/Datormusuem/VT50/VT50-RT11-small.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;Nelle puntate precedenti abbiamo visto come scrivere dei semplici script in &lt;code&gt;bash&lt;/code&gt; o in &lt;code&gt;awk&lt;/code&gt; che risolvono un problema assai specifico, è vero, ma che possono anche costituire una buona base di partenza per affrontare argomenti più complessi (i link alle puntate precedenti si trovano alla fine dell&amp;rsquo;articolo).&lt;/p&gt;&#xA;&lt;p&gt;In particolare, nella &lt;a href=&#34;https://melabit.wordpress.com/2018/12/30/script-per-tutti-i-giorni-shell-e-parametri/&#34;&gt;terza puntata&lt;/a&gt; abbiamo imparato come rendere i nostri script &lt;em&gt;quasi&lt;/em&gt; indistinguibili dai normali comandi del Terminale: (1) si aggiunge in testa allo script lo &lt;a href=&#34;https://en.wikipedia.org/wiki/Shebang_%28Unix%29&#34;&gt;shebang&lt;/a&gt;, cioè la sequenza di caratteri &lt;code&gt;#!&lt;/code&gt;, seguita dal percorso completo al programma da utilizzare per eseguire lo script,&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; (2) si usa il comando &lt;code&gt;chmod&lt;/code&gt; per rendere lo script eseguibile (almeno) all’utente attuale del Mac,&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ chmod u+x nomescript&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;dove &lt;code&gt;nomescript&lt;/code&gt; è il nome generico dello script che vogliamo rendere eseguibile (ad esempio lo script &lt;code&gt;convert_title.sh&lt;/code&gt; della &lt;a href=&#34;https://melabit.wordpress.com/2018/12/30/script-per-tutti-i-giorni-shell-e-parametri/&#34;&gt;terza puntata&lt;/a&gt;).&lt;/p&gt;&#xA;&lt;p&gt;Il &amp;ldquo;quasi&amp;rdquo; di prima dipende dal fatto che, anche con queste modifiche, ogni volta che eseguiamo lo script dobbiamo indicare esplicitamente la directory dove si trova. Ad esempio, se ci siamo spostati con &lt;code&gt;cd&lt;/code&gt; nella directory che contiene &lt;code&gt;nomescript&lt;/code&gt;, per eseguirlo script dobbiamo scrivere&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ ./nomescript&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;premettendo quindi al nome dello script il percorso (&lt;code&gt;./&lt;/code&gt;) alla directory corrente.&lt;/p&gt;&#xA;&lt;p&gt;Invece, quando eseguiamo uno dei comandi del sistema operativo, ci basta scrivere il nome del comando nel Terminale e il sistema operativo (o più precisamente la &lt;a href=&#34;https://it.wikipedia.org/wiki/Shell_Unix&#34;&gt;shell&lt;/a&gt; che stiamo usando, che in genere è &lt;code&gt;bash&lt;/code&gt;)&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt; va a cercare il programma sul disco rigido e lo esegue senza troppi problemi.&lt;/p&gt;&#xA;&lt;p&gt;Qual&amp;rsquo;è il meccanismo che permette alla shell di &lt;em&gt;sapere&lt;/em&gt; in quale directory si trovano i comandi che eseguiamo nel Terminale? Esiste un modo per replicare questo comportamento anche per i nostri script, rendendoli praticamente indistinguibili dai comandi intrinseci del sistema operativo?&lt;/p&gt;&#xA;&lt;h4 id=&#34;variabili-di-ambiente&#34;&gt;Variabili di ambiente&lt;/h4&gt;&#xA;&lt;p&gt;In realtà non c&amp;rsquo;è niente di sofisticato o di particolarmente intelligente in quello che fa la shell. La chiave di tutto sta nelle &lt;a href=&#34;https://it.wikipedia.org/wiki/Variabile_d%27ambiente_%28Unix%29&#34;&gt;variabili di ambiente&lt;/a&gt; di &lt;code&gt;bash&lt;/code&gt;, delle variabili speciali usate fra l&amp;rsquo;altro per specificare le impostazioni di lavoro della shell. Se lanciamo il Terminale ed eseguiamo il comando&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ env&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;otterremo un lungo elenco con tutte le variabili di ambiente definite da &lt;code&gt;bash&lt;/code&gt;, che per convenzione vengono scritte in maiuscolo. Fra queste spiccano &lt;code&gt;HOME&lt;/code&gt;, che definisce il percorso alla cartella Home dell&amp;rsquo;utente che sta usando il Mac, &lt;code&gt;USER&lt;/code&gt; che riporta il &lt;code&gt;nome account&lt;/code&gt; (o &lt;code&gt;nome breve&lt;/code&gt;) dell&amp;rsquo;utente, e &lt;code&gt;PWD&lt;/code&gt; che contiene il percorso alla directory in cui ci troviamo (percorso che, come già visto, &lt;a href=&#34;https://melabit.wordpress.com/2019/01/30/script-per-tutti-i-giorni-ricapitoliamo/&#34;&gt;si può ricavare&lt;/a&gt; con il comando &lt;code&gt;pwd&lt;/code&gt;, ma guarda la combinazione).&lt;/p&gt;&#xA;&lt;p&gt;Se siamo interessati solo ad una particolare variabile di ambiente, possiamo stamparla con &lt;code&gt;echo&lt;/code&gt; seguito dal nome della variabile di ambiente, che però deve essere preceduto dal simbolo &lt;code&gt;$&lt;/code&gt;. Ad esempio&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ echo $HOME&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;stampa nel Terminale il valore della variabile di ambiente &lt;code&gt;HOME&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Fra tutte le variabili di ambiente elencate da &lt;code&gt;env&lt;/code&gt;, quella che ci interessa di più in questo momento è &lt;code&gt;PATH&lt;/code&gt;, che contiene una serie di percorsi di directory separati dal simbolo &lt;code&gt;:&lt;/code&gt;. Nella configurazione di default il valore del PATH è&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ echo $PATH&#xA;PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;h4 id=&#34;shell-e-path&#34;&gt;Shell e PATH&lt;/h4&gt;&#xA;&lt;p&gt;È proprio il PATH che permette alla shell di trovare da sola i comandi di sistema. Ogni volta che eseguiamo un comando nel Terminale, la shell lo cerca nelle directory indicate nel PATH, esaminandole una dopo l&amp;rsquo;altra nell&amp;rsquo;ordine in cui sono scritte. Se trova il comando lo esegue immediatamente, senza preoccuparsi di esaminare le directory successive, altrimenti dà un errore di &lt;code&gt;command not found&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Di conseguenza, l&amp;rsquo;ordine in cui sono elencati i percorsi nel PATH è importante. Questa particolarità può essere sfruttata per sostituire un comando del sistema operativo con una versione più recente, senza però cancellare il comando originale: se il comando originale è situato in &lt;code&gt;/usr/bin&lt;/code&gt; o in &lt;code&gt;/bin&lt;/code&gt;, basta installare la versione aggiornata in una directory del PATH che precede queste due directory, come ad esempio &lt;code&gt;/usr/local/bin&lt;/code&gt; (che nei sistemi Unix serve proprio per installare il software &amp;ldquo;locale&amp;rdquo; non gestito direttamente dal sistema operativo).&lt;sup id=&#34;fnref:3&#34;&gt;&lt;a href=&#34;#fn:3&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;3&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#xA;&lt;p&gt;La seconda conseguenza è che, se modifichiamo il PATH aggiungendo altre directory in testa o in fondo all&amp;rsquo;elenco originale, possiamo &lt;em&gt;obbligare&lt;/em&gt; la shell a cercare i comandi anche in queste nuove directory non presenti nella configurazione di default. Che è proprio quello che ci serve.&lt;/p&gt;&#xA;&lt;p&gt;Prima di andare avanti una avvertenza &lt;strong&gt;FONDAMENTALE&lt;/strong&gt;. Possiamo aggiungere senza troppi problemi delle nuove directory al PATH di default, ma non dobbiamo &lt;strong&gt;MAI MAI MAI&lt;/strong&gt; rimuovere le directory presenti nella configurazione originale del PATH, in particolare le quattro directory &lt;code&gt;/usr/bin:/bin:/usr/sbin:/sbin&lt;/code&gt; (leggetele ad alta voce e notate l&amp;rsquo;assonanza). Cancellare per errore una di queste directory dal PATH significa non poter più usare il Mac, o perlomeno dover usare degli strumenti non alla portata di tutti per rimettere a posto le cose.&lt;/p&gt;&#xA;&lt;p&gt;Siete avvertiti!!!&lt;/p&gt;&#xA;&lt;h4 id=&#34;modificare-il-path&#34;&gt;Modificare il PATH&lt;/h4&gt;&#xA;&lt;p&gt;Per aggiungere (o rimuovere) delle directory al PATH di default del nostro Mac dobbiamo modificare con un &lt;a href=&#34;https://melabit.wordpress.com/2018/12/05/script-per-tutti-i-giorni-dalla-linea-di-comando-al-programma/&#34;&gt;editor di testo&lt;/a&gt; (non con un wordprocessor!) il file &lt;code&gt;.bashrc&lt;/code&gt; situato nella nostra &lt;code&gt;HOME&lt;/code&gt;. Questo introduce una piccola complicazione, perché il file &lt;code&gt;~/.bashrc&lt;/code&gt; è un file nascosto, non accessibile direttamente dal Finder.&lt;/p&gt;&#xA;&lt;p&gt;Se usiamo &lt;code&gt;emacs&lt;/code&gt; o &lt;code&gt;vi&lt;/code&gt; possiamo aprire &lt;code&gt;.bashrc&lt;/code&gt; direttamente dal Terminale. Ci basta spostarci nella &lt;code&gt;HOME&lt;/code&gt;&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ cd ~&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;ed eseguire&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ emacs .bashrc&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;oppure&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ vi .bashrc&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Se questi editor ci sembrano troppo difficili da usare (e lo sono!), possiamo usare &lt;code&gt;nano&lt;/code&gt; che, come &lt;code&gt;emacs&lt;/code&gt; e &lt;code&gt;vi&lt;/code&gt;, si trova installato di default su ogni Mac&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ nano .bashrc&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Anche se &lt;a href=&#34;https://www.nano-editor.org/&#34;&gt;nano&lt;/a&gt; è un editor piuttosto limitato rispetto ai due mostri sacri, è molto comodo per modificare velocemente i file di sistema senza dover affrontare una lunga fase di apprendimento.&lt;/p&gt;&#xA;&lt;p&gt;Se invece preferiamo usare un &lt;a href=&#34;https://melabit.wordpress.com/2018/12/05/script-per-tutti-i-giorni-dalla-linea-di-comando-al-programma/&#34;&gt;editor grafico&lt;/a&gt; come BBEdit, TextMate, Atom o simili, la procedura esatta per aprire un file nascosto dipende dall&amp;rsquo;editor scelto.&lt;/p&gt;&#xA;&lt;p&gt;Alcuni editor permettono di installare un comando di Terminale con cui lanciare l&amp;rsquo;editor dalla linea di comando: &lt;code&gt;mate&lt;/code&gt; per TextMate, &lt;code&gt;atom&lt;/code&gt; e &lt;code&gt;bbedit&lt;/code&gt; per&amp;hellip; lo sapete già. Anche con questi editor, quindi, possiamo aprire &lt;code&gt;.bashrc&lt;/code&gt; dal Terminale con uno dei comandi seguenti&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ mate .bashrc &#xA;$ atom .bashrc&#xA;$ bbedit .bashrc&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Con BBEdit e TextMate, la finestra di apertura file dispone di un tasto &lt;code&gt;Opzioni&lt;/code&gt; con il quale si può decidere di mostrare (e quindi di aprire) anche i file nascosti&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://melabit.files.wordpress.com/2019/04/textmate-options.png&#34; alt=&#34;&#34;&gt;&#xA;&lt;img src=&#34;https://melabit.files.wordpress.com/2019/04/textmate-hidden.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Ma il metodo più generale per modificare un file nascosto con un editor grafico è quello di usare il comando &lt;code&gt;open&lt;/code&gt; dal Terminale&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ cd ~&#xA;$ open -a &amp;quot;TextMate&amp;quot; .bashrc&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;dove l&amp;rsquo;opzione &lt;code&gt;-a&lt;/code&gt; permette di specificare l&amp;rsquo;applicazione con cui aprire il file indicato.&lt;/p&gt;&#xA;&lt;p&gt;Qualunque sia il metodo utilizzato, alla fine ci ritroveremo con il file &lt;code&gt;.bashrc&lt;/code&gt; pronto per essere modificato. Tutto quello che dobbiamo fare è aggiungere questa linea alla fine di &lt;code&gt;.bashrc&lt;/code&gt;&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;export PATH=$PATH:~/Development&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;che istruisce la shell di andare a cercare i comandi da eseguire nel Terminale anche nella directory &lt;code&gt;~/Development&lt;/code&gt;, dove &lt;a href=&#34;https://melabit.wordpress.com/2018/12/30/script-per-tutti-i-giorni-shell-e-parametri/&#34;&gt;abbiamo deciso di salvare&lt;/a&gt; tutti gli script che sviluppiamo.&lt;/p&gt;&#xA;&lt;p&gt;Una volta fatta questa semplice modifica, salviamo il file &lt;code&gt;.bashrc&lt;/code&gt; e usciamo dall&amp;rsquo;editor. Chiudiamo e riapriamo il Terminale per &lt;em&gt;costringere&lt;/em&gt; la shell a rileggere il file &lt;code&gt;.bashrc&lt;/code&gt; (oppure eseguiamo il comando &lt;code&gt;$ source ~/.bashrc&lt;/code&gt; senza chiudere il Terminale) e proviamo di nuovo ad eseguire &lt;code&gt;nomescript&lt;/code&gt;, ma questa volta senza premettere il percorso alla directory dove si trova&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ nomescript&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Questa volta lo script funzionerà senza bisogno di &lt;em&gt;aiutini&lt;/em&gt;, proprio come se fosse un normale comando di sistema. Per verificare che tutto funzioni come descritto possiamo provare ad eseguire uno degli script della &lt;a href=&#34;https://melabit.wordpress.com/2018/12/30/script-per-tutti-i-giorni-shell-e-parametri/&#34;&gt;terza&lt;/a&gt; o della &lt;a href=&#34;https://melabit.wordpress.com/2019/02/18/script-per-tutti-i-giorni-entra-in-scena-awk/&#34;&gt;quinta&lt;/a&gt; puntata.&lt;/p&gt;&#xA;&lt;h4 id=&#34;ma-non-è-ancora-finita&#34;&gt;Ma non è ancora finita&amp;hellip;&lt;/h4&gt;&#xA;&lt;p&gt;Bisogna ammetterlo, aggiungere al &lt;code&gt;$PATH&lt;/code&gt; una directory &lt;em&gt;qualunque&lt;/em&gt; come &lt;code&gt;~/Development&lt;/code&gt; può andar bene per fare delle prove veloci, ma non è per niente elegante. Sarebbe molto meglio adeguarsi alle convenzioni di Unix, secondo le quali i programmi eseguibili devono trovarsi in una directory denominata &lt;code&gt;bin&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Niente di più facile, possiamo creare facilmente una directory &lt;code&gt;bin&lt;/code&gt; nella nostra &lt;code&gt;HOME&lt;/code&gt;&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ cd&#xA;$ mkdir bin&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;e decidere di tenere gli script in fase di sviluppo nella directory &lt;code&gt;~/Development&lt;/code&gt;, per poi spostarli (o meglio copiarli) in &lt;code&gt;~/bin&lt;/code&gt; quando sono pronti per essere usati. Naturalmente dovremo modificare di conseguenza il file &lt;code&gt;.bashrc&lt;/code&gt;, aggiungendo alla fine del file&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;export PATH=$PATH:~/bin&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;al posto di &lt;code&gt;export PATH=$PATH:~/Development&lt;/code&gt; visto sopra.&lt;/p&gt;&#xA;&lt;p&gt;Non ci piace vedere con il Finder la directory &lt;code&gt;bin&lt;/code&gt; nella &lt;code&gt;HOME&lt;/code&gt;? Possiamo nasconderla con facilità, basta solo eseguire dal solito Terminale il comando&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ chflags hidden ~/bin&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;(il comando duale &lt;code&gt;$ chflags nohidden ~/bin&lt;/code&gt; rende di nuovo visibile la directory).&lt;/p&gt;&#xA;&lt;h4 id=&#34;conclusioni&#34;&gt;Conclusioni&lt;/h4&gt;&#xA;&lt;p&gt;Per i più pigri che non vogliono andare a rileggere le puntate precedenti per provare le novità descritte nell&amp;rsquo;articolo, ecco un semplice script in &lt;code&gt;bash&lt;/code&gt; che mostra la data e l&amp;rsquo;ora corrente nel formato standard Unix e in una forma molto più dettagliata (e per una volta anche nella nostra lingua)&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;#!/bin/bash&#xA;&#xA;year=`date +%Y`&#xA;month=`date +%B`&#xA;day=`date +%d`&#xA;hour=`date +%H`&#xA;minute=`date +%M`&#xA;second=`date +%S`&#xA;dayofyear=`date +%j`&#xA;weekday=`date +%A`&#xA;&#xA;echo `date`&#xA;echo -n &amp;#34;Oggi è $weekday $day $month $year, &amp;#34;&#xA;echo -n &amp;#34;il $dayofyear-esimo giorno dell&amp;#39;anno, &amp;#34;&#xA;echo &amp;#34;e sono le ore $hour:$minute:$second&amp;#34;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Copiamo lo script nell&amp;rsquo;editor preferito, salviamolo in &lt;code&gt;~/bin&lt;/code&gt; (o in &lt;code&gt;~/Development&lt;/code&gt;) con il nome &lt;code&gt;data_estesa&lt;/code&gt;, rendiamolo eseguibile con &lt;code&gt;chmod&lt;/code&gt; e proviamo che funzioni come previsto&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ data_estesa&#xA;Fri Apr 12T17:28:00:50 CEST 2019&#xA;Oggi è Venerdì 12 Aprile 2019, il 102-esimo giorno dell&#39;anno, e sono le ore 17:28:50&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;E per oggi è davvero tutto.&lt;/p&gt;&#xA;&lt;h4 id=&#34;articoli-precedenti&#34;&gt;Articoli precedenti&lt;/h4&gt;&#xA;&lt;p&gt;Per leggere gli articoli precedenti della serie basta cliccare sui link qui sotto.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Prima puntata, &lt;a href=&#34;https://melabit.wordpress.com/2018/11/23/script-per-tutti-i-giorni-semplici-modifiche-alle-stringhe-di-testo/&#34;&gt;Script per tutti i giorni: semplici modifiche alle stringhe di testo&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;Seconda puntata, &lt;a href=&#34;https://melabit.wordpress.com/2018/12/05/script-per-tutti-i-giorni-dalla-linea-di-comando-al-programma/&#34;&gt;Script per tutti i giorni: dalla linea di comando al programma&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;Terza puntata, &lt;a href=&#34;https://melabit.wordpress.com/2018/12/30/script-per-tutti-i-giorni-shell-e-parametri/&#34;&gt;Script per tutti i giorni: shell e parametri&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;Quarta puntata, &lt;a href=&#34;https://melabit.wordpress.com/2019/01/30/script-per-tutti-i-giorni-ricapitoliamo/&#34;&gt;Script per tutti i giorni: ricapitoliamo&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;Quinta puntata, &lt;a href=&#34;https://melabit.wordpress.com/2019/02/18/script-per-tutti-i-giorni-entra-in-scena-awk/&#34;&gt;Script per tutti i giorni: entra in scena awk&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;&#xA;&lt;hr&gt;&#xA;&lt;ol&gt;&#xA;&lt;li id=&#34;fn:1&#34;&gt;&#xA;&lt;p&gt;Sul Mac uno script in &lt;code&gt;bash&lt;/code&gt; richiede il percorso &lt;code&gt;/bin/bash&lt;/code&gt;, uno in &lt;code&gt;awk&lt;/code&gt; &lt;em&gt;puro&lt;/em&gt; &lt;code&gt;/usr/bin/awk&lt;/code&gt;, mentre uno nella ormai veneranda versione 2.7 di &lt;code&gt;python&lt;/code&gt; installata di default in macOS richiede &lt;code&gt;/usr/bin/python&lt;/code&gt; (ma ci vuol poco ad installare &lt;code&gt;python3&lt;/code&gt; con &lt;a href=&#34;https://brew.sh&#34;&gt;Homebrew&lt;/a&gt; o &lt;a href=&#34;https://conda.io/en/latest/&#34;&gt;Conda&lt;/a&gt;).&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:2&#34;&gt;&#xA;&lt;p&gt;Ma ci sono anche &lt;code&gt;zsh&lt;/code&gt;, &lt;code&gt;ksh&lt;/code&gt;, &lt;code&gt;tcsh&lt;/code&gt;, &lt;code&gt;fish&lt;/code&gt;, solo per menzionare le shell più note.&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:3&#34;&gt;&#xA;&lt;p&gt;È esattamente quello che fa &lt;a href=&#34;https://brew.sh&#34;&gt;Homebrew&lt;/a&gt;, uno strumento utilissimo (di cui ho &lt;a href=&#34;https://melabit.wordpress.com/2014/04/29/homebrew-software-per-il-mac-fatto-in-casa/&#34;&gt;scritto parecchio&lt;/a&gt; su questo blog) che utilizza &lt;code&gt;/usr/local/bin&lt;/code&gt; per installare un gran numero di strumenti software provenienti dal mondo Linux e non disponibili su macOS, oppure per aggiornare a versioni più recenti quelli, normalmente piuttosto datati, forniti da Apple insieme al sistema operativo.&amp;#160;&lt;a href=&#34;#fnref:3&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/div&gt;&#xA;</description>
    </item>
    <item>
      <title>Script per tutti i giorni: 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>
  </channel>
</rss>
