<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Css on Melabit</title>
    <link>https://static.233.196.69.159.clients.your-server.de/it/tags/css/</link>
    <description>Recent content in Css on Melabit</description>
    <generator>Hugo</generator>
    <language>it</language>
    <lastBuildDate>Thu, 07 Sep 2017 18:00:00 +0000</lastBuildDate>
    <atom:link href="https://static.233.196.69.159.clients.your-server.de/it/tags/css/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Una linea di codice</title>
      <link>https://static.233.196.69.159.clients.your-server.de/it/2017/09/07/una-linea-di-codice/</link>
      <pubDate>Thu, 07 Sep 2017 18:00:00 +0000</pubDate>
      <guid>https://static.233.196.69.159.clients.your-server.de/it/2017/09/07/una-linea-di-codice/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://melabit.wordpress.com/2017/08/31/cray-1-a-confronto/&#34;&gt;A proposito di programmazione&lt;/a&gt;, cosa si può fare con una linea di codice? A volte si può fare moltissimo, come dimostra &lt;a href=&#34;http://www.p01.org/128b_raytraced_checkboard/&#34;&gt;questa singola linea di codice JavaScript&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;[code language=&amp;ldquo;javascript&amp;rdquo; htmlscript=true]&#xA;&lt;pre id=p&gt;&lt;script&gt;n=setInterval(&amp;ldquo;for(n+=7,i=k,P=&amp;lsquo;p.\n&amp;rsquo;;i-=1/k;P+=P[i%2?(i%2*j-j+n/k^j)&amp;amp;1:2])j=k/i;p.innerHTML=P&amp;rdquo;,k=64)&lt;/script&gt;&#xA;[/code]&#xA;&lt;/pre&gt;&lt;/p&gt;&#xA;&lt;p&gt;Sono appena 128 caratteri, meno di un tweet, che però riescono a produrre questa bella immagine dinamica.&lt;/p&gt;&#xA;&lt;img src=&#34;https://www.alexkras.com/wp-content/uploads/ray.gif&#34; alt=&#34;&#34;&gt;&lt;p&gt;Ma come fa?&lt;/p&gt;&#xA;&lt;p&gt;Alex Kras ha accettato la sfida e ha scritto un bellissimo articolo, &lt;a href=&#34;https://www.alexkras.com/reverse-engineering-one-line-of-javascript&#34;&gt;&lt;em&gt;Reverse Engineering One Line of JavaScript&lt;/em&gt;&lt;/a&gt;, in cui descrive il suo viaggio nei meandri di un codice solo apparentemente semplice.&lt;/p&gt;&#xA;&lt;p&gt;È una splendida dimostrazione di capacità tecnica, sia di chi ha scritto il codice originale ma anche di chi si è dato tanto da fare per decodificarlo e per descriverne il funzionamento fin nei minimi particolari.&lt;/p&gt;&#xA;&lt;p&gt;Capire tutti i dettagli dell&amp;rsquo;articolo non è facile, ma  non credo che sia la cosa più importante. Ciò che importa è l&amp;rsquo;idea generale, è provare a mettersi nella testa di un programmatore per capire il suo modo di ragionare, è rendersi conto di quello che si può fare con una conoscenza più o meno approfondita di un linguaggio di programmazione (e delle basi matematiche che gli stanno dietro).&lt;/p&gt;&#xA;&lt;p&gt;Il nostro codice non sarà mai così elegante e compatto? Che importa, l&amp;rsquo;importante è iniziare a provarci. Tanto si può solo migliorare.&lt;/p&gt;&#xA;&lt;p&gt;Per la cronaca, questo è il codice finale dopo la decodifica.&lt;/p&gt;&#xA;&lt;p&gt;[code language=&amp;ldquo;javascript&amp;rdquo; ]&#xA;const DELAY = 64; // approximately 15 frames per second 15 frames per second * 64 seconds = 960 frames&#xA;var n = 1;&#xA;var p = document.getElementById(&amp;ldquo;p&amp;rdquo;);&#xA;// var draw = &amp;ldquo;for(n+=7,i=delay,P=&amp;lsquo;p.\n&amp;rsquo;;i-=1/delay;P+=P[i%2?(i%2*j-j+n/delay^j)&amp;amp;1:2])j=delay/i;p.innerHTML=P&amp;rdquo;;&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;/**&#xA; * Draws a picture&#xA; * 128 chars by 32 chars = total 4096 chars&#xA; */&#xA;var draw = function() {&#xA;    var i = DELAY; // 64&#xA;    var P =&#39;p.\n&#39;; // First line, reference for chars to use&#xA;    var j;&#xA; &#xA;    n += 7;&#xA; &#xA;    while (i &amp;gt; 0) {&#xA; &#xA;        j = DELAY / i;&#xA;        i -= 1 / DELAY;&#xA; &#xA;        let index;&#xA;        let iIsOdd = (i % 2 != 0);&#xA; &#xA;        if (iIsOdd) {&#xA;            let magic = ((i % 2 * j - j + n / DELAY) ^ j); // &amp;lt; ------------------&#xA;            let magicIsOdd = (magic % 2 != 0); // &amp;amp;1&#xA;            if (magicIsOdd) { // &amp;amp;1&#xA;                index = 1;&#xA;            } else {&#xA;                index = 0;&#xA;            }&#xA;        } else {&#xA;            index = 2;&#xA;        }&#xA; &#xA;        switch (index) { // P += P[index];&#xA;            case 0:&#xA;                P += &amp;quot;p&amp;quot;; // aka P[0]&#xA;                break;&#xA;            case 1:&#xA;                P += &amp;quot;.&amp;quot;; // aka P[1]&#xA;                break;&#xA;            case 2:&#xA;                P += &amp;quot;\n&amp;quot;; // aka P[2]&#xA;        }&#xA;    }&#xA;    //Update HTML&#xA;    p.innerHTML = P;&#xA;};&#xA; &#xA;setInterval(draw, 64);&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;[/code]&lt;/p&gt;&#xA;&lt;p&gt;Incredibile, no?&lt;/p&gt;&#xA;&lt;p&gt;I più volonterosi possono anche &lt;a href=&#34;https://codepen.io/akras14/pen/qjgrxz&#34; target=&#34;_blank&#34;&gt;provare a giocare con il codice&lt;/a&gt;, modificandolo a loro piacimento. Si può ad esempio cambiare colore e dimensioni del testo, inserendo queste righe nella sezione CSS (e poi andando a &lt;a href=&#34;https://www.w3schools.com/css/css_syntax.asp&#34;&gt;leggere qui per capire perché&lt;/a&gt;).&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-css&#34; data-lang=&#34;css&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;#p {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;color&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;blue&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;font-size&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;10&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;px&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Oppure modificare le le strighe &lt;code&gt;&amp;quot;p&amp;quot;&lt;/code&gt; e &lt;code&gt;&amp;quot;.&amp;quot;&lt;/code&gt;, rispettivamente alle linee 39 e 42 del codice JavaScript, per cambiare i caratteri mostrati sullo schermo. Ancora più interessante è variare il valore di &lt;code&gt;DELAY&lt;/code&gt; nella prima riga del codice JavaScript e vedere l&amp;rsquo;effetto che fa.&lt;/p&gt;&#xA;&lt;p&gt;Sembra solo un giochetto un po&amp;rsquo; stupido, ma si impara a programmare (anche) così.&lt;/p&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>
