<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Imagemagick on Melabit</title>
    <link>https://static.233.196.69.159.clients.your-server.de/it/tags/imagemagick/</link>
    <description>Recent content in Imagemagick on Melabit</description>
    <generator>Hugo</generator>
    <language>it</language>
    <lastBuildDate>Sat, 07 Aug 2021 06:00:00 +0000</lastBuildDate>
    <atom:link href="https://static.233.196.69.159.clients.your-server.de/it/tags/imagemagick/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Come nascondere in modo sicuro le informazioni riservate di un file pdf</title>
      <link>https://static.233.196.69.159.clients.your-server.de/it/2021/08/07/come-nascondere-in-modo-sicuro-le-informazioni-riservate-di-un-file-pdf/</link>
      <pubDate>Sat, 07 Aug 2021 06:00:00 +0000</pubDate>
      <guid>https://static.233.196.69.159.clients.your-server.de/it/2021/08/07/come-nascondere-in-modo-sicuro-le-informazioni-riservate-di-un-file-pdf/</guid>
      <description>&lt;p&gt;Ve la ricordate la figuraccia dell&amp;rsquo;esercito americano che aveva documentato i risultati dell&amp;rsquo;&lt;a href=&#34;https://www.repubblica.it/2005/d/sezioni/esteri/niccal3/relusa/relusa.html&#34;&gt;indagine sulla morte di Nicola Calipari&lt;/a&gt; con un PDF pieno di omissis ma che &lt;a href=&#34;https://www.macchianera.net/2005/05/01/il-rapporto-calipari-senza-omissis/&#34;&gt;poteva essere letto integralmente&lt;/a&gt; con un semplice copia e incolla del testo? Beh, è successo anche a me: dovevo nascondere delle informazioni riservate da alcuni documenti richiesti dal Ministero e &lt;strong&gt;ho fatto lo stesso errore degli americani&lt;/strong&gt;. Però poi ho imparato come si fa in modo corretto e lo racconto qui perché potrebbe essere utile ad altri lettori.&lt;/p&gt;&#xA;&lt;hr style = &#34;border: none; &#xA;            border-top: 3px double #333; &#xA;            color: #333; &#xA;            overflow: visible; &#xA;            height: 5px; &#xA;            width: 50%; &#xA;            margin-left: auto; &#xA;            margin-right: auto;&#34;&#xA;&gt;&#xA;&#xA;&lt;p&gt;La burocrazia italiana è un mostro dalle mille teste e da un pezzo ho smesso di cercare di capirne le motivazioni. Questa però non è male: ogni volta che partecipo a un progetto di ricerca finanziato da un Ministero o da una Regione devo produrre i miei cedolini dello stipendio in formato PDF per tutti i mesi (o meglio anni) di durata del progetto.&lt;/p&gt;&#xA;&lt;p&gt;Tutto ciò serve a dimostrare che il mio datore di lavoro è in regola con i contributi e con tutte le altre disposizioni di legge. Tutto bene in teoria, peccato che il mio datore di lavoro sia il CNR, un ente pubblico, che quindi deve per forza di cose essere in regola con queste disposizioni. Ma la burocrazia non guarda a questi dettagli, se c&amp;rsquo;è una norma va applicata ciecamente anche se è inutile (anzi, direi, preferibilmente se è inutile).&lt;/p&gt;&#xA;&lt;hr style = &#34;border: none; &#xA;            border-top: 3px double #333; &#xA;            color: #333; &#xA;            overflow: visible; &#xA;            height: 5px; &#xA;            width: 50%; &#xA;            margin-left: auto; &#xA;            margin-right: auto;&#34;&#xA;&gt;&#xA;&#xA;&lt;p&gt;Ma al di là della seccatura di dover rispondere ad una richiesta chiaramente superflua, i cedolini contengono &lt;strong&gt;informazioni riservate che è bene nascondere&lt;/strong&gt;: l&amp;rsquo;IBAN prima di tutto, ma poi anche l&amp;rsquo;eventuale quota sindacale, informazioni sulle tasse pagate o sui prestiti e benefici vari di cui si potrebbe usufruire, e chissà che altro che non so. Per parecchio tempo ho reso illeggibili queste informazioni utilizzando la funzione &lt;em&gt;sfumino&lt;/em&gt; (&lt;em&gt;smudge&lt;/em&gt;) di Pixelmator, come si può vedere qui sotto.&lt;/p&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2021-08-07-come-nascondere-in-modo-sicuro-le-informazioni-riservate-di-un-file-pdf/iban-con-sfumino.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;Usare lo sfumino però è noioso, soprattutto se si deve ripetere il processo su un gran numero di documenti diversi. E allora a un certo punto, ideona!, ho pensato bene di &lt;strong&gt;utilizzare Anteprima per inserire dei rettangoli neri sopra le porzioni di testo da nascondere&lt;/strong&gt;, con il grosso vantaggio di poterli copiare ed incollare facilmente in tutti i documenti da mascherare.&lt;/p&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2021-08-07-come-nascondere-in-modo-sicuro-le-informazioni-riservate-di-un-file-pdf/iban-con-rettangolo.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;Ma, proprio come nel rapporto Calipari, &lt;strong&gt;questo metodo consente di recuperare le informazioni riservate con un semplice copia e incolla&lt;/strong&gt;, come potete verificare voi stessi con &lt;a href=&#34;https://melabit.files.wordpress.com/2021/08/documento-pdf-mascherato.pdf&#34;&gt;questo file&lt;/a&gt;.&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#xA;&lt;p&gt;Tutto ciò succede perché, a partire dalla &lt;a href=&#34;https://www.prepressure.com/pdf/basics/version&#34;&gt;versione 1.5&lt;/a&gt;, &lt;strong&gt;un file PDF può memorizzare le informazioni su più livelli diversi&lt;/strong&gt;, più o meno come i file grafici di Photoshop (o simili). Nel caso specifico, i rettangoli aggiunti finiscono in un livello diverso da quello del cedolino originale e possono essere selezionati e modificati anche in un secondo momento con Anteprima o con Acrobat Reader.&lt;/p&gt;&#xA;&lt;hr style = &#34;border: none; &#xA;            border-top: 3px double #333; &#xA;            color: #333; &#xA;            overflow: visible; &#xA;            height: 5px; &#xA;            width: 50%; &#xA;            margin-left: auto; &#xA;            margin-right: auto;&#34;&#xA;&gt;&#xA;&#xA;&lt;p&gt;&lt;strong&gt;Combinare i livelli di un file PDF è facile&lt;/strong&gt;, basta usare il servizio &amp;ldquo;Salva come PDF&amp;hellip;&amp;rdquo; raggiungibile dal menu File &amp;gt; Stampa&amp;hellip; di Anteprima (o di qualunque altra applicazione per macOS). Questo servizio simula la stampa del file PDF originale, salvandolo invece in un nuovo documento PDF. Poiché una stampante non può gestire i livelli multipli del file originale, l&amp;rsquo;effetto finale è quello di fondere tutti i livelli in uno solo, rendendo il documento non più modificabile (come ci si può accorgere facilmente se si prova a selezionare i rettangoli neri di &lt;a href=&#34;https://static.233.196.69.159.clients.your-server.de/img/2021-08-07-come-nascondere-in-modo-sicuro-le-informazioni-riservate-di-un-file-pdf/documento-pdf-mascherato.pdf&#34;&gt;questo file&lt;/a&gt; dopo averlo &lt;a href=&#34;https://static.233.196.69.159.clients.your-server.de/img/2021-08-07-come-nascondere-in-modo-sicuro-le-informazioni-riservate-di-un-file-pdf/documento-pdf-mascherato-e-stampato.pdf&#34;&gt;stampato virtualmente&lt;/a&gt; come appena descritto).&lt;/p&gt;&#xA;&lt;p&gt;Ho sempre pensato che tutto ciò bastasse a nascondere efficacemente le informazioni riservate, ma purtroppo non è così: anche se i rettangoli neri aggiunti al file PDF non possono essere più modificati, è ancora possibile selezionare e copiare il testo sottostante (provare con il &lt;a href=&#34;https://static.233.196.69.159.clients.your-server.de/img/2021-08-07-come-nascondere-in-modo-sicuro-le-informazioni-riservate-di-un-file-pdf/documento-pdf-mascherato-e-stampato.pdf&#34;&gt;file di sopra&lt;/a&gt; per credere).&lt;/p&gt;&#xA;&lt;p&gt;Per fortuna il problema può essere risolto sia tramite il solito Anteprima che con il Terminale. Anteprima va benissimo se abbiamo a che fare con uno o due file PDF, mentre la potenza del Terminale viene fuori alla grande quando i file da gestire sono parecchi.&lt;/p&gt;&#xA;&lt;hr style = &#34;border: none; &#xA;            border-top: 3px double #333; &#xA;            color: #333; &#xA;            overflow: visible; &#xA;            height: 5px; &#xA;            width: 50%; &#xA;            margin-left: auto; &#xA;            margin-right: auto;&#34;&#xA;&gt;&#xA;&#xA;&lt;p&gt;&lt;strong&gt;Metodo numero 1&lt;/strong&gt;. Usare Anteprima è di gran lunga il modo più facile per nascondere in modo sicuro le informazioni riservate presenti in un file PDF, ma richiede due passaggi manuali e la creazione di un file intermedio che va poi buttato via, per cui è consigliabile solo a chi deve rendere sicuri solo pochi file PDF (oppure a chi ha molta pazienza).&lt;/p&gt;&#xA;&lt;p&gt;Per procedere bisogna aprire con Anteprima il file PDF contenente le informazioni riservate ancora in chiaro e inserire i soliti rettangoli neri sopra le parti di testo da nascondere. Arrivati a questo punto si esporta il file PDF in un formato grafico, che può essere indifferentemente HEIC, PNG o TIFF (non JPEG, perché questo formato supporta solo documenti di una pagina). Basta ora aprire questo file grafico con Anteprima ed esportarlo di nuovo in PDF (o ancora meglio stamparlo virtualmente in PDF) per avere un file a prova di bomba, nel quale non è più possibile selezionare il testo del documento. Il file rimane sicuro anche se lo si sottopone ad un processo di riconoscimento ottico dei caratteri (OCR) con uno dei tanti software disponibili (io uso con soddisfazione una vecchia versione di PDFpenPro ma ce n&amp;rsquo;è davvero per tutti i gusti), che ora non può andare a leggere &lt;em&gt;dietro&lt;/em&gt; le pecette nere.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Metodo numero 2&lt;/strong&gt;. &lt;a href=&#34;https://www.ghostscript.com/&#34;&gt;Ghostscript&lt;/a&gt; è probabilmente lo strumento software più diffuso per la gestione dei file PostScript e PDF dal Terminale, può fare cose complicatissime ma richiede un grosso sforzo per padroneggiarlo a dovere. Ghostscript non è presente di default in macOS ma può essere installato facilmente &lt;a href=&#34;https://discussions.apple.com/thread/8584571&#34;&gt;tramite Homebrew&lt;/a&gt; oppure installando &lt;a href=&#34;http://www.tug.org/mactex/&#34;&gt;MacTeX&lt;/a&gt;,&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt; la distribuzione più diffusa di LaTeX per macOS.&lt;/p&gt;&#xA;&lt;p&gt;Una volta che abbiamo Ghostscript sul Mac, possiamo usarlo per trasformare in un solo colpo il documento PDF da mascherare in un documento sicuro tramite questo comando da eseguire nel Terminale di macOS&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ gs -dPDF -dBATCH -dNOPAUSE -dNOSUBSTDEVICECOLORS -sDEVICE=pdfwrite \&#xA;-sOutputFile=documento_sicuro.pdf documento_da_mascherare.pdf&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;I nomi dei due file PDF presenti nell&amp;rsquo;ultima riga del comando sono autoesplicativi e vanno sostituiti con i nomi veri dei nostri documenti. Ricordo come al solito che il carattere &lt;code&gt;$&lt;/code&gt; indica il prompt del Terminale di macOS e non fa parte del comando vero e proprio.&lt;/p&gt;&#xA;&lt;p&gt;Ghoscript funziona bene ma è un po&amp;rsquo; lento e tante opzioni sono davvero oscure. Molto meglio secondo me utilizzare il prossimo metodo.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Metodo numero 3&lt;/strong&gt;. Anche &lt;a href=&#34;https://imagemagick.org&#34;&gt;ImageMagick&lt;/a&gt; è un peso massimo fra gli strumenti da Terminale, specializzato nella creazione, modifica o conversione dei file grafici di praticamente &lt;a href=&#34;https://imagemagick.org/script/formats.php&#34;&gt;qualunque formato&lt;/a&gt; ci venga in mente. ImageMagick mette a disposizione una marea sterminata di comandi e di opzioni fra i quali è facile perdersi, però la natura più moderna del programma lo rende più facile da usare, almeno al livello base che ci serve qui. Anche ImageMagick va &lt;a href=&#34;https://imagemagick.org/script/download.php#macosx&#34;&gt;installato sul Mac tramite Homebrew&lt;/a&gt;, e comunque richiede la presenza di Ghostscript per funzionare (che è poi il motivo principale per cui ho deciso di presentare anche il metodo numero 2).&lt;/p&gt;&#xA;&lt;p&gt;Per convertire il documento PDF da mascherare in un documento sicuro con ImageMagick basta eseguire da Terminale il comando&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ magick convert -density 300 documento_da_mascherare.pdf documento_sicuro.pdf&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;eventualmente anche senza il comando iniziale &lt;code&gt;magick&lt;/code&gt;&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ convert -density 300 documento_da_mascherare.pdf documento_sicuro.pdf&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;L&amp;rsquo;opzione &lt;code&gt;density&lt;/code&gt; indica la risoluzione (in punti per pollice, dpi) del documento finale, 300 dpi vanno benissimo per i documenti stampati ma possono essere tranquillamente ridotti a 150 o anche 96 dpi se il file sicuro viene utilizzato solo sul computer (e quindi, come piace tanto dire ai nostri burocrati, è &lt;em&gt;dematerializzato&lt;/em&gt;).&lt;/p&gt;&#xA;&lt;p&gt;Come dicevo prima, l&amp;rsquo;utilità di usare il Terminale viene fuori soprattutto quando abbiamo un gran numero di file da rendere sicuri. Per farlo possiamo usare questo script in &lt;code&gt;bash&lt;/code&gt; che va copiato nella cartella contenente i file PDF da processare (oppure in una &lt;a href=&#34;https://melabit.com/it/2019/04/12/script-per-tutti-i-giorni-lo-script-e-il-comando/&#34;&gt;cartella presente nel &lt;code&gt;PATH&lt;/code&gt;&lt;/a&gt;) dandogli un nome significativo (io uso &lt;code&gt;secure_pdf&lt;/code&gt; ma potete usare quello che preferite), lanciandolo da Terminale dopo averlo reso eseguibile con &lt;code&gt;chmod&lt;/code&gt; (i dettagli di come si fa &lt;a href=&#34;https://melabit.com/it/2019/04/12/script-per-tutti-i-giorni-lo-script-e-il-comando/&#34;&gt;li trovate qui&lt;/a&gt;).&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;#!/bin/bash&#xA;&#xA;OUTDIR=&amp;#34;./secured&amp;#34;&#xA;&#xA;if [[ ! -d $OUTDIR ]]; then&#xA;    mkdir &amp;#34;$OUTDIR&amp;#34;&#xA;fi&#xA; &#xA;for f in *.pdf; do&#xA;    fout=&amp;#34;$OUTDIR/$f&amp;#34;&#xA;    echo &amp;#34;Converting &amp;#39;$f&amp;#39; to &amp;#39;$fout&amp;#39;&amp;#34;&#xA;    convert -density 300 &amp;#34;$f&amp;#34; &amp;#34;$fout&amp;#34;&#xA;done&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Lo script converte tutti i PDF che trova nella cartella dove viene eseguito, salvandoli in una nuova cartella &lt;code&gt;secured&lt;/code&gt; con lo stesso nome del documento PDF originale. Se volete che i file sicuri abbiano un nome diversi e magari finiscano nella stessa cartella dei file originali, basta aggiungere o modificare un paio di righe ed è fatto.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;#!/bin/bash&#xA;&#xA;OUTDIR=&amp;#34;.&amp;#34;&#xA;SUFFIX=&amp;#34;-SECURE&amp;#34;&#xA;&#xA;if [[ ! -d $OUTDIR ]]; then&#xA;    mkdir &amp;#34;$OUTDIR&amp;#34;&#xA;fi&#xA; &#xA;for f in *.pdf; do&#xA;    fname=`basename &amp;#34;$f&amp;#34; &amp;#34;.pdf&amp;#34;`&#xA;    fout=&amp;#34;$OUTDIR/$fname $SUFFIX.pdf&amp;#34;&#xA;    echo &amp;#34;Converting &amp;#39;$f&amp;#39; to &amp;#39;$fout&amp;#39;&amp;#34;&#xA;    convert -density 300 &amp;#34;$f&amp;#34; &amp;#34;$fout&amp;#34;&#xA;done&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;Altri metodi&lt;/strong&gt;. Naturalmente quelli elencato non sono gli unici metodi validi per rendere sicuro un PDF. Chi usa Acrobat Pro può fare tutto da questo programma &lt;a href=&#34;https://helpx.adobe.com/it/acrobat/using/removing-sensitive-content-pdfs.html&#34;&gt;utilizzando gli strumenti integrati di redazione del testo&lt;/a&gt;. Personalmente trovo inutile pagare 20 euro al mese per un editor di PDF (il migliore, è vero, ma sono sempre 240 euro all&amp;rsquo;anno), ma per chi ha già una licenza Adobe può essere l&amp;rsquo;opzione migliore.&lt;/p&gt;&#xA;&lt;p&gt;Un&amp;rsquo;altra alternativa molto meno costosa è quella di usare uno strumento come il mai troppo apprezzato &lt;a href=&#34;https://apps.apple.com/it/app/pdf-toolkit/id545164971&#34;&gt;PDF Toolkit+&lt;/a&gt;, con il quale è possibile tramite interfaccia grafica esportare un documento PDF in vari formati grafici e a svariate risoluzioni, dove ogni pagina del PDF finisce in un file diverso, e &lt;em&gt;rimontare&lt;/em&gt; poi le singole pagine in un unico file PDF. Niente che non si possa fare con Anteprima, ma qui abbiamo una maggiore flessibilità, ad esempio perché possiamo decidere di cambiare l&amp;rsquo;ordine delle pagine o di escluderne alcune dal documento finale. In ogni caso PDF Toolkit+ vale molto di più dei due caffè che costa, io ad esempio lo trovo perfetto per ridurre le dimensioni dei file PDF scannerizzati.&lt;/p&gt;&#xA;&lt;p&gt;Direi che questi 5 metodi possano bastare, ma se qualche lettore ne conosce altri sarebbe bello se li descrivesse nei commenti.&lt;/p&gt;&#xA;&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;&#xA;&lt;hr&gt;&#xA;&lt;ol&gt;&#xA;&lt;li id=&#34;fn:1&#34;&gt;&#xA;&lt;p&gt;Non sperate di trovare il mio IBAN, è solo la versione in PDF della prima pagina di questo post.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:2&#34;&gt;&#xA;&lt;p&gt;Qualcuno potrà chiedersi che senso abbia installare i quasi 5 GB di MacTeX solo per avere Ghostscript. Vista così può davvero sembrare una cosa insensata, ma il valore aggiunto di avere LaTeX sul Mac è, a mio avviso, inestimabile.&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/div&gt;&#xA;</description>
    </item>
    <item>
      <title>Programmare l&#39;inutilità</title>
      <link>https://static.233.196.69.159.clients.your-server.de/it/2015/11/23/programmare-linutilita/</link>
      <pubDate>Mon, 23 Nov 2015 06:00:00 +0000</pubDate>
      <guid>https://static.233.196.69.159.clients.your-server.de/it/2015/11/23/programmare-linutilita/</guid>
      <description>&lt;p&gt;Come tanti ricevo ogni giorno una o più email che mi propongono di visitare questo o quel sito. Non è sempre tempo perso, spesso si trovano delle vere e proprie gemme.&lt;/p&gt;&#xA;&lt;p&gt;Altre volte però scopro siti o applicazioni la cui utilità è perlomeno dubbia.&lt;/p&gt;&#xA;&lt;h4 id=&#34;img2css&#34;&gt;img2css&lt;/h4&gt;&#xA;&lt;p&gt;La palma del programma più inutile degli ultimi mesi vorrei assegnarla a &lt;a href=&#34;http://javier.xyz/img2css/&#34;&gt;img2css&lt;/a&gt;, una applicazione web scritta in JavaScript che converte una immagine bitmap (in formato png, jpg o simili) in un file CSS, che può qundi essere inserito direttamente in una pagina web.&lt;/p&gt;&#xA;&lt;p&gt;In teoria l&amp;rsquo;idea è ottima, perché permette di integrare un&amp;rsquo;immagine in una pagina web senza bisogno di collegamenti a file esterni, ma nella pratica fallisce miseramente.&lt;/p&gt;&#xA;&lt;p&gt;Anche con immagini semplicissime il file CSS generato diventa di dimensioni abnormi, ed è molto più pesante da gestire e da trasmettere in rete rispetto all&amp;rsquo;immagine originale.&lt;/p&gt;&#xA;&lt;h4 id=&#34;proviamo-img2css&#34;&gt;Proviamo img2css&lt;/h4&gt;&#xA;&lt;p&gt;Proviamo ad usare img2css con una immagine semplicissima composta da un quadrato di 10x10 pixel con bordo nero e interno bianco. L&amp;rsquo;immagine si può creare da Terminale tramite &lt;code&gt;convert&lt;/code&gt;, uno dei comandi più potenti di &lt;a href=&#34;http://www.imagemagick.org/script/index.php&#34;&gt;ImageMagick&lt;/a&gt;, in grado non solo (come dice il nome) di convertire le immagini da un formato grafico all&amp;rsquo;altro, ma anche di generare  delle immagini &lt;em&gt;ex-novo&lt;/em&gt; in praticamente qualunque formato conosciuto.&lt;/p&gt;&#xA;&lt;p&gt;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;&#x9;$ convert -size 10x10 xc:white -fill white &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;&#x9;-stroke black -draw &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;rectangle 0,0 9,9&amp;#34;&lt;/span&gt; square_10x10.png&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;produce l&amp;rsquo;immagine &lt;img src=&#34;https://melabit.files.wordpress.com/2015/11/square_10x10.png&#34; alt=&#34;square_10x10&#34; width=&#34;20&#34; height=&#34;20&#34; class=&#34;wp-image-2226&#34; /&gt;, che occupa esattamente 127 byte (per maggiore chiarezza l&amp;rsquo;immagine è visualizzata al doppio della dimensione originale).&lt;/p&gt;&#xA;&lt;p&gt;Convertendo l&amp;rsquo;immagine con &lt;code&gt;img2css&lt;/code&gt;, il codice CSS corrispondente&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-html&#34; data-lang=&#34;html&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;div&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;style&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;height:1px;width:1px;box-shadow:#000 0 0, #000 1px 0, #000 2px 0, #000 3px 0, #000 4px 0, #000 5px 0, #000 6px 0, #000 7px 0, #000 8px 0, #000 9px 0, #000 0 1px, #000 1px 1px, #000 2px 1px, #000 3px 1px, #000 4px 1px, #000 5px 1px, #000 6px 1px, #000 7px 1px, #000 8px 1px, #000 9px 1px, #000 0 2px, #000 1px 2px, #fff 2px 2px, #fff 3px 2px, #fff 4px 2px, #fff 5px 2px, #fff 6px 2px, #fff 7px 2px, #000 8px 2px, #000 9px 2px, #000 0 3px, #000 1px 3px, #fff 2px 3px, #fff 3px 3px, #fff 4px 3px, #fff 5px 3px, #fff 6px 3px, #fff 7px 3px, #000 8px 3px, #000 9px 3px, #000 0 4px, #000 1px 4px, #fff 2px 4px, #fff 3px 4px, #fff 4px 4px, #fff 5px 4px, #fff 6px 4px, #fff 7px 4px, #000 8px 4px, #000 9px 4px, #000 0 5px, #000 1px 5px, #fff 2px 5px, #fff 3px 5px, #fff 4px 5px, #fff 5px 5px, #fff 6px 5px, #fff 7px 5px, #000 8px 5px, #000 9px 5px, #000 0 6px, #000 1px 6px, #fff 2px 6px, #fff 3px 6px, #fff 4px 6px, #fff 5px 6px, #fff 6px 6px, #fff 7px 6px, #000 8px 6px, #000 9px 6px, #000 0 7px, #000 1px 7px, #fff 2px 7px, #fff 3px 7px, #fff 4px 7px, #fff 5px 7px, #fff 6px 7px, #fff 7px 7px, #000 8px 7px, #000 9px 7px, #000 0 8px, #000 1px 8px, #000 2px 8px, #000 3px 8px, #000 4px 8px, #000 5px 8px, #000 6px 8px, #000 7px 8px, #000 8px 8px, #000 9px 8px, #000 0 9px, #000 1px 9px, #000 2px 9px, #000 3px 9px, #000 4px 9px, #000 5px 9px, #000 6px 9px, #000 7px 9px, #000 8px 9px, #000 9px 9px;&amp;#34;&lt;/span&gt;&amp;gt;&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;div&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;occupa 1259 byte, circa 10 volte in più del file &lt;code&gt;png&lt;/code&gt; di partenza. Le cose peggiorano rapidamente se si usano immagini più complesse. Questa immagine da 20x20 pixel &lt;img src=&#34;https://melabit.files.wordpress.com/2015/11/concentric_color.png&#34; alt=&#34;concentric_color&#34; width=&#34;20&#34; height=&#34;20&#34; class=&#34;wp-image-2232&#34; /&gt;, composta da alcuni rettangoli concentrici colorati e generata tramite&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;$ convert -size 20x20 xc:white -fill white &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;-stroke black  -draw &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;rectangle 0,0 19,19&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;-stroke red    -draw &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;rectangle 2,2 17,17&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;-stroke green  -draw &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;rectangle 4,4 15,15&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;-stroke blue   -draw &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;rectangle 6,6 13,13&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;&lt;/span&gt;-stroke yellow -draw &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;rectangle 8,8 11,11&amp;#34;&lt;/span&gt; concentric_color.png&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;occupa solo 481 byte in formato &lt;code&gt;png&lt;/code&gt;, che diventano ben 6.491 byte quando di converte l&amp;rsquo;immagine in CSS con &lt;code&gt;img2css&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Con immagini &lt;em&gt;reali&lt;/em&gt; a colori, o peggio ancora fotografie (&lt;a href=&#34;https://melabit.files.wordpress.com/2015/11/ipadpro.jpg&#34;&gt;ad esempio questa&lt;/a&gt;), le immagini CSS possono diventare anche 150-200 volte più grandi di quella originale, mettendo in ginocchio il browser (e il computer!) durante il processo di conversione o quando si copia il file CSS ottenuto in una pagina web.&lt;/p&gt;&#xA;&lt;p&gt;Provare per credere, ma se poi il Mac si pianta non prendetevela con me.&lt;/p&gt;&#xA;&lt;h4 id=&#34;dentro-il-codice&#34;&gt;Dentro il codice&lt;/h4&gt;&#xA;&lt;p&gt;Il programma &lt;a href=&#34;http://javier.xyz/img2css/&#34;&gt;img2css&lt;/a&gt; è molto semplice ed è composto poche centinaia di linee di codice JavaScript. Ma è perfino troppo lungo per quello che fa.&lt;/p&gt;&#xA;&lt;p&gt;In fondo si tratta solo di determinare il &lt;a href=&#34;http://www.rapidtables.com/web/color/RGB_Color.htm&#34;&gt;codice RGB&lt;/a&gt; di ogni pixel dell&amp;rsquo;immagine, convertirlo in &lt;a href=&#34;http://it.wikihow.com/Convertire-un-Numero-Decimale-in-Esadecimale&#34;&gt;formato esadecimale&lt;/a&gt; ed associarlo alle coordinate orizzonantali e verticali del pixel considerato.&lt;/p&gt;&#xA;&lt;p&gt;Ogni pixel viene quindi convertito nella sequenza &lt;code&gt;#AAA Xpx Ypx&lt;/code&gt;, dove &lt;code&gt;#AAA&lt;/code&gt; indica il colore in esadecimale (la stringa può essere composta da 3 o 6 numeri a seconda del colore RGB determinato) e &lt;code&gt;Xpx Ypx&lt;/code&gt; indicano le coordinate orizzonantali e verticali del pixel.&lt;/p&gt;&#xA;&lt;p&gt;Tutto questo si può fare tranquillamente da Terminale, con poche righe di codice ben piazzate.&lt;/p&gt;&#xA;&lt;h4 id=&#34;img2css-da-terminale&#34;&gt;img2css da Terminale&lt;/h4&gt;&#xA;&lt;p&gt;Per convertire un file grafico in una sequenza di colori RGB si può usare ancora &lt;code&gt;convert&lt;/code&gt; di &lt;a href=&#34;http://www.imagemagick.org/script/index.php&#34;&gt;ImageMagick&lt;/a&gt;,&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ convert square_10x10.png -compress none square_10x10.ppm&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;ottenendo un file in &lt;a href=&#34;http://netpbm.sourceforge.net/doc/ppm.html&#34;&gt;formato ppm&lt;/a&gt;, in cui ciascun pixel dell&amp;rsquo;immagine è rappresentato da tre numeri interi decimali, corrispondenti ai tre colori RGB del pixel stesso (il formato grafico &lt;code&gt;ppm&lt;/code&gt; è molto inefficiente, ma è utilissimo dal punto di vista didattico perché mostra chiaramente come è &lt;em&gt;fatto&lt;/em&gt; un file grafico).&lt;/p&gt;&#xA;&lt;p&gt;Le sequenze di tre  numeri decimali sono disposte per righe orizzontali a partire dalla quarta riga del file. Le prime tre righe contengono rispettivamente il &lt;em&gt;numero magico&lt;/em&gt; che definisce il tipo di file, le dimensioni dell&amp;rsquo;immagine in pixel e il valore massimo del colore RGB del file.&lt;/p&gt;&#xA;&lt;p&gt;La rappresentazione in formato &lt;code&gt;ppm&lt;/code&gt; del quadrato di 10x10 pixel con bordo nero e interno bianco &lt;img src=&#34;./file/img2css/square_10x10.png&#34; alt=&#34;&#34;&gt; mostrato sopra è&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;P3&#xA;10 10&#xA;255&#xA;0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 &#xA;0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 &#xA;0 0 0 0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 0 0 0 0 0 0 &#xA;0 0 0 0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 0 0 0 0 0 0 &#xA;0 0 0 0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 0 0 0 0 0 0 &#xA;0 0 0 0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 0 0 0 0 0 0 &#xA;0 0 0 0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 0 0 0 0 0 0 &#xA;0 0 0 0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 0 0 0 0 0 0 &#xA;0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 &#xA;0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 &#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Sequenze di dati come questa possono essere facilmente analizzate e trasformate tramite &lt;a href=&#34;http://www.grymoire.com/Unix/Awk.html&#34;&gt;awk&lt;/a&gt;, uno dei tanti potenti strumenti specifici disponibili nei sistemi operativi basati su Unix.&lt;/p&gt;&#xA;&lt;p&gt;Basta uno script &lt;code&gt;awk&lt;/code&gt; di poche righe per convertire le informazioni RGB decimali contenute nel file &lt;code&gt;ppm&lt;/code&gt; in formato esadecimale&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;#!/usr/bin/awk -f&#xA;&#xA;/^255/  { while (getline == 1)&#xA;          { for (i = 1; i &amp;lt;= NF; i += 3)&#xA;              printf &amp;#34;0x%02X%02X%02X &amp;#34;, $i, $(i+1), $(i+2);&#xA;              printf &amp;#34;\n&amp;#34;&#xA;          }&#xA;        }&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Eseguendo lo script &lt;code&gt;img2css.awk&lt;/code&gt; sul file &lt;code&gt;ppm&lt;/code&gt; precedente si ottiene&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;$ ./img2css.awk square_10x10.ppm &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;0x000000 0x000000 0x000000 0x000000 0x000000 0x000000 0x000000 0x000000 0x000000 0x000000 &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;0x000000 0x000000 0x000000 0x000000 0x000000 0x000000 0x000000 0x000000 0x000000 0x000000 &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;0x000000 0x000000 0xFFFFFF 0xFFFFFF 0xFFFFFF 0xFFFFFF 0xFFFFFF 0xFFFFFF 0x000000 0x000000 &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;0x000000 0x000000 0xFFFFFF 0xFFFFFF 0xFFFFFF 0xFFFFFF 0xFFFFFF 0xFFFFFF 0x000000 0x000000 &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;0x000000 0x000000 0xFFFFFF 0xFFFFFF 0xFFFFFF 0xFFFFFF 0xFFFFFF 0xFFFFFF 0x000000 0x000000 &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;0x000000 0x000000 0xFFFFFF 0xFFFFFF 0xFFFFFF 0xFFFFFF 0xFFFFFF 0xFFFFFF 0x000000 0x000000 &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;0x000000 0x000000 0xFFFFFF 0xFFFFFF 0xFFFFFF 0xFFFFFF 0xFFFFFF 0xFFFFFF 0x000000 0x000000 &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;0x000000 0x000000 0xFFFFFF 0xFFFFFF 0xFFFFFF 0xFFFFFF 0xFFFFFF 0xFFFFFF 0x000000 0x000000 &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;0x000000 0x000000 0x000000 0x000000 0x000000 0x000000 0x000000 0x000000 0x000000 0x000000 &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;0x000000 0x000000 0x000000 0x000000 0x000000 0x000000 0x000000 0x000000 0x000000 0x000000 &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Per riprodurre l&amp;rsquo;output prodotto da &lt;code&gt;img2css&lt;/code&gt;, è sufficiente modificare leggermente il modo in cui lo script stampa i valori dei colori RGB, aggiungere la stampa della le coordinate di ciascun pixel e inserire le parti iniziali e finali del &lt;a href=&#34;http://www.w3schools.com/cssref/css3_pr_box-shadow.asp&#34;&gt;tag &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt;&lt;/a&gt;, ottenendo&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;#!/usr/bin/awk -f&#xA;&#xA;BEGIN   { out = sprintf(&amp;#34;&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&amp;#34;);&#xA;          print out;&#xA;        }&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;che produce un output equivalente a quello di img2css&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;$ ./img2css_v2.awk square_10x10.ppm&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;div style&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;height:1px;width:1px;box-shadow:#000000 0 0px, #000000 1px 0px, #000000 2px 0px, #000000 3px 0px, #000000 4px 0px, #000000 5px 0px, #000000 6px 0px, #000000 7px 0px, #000000 8px 0px, #000000 9px 0px, #000000 0 1px, #000000 1px 1px, #000000 2px 1px, #000000 3px 1px, #000000 4px 1px, #000000 5px 1px, #000000 6px 1px, #000000 7px 1px, #000000 8px 1px, #000000 9px 1px, #000000 0 2px, #000000 1px 2px, #FFFFFF 2px 2px, #FFFFFF 3px 2px, #FFFFFF 4px 2px, #FFFFFF 5px 2px, #FFFFFF 6px 2px, #FFFFFF 7px 2px, #000000 8px 2px, #000000 9px 2px, #000000 0 3px, #000000 1px 3px, #FFFFFF 2px 3px, #FFFFFF 3px 3px, #FFFFFF 4px 3px, #FFFFFF 5px 3px, #FFFFFF 6px 3px, #FFFFFF 7px 3px, #000000 8px 3px, #000000 9px 3px, #000000 0 4px, #000000 1px 4px, #FFFFFF 2px 4px, #FFFFFF 3px 4px, #FFFFFF 4px 4px, #FFFFFF 5px 4px, #FFFFFF 6px 4px, #FFFFFF 7px 4px, #000000 8px 4px, #000000 9px 4px, #000000 0 5px, #000000 1px 5px, #FFFFFF 2px 5px, #FFFFFF 3px 5px, #FFFFFF 4px 5px, #FFFFFF 5px 5px, #FFFFFF 6px 5px, #FFFFFF 7px 5px, #000000 8px 5px, #000000 9px 5px, #000000 0 6px, #000000 1px 6px, #FFFFFF 2px 6px, #FFFFFF 3px 6px, #FFFFFF 4px 6px, #FFFFFF 5px 6px, #FFFFFF 6px 6px, #FFFFFF 7px 6px, #000000 8px 6px, #000000 9px 6px, #000000 0 7px, #000000 1px 7px, #FFFFFF 2px 7px, #FFFFFF 3px 7px, #FFFFFF 4px 7px, #FFFFFF 5px 7px, #FFFFFF 6px 7px, #FFFFFF 7px 7px, #000000 8px 7px, #000000 9px 7px, #000000 0 8px, #000000 1px 8px, #000000 2px 8px, #000000 3px 8px, #000000 4px 8px, #000000 5px 8px, #000000 6px 8px, #000000 7px 8px, #000000 8px 8px, #000000 9px 8px, #000000 0 9px, #000000 1px 9px, #000000 2px 9px, #000000 3px 9px, #000000 4px 9px, #000000 5px 9px, #000000 6px 9px, #000000 7px 9px, #000000 8px 9px, #000000 9px 9px;&amp;#34;&lt;/span&gt;&amp;gt;&amp;lt;/div&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;perfettamente funzionante, come si può verificare inserendo pari pari il tag &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; ottenuto in un documento html (come questo):&lt;/p&gt;&#xA;&lt;div style=&#34;height:1px;width:1px;box-shadow:#000000 0 0px, #000000 1px 0px, #000000 2px 0px, #000000 3px 0px, #000000 4px 0px, #000000 5px 0px, #000000 6px 0px, #000000 7px 0px, #000000 8px 0px, #000000 9px 0px, #000000 0 1px, #000000 1px 1px, #000000 2px 1px, #000000 3px 1px, #000000 4px 1px, #000000 5px 1px, #000000 6px 1px, #000000 7px 1px, #000000 8px 1px, #000000 9px 1px, #000000 0 2px, #000000 1px 2px, #FFFFFF 2px 2px, #FFFFFF 3px 2px, #FFFFFF 4px 2px, #FFFFFF 5px 2px, #FFFFFF 6px 2px, #FFFFFF 7px 2px, #000000 8px 2px, #000000 9px 2px, #000000 0 3px, #000000 1px 3px, #FFFFFF 2px 3px, #FFFFFF 3px 3px, #FFFFFF 4px 3px, #FFFFFF 5px 3px, #FFFFFF 6px 3px, #FFFFFF 7px 3px, #000000 8px 3px, #000000 9px 3px, #000000 0 4px, #000000 1px 4px, #FFFFFF 2px 4px, #FFFFFF 3px 4px, #FFFFFF 4px 4px, #FFFFFF 5px 4px, #FFFFFF 6px 4px, #FFFFFF 7px 4px, #000000 8px 4px, #000000 9px 4px, #000000 0 5px, #000000 1px 5px, #FFFFFF 2px 5px, #FFFFFF 3px 5px, #FFFFFF 4px 5px, #FFFFFF 5px 5px, #FFFFFF 6px 5px, #FFFFFF 7px 5px, #000000 8px 5px, #000000 9px 5px, #000000 0 6px, #000000 1px 6px, #FFFFFF 2px 6px, #FFFFFF 3px 6px, #FFFFFF 4px 6px, #FFFFFF 5px 6px, #FFFFFF 6px 6px, #FFFFFF 7px 6px, #000000 8px 6px, #000000 9px 6px, #000000 0 7px, #000000 1px 7px, #FFFFFF 2px 7px, #FFFFFF 3px 7px, #FFFFFF 4px 7px, #FFFFFF 5px 7px, #FFFFFF 6px 7px, #FFFFFF 7px 7px, #000000 8px 7px, #000000 9px 7px, #000000 0 8px, #000000 1px 8px, #000000 2px 8px, #000000 3px 8px, #000000 4px 8px, #000000 5px 8px, #000000 6px 8px, #000000 7px 8px, #000000 8px 8px, #000000 9px 8px, #000000 0 9px, #000000 1px 9px, #000000 2px 9px, #000000 3px 9px, #000000 4px 9px, #000000 5px 9px, #000000 6px 9px, #000000 7px 9px, #000000 8px 9px, #000000 9px 9px;&#34;&gt;&lt;/div&gt;&#xA;&lt;h4 id=&#34;conclusioni&#34;&gt;Conclusioni&lt;/h4&gt;&#xA;&lt;p&gt;È chiaro che usare &lt;code&gt;convert&lt;/code&gt; ed &lt;code&gt;awk&lt;/code&gt; non risolve il problema di fondo, le immagini CSS generate rimangono comunque molto più grosse di quelle originali, ma almeno sono prodotte con poche righe di codice ed usando solo degli strumenti standard di Unix.&lt;/p&gt;&#xA;&lt;p&gt;Alcuni anni fa si parlava in senso negativo di &lt;a href=&#34;https://en.wikipedia.org/wiki/Software_bloat&#34;&gt;&lt;em&gt;bloatware&lt;/em&gt;&lt;/a&gt;, di quei programmi inutilmente grossi e tanto poco ottimizzati da richiedere grosse risorse hardware anche per svolgere funzioni relativamente semplici.&lt;/p&gt;&#xA;&lt;p&gt;A volte i programmatori dimenticano due concetti fondamentali della buona programmazione, cercare la semplicità e usare lo strumento più adatto per il compito specifico, e si perdono in inutili (e stucchevoli) esercitazioni di stile. Succede a chi propone banalmente di usare file CSS enormi al posto di semplici immagini grafiche, ma succede anche in tanti altri casi ben peggiori.&lt;/p&gt;&#xA;&lt;p&gt;A parte questo, il post è stato anche un&amp;rsquo;occasione per parlare di &lt;code&gt;awk&lt;/code&gt;, uno strumento poco conosciuto ma molto otente, in particolare quando si tratta di analizzare e trasformare dati contenuti in file di testo.&lt;/p&gt;&#xA;&lt;p&gt;Uno strumento che è diventato parte integrante da anni della mia routine di lavoro quotidiana. Sarebbe bello poterne riparlare.&lt;/p&gt;&#xA;</description>
    </item>
  </channel>
</rss>
