<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Html on Melabit</title>
    <link>https://static.233.196.69.159.clients.your-server.de/it/tags/html/</link>
    <description>Recent content in Html on Melabit</description>
    <generator>Hugo</generator>
    <language>it</language>
    <lastBuildDate>Mon, 14 Dec 2020 06:00:00 +0000</lastBuildDate>
    <atom:link href="https://static.233.196.69.159.clients.your-server.de/it/tags/html/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Qual è la somma? Soluzioni</title>
      <link>https://static.233.196.69.159.clients.your-server.de/it/2020/12/14/qual-e-la-somma-soluzioni/</link>
      <pubDate>Mon, 14 Dec 2020 06:00:00 +0000</pubDate>
      <guid>https://static.233.196.69.159.clients.your-server.de/it/2020/12/14/qual-e-la-somma-soluzioni/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;https://melabit.files.wordpress.com/2020/12/neonbrand-dgcuivmsqc0-unsplash.jpg&#34; alt=&#34;&#34;&gt;&lt;br&gt;&#xA;&amp;ndash; &lt;em&gt;Foto di &lt;a href=&#34;https://unsplash.com/@neonbrand&#34;&gt;NeONBRAND&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;Ed ecco la soluzione promessa al &lt;a href=&#34;https://melabit.wordpress.com/2020/12/13/qual-e-la-somma/&#34;&gt;problema di ieri&lt;/a&gt;. Anzi, &lt;strong&gt;LE&lt;/strong&gt; soluzioni, perché ce ne sono parecchie, più o meno complicate o, meglio, più o meno adatte al modo di pensare di ciascuno.&lt;/p&gt;&#xA;&lt;p&gt;Il problema era:&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;em&gt;Ciascun termine di una serie geometrica è il doppio del precedente. In una certa serie geometrica, la somma del settimo, ottavo e nono termine fa 3. Qual&amp;rsquo;è la somma del quarto e quinto termine?&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;In un primo momento può sembrare un problema complicato, ma basta pensarci un po&amp;rsquo; per accorgersi che in realtà la soluzione è abbastanza semplice.&lt;/p&gt;&#xA;&lt;h4 id=&#34;serie-geometrica&#34;&gt;Serie geometrica&lt;/h4&gt;&#xA;&lt;p&gt;Come spiega l&amp;rsquo;enunciato stesso del problema, una &lt;em&gt;serie geometrica&lt;/em&gt; è composta da un numero in teoria infinito di termini, ciascuno dei quali è il doppio di quello precedente. Ad esempio, la serie geometrica più semplice che mi viene in mente è&lt;/p&gt;&#xA;&lt;p&gt;1, 2, 4, 8, 16, 32, 64&amp;hellip;&lt;/p&gt;&#xA;&lt;p&gt;nella quale 1 è il primo termine della serie, 2 il secondo termine e così via, e ciascun termine (ad esempio 8) è il doppio di quello che lo precede (in questo caso 4). (Volendo ci sarebbe una serie geometrica ancora più semplice, composta tutta da zeri, 0, 0, 0, 0, &amp;hellip;, ma è un caso particolare molto banale).&lt;/p&gt;&#xA;&lt;p&gt;Ogni termine della serie può essere indicato con una variabile a cui viene associato un pedice (cioè un numero scritto più in basso rispetto al nome della variabile), che aiuta ad individuare più facilmente il termine della serie a cui ci stiamo riferendo. As esempio a&lt;sub&gt;1&lt;/sub&gt;, a&lt;sub&gt;2&lt;/sub&gt;, a&lt;sub&gt;3&lt;/sub&gt;, indicano rispettivamente il primo, secondo e terzo termine della serie. Per una serie geometrica,  a&lt;sub&gt;2&lt;/sub&gt; = 2  a&lt;sub&gt;1&lt;/sub&gt;,  a&lt;sub&gt;3&lt;/sub&gt; = 2  a&lt;sub&gt;2&lt;/sub&gt; = 4 a&lt;sub&gt;1&lt;/sub&gt;, e così via.&lt;/p&gt;&#xA;&lt;h4 id=&#34;soluzione-1&#34;&gt;Soluzione #1&lt;/h4&gt;&#xA;&lt;p&gt;In base a quanto appena detto, definiamo il settimo, ottavo e nono termine della serie come a&lt;sub&gt;7&lt;/sub&gt;, a&lt;sub&gt;8&lt;/sub&gt; e a&lt;sub&gt;9&lt;/sub&gt;. Il problema ci dice che la somma di questi termini è uguale a 3,&lt;/p&gt;&#xA;&lt;p&gt;a&lt;sub&gt;7&lt;/sub&gt; + a&lt;sub&gt;8&lt;/sub&gt; + a&lt;sub&gt;9&lt;/sub&gt; = 3&lt;/p&gt;&#xA;&lt;p&gt;Ma abbiamo anche altre informazioni, perché sappiamo che a&lt;sub&gt;8&lt;/sub&gt; = 2 a&lt;sub&gt;7&lt;/sub&gt; e a&lt;sub&gt;9&lt;/sub&gt; = 2 a&lt;sub&gt;8&lt;/sub&gt;. Possiamo quindi scrivere un sistema di tre equazioni in tre incognite,&lt;/p&gt;&#xA;&lt;p&gt;a&lt;sub&gt;7&lt;/sub&gt; + a&lt;sub&gt;8&lt;/sub&gt; + a&lt;sub&gt;9&lt;/sub&gt; = 3&#xA;a&lt;sub&gt;8&lt;/sub&gt; = 2 a&lt;sub&gt;7&lt;/sub&gt;&#xA;a&lt;sub&gt;9&lt;/sub&gt; = 2 a&lt;sub&gt;8&lt;/sub&gt;&lt;/p&gt;&#xA;&lt;p&gt;che può essere semplificato tenendo conto delle relazioni fra a&lt;sub&gt;7&lt;/sub&gt;, a&lt;sub&gt;8&lt;/sub&gt; e a&lt;sub&gt;9&lt;/sub&gt; e esprimendo le tre equazioni in funzione della sola a&lt;sub&gt;7&lt;/sub&gt;,&lt;/p&gt;&#xA;&lt;p&gt;a&lt;sub&gt;7&lt;/sub&gt; + (2 a&lt;sub&gt;7&lt;/sub&gt;) + (4 a&lt;sub&gt;7&lt;/sub&gt;) = 3&#xA;a&lt;sub&gt;8&lt;/sub&gt; = 2 a&lt;sub&gt;7&lt;/sub&gt;&#xA;a&lt;sub&gt;9&lt;/sub&gt; = 4 a&lt;sub&gt;7&lt;/sub&gt;&lt;/p&gt;&#xA;&lt;p&gt;La prima delle tre equazioni del sistema diventa 7 a&lt;sub&gt;7&lt;/sub&gt; = 3, cioè&lt;/p&gt;&#xA;&lt;p&gt;a&lt;sub&gt;7&lt;/sub&gt; = 3 ⁄ 7&lt;/p&gt;&#xA;&lt;p&gt;A questo punto è facile, perché a&lt;sub&gt;6&lt;/sub&gt; è la metà di a&lt;sub&gt;7&lt;/sub&gt;, a&lt;sub&gt;5&lt;/sub&gt; un quarto di a&lt;sub&gt;7&lt;/sub&gt; e a&lt;sub&gt;4&lt;/sub&gt; un ottavo, sempre di a&lt;sub&gt;7&lt;/sub&gt;. Quindi&lt;/p&gt;&#xA;&lt;p&gt;a&lt;sub&gt;6&lt;/sub&gt; = 3 ⁄ 14&#xA;a&lt;sub&gt;5&lt;/sub&gt; = 3 ⁄ 28&#xA;a&lt;sub&gt;4&lt;/sub&gt; = 3 ⁄ 56&lt;/p&gt;&#xA;&lt;p&gt;da cui si ottiene che&lt;/p&gt;&#xA;&lt;p&gt;a&lt;sub&gt;4&lt;/sub&gt; + a&lt;sub&gt;5&lt;/sub&gt; = 3 ⁄ 28 + 3 ⁄ 56 = (2 × 3 + 3) ⁄ 56 = 9 ⁄ 56&lt;/p&gt;&#xA;&lt;p&gt;che è la soluzione del problema.&lt;/p&gt;&#xA;&lt;h4 id=&#34;soluzione-2&#34;&gt;Soluzione #2&lt;/h4&gt;&#xA;&lt;p&gt;In realtà non c&amp;rsquo;è bisogno di mettere su un rigoroso sistema di tre equazioni in tre incognite, perché dalla definizione di serie geometrica sappiamo immediatamente che&lt;/p&gt;&#xA;&lt;p&gt;a&lt;sub&gt;7&lt;/sub&gt; + a&lt;sub&gt;8&lt;/sub&gt; + a&lt;sub&gt;9&lt;/sub&gt; = a&lt;sub&gt;7&lt;/sub&gt; + 2 a&lt;sub&gt;7&lt;/sub&gt; + 4 a&lt;sub&gt;7&lt;/sub&gt; = 3&lt;/p&gt;&#xA;&lt;p&gt;da cui ricaviamo immediatamente che a&lt;sub&gt;7&lt;/sub&gt; = 3, e tutto il resto è identico al caso precedente.&lt;/p&gt;&#xA;&lt;h4 id=&#34;soluzione-3&#34;&gt;Soluzione #3&lt;/h4&gt;&#xA;&lt;p&gt;Questa soluzione funziona al contrario delle due precedenti, che partono dai termini di ordine maggiore per calcolare quelli di ordine inferiore. In base alla definizione di serie geometrica,&lt;/p&gt;&#xA;&lt;p&gt;a&lt;sub&gt;2&lt;/sub&gt; = 2 a&lt;sub&gt;1&lt;/sub&gt;, a&lt;sub&gt;3&lt;/sub&gt; = 4 a&lt;sub&gt;1&lt;/sub&gt;, a&lt;sub&gt;4&lt;/sub&gt; = 8 a&lt;sub&gt;1&lt;/sub&gt;, a&lt;sub&gt;5&lt;/sub&gt; = 16 a&lt;sub&gt;1&lt;/sub&gt;, a&lt;sub&gt;6&lt;/sub&gt; = 32 a&lt;sub&gt;1&lt;/sub&gt;, a&lt;sub&gt;7&lt;/sub&gt; = 64 a&lt;sub&gt;1&lt;/sub&gt;, a&lt;sub&gt;8&lt;/sub&gt; = 128 a&lt;sub&gt;1&lt;/sub&gt;, a&lt;sub&gt;9&lt;/sub&gt; = 256 a&lt;sub&gt;1&lt;/sub&gt;&lt;/p&gt;&#xA;&lt;p&gt;Di conseguenza,&lt;/p&gt;&#xA;&lt;p&gt;a&lt;sub&gt;4&lt;/sub&gt; + a&lt;sub&gt;5&lt;/sub&gt; = 8 a&lt;sub&gt;1&lt;/sub&gt; + 16 a&lt;sub&gt;1&lt;/sub&gt; = 24 a&lt;sub&gt;1&lt;/sub&gt;&lt;/p&gt;&#xA;&lt;p&gt;e&lt;/p&gt;&#xA;&lt;p&gt;a&lt;sub&gt;7&lt;/sub&gt; + a&lt;sub&gt;8&lt;/sub&gt; + a&lt;sub&gt;9&lt;/sub&gt; = 64 a&lt;sub&gt;1&lt;/sub&gt; + 128 a&lt;sub&gt;1&lt;/sub&gt; + 256 a&lt;sub&gt;1&lt;/sub&gt; = 448 a&lt;sub&gt;1&lt;/sub&gt; = 3&lt;/p&gt;&#xA;&lt;p&gt;Da questa eguaglianza si ricava il primo termine della serie, a&lt;sub&gt;1&lt;/sub&gt; = 3 ⁄ 448, e quindi&lt;/p&gt;&#xA;&lt;p&gt;a&lt;sub&gt;4&lt;/sub&gt; + a&lt;sub&gt;5&lt;/sub&gt; = 24 a&lt;sub&gt;1&lt;/sub&gt; = 24 × 3 ⁄ 448 = 72 ⁄ 448 = 9 ⁄ 56.&lt;/p&gt;&#xA;&lt;h4 id=&#34;soluzione-4-5-&#34;&gt;Soluzione #4, 5, &amp;hellip;&lt;/h4&gt;&#xA;&lt;p&gt;Se qualcuno trova delle soluzioni diverse al problema, sarò ben felice di aggiungerle qui.&lt;/p&gt;&#xA;&lt;h4 id=&#34;markdown-e-latex&#34;&gt;Markdown e LaTeX&lt;/h4&gt;&#xA;&lt;p&gt;Markdown mi piace moltissimo e infatti lo uso per scrivere tutti i miei post, così come tanti documenti di lavoro che non devono circolare oltre il circolo, purtroppo ristretto, di chi è in grado di scrollarsi di dosso Word. Purtroppo devo ammettere che il supporto a LaTeX è abbastanza inconsistente. Va benissimo finché si tratta di scrivere delle equazioni semplici, ma appena le cose si complicano, ad esempio quando si prova ad inserire un sistema di equazioni, sono dolori.&lt;/p&gt;&#xA;&lt;p&gt;Ancora peggio è il fatto che la resa finale dipenda dal motore di conversione. Ad esempio, &lt;a href=&#34;https://marked2app.com&#34;&gt;Marked&lt;/a&gt; converte quasi sempre perfettamente le equazioni fuori testo (quelle centrate in uno spazio apposito), sia quando si usano i simboli &lt;code&gt;$$&lt;/code&gt; prima e dopo l&amp;rsquo;equazione sia inserendole all&amp;rsquo;interno dell&amp;rsquo;ambiente &lt;code&gt;\begin{equation} ... \end{equation}&lt;/code&gt;. Ma se l&amp;rsquo;equazione incapsulata fra &lt;code&gt;$$ ... $$&lt;/code&gt; contiene dei pedici (o degli apici) Marked dà un errore, che invece non compare se si usa l&amp;rsquo;ambiente &lt;code&gt;\begin{equation} ... \end{equation}&lt;/code&gt; (meno usato perché molto più lungo da scrivere).&lt;/p&gt;&#xA;&lt;p&gt;Ancora peggio è quello che succede con il motore LaTeX di &lt;a href=&#34;https://wordpress.com/support/latex/&#34;&gt;Wordpress.com&lt;/a&gt;, che non supporta l&amp;rsquo;ambiente &lt;code&gt;\begin{equation} ... \end{equation}&lt;/code&gt; e nemmeno la forma abbreviata &lt;code&gt;$$ ... $$&lt;/code&gt;, ma che per integrare le equazioni nel testo in Markdown usa una sintassi non standard, &lt;code&gt;&amp;amp;#36;latex ... &amp;amp;#36;&lt;/code&gt; (dove il codice LaTeX va inserito al posto dei puntini).&lt;/p&gt;&#xA;&lt;p&gt;D&amp;rsquo;altro canto Markdown nasce per essere uno strumento semplice per scrivere sul web, caricarlo di troppe opzioni (e di troppe responsabilità) sarebbe un controsenso. In casi come questi forse la cosa migliore è scrivere il testo direttamente in LaTeX, convertendolo poi in HTML puro tramite &lt;a href=&#34;https://pandoc.org&#34;&gt;pandoc&lt;/a&gt; o simili.&lt;/p&gt;&#xA;&lt;p&gt;Io avevo già scritto quasi tutto il testo quando mi sono accorto di questi problemi e per questa volta ho preferito eliminare il codice LaTeX ed usare solo il normale HTML per indicare i pedici o le frazioni, perché la resa grafica delle equazioni fuori testo era davvero pessima. Basta confrontare questa equazione scritta in LaTeX,&lt;/p&gt;&#xA;&lt;p&gt;$latex&#xA;\begin{array}{ll}&#xA;a_7 + a_8 + a_9 = 3\&#xA;a_8 = 2 a_7\&#xA;a_9 = 2 a_8&#xA;\end{array}$&lt;/p&gt;&#xA;&lt;p&gt;con questa in HTLM mescolato al normale codice Markdown,&lt;/p&gt;&#xA;&lt;p&gt;a&lt;sub&gt;7&lt;/sub&gt; + a&lt;sub&gt;8&lt;/sub&gt; + a&lt;sub&gt;9&lt;/sub&gt; = 3&#xA;a&lt;sub&gt;8&lt;/sub&gt; = 2 a&lt;sub&gt;7&lt;/sub&gt;&#xA;a&lt;sub&gt;9&lt;/sub&gt; = 2 a&lt;sub&gt;8&lt;/sub&gt;&lt;/p&gt;&#xA;&lt;p&gt;per rendersene conto. Purtroppo l&amp;rsquo;HTML non riesce a gestire bene le frazioni (o forse sono io che non so come fare), prometto di far meglio la prossima volta.&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>WorldWideWeb, il primo browser web è online</title>
      <link>https://static.233.196.69.159.clients.your-server.de/it/2019/02/20/worldwideweb-il-primo-browser-web-e-online/</link>
      <pubDate>Wed, 20 Feb 2019 18:00:00 +0000</pubDate>
      <guid>https://static.233.196.69.159.clients.your-server.de/it/2019/02/20/worldwideweb-il-primo-browser-web-e-online/</guid>
      <description>&lt;p&gt;La storia la sapete. Trent&amp;rsquo;anni fa Tim Berners-Lee, un fisico del CERN, sviluppò su un &lt;a href=&#34;https://it.wikipedia.org/wiki/NeXT&#34;&gt;computer NeXT&lt;/a&gt; il primo server web &lt;code&gt;httpd&lt;/code&gt; e il relativo browser, che chiamò WorldWideWeb,&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; insieme al linguaggio HTML con cui creare i documenti ipertestuali visualizzabili dal browser.&lt;/p&gt;&#xA;&lt;p&gt;Tim Berners-Lee non aveva idea che il suo lavoro avrebbe rivoluzionato la nostra vita. In realtà voleva solo permettere di preparare dei documenti collegati uno all&amp;rsquo;altro da utilizzare all&amp;rsquo;interno del CERN, rendendo possibile passare da un documento all&amp;rsquo;altro cliccando sui link presenti nei documenti stessi.&lt;/p&gt;&#xA;&lt;p&gt;Un&amp;rsquo;idea nemmeno troppo nuova, il concetto di &lt;em&gt;ipertesto&lt;/em&gt; era stato introdotto da &lt;a href=&#34;http://info.cern.ch/hypertext/WWW/Xanadu.html#Nelson&#34;&gt;Ted Nelson&lt;/a&gt; già a metà degli anni &amp;lsquo;60 ed era stato reso popolare da Apple con il suo linguaggio &lt;a href=&#34;https://en.wikipedia.org/wiki/HyperCard&#34;&gt;HyperCard&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Il primo sito web sviluppato Tim Berners-Lee è &lt;a href=&#34;http://info.cern.ch/hypertext/WWW/TheProject.html&#34;&gt;ancora online&lt;/a&gt;, ed è un&amp;rsquo;ottimo modo per accedere ai documenti originali che sono alla base del web come lo conosciamo oggi.&lt;/p&gt;&#xA;&lt;p&gt;Ora, per celebrare il trentesimo anniversario del web, il CERN ha messo online un emulatore del &lt;a href=&#34;https://worldwideweb.cern.ch/&#34;&gt;browser WorldWideWeb originale&lt;/a&gt; scritto da Tim Berners-Lee, che gira tranquillamente all&amp;rsquo;interno di un qualunque browser odierno. L&amp;rsquo;esperienza d&amp;rsquo;uso di &lt;a href=&#34;https://worldwideweb.cern.ch/&#34;&gt;WorldWideWeb&lt;/a&gt; è infinitamente meno soddisfacente di quello a cui siamo abituati oggi, ma vale la pena provare in prima persona una tecnologia che ha avuto effetti straordinari e assolutamente imprevedibili sulla vita di tutti noi. Anche se non ci sono le immagini, i siti odierni sono ancora perfettamente fruibili, sembra di usare un browser testuale come &lt;a href=&#34;http://links.twibright.com/&#34;&gt;Links&lt;/a&gt; o &lt;a href=&#34;https://lynx.invisible-island.net/&#34;&gt;Lynx&lt;/a&gt;. L&amp;rsquo;unica accortezza è ricordarsi che per attivare i link c&amp;rsquo;è bisogno di un doppio click, il click singolo a cui siamo abituati arriverà solo qualche tempo dopo.&lt;/p&gt;&#xA;&lt;p&gt;E allora perché non provare a leggere questo blog tramite il browser originale di Tim Berners-Lee? Io ci ho provato, e non è nemmeno troppo difficile. Basta lanciare l&amp;rsquo;&lt;a href=&#34;https://worldwideweb.cern.ch/&#34;&gt;emulatore di WorldWideWeb&lt;/a&gt;, cliccare sulla voce &lt;code&gt;Document&lt;/code&gt; del menu laterale e poi su &lt;code&gt;Open from full document reference&lt;/code&gt;. A questo punto bisogna scrivere (o incollare) nel campo &lt;code&gt;Reference&lt;/code&gt; l&amp;rsquo;indirizzo web completo di melabit, &lt;code&gt;https://melabit.wordpress.com&lt;/code&gt;, e cliccare sul grosso (e brutto) bottone &lt;code&gt;Open&lt;/code&gt; di destra. Quello che succede si può vedere qui sotto (cliccando sulle immaginini si aprono le versioni in alta risoluzione).&lt;/p&gt;&#xA;&lt;a href=&#34;https://melabit.files.wordpress.com/2019/02/worldwideweb.png&#34; target=&#34;_blank&#34;&gt;&#xA;    &lt;img align=&#34;center&#34; src=&#34;https://melabit.files.wordpress.com/2019/02/worldwideweb.png&#34;/&gt;&#xA;&lt;/a&gt;&#xA;&lt;a href=&#34;https://melabit.files.wordpress.com/2019/02/worldwideweb-multiple-windows.png&#34; target=&#34;_blank&#34;&gt;&#xA;    &lt;img align=&#34;center&#34; src=&#34;https://melabit.files.wordpress.com/2019/02/worldwideweb-multiple-windows.png&#34;/&gt;&#xA;&lt;/a&gt;&#xA;&lt;p&gt;Niente immagini e niente colori, i caratteri speciali vengono resi con i codici HTML (l&amp;rsquo;apostrofo ad esempio diventa &lt;code&gt;&amp;amp;&lt;/code&gt;&lt;code&gt;#8217;&lt;/code&gt;), il font è quello ancora &lt;a href=&#34;https://worldwideweb.cern.ch/typography/&#34;&gt;&lt;em&gt;pixellato&lt;/em&gt; del NeXT&lt;/a&gt;, cliccando sui link si aprono delle nuove finestre invece che nuove schede come nei browser moderni, la barra di scorrimento della finestra è a sinistra e non a destra come siamo abituati ora. Però a parte queste minuzie, il blog è perfettamente fruibile, anche se stiamo usando uno strumento pensato e sviluppato ben trent&amp;rsquo;anni fa.&lt;/p&gt;&#xA;&lt;p&gt;Affascinante.&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;Da cui deriva la tripletta &amp;ldquo;www&amp;rdquo;, utilizzata da allora per indicare il web.&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>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>
    <item>
      <title>Markdown online</title>
      <link>https://static.233.196.69.159.clients.your-server.de/it/2015/03/31/markdown-online/</link>
      <pubDate>Tue, 31 Mar 2015 06:00:00 +0000</pubDate>
      <guid>https://static.233.196.69.159.clients.your-server.de/it/2015/03/31/markdown-online/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://daringfireball.net/projects/markdown/&#34;&gt;Markdown&lt;/a&gt; è uno strumento che permette di scrivere testi per il web utilizzando una sintassi semplificata rispetto a quella un po&amp;rsquo; bizantina del &lt;a href=&#34;http://www.w3schools.com/html/&#34;&gt;linguaggio HTML&lt;/a&gt; e di convertire tali testi in codice HTML valido, pronto per essere incluso in una pagina web perfettamente funzionale.&lt;/p&gt;&#xA;&lt;p&gt;Con il tempo, l&amp;rsquo;uso di Markdown si è esteso notevolmente ed ora è possibile usarlo per scrivere documenti di qualunque genere, convertendol in qualunque formato di testo significativo tramite &lt;a href=&#34;http://johnmacfarlane.net/pandoc/&#34;&gt;Pandoc&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Io uso da tempo Markdown ogni giorno per scrivere di tutto, fra cui tutti i post di questo blog. Le uniche eccezioni sono gli articoli scientifici, per cui &lt;a href=&#34;http://www.latex-project.org/&#34;&gt;LaTeX&lt;/a&gt; è ancora insuperabile, e i documenti inviati dai colleghi, che mi obbligano ad usare l&amp;rsquo;odiato Word.&lt;/p&gt;&#xA;&lt;p&gt;Quello che trovo però molto difficile è provare a spiegare l&amp;rsquo;utilità di Markdown a chi non l&amp;rsquo;ha mai usato. La risposta normale è &amp;ldquo;Perché mai imparare ad usare un altro strumento quando c&amp;rsquo;è già Word che va benissimo?&amp;rdquo;&lt;/p&gt;&#xA;&lt;p&gt;Purtroppo in parte hanno ragione: finché non lo si prova è difficile rendersi conto dei vantaggi di Markdown e della sua estrema semplicità di uso.&lt;/p&gt;&#xA;&lt;p&gt;Invece di provare a spiegare in teoria &lt;em&gt;perché&lt;/em&gt; usare Markdown, non sarebbe meglio mostrare degli strumenti semplici semplici per iniziare ad usarlo senza troppi problemi?&lt;/p&gt;&#xA;&lt;p&gt;E cosa c&amp;rsquo;è di meglio, oggi, che usare strumenti che funzionano direttemente nel browser, senza nulla da scaricare, installare o configurare?&lt;/p&gt;&#xA;&lt;h4 id=&#34;imparare-markdown&#34;&gt;Imparare Markdown&lt;/h4&gt;&#xA;&lt;p&gt;Per questo non c&amp;rsquo;è storia, il sito migliore è di sicuro &lt;a href=&#34;http://thisismarkdown.com/&#34;&gt;This is Markdown&lt;/a&gt;, che insegna la sintassi di Markdown tramite una pagina web interattiva, che può essere modificata direttamente nel browser visualizzando immediatamente il risultato delle modifiche effettuate.&lt;/p&gt;&#xA;&lt;h4 id=&#34;strumenti-di-conversione&#34;&gt;Strumenti di conversione&lt;/h4&gt;&#xA;&lt;p&gt;Anche qui non c&amp;rsquo;è molto da dire, lo strumento più interessante è &lt;a href=&#34;http://johnmacfarlane.net/pandoc/try/&#34;&gt;Try pandoc!&lt;/a&gt;, che permette di usare Pandoc dal browser per convertire un documento scritto in Markdown (o in una dozzina di altri formati di testo) in formato HTML, RTF, LaTeX, oltre che in varie implementazioni di Markdown e in altri formati di testo meno noti.&lt;/p&gt;&#xA;&lt;p&gt;Un altro strumento utile è &lt;a href=&#34;http://johnmacfarlane.net/babelmark2/&#34;&gt;Babelmark 2&lt;/a&gt;, che permette di valutare le differenze fra il codice HTML generato dalle varie implementazioni (&lt;em&gt;dialetti&lt;/em&gt;?) di Markdown.&lt;/p&gt;&#xA;&lt;p&gt;Detto fra parentesi, l&amp;rsquo;esistenza di svariate implementazioni di Markdown leggermente differenti l&amp;rsquo;una dall&amp;rsquo;altra è la vera debolezza di questo strumento di scrittura. Spero vivamente che prenda piede una implementazione standard come quella proposta da &lt;a href=&#34;http://commonmark.org/&#34;&gt;CommonMark&lt;/a&gt; (anche se criticata, a mio modesto parere un po&amp;rsquo; scioccamente, da John Gruber, l&amp;rsquo;ideatore di Markdown).&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://heckyesmarkdown.com/&#34;&gt;Heck Yes Markdown&lt;/a&gt; fa il contrario: prende una pagina web e la converte in Markdown. Utilissimo per convertire in questo formato dei documenti scritti in passato in HTML, magari allo scopo di creare un archivio di pagine web in un formato uniforme o di riutilizzarli per un &lt;a href=&#34;http://codecondo.com/7-static-site-generators-for-building-websites-blogs/&#34;&gt;sito web statico&lt;/a&gt;. Ma forse altrettanto utile per implementare con il solo Markdown uno strumento simile a &lt;a href=&#34;https://readability.com/&#34;&gt;Readability&lt;/a&gt;. Da provare con i siti più pesanti e carichi di pubblicità e animazioni.&lt;/p&gt;&#xA;&lt;h4 id=&#34;editor-online&#34;&gt;Editor online&lt;/h4&gt;&#xA;&lt;p&gt;In questo campo c&amp;rsquo;è solo da scegliere: gli editor online di Markdown sono fin troppi.&lt;/p&gt;&#xA;&lt;p&gt;Per un uso occasionale consiglio, in ordine (molto) personale di preferenza, &lt;a href=&#34;http://dillinger.io/&#34;&gt;Dillinger&lt;/a&gt;, che permette di importare e salvare i documenti in Dropbox, Google Drive, One Drive e GitHub, &lt;a href=&#34;https://stackedit.io/editor&#34;&gt;StackEdit&lt;/a&gt;, il più completo e facile da usare, con sincronizzazione opzionale dei documenti con alcuni servizi cloud, &lt;a href=&#34;http://daringfireball.net/projects/markdown/dingus&#34;&gt;Markdown Web Dingus&lt;/a&gt; di John Gruber, con una colonna con la sintassi di Markdown, &lt;a href=&#34;http://softwaremaniacs.org/playground/showdown-highlight/&#34;&gt;Showdown&lt;/a&gt;, contenente una guida molto dettagliata alla sintassi di Markdown e &lt;a href=&#34;http://socrates.io&#34;&gt;Socrates&lt;/a&gt;, decisamente pulito e minimale. Tutti questi editor non richiedono registrazione e possono essere usati immediatamente, ma hanno lo svantaggio di non permettere il salvataggio dei documenti prodotti, a meno di non usare qualche servizio cloud come quelli citati sopra.&lt;/p&gt;&#xA;&lt;p&gt;Per un uso più continuativo, oltre a Dillinger e StackEdit, consiglio di provare anche &lt;a href=&#34;https://beegit.com/&#34;&gt;Beegit&lt;/a&gt;, che permette a più persone di collaborare alla stesura dello stesso documento, &lt;a href=&#34;https://draftin.com/&#34;&gt;Draft&lt;/a&gt;, il più completo oltre che il più bello dal punto di vista grafico e &lt;a href=&#34;http://markable.in/&#34;&gt;Markable&lt;/a&gt;, che purtroppo, non so perché, mi fa pensare a un prodotto pensato per Windows.&lt;/p&gt;&#xA;&lt;p&gt;Peccato solo per Editorially, un ottimo editor online che ha avuto però una vita molto breve.&lt;/p&gt;&#xA;</description>
    </item>
  </channel>
</rss>
