<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Javascript on Melabit</title>
    <link>https://static.233.196.69.159.clients.your-server.de/it/tags/javascript/</link>
    <description>Recent content in Javascript on Melabit</description>
    <generator>Hugo</generator>
    <language>it</language>
    <lastBuildDate>Mon, 03 Oct 2022 06:00:00 +0000</lastBuildDate>
    <atom:link href="https://static.233.196.69.159.clients.your-server.de/it/tags/javascript/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Swift contro Python, ovvero mele contro pere</title>
      <link>https://static.233.196.69.159.clients.your-server.de/it/2022/10/03/swift-contro-python-ovvero-mele-contro-pere/</link>
      <pubDate>Mon, 03 Oct 2022 06:00:00 +0000</pubDate>
      <guid>https://static.233.196.69.159.clients.your-server.de/it/2022/10/03/swift-contro-python-ovvero-mele-contro-pere/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2022-10-03-swift-contro-python-ovvero-mele-contro-pere/martina-leuderalbert-i-GgDz7KQz4-unsplash.jpg&#34; alt=&#34;&#34;&gt;&#xA;&amp;ndash; &lt;em&gt;Fonte: &lt;a href=&#34;https://unsplash.com/@tinaleuderalbert&#34;&gt;Martina Leuderalbert&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;Alle elementari la maestra mi aveva insegnato a non sommare le mele con le pere, cioè a non mettere insieme (o paragonare) cose e fatti molto diversi fra loro. Non ha quindi senso sommare 3 litri di acqua con 5 chilogrammi di farina o chiedersi se 40 metri sono più o meglio di 20 secondi.&lt;/p&gt;&#xA;&lt;p&gt;Quello che diceva la mia maestra lo dicono, sono sicuro, le maestre di tutto il mondo, ma c&amp;rsquo;è sempre qualcuno assente a queste lezioni.&lt;/p&gt;&#xA;&lt;h4 id=&#34;il-golia-della-programmazione-moderna&#34;&gt;Il Golia della programmazione moderna&lt;/h4&gt;&#xA;&lt;p&gt;Uno di questi è stato di sicuro Ari Joury che, nonostante il suo dottorato in fisica delle particelle, non si è fatto scrupoli a pubblicare su Medium questo &lt;a href=&#34;https://medium.com/geekculture/swift-was-poised-to-replace-python-then-it-tanked-3e6c11740ba6&#34;&gt;Swift was poised to replace Python. Then it tanked&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Cosa dice l’articolo? Che nel mondo del machine learning i linguaggi di programmazione più usati sono Matlab, R, Julia e soprattutto Python. Quest’ultimo, nato originariamente per sviluppare dei piccoli &lt;em&gt;script&lt;/em&gt; senza troppe pretese, è diventato oggi un vero &lt;em&gt;&amp;ldquo;Golia della programmazione moderna”&lt;/em&gt;, tanto da essere usato estensivamente da aziende come Dropbox, Instagram e Pinterest per i loro servizi online.&lt;/p&gt;&#xA;&lt;p&gt;Grazie alla disponibilità di librerie come TensorFlow o PyTorch (nonché, aggiungo io, di librerie di base come Pandas o NumPy), Python è diventato anche il linguaggio di elezione di chi si occupa di machine learning e di analisi dei dati.&lt;/p&gt;&#xA;&lt;p&gt;La crescita di Python sembra bloccata da un paio di anni, ma la sua enorme diffusione lo farà rimanere comunque un attore centrale anche nel prossimo futuro.&lt;/p&gt;&#xA;&lt;h4 id=&#34;entra-in-scena-swift&#34;&gt;Entra in scena Swift&lt;/h4&gt;&#xA;&lt;p&gt;Fin qui tutto vero e condivisibile. Magari si potrebbe eccepire qualcosina sull&amp;rsquo;importanza di R nell&amp;rsquo;ambito dell&amp;rsquo;analisi dei dati, ma non voglio essere puntiglioso.&lt;/p&gt;&#xA;&lt;p&gt;Il guaio è che se uno si limita a scrivere queste cose non se lo fila nessuno, chi vorrà mai leggere l&amp;rsquo;ennesimo articolo generico sulle virtù di Python per il machine learning (e non) o su &lt;a href=&#34;https://towardsdatascience.com/why-python-is-not-the-programming-language-of-the-future-30ddc5339b66&#34;&gt;quale linguaggio&lt;/a&gt; è destinato a soppiantarlo?&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; Ci vuole un colpo d&amp;rsquo;ala.&lt;/p&gt;&#xA;&lt;p&gt;Per fortuna c&amp;rsquo;è sempre Apple che, come il nero, va bene su tutto e, soprattutto, garantisce sempre un bel po&amp;rsquo; di click. E allora perché non mettere in mezzo Swift?&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.apple.com/swift&#34;&gt;Swift&lt;/a&gt; è un linguaggio di programmazione sviluppato da Apple con l&amp;rsquo;obiettivo specifico di sostituire &lt;a href=&#34;https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/ObjectiveC/Introduction/introObjectiveC.html&#34;&gt;Objective-C&lt;/a&gt; come linguaggio di elezione per lo sviluppo delle applicazioni per iOS e per macOS. Swift è facile da imparare e la sua sintassi leggibile ricalca quella di Python, è vero, così come quella di Julia e di tanti altri linguaggi di programmazione moderni.&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;&lt;/p&gt;&#xA;&lt;p&gt;Swift però non ha mai preteso di essere, come &lt;a href=&#34;https://medium.com/geekculture/swift-was-poised-to-replace-python-then-it-tanked-3e6c11740ba6&#34;&gt;sostiene il nostro Ari&lt;/a&gt;, il nuovo &lt;em&gt;&amp;ldquo;Re della Programmazione&amp;rdquo;&lt;/em&gt;. Ad Apple non interessa posizionare Swift come uno strumento di programmazione &lt;em&gt;general purpose&lt;/em&gt;, le interessa solo che venga usato per programmare le applicazioni per i suoi sistemi operativi. Del resto, il fatto che manchi di una versione per Windows taglia fuori una fetta così importante di potenziali utenti da rendere impossibile a priori una pretesa tanto assurda.&lt;/p&gt;&#xA;&lt;p&gt;A maggior ragione Swift non ha mai preteso di essere il nuovo strumento principe per il machine learning, come il buon Ari sotto sotto ci vuole far intendere. È vero che Google ha provato a &lt;a href=&#34;https://tensorflow.org/swift&#34;&gt;supportare Swift&lt;/a&gt; all&amp;rsquo;interno di TensorFlow (di cui Google è il principale sviluppatore), ma questo esperimento, come succede con tanti altri prodotti dell&amp;rsquo;azienda di Mountain View, è stato interrotto nel 2021. È ragionevole pensare, infatti, che chi sviluppa in Swift preferisce usare gli &lt;a href=&#34;https://developer.apple.com/machine-learning&#34;&gt;strumenti per il machine learning integrati&lt;/a&gt; in macOS/iOS piuttosto che prodotti di terze parti.&lt;/p&gt;&#xA;&lt;h4 id=&#34;io-sono-più-popolare-di-te&#34;&gt;Io sono più popolare di te&lt;/h4&gt;&#xA;&lt;p&gt;Ma la cosa più sconcertante è pretendere di confrontare la popolarità (o meno) dei linguaggi di programmazione utilizzando una metrica fasulla come la percentuale di domande poste ogni mese su StackOverflow relativamente ad uno o ad un altro linguaggio. In base a questa percentuale, la &lt;a href=&#34;https://insights.stackoverflow.com/trends?tags=python%2Cswift&#34;&gt;popolarità di Python&lt;/a&gt; è cresciuta costantemente fino alla fine del 2020, per poi stabilizzarsi al 16% del totale delle domande su StackOverflow, mentre &lt;a href=&#34;https://insights.stackoverflow.com/trends?tags=python%2Cswift&#34;&gt;quella di Swift&lt;/a&gt; dopo aver raggiunto un massimo del 3% è in declino e ora si aggira nei dintorni dell&#39;1.5%.&lt;/p&gt;&#xA;&lt;p&gt;Perché è una metrica fasulla? Perché finché siamo sui grandi numeri e confrontiamo la &lt;a href=&#34;https://insights.stackoverflow.com/trends?tags=python%2Cjavascript&#34;&gt;popolarità di Python con quella di JavaScript&lt;/a&gt; può anche avere senso basarsi sul numero di domande poste su StackOverflow per valutarne la diffusione.&lt;/p&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2022-10-03-swift-contro-python-ovvero-mele-contro-pere/stack-overflow-python-javascript.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;Ma se buttiamo nel calderone anche la terna &lt;a href=&#34;https://insights.stackoverflow.com/trends?tags=python%2Cjavascript%2Cjava%2Chtml%2Ccss%2Cphp&#34;&gt;HTML, CSS e PHP&lt;/a&gt;, che sono ancora oggi tre strumenti fondamentali per chi fa sviluppo web, troviamo che questi ultimi sono in costante declino, senza però che la decadenza (su StackOverflow) di PHP venga compensata da un incremento corrispondente nell&amp;rsquo;interesse verso JavaScript.&lt;/p&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2022-10-03-swift-contro-python-ovvero-mele-contro-pere/stack-overflow-python-javascript-html-css-php.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;Anche &lt;a href=&#34;https://insights.stackoverflow.com/trends?tags=wordpress&#34;&gt;Wordpress&lt;/a&gt;, che piaccia o non piaccia sta dietro il 40% dei siti web, secondo la metrica di StackOverflow sarebbe in calo. Idem per &lt;a href=&#34;https://insights.stackoverflow.com/trends?tags=mysql&#34;&gt;MySQL&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;E allora la spiegazione può essere un&amp;rsquo;altra: più che la diffusione, le domande su StackOverflow ci fanno vedere la complessità del linguaggio e la qualità della sua documentazione: HTML, CSS e PHP (o Wordpress e MySQL) sono prodotti ben assestati, per loro esistono ottime guide sul web che ne spiegano diffusamente i segreti. Di conseguenza non è necessario cercare risposte più o meno occasionali su StackOverflow, e comunque quelle che ci sono già bastano ed avanzano.&lt;/p&gt;&#xA;&lt;p&gt;Python e JavaScript, al contrario, hanno una sintassi di base piuttosto semplice ma per essere usati al meglio hanno bisogno di un gran numero di librerie aggiuntive, che sono spesso più complesse del linguaggio base e che vengono aggiornate ed espanse di continuo. La documentazione relativa non tiene sempre il passo dello sviluppo, per cui il modo migliore per imparare ad usare al meglio le centinaia e centinaia di API disponibili è quello di rivolgersi a qualche esperto su StackOverflow, spingendo così in alto la &lt;em&gt;popolarità&lt;/em&gt; dei due linguaggi.&lt;sup id=&#34;fnref:3&#34;&gt;&lt;a href=&#34;#fn:3&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;3&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#xA;&lt;p&gt;Secondo la logica basata sul numero di domande su StackOverflow anche &lt;a href=&#34;https://insights.stackoverflow.com/trends?tags=c%2Cc%2B%2B&#34;&gt;C e C++&lt;/a&gt;, i linguaggi usati per la programmazione di sistema (e non) su Linux e Windows, sarebbero in declino, e lo stesso succede a &lt;a href=&#34;https://insights.stackoverflow.com/trends?tags=algorithm%2Carchitecture%2Cclass%2Cdatabase&#34;&gt;concetti di base&lt;/a&gt; come &lt;em&gt;algoritmo&lt;/em&gt;, &lt;em&gt;architettura&lt;/em&gt;, &lt;em&gt;classe&lt;/em&gt; o &lt;em&gt;database&lt;/em&gt;. Ma  sono in declino perché c&amp;rsquo;è davvero poco interesse o solo perché anche per loro c&amp;rsquo;è abbondanza di documentazione di ottimo livello, senza doversi ridurre a porre sempre delle nuove domande su StackOverflow?&lt;/p&gt;&#xA;&lt;p style=&#34;border-style:solid; border-color:lightblue; background-color:lightyellow; padding:1em;&#34;&gt;Nel mio piccolo lo faccio anch&#39;io: quando programmo in R uso pochissimo StackOverflow, perché posso usare l&#39;ottimo help in linea di RStudio e perché la documentazione che accompagna le librerie aggiuntive di R è centralizzata sul [CRAN](https://cran.r-project.org/) (_The Comprehensive R Archive Network_) ed è di altissima qualità. E quando tutto questo non basta, posso trovare decine di siti e di blog che spiegano benissimo gli aspetti più ostici del linguaggio. Quando passo a Python (un linguaggio che, sia chiaro, mi piace parecchio), StackOverflow diventa quasi una necessità, perché la frammentazione e la mancanza di sistema di gestione centralizzata delle librerie di Python rendono molto più complicato trovare documentazione aggiornata di qualità.&#xA;&lt;/p&gt;&#xA;&lt;h4 id=&#34;decaduto-o-semplice&#34;&gt;Decaduto o semplice?&lt;/h4&gt;&#xA;&lt;p&gt;Swift è un linguaggio semplice con una ottima &lt;a href=&#34;https://www.swift.org/documentation/&#34;&gt;documentazione ufficiale&lt;/a&gt;, un eccellente strumento di apprendimento del linguaggio (e non solo) come &lt;a href=&#34;https://www.apple.com/it/swift/playgrounds/&#34;&gt;Swift Playgrounds&lt;/a&gt; e un numero relativemente ridotto di &lt;a href=&#34;https://codersera.com/blog/open-source-swift-libraries/&#34;&gt;librerie aggiuntive&lt;/a&gt;, c&amp;rsquo;è davvero bisogno di passare un sacco di tempo su StackOverflow per usarlo al meglio?&lt;/p&gt;&#xA;&lt;p&gt;Guardando il grafico relativo al numero di domande relative a Swift ci si accorge che i picchi di interesse corrispondono alle date di presentazione della versione 1.0 (giugno 2014) e al rilascio delle versioni 2.0 (settembre 2015), 3.0  (settembre 2016) e 5.0 (marzo 2019) e, come è naturale, dopo ogni presentazione l&amp;rsquo;interesse tende a decadere, proprio perché per usare il linguaggio c&amp;rsquo;è davvero poco da chiedere su StackOverflow.&lt;/p&gt;&#xA;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2022-10-03-swift-contro-python-ovvero-mele-contro-pere/stack-overflow-swift.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;A supporto di questa tesi c&amp;rsquo;è il risultato di &lt;a href=&#34;https://data.stackexchange.com/stackoverflow/query/edit/1649394&#34;&gt;questa semplice query SQL&lt;/a&gt;, con la quale ho provato a calcolare il numero di domande poste su StackOverflow ogni anno. Di SQL ne so pochissimo per cui dovete prendere i risultati con le pinze, ma sembra che il numero di domande su StackOverflow sia in progressiva diminuzione, da un massimo di 2.2 milioni di domande nel 2016 a 1.6 milioni nel 2021.&lt;/p&gt;&#xA;&lt;p&gt;Una volta raggiunta una base di conoscenza sufficientemente ampia non ha molto senso porre sempre delle nuove domande (che su StackOverflow sono fortemente scoraggiate) ma ci si può limitare ad utilizzare il materiale già esistente. Questo almeno per le tecnologie più stabili, come possono essere HTML, CCS, PHP, Wordpress, MySQL&amp;hellip; oppure Swift. Quando invece abbiamo a che fare con strumenti in rapidissima evoluzione, come Python o JavaScript, StackOverflow diventa davvero il modo migliore per imparare.&lt;/p&gt;&#xA;&lt;h4 id=&#34;conclusioni&#34;&gt;Conclusioni&lt;/h4&gt;&#xA;&lt;p&gt;C&amp;rsquo;è bisogno di dilungarsi ancora? Non credo, dico solo che basarsi su ipotesi fantasiose o metriche poco affidabili per ipotizzare &lt;a href=&#34;https://medium.com/geekculture/swift-was-poised-to-replace-python-then-it-tanked-3e6c11740ba6&#34;&gt;scenari catastrofici&lt;/a&gt; per Swift (o, al contrario, &lt;a href=&#34;https://towardsdatascience.com/bye-bye-python-hello-julia-9230bff0df62&#34;&gt;scenari entusiasmanti&lt;/a&gt; per Julia&lt;sup id=&#34;fnref:4&#34;&gt;&lt;a href=&#34;#fn:4&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;4&lt;/a&gt;&lt;/sup&gt;) mi pare francamente &lt;a href=&#34;https://xkcd.com/558/&#34;&gt;insensato&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://static.233.196.69.159.clients.your-server.de/img/2022-10-03-swift-contro-python-ovvero-mele-contro-pere/dt140323.jpg&#34; alt=&#34;&#34;&gt;&#xA;&amp;ndash; &lt;em&gt;Fonte: &lt;a href=&#34;https://dilbert.com/strip/2014-03-23&#34;&gt;Dilbert&lt;/a&gt; di Scott Adams&lt;/em&gt;.&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Capo: Non si possono confrontare mele e arance.&lt;/p&gt;&#xA;&lt;p&gt;Dilbert: È chiaramente sbagliato, perché li hai appena confrontati e dichiarati diversi.&lt;/p&gt;&#xA;&lt;p&gt;Wally: Mele e arance sono entrambi alimenti che crescono sugli alberi. Sarebbe assolutamente valido confrontarli dal punto di vista nutrizionale.&lt;/p&gt;&#xA;&lt;p&gt;Dilbert: Ho notato che molte delle cose che escono dalla tua bocca non hanno senso.&lt;/p&gt;&#xA;&lt;p&gt;Capo: Parli come mia moglie.&lt;/p&gt;&#xA;&lt;p&gt;Wally: Non puoi paragonare tua moglie al tuo subordinato. Sono mele e arance.&lt;/p&gt;&#xA;&lt;p&gt;Capo: Cosa sta succedendo qui?&lt;/p&gt;&#xA;&lt;p&gt;Wally: Non lo so, ma non lo paragonerei a lavoro.&lt;/p&gt;&lt;/blockquote&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;Ari sembra avere le idee un po&amp;rsquo; confuse sul futuro di Python, dato che su Medium ha anche pubblicato &lt;a href=&#34;https://towardsdatascience.com/why-python-is-not-the-programming-language-of-the-future-30ddc5339b66&#34;&gt;Why Python is not the programming language of the future&lt;/a&gt;, oppure &lt;a href=&#34;https://towardsdatascience.com/bye-bye-python-hello-julia-9230bff0df62&#34;&gt;Bye-bye Python. Hello Julia!&lt;/a&gt; e perfino &lt;a href=&#34;https://levelup.gitconnected.com/why-tensorflow-for-python-is-dying-a-slow-death-ba4dafcb37e6&#34;&gt;Why TensorFlow for Python is dying a slow death&lt;/a&gt;.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:2&#34;&gt;&#xA;&lt;p&gt;E non è un caso, perché alla base di tutti questi linguaggi c&amp;rsquo;è sempre il buon vecchio &lt;a href=&#34;https://time.com/69316/basic/&#34;&gt;BASIC&lt;/a&gt;, il primo linguaggio di programmazione davvero per tutti, che è stato il linguaggio di base dei computer personali degli anni &amp;lsquo;80 su cui si sono fatti le ossa tutti i grandi nomi dell&amp;rsquo;informatica di quegli anni.&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:3&#34;&gt;&#xA;&lt;p&gt;Le sole domande sulla libreria &lt;code&gt;pandas&lt;/code&gt; di Python (una libreria fondamentale per chi usa Python per l&amp;rsquo;analisi dei dati) &lt;a href=&#34;https://insights.stackoverflow.com/trends?tags=pandas&#34;&gt;assommano al 3%&lt;/a&gt; del totale, le principali librerie per il machine learning (TensorFlow, Keras, PyTorch, scikit-learn, OpenCV, NLTK) fanno &lt;a href=&#34;https://insights.stackoverflow.com/trends?tags=tensorflow%2Ckeras%2Cpytorch%2Cscikit-learn%2Copencv%2Cnltk&#34;&gt;un altro 2%&lt;/a&gt;, mentre quelle su &lt;code&gt;Django&lt;/code&gt; e &lt;code&gt;Flask&lt;/code&gt; (le principali librerie Python per lo sviluppo di applicazioni per il web) sono quasi &lt;a href=&#34;https://insights.stackoverflow.com/trends?tags=django%2Cflask&#34;&gt;al 2.5%&lt;/a&gt; del totale generale. Chiaramente queste domande vengono anche conteggiate come domande relative a Python.&amp;#160;&lt;a href=&#34;#fnref:3&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:4&#34;&gt;&#xA;&lt;p&gt;Perché sì, &lt;a href=&#34;https://insights.stackoverflow.com/trends?tags=julia&#34;&gt;l&amp;rsquo;interesse per Julia&lt;/a&gt; sembra essere in aumento su StackOverflow, ma parliamo di non più dello 0.16% (1/10 dei valori di Swift) e anche in questo caso i picchi corrispondono al rilascio delle varie versioni del linguaggio.&amp;#160;&lt;a href=&#34;#fnref:4&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/div&gt;&#xA;</description>
    </item>
    <item>
      <title>Viaggetto</title>
      <link>https://static.233.196.69.159.clients.your-server.de/it/2017/10/07/viaggetto/</link>
      <pubDate>Sat, 07 Oct 2017 06:00:00 +0000</pubDate>
      <guid>https://static.233.196.69.159.clients.your-server.de/it/2017/10/07/viaggetto/</guid>
      <description>&lt;p&gt;Per fortuna internet non è solo &lt;a href=&#34;https://melabit.wordpress.com/2017/10/02/lelettro-giubbotto/&#34;&gt;sciocchezze&lt;/a&gt; o vere e proprie &lt;a href=&#34;https://melabit.wordpress.com/2017/10/01/la-spremuta-al-tempo-di-internet/&#34;&gt;truffe&lt;/a&gt;, ogni tanto si possono trovare vere e proprie oasi di bellezza e di maestria tecnica.&lt;/p&gt;&#xA;&lt;p&gt;Se avete qualche minuto libero godetevi &lt;a href=&#34;http://alexanderperrin.com.au/paper/shorttrip/&#34;&gt;questo viaggetto in treno&lt;/a&gt;, sono sicuro che non ve ne pentirete. Funziona su tutti i browser che supportano &lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Learn/WebGL&#34;&gt;WebGL&lt;/a&gt;, anche quelli per tablet e smartphone.&lt;/p&gt;&#xA;&lt;img src=&#34;http://alexanderperrin.com.au/wp-content/uploads/2017/09/shorttrip04.png&#34; alt=&#34;&#34;&gt;</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>Emulare online: sempre più in Alto</title>
      <link>https://static.233.196.69.159.clients.your-server.de/it/2017/05/20/emulare-online-sempre-piu-in-alto/</link>
      <pubDate>Sat, 20 May 2017 06:00:00 +0000</pubDate>
      <guid>https://static.233.196.69.159.clients.your-server.de/it/2017/05/20/emulare-online-sempre-piu-in-alto/</guid>
      <description>&lt;p&gt;Non c&amp;rsquo;è solo il &lt;a href=&#34;https://melabit.wordpress.com/2017/04/23/emulare-il-macintosh-online/&#34;&gt;Macintosh&lt;/a&gt;. Il web è pieno di emulatori di tutti i tipi, con i quali si possono usare vecchie macchine e vecchi sistemi operativi direttamente nel browser, senza installare nulla sul proprio computer.&lt;/p&gt;&#xA;&lt;p&gt;L&amp;rsquo;idea iniziale per questo post era quella di proporre un lista ragionata dei migliori emulatori online, ma poi ho deciso di lasciar perdere, ci sono già delle liste ben fatte ed è inutile ripetersi.&#xA;La mia preferita è una lista molto dettagliata di &lt;a href=&#34;https://www.cambus.net/emulators-written-in-javascript/&#34;&gt;emulatori in JavaScript&lt;/a&gt;, che è di sicuro il modo più &lt;em&gt;moderno&lt;/em&gt; ed efficace (anche se magari non il più efficiente) per realizzare un emulatore online, oggi.&lt;/p&gt;&#xA;&lt;p&gt;Interessanti anche le liste contenute in &lt;a href=&#34;https://hackaday.com/2015/09/28/roundup-retro-computers-in-your-browser/&#34;&gt;Roundup: Retro Computers in Your Browser&lt;/a&gt; e in &lt;a href=&#34;https://archive.vg/blog/a-big-list-of-browser-based-emulators-and-ports-of-classic-games&#34;&gt;A Big List of Browser-Based Emulators and Ports of Classic Games&lt;/a&gt;, che però contengono parecchi link ormai defunti, oltre che un po&amp;rsquo; di emulatori che richiedono Flash, Java o qualche strano plugin per funzionare.&lt;/p&gt;&#xA;&lt;p&gt;Senza dimenticare la &lt;a href=&#34;https://archive.org/details/softwarelibrary&#34;&gt;Software Library&lt;/a&gt; dell&amp;rsquo;Internet Archive, dove si trova un po&amp;rsquo; di tutto, anzi il vero problema è proprio quello di riuscire ad orientarsi fra la tantissima roba disponibile.&lt;/p&gt;&#xA;&lt;p&gt;Se proprio devo consigliare un paio di cose da provare, sceglierei &lt;a href=&#34;https://www.scullinsteel.com/apple//e&#34;&gt;Apple //jse&lt;/a&gt; e &lt;a href=&#34;http://www.pcjs.org/&#34;&gt;PCjs Machines&lt;/a&gt;, facili e comodi da usare e con tantissimo software di buona qualità disponibile.&lt;/p&gt;&#xA;&lt;p&gt;Ma fin qui, diciamolo, non c&amp;rsquo;è niente di particolarmente eccitante, in fondo l&amp;rsquo;Apple II si poteva emulare tranquillamente anche in un &lt;a href=&#34;https://web.archive.org/web/20130128132322/http://www-personal.umich.edu/~mressl/appleiigo/&#34;&gt;widget di Dashboard&lt;/a&gt;!&lt;/p&gt;&#xA;&lt;p&gt;Perché non provare invece qualcosa di più interessante, una macchina ormai quasi dimenticata, ma senza la quale non ci sarebbero i computer come li conosciamo (e li usiamo) oggi?&lt;/p&gt;&#xA;&lt;img src=&#34;https://c1.staticflickr.com/6/5550/31336403041_6946f4b212_z.jpg&#34; alt=&#34;&#34;&gt;&lt;p&gt;Parlo di sua maestà, l&amp;rsquo;&lt;a href=&#34;http://history-computer.com/ModernComputer/Personal/Alto.html&#34;&gt;Alto&lt;/a&gt;, sviluppato al Palo Alto Research Center (PARC) della Xerox nei primi anni &amp;lsquo;70. Il  primo &lt;em&gt;computer personale&lt;/em&gt;, ma anche il primo computer che conteneva, anche se in modo ancora acerbo, gli elementi di una interfaccia utente grafica, parecchi anni prima del Lisa e del Macintosh.&lt;/p&gt;&#xA;&lt;p&gt;Dell&amp;rsquo;Alto non è stato venduto nemmeno un esemplare &amp;ndash; tutti gli esemplari prodotti sono stati usati all&amp;rsquo;interno della Xerox oppure regalati(!) a università e centri di ricerca USA, oltre che alla Casa Bianca e alla Camera dei Rappresentanti &amp;ndash; ma rimane lo stesso una pietra miliare nella storia dell&amp;rsquo;informatica.&lt;/p&gt;&#xA;&lt;p&gt;Sembra incredibile ma esiste un &lt;a href=&#34;http://retroweb.maclab.org/articles/Xerox-Alto.html&#34;&gt;emulatore online dell&amp;rsquo;Alto&lt;/a&gt;, lento, anzi lentissimo, e soggetto a continui crash, ma comunque molto utile per conoscere un oggetto affascinante (ed imprescindibile) della storia della tecnologia.&lt;/p&gt;&#xA;&lt;p&gt;Per usare l&amp;rsquo;emulatore bisogna cliccare prima &lt;a href=&#34;http://retroweb.maclab.org/articles/Xerox-Alto.html&#34;&gt;su questo link&lt;/a&gt; e poi sul disco di boot (Boot Disk), rappresentato dall&amp;rsquo;icona del disco rigido con il pallino verde, che compare nella finestra di testo a sinistra del monitor dell&amp;rsquo;Alto.&lt;/p&gt;&#xA;&lt;img src=&#34;https://melabit.files.wordpress.com/2017/05/salto_online.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;Una volta completato l&amp;rsquo;avvio del sistema comparirà la scritta &amp;ldquo;Xerox Alto Executive/12&amp;rdquo;, con alcuni dati relativi al sistema operativo in esecuzione, e poi il prompt dei comandi (l&amp;rsquo;equivalente del Terminale del Mac), rappresentato da un &lt;code&gt;&amp;amp;#62;&lt;/code&gt;.&#xA;Spostando il mouse sull&amp;rsquo;immagine del monitor si può finalmente provare ad usare l&amp;rsquo;Alto (preferibilmente scegliendo il tasto di zoom, in modo da ingrandire l&amp;rsquo;immagine del monitor su tutta la finestra del browser).&lt;/p&gt;&#xA;&lt;p&gt;Un comando fondamentale per interagire con l&amp;rsquo;Alto è il &lt;code&gt;?&lt;/code&gt;, che mostra il contenuto del disco montato nell&amp;rsquo;emulatore. L&amp;rsquo;Alto usa però la tastiera americana, per inserire il &lt;code&gt;?&lt;/code&gt; con tastiera italiana dobbiamo premere contemporaneamente &lt;code&gt;SHIFT&lt;/code&gt; e &lt;code&gt;-&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Comparirà (lentamente!) una lista dei file presenti sul disco, quasi tutti giochi, insieme ad una freccia tremolante che rappresenta il puntatore del mouse, la prima indicazione che stiamo usando un sistema con una interfaccia grafica.&lt;/p&gt;&#xA;&lt;p&gt;I programmi eseguibili hanno il suffisso &lt;code&gt;.Run&lt;/code&gt; (più o meno come il suffisso &lt;code&gt;.exe&lt;/code&gt; che indica i programmi eseguibili su Windows). Per lanciare un programma basta scrivere una parte univoca del nome (il sistema operativo non distingue fra maiuscole e minuscole), anche senza estensione, e premere Invio.&lt;/p&gt;&#xA;&lt;p&gt;Per cominciare, consiglio di lanciare il programma &lt;code&gt;Ti55.Run&lt;/code&gt;, un emulatore (dentro l&amp;rsquo;emulatore!) di una calcolatrice &lt;a href=&#34;http://www.datamath.org/Sci/MAJESTIC/TI-55.htm&#34;&gt;Texas Instruments TI-55&lt;/a&gt;, utilizzabile completamente con il mouse. Per uscire dall&amp;rsquo;emulatore basta schiacciare il tasto (virtuale) &lt;code&gt;OFF&lt;/code&gt; che &amp;ldquo;spegne&amp;rdquo; la calcolatrice.&lt;/p&gt;&#xA;&lt;p&gt;Non male anche il gioco del labirinto, &lt;code&gt;maze&lt;/code&gt;, nel quale si usa il mouse per tracciare il percorso che congiunge il quadratino chiaro lampeggiante di partenza a quello nero di arrivo. E dove, come in un labirinto reale, per tornare sui propri passi bisogna proprio rifare il percorso al contrario. Oppure &lt;code&gt;pinball&lt;/code&gt;, l&amp;rsquo;intramontabile flipper della nostra (o almeno della mia) giovinezza, che però è così lento da essere praticamente inutilizzabile, &lt;code&gt;trek&lt;/code&gt;, un gioco spaziale che ha bisogno di un &lt;a href=&#34;https://web.archive.org/web/20060823194351/http://www.bitsavers.org/pdf/xerox/alto/trek21.pdf&#34;&gt;manuale di 20 pagine&lt;/a&gt; per poter essere usato, o &lt;code&gt;turkey&lt;/code&gt;, un &lt;a href=&#34;https://it.wikipedia.org/wiki/Gioco_del_quindici&#34;&gt;gioco del 15&lt;/a&gt; grafico in cui le tessere vengono mosse con il mouse.&lt;/p&gt;&#xA;&lt;p&gt;Se qualcosa va storto (e qualcosa va &lt;em&gt;spesso&lt;/em&gt; storto), la cosa più semplice è ricaricare la finestra del browser e far ripartire l&amp;rsquo;emulatore da zero.&lt;/p&gt;&#xA;&lt;p&gt;Purtroppo l&amp;rsquo;emulatore online dell&amp;rsquo;Alto contiene praticamente solo giochi. Per provare altre applicazioni fondamentali dell&amp;rsquo;Alto, come &lt;code&gt;Bravo&lt;/code&gt;, il primo editor grafico di testi, o &lt;code&gt;Draw&lt;/code&gt;, un programma di grafica vettoriale, ci vuole qualcosa di più.&lt;/p&gt;&#xA;&lt;p&gt;Appuntamento alla prossima volta.&lt;/p&gt;&#xA;&lt;h4 id=&#34;bibliografia&#34;&gt;Bibliografia&lt;/h4&gt;&#xA;&lt;p&gt;Per saperne di più sull&amp;rsquo;Alto, consiglio fortemente la lettura di &lt;a href=&#34;https://archive.org/stream/byte-magazine-1981-09/BYTE_Vol_06-09_1981-09_Artifical_Intelligence#page/n59/mode/2up&#34;&gt;questo articolo di BYTE&lt;/a&gt;, pubblicato nel numero di settembre 1981. BYTE è stata per tutti gli anni &amp;lsquo;80 e i primi anni &amp;lsquo;90 la rivista fondamentale nel campo del &lt;em&gt;personal computing&lt;/em&gt; (e non solo), con un livello   di dettaglio e di approfondimento degli articoli che sarebbe assolutamente impensabile oggi.&lt;/p&gt;&#xA;&lt;p&gt;Molto interessante anche l&amp;rsquo;&lt;a href=&#34;http://www.righto.com/2016/06/y-combinators-xerox-alto-restoring.html&#34;&gt;introduzione alla storia del restauro di un vecchio Alto&lt;/a&gt; appartenuto ad Alan Kay (il padre della programmazione ad oggetti e del &lt;a href=&#34;https://en.wikipedia.org/wiki/Dynabook&#34;&gt;Dynabook&lt;/a&gt;, il computer educativo &lt;em&gt;ideale&lt;/em&gt; da cui discendono i notebook e i tablet di oggi).&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>Emulare il Macintosh online</title>
      <link>https://static.233.196.69.159.clients.your-server.de/it/2017/04/23/emulare-il-macintosh-online/</link>
      <pubDate>Sun, 23 Apr 2017 06:00:00 +0000</pubDate>
      <guid>https://static.233.196.69.159.clients.your-server.de/it/2017/04/23/emulare-il-macintosh-online/</guid>
      <description>&lt;p&gt;Il &lt;em&gt;retrocomputing&lt;/em&gt; &amp;ndash; il recupero, il restauro e la conservazione di vecchi computer e del relativo software e documentazione, un tema a metà fra l&amp;rsquo;&lt;em&gt;archeologia&lt;/em&gt; informatica e la semplice &lt;em&gt;nostalgia&lt;/em&gt; (ma personalmente propendo per la prima alternativa) &amp;ndash; è  un argomento piuttosto &lt;em&gt;caldo&lt;/em&gt; in questi ultimi giorni.&lt;/p&gt;&#xA;&lt;p&gt;Ne ho parlato pochi giorni fa a proposito del sito &lt;a href=&#34;https://melabit.wordpress.com/2017/04/18/storie-di-apple-la-storia-di-apple/&#34;&gt;Storie di Apple&lt;/a&gt;, che cerca di recuperare la storia, nota e semisconosciuta, dell&amp;rsquo;azienda di Cupertino.&lt;/p&gt;&#xA;&lt;p&gt;Ne hanno parlato in tanti in questa settimana,&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; dopo che il benemerito Internet Archive ha &lt;a href=&#34;http://blog.archive.org/2017/04/16/early-macintosh-emulation-comes-to-the-archive/&#34;&gt;annunciato&lt;/a&gt;, proprio il  giorno di Pasqua, l&amp;rsquo;attivazione di un &lt;a href=&#34;https://archive.org/details/softwarelibrary_mac&#34;&gt;emulatore online del primo Macintosh&lt;/a&gt;, il computer che ha cambiato la storia della tecnologia. La collezione attuale di sistemi operativi, applicazioni e giochi per i primi Macintosh è piuttosto ristretta, ma è probabile che cresca rapidamente.&lt;/p&gt;&#xA;&lt;p&gt;L&amp;rsquo;emulatore (si tratta di &lt;a href=&#34;https://github.com/jsdf/pce&#34;&gt;PCE.js&lt;/a&gt;, la versione in JavaScript dell&amp;rsquo;&lt;a href=&#34;http://www.hampa.ch/pce/index.html&#34;&gt;emulatore PCE&lt;/a&gt; originale) può essere usato direttamente nel browser, indipendentemente dal sistema operativo sottostante e senza installare niente sul proprio computer. Una cosa che trovo sempre straordinaria, un segno chiarissimo della potenza dei computer attuali (emulare non è mai uno scherzo) e della trasformazione sempre più spinta del browser web in un vero e proprio sistema operativo.&lt;/p&gt;&#xA;&lt;p&gt;Ma l&amp;rsquo;annuncio pasquale contiene una seconda parte trascurata da quasi tutti i commentatori, che però a me fa molto più gola. Dove viene detto che l&amp;rsquo;Internet Archive contiene ormai anche un&amp;rsquo;ampia collezione di &lt;a href=&#34;https://archive.org/details/macworld-magazine?sort=-date&#34;&gt;Macworld Magazine&lt;/a&gt; &amp;ndash; compreso il primissimo numero con Steve Jobs e il Macintosh 128K in copertina &amp;ndash; e di libri relativi al Macintosh (questi sono solo quelli &lt;a href=&#34;https://archive.org/details/macbooks?and%5B%5D=1984&amp;amp;sort=-date&#34;&gt;pubblicati nel 1984&lt;/a&gt; o nel &lt;a href=&#34;https://archive.org/details/macbooks?and[]=1985&amp;amp;sort=-date&#34;&gt;1985&lt;/a&gt;). Tutti disponibili anche in pdf, per poter essere scaricati e sfogliati più comodamente sul proprio computer o tablet.&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;&lt;/p&gt;&#xA;&lt;p&gt;Come &lt;a href=&#34;https://archive.org/details/MacWorld_8801_January_1988&#34;&gt;questo numero di Macworld&lt;/a&gt;, che non potrebbe essere stato meno profetico.&lt;/p&gt;&#xA;&lt;img src=&#34;https://melabit.files.wordpress.com/2017/04/macworld8801.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;Oppure questa &lt;em&gt;&lt;a href=&#34;https://archive.org/details/mac_Macintosh_Repair_and_Maintenance_Chilton_1986&#34;&gt;Chilton&amp;rsquo;s guide to Macintosh repair and maintenance&lt;/a&gt;&lt;/em&gt; che, molto prima di &lt;a href=&#34;https://www.ifixit.com/&#34;&gt;iFixit&lt;/a&gt;, insegnava come mettere le mani nel proprio (costoso!) Macintosh.&lt;/p&gt;&#xA;&lt;p&gt;Ma non è finita qui.&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;Fra questi, Ian Paul, &lt;em&gt;&lt;a href=&#34;http://www.macworld.com/article/3190166/macs/the-internet-archive-brings-macintoshs-classic-era-to-your-browser.html&#34;&gt;The Internet Archive brings Apple&amp;rsquo;s classic Macintosh to your browser&lt;/a&gt;&lt;/em&gt; su Macworld, Andrew Cunningham, &lt;em&gt;&lt;a href=&#34;https://arstechnica.com/apple/2017/04/classic-mac-os-and-dozens-of-apps-can-now-be-run-in-a-browser-window/&#34;&gt;Classic Mac OS and dozens of apps can now be run in a browser window&lt;/a&gt;&lt;/em&gt; su ArsTechnica, Tim Hardwick, &lt;em&gt;&lt;a href=&#34;https://www.macrumors.com/2017/04/19/internet-archive-classic-macintosh-software/&#34;&gt;Internet Archive Offers In-Browser Emulation of Classic Macintosh Software, Circa 1984-1989&lt;/a&gt;&lt;/em&gt;, Charley Locke, &lt;em&gt;&lt;a href=&#34;https://www.wired.com/2017/04/mac-emulator-internet-archive/&#34;&gt;Aw Yiss: You Can Now Play Old-School Mac Games in Your Browser&lt;/a&gt;&lt;/em&gt; su Wired. In italiano, a parte un breve articolo su Applicando, &lt;em&gt;&lt;a href=&#34;https://www.applicando.com/il-primo-mac-1984-si-puo-emulare-online/&#34;&gt;Il primo Mac del 1984 si può emulare online&lt;/a&gt;&lt;/em&gt; e il commento stimolante come sempre del mio amico Lux, &lt;em&gt;&lt;a href=&#34;http://macintelligence.org/blog/2017/04/18/segni-del-tempo/&#34;&gt;Segni del tempo&lt;/a&gt;&lt;/em&gt;, non ho trovato altro.&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;Perché, se è vero che il browser sta diventando un sistema operativo, ci sono cose che secondo me funzionano ancora molto meglio sul desktop (anche scollegati dalla rete), e la lettura dei pdf è fra quelle.&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>Regolarizziamo</title>
      <link>https://static.233.196.69.159.clients.your-server.de/it/2017/02/20/regolarizziamo/</link>
      <pubDate>Mon, 20 Feb 2017 18:00:00 +0000</pubDate>
      <guid>https://static.233.196.69.159.clients.your-server.de/it/2017/02/20/regolarizziamo/</guid>
      <description>&lt;img src=&#34;https://imgs.xkcd.com/comics/perl_problems.png&#34; alt=&#34;&#34;&gt;&lt;p&gt;Le espressioni regolari sono uno degli argomenti più ostici che ci si può trovare ad affrontare quando si usa un computer. Purtroppo sono anche una delle cose più utili, in particolare quando si cerca qualcosa che è sepolto nel disco rigido o quando si devono estrarre informazioni da grosse moli di dati.&lt;/p&gt;&#xA;&lt;p&gt;Ma prima di tutto, cos&amp;rsquo;è una &lt;em&gt;espressione regolare&lt;/em&gt;, o come si dice normalmente in gergo informatico, una &lt;em&gt;regexp&lt;/em&gt;?&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Definizione.&lt;/strong&gt; Una espressione regolare è una sequenza di caratteri che definisce uno schema di ricerca (&lt;em&gt;search pattern&lt;/em&gt;) di informazioni strutturate in modo più o meno preciso.&lt;/p&gt;&#xA;&lt;p&gt;Ecco, la chiave di tutto sta proprio nella espressione &amp;ldquo;&lt;em&gt;più o meno preciso&lt;/em&gt;&amp;rdquo;. Cercare una parola precisa in un file è piuttosto facile, molto meno facile è cercare tutte le possibili variazioni della stessa parola, oppure intere classi di parole.&lt;/p&gt;&#xA;&lt;p&gt;Arrivato a questo punto dovrei fare qualche esempio più o meno complicato di uso delle espressioni regolari per risolvere qualche problema &lt;em&gt;pratico&lt;/em&gt;, come scambiare il nome con il cognome in una lista di indirizzi, aggiungere &lt;code&gt;http://&lt;/code&gt;, o meglio &lt;code&gt;https://&lt;/code&gt;, a tutti gli indirizzi web presenti in un file, cercare i numeri degli ordini di acquisto di una azienda e trasformarli in un formato standardizzato.&lt;/p&gt;&#xA;&lt;p&gt;Ma non mi sogno nemmeno di farlo, scappereste quasi tutti a gambe levate. Perché le espressioni regolari si apprezzano solo quando servono &lt;em&gt;veramente&lt;/em&gt;, quando permettono di risparmiare tempo e fatica facendo svolgere al computer, invece che a noi, le noiose operazioni ripetitive per le quali è così portato.&lt;/p&gt;&#xA;&lt;h4 id=&#34;imparare-ad-usare-le-espressioni-regolari&#34;&gt;Imparare ad usare le espressioni regolari&lt;/h4&gt;&#xA;&lt;p&gt;E allora come si può imparare ad usare queste benedette espressioni regolari?&lt;/p&gt;&#xA;&lt;p&gt;Ci sono decine di libri e di tutorial che ne trattano, ne ho elencati alcuni nella bibliografia. Devo però ammettere che i libri e la maggior parte dei tutorial non li ho mai non dico letti ma nemmeno guardati, mi annoierebbero troppo con le loro sequenze di regole e regolette, terra-terra e quasi inutili o così acrobatiche da essere incomprensibili.&lt;/p&gt;&#xA;&lt;p&gt;Molto meglio i siti web che insegnano ad usare in pratica le espressioni regolari: inserisci da una parte l&amp;rsquo;espressione regolare e dall&amp;rsquo;altra il testo in cui cercare e l&amp;rsquo;applicazione mette in evidenza tutte le sequenze di caratteri che soddisfano l&amp;rsquo;espressione inserita (le &lt;em&gt;occorrenze&lt;/em&gt;), con una spiegazione più o meno dettagliata di quello che succede.&lt;/p&gt;&#xA;&lt;p&gt;Fra tutti i siti di questo tipo, il mio preferito è &lt;a href=&#34;https://regex101.com/&#34;&gt;regex101&lt;/a&gt;, veloce e con spiegazioni chiare e prive di inutili dettagli. Al secondo posto &lt;a href=&#34;https://www.debuggex.com/&#34;&gt;Debuggex&lt;/a&gt;, ottimo ma più complesso da usare, soprattutto le prime volte. Non male anche &lt;a href=&#34;http://regexr.com/&#34;&gt;RegExr&lt;/a&gt;, che però interpreta le espressioni regolari inserite utilizzando il motore JavaScript del browser, che non è sempre compatibile al 100% con le espressioni regolari di altri linguaggi.&lt;/p&gt;&#xA;&lt;h4 id=&#34;ci-sporchiamo-le-mani&#34;&gt;Ci sporchiamo le mani?&lt;/h4&gt;&#xA;&lt;p&gt;Tutto qui? Per ora si, questa voleva essere solo una piccolissima introduzione al mondo oggettivamente complicato delle espressioni regolari. Più o meno come mettere il dito nell&amp;rsquo;acqua per vedere se è fredda.&lt;/p&gt;&#xA;&lt;p&gt;Se l&amp;rsquo;argomento interessa, si può andare avanti con l&amp;rsquo;esplorazione, magari partendo da problemi pratici non troppo banali (affrontabili con tecniche meno complesse), ma nemmeno tanto complicati da risultare ostici.&lt;/p&gt;&#xA;&lt;p&gt;Che ne dite? Aspetto il vostro feedback nei commenti.&lt;/p&gt;&#xA;&lt;h4 id=&#34;bibliografia&#34;&gt;Bibliografia&lt;/h4&gt;&#xA;&lt;h5 id=&#34;libri&#34;&gt;Libri&lt;/h5&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Fitzgerald, &lt;a href=&#34;http://shop.oreilly.com/product/0636920012337.do&#34;&gt;&lt;em&gt;Introducing Regular Expressions&lt;/em&gt;&lt;/a&gt; (O&amp;rsquo;Reilly 2012).&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Goyvaerts, &lt;a href=&#34;http://shop.oreilly.com/product/0636920023630.do&#34;&gt;&lt;em&gt;Regular Expressions Cookbook&lt;/em&gt;&lt;/a&gt;, 2a edizione (O&amp;rsquo;Reilly 2012).&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;López, Romero, &lt;a href=&#34;https://www.packtpub.com/application-development/mastering-python-regular-expressions&#34;&gt;&lt;em&gt;Mastering Python Regular Expressions&lt;/em&gt;&lt;/a&gt; (Packt 2014).&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h5 id=&#34;tutorial&#34;&gt;Tutorial&lt;/h5&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://regexone.com/&#34;&gt;RegexOne&lt;/a&gt;: learn regular expressions with simple, interactive exercises.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.regular-expressions.info/&#34;&gt;Regular-Expressions.info&lt;/a&gt;: the premier website about regular expressions.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.rexegg.com/&#34;&gt;Regex Tutorial&lt;/a&gt;: from regex 101 to advanced regex.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://blog.chalda.it/guida-alla-sintassi-delle-espressioni-regolari-217.html&#34;&gt;Guida alla sintassi delle espressioni regolari&lt;/a&gt; (con esempi).&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://www.marioconcina.it/blog/come-fare/guida-alle-espressioni-regolari-regex.html&#34;&gt;Guida alle espressioni regolari (regex)&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.digitalocean.com/community/tutorials/using-grep-regular-expressions-to-search-for-text-patterns-in-linux&#34;&gt;Using Grep &amp;amp; Regular Expressions to Search for Text Patterns in Linux&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://matt.might.net/articles/sculpting-text/&#34;&gt;Sculpting text with regex, grep, sed, awk, emacs and vim&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h5 id=&#34;servizi-online&#34;&gt;Servizi online&lt;/h5&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://regex101.com/&#34;&gt;regex101&lt;/a&gt;: an online regex tester and debugger.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.debuggex.com/&#34;&gt;Debuggex&lt;/a&gt;, an online visual regex tester.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://regexr.com/&#34;&gt;RegExr&lt;/a&gt;: learn, build, &amp;amp; test regex.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
    </item>
    <item>
      <title>Non trovo le parole</title>
      <link>https://static.233.196.69.159.clients.your-server.de/it/2015/12/04/non-trovo-le-parole/</link>
      <pubDate>Fri, 04 Dec 2015 06:00:00 +0000</pubDate>
      <guid>https://static.233.196.69.159.clients.your-server.de/it/2015/12/04/non-trovo-le-parole/</guid>
      <description>&lt;p&gt;Non trovo le parole per descrivere al meglio &lt;a href=&#34;https://c1.goote.ch/c8a05c9a6d4a4929a3fa50e6ebdee0c3.scene/&#34;&gt;questo sito&lt;/a&gt; (e la &lt;a href=&#34;http://goocreate.com/product/&#34;&gt;tecnologia che c&amp;rsquo;è dietro&lt;/a&gt;).&lt;/p&gt;&#xA;&lt;p&gt;Le animazioni sono realistiche, lo scroll velocissimo e naturale, tutto succede nel browser senza pause o impuntature. Perfino la musica, anche se ripetitiva, è affascinante.&lt;/p&gt;&#xA;&lt;p&gt;Altro che Flash, qui si dimostra al meglio la potenza e la flessibilità dell&amp;rsquo;HTML5. Questo è il futuro.&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>I limiti di Wordpress.com: generatori di siti web statici</title>
      <link>https://static.233.196.69.159.clients.your-server.de/it/2014/08/09/i-limiti-di-wordpress-com-generatori-di-siti-web-statici/</link>
      <pubDate>Sat, 09 Aug 2014 06:00:00 +0000</pubDate>
      <guid>https://static.233.196.69.159.clients.your-server.de/it/2014/08/09/i-limiti-di-wordpress-com-generatori-di-siti-web-statici/</guid>
      <description>&lt;p&gt;Come ho già scritto qualche giorno fa, ci sono letteralmente decine di &lt;a href=&#34;http://melabit.wordpress.com/2014/08/06/i-limiti-di-wordpress-com-una-nuova-piattaforma-per-il-blog/&#34;&gt;generatori di siti web statici&lt;/a&gt;, quasi quante sono le distribuzioni di Linux. Io nei miei bookmark ne ho una trentina.&lt;/p&gt;&#xA;&lt;p&gt;Come orientarsi in questa moltitudine?&lt;/p&gt;&#xA;&lt;p&gt;Per le distribuzioni di Linux esiste &lt;a href=&#34;http://distrowatch.com&#34;&gt;Distrowatch&lt;/a&gt;, un sito popolarissimo che cerca di classificarle tutte. Analogamente, esistono almeno due siti che cercano di elencare tutti i generatori di siti web statici: &lt;a href=&#34;https://www.staticgen.com/&#34;&gt;StaticGen&lt;/a&gt; e &lt;a href=&#34;http://staticsitegenerators.net/&#34;&gt;Static Site Generators&lt;/a&gt;.&#xA;L&amp;rsquo;approccio dei due è totalmente diverso anche se le informazioni riportate sono praticamente le stesse.&lt;/p&gt;&#xA;&lt;p&gt;Il primo ordina di default i generatori di siti statici in base alla popolarità, ma si possono applicare vari filtri basati sul linguaggio di programmazione, la valutazione degli utenti e persino gli &lt;em&gt;issue&lt;/em&gt;, i problemi riscontrati dagli utenti.&lt;/p&gt;&#xA;&lt;p&gt;L&amp;rsquo;altro è apparentemente una tabella ordinata alfabeticamente (in questo momento elenca ben 289 sistemi diversi!), ma cliccando sulle intestazioni si può ordinarla in base al linguaggio di programmazione, alla valutazione degli utenti o alla data in cui il sistema è stato aggiornato per l&amp;rsquo;ultima volta.&#xA;Quest&amp;rsquo;ultima è una informazione utilissima, se un sistema non è aggiornato da anni non vale la pena perderci tempo.&lt;/p&gt;&#xA;&lt;p&gt;Provando ad applicare un po&amp;rsquo; di filtri si copre che esiste perfino un generatore, &lt;a href=&#34;https://github.com/moebiuseye/skf&#34;&gt;StatiKiss Framework&lt;/a&gt;, basato su &lt;a href=&#34;http://www.gnu.org/software/bash/&#34;&gt;Bash&lt;/a&gt;, ma &lt;a href=&#34;http://skf.jeannedhack.org/&#34;&gt;il sito web ufficiale&lt;/a&gt; contenente la documentazione non risponde. In realtà esisteva un&amp;rsquo;altro sistema interessante basato su Bash, &lt;a href=&#34;http://nanoblogger.sourceforge.net/&#34;&gt;NanoBlogger&lt;/a&gt;, il cui sviluppo  è stato però sospeso all&amp;rsquo;inizio del 2013. Evidentemente Bash non va bene per sviluppare siti web.&lt;/p&gt;&#xA;&lt;p&gt;Si può trovare anche &lt;a href=&#34;https://github.com/nuex/zodiac&#34;&gt;Zodiac&lt;/a&gt;, un generatore di siti statici scritto in &lt;a href=&#34;http://en.wikipedia.org/wiki/AWK&#34;&gt;AWK&lt;/a&gt;, un linguaggio perfetto per la manipolazione di file di testo, sviluppato fra gli altri da &lt;a href=&#34;http://www.cs.princeton.edu/~bwk/&#34;&gt;Brian Kernighan&lt;/a&gt;, uno dei padri di Unix e del linguaggio C. A leggere il README Zodiac sembra semplice da usare, supporta markdown e la struttura delle directory in cui sono organizzati i documenti utilizzati per generare il sito è ragionevole.&#xA;Ma purtroppo la popolarità di Zodiac è scarsa, scarsissima. Si potrebbe di certo usare per un progetto personale e soprattutto per imparare, ma è impensabile volere sostituire Wordpress con qualcosa come Zodiac. A chi rivolgersi, dove cercare aiuto e documentazione se si volesse fare qualcosa di non previsto dal programmatore, ad esempio gestire un sistema di commenti?&lt;/p&gt;&#xA;&lt;p&gt;Fra i generatori di siti web statici ci sono persino due sistemi scritti in &lt;a href=&#34;http://www.microsoft.com/net&#34;&gt;.NET&lt;/a&gt;. Ma vogliamo farci veramente del male?&lt;/p&gt;&#xA;&lt;p&gt;Ma lasciamo perdere le curiosità. Quali sono invece i &lt;em&gt;top player&lt;/em&gt;? Quali sono i sistemi più popolari, più diffusi e, si spera, più affidabili? Facile, il primo in assoluto è &lt;a href=&#34;http://jekyllrb.com/&#34;&gt;Jekyll&lt;/a&gt;, un generatore sviluppato in &lt;a href=&#34;https://www.ruby-lang.org/en/&#34;&gt;Ruby&lt;/a&gt;, un linguaggio di programmazione che è più o meno la risposta giapponese a Python, molto diffuso per sviluppare applicazioni web.&#xA;Seguono &lt;a href=&#34;http://octopress.org/&#34;&gt;Octopress&lt;/a&gt; (un derivato &lt;em&gt;semplificato&lt;/em&gt; di Jekyll, il cui sviluppo però è fermo dal 2011), &lt;a href=&#34;http://blog.getpelican.com/&#34;&gt;Pelican&lt;/a&gt; in Python, &lt;a href=&#34;http://middlemanapp.com/&#34;&gt;Middleman&lt;/a&gt; ancora in Ruby e &lt;a href=&#34;http://hexo.io/&#34;&gt;Hexo&lt;/a&gt; in JavaScript.&lt;/p&gt;&#xA;&lt;p&gt;Ci sono comunque altri generatori interessanti, alcuni con nomi veramente curiosi, &lt;a href=&#34;http://ruhoh.com/&#34;&gt;Ruhoh&lt;/a&gt;, &lt;a href=&#34;http://hugo.spf13.com/&#34;&gt;Hugo&lt;/a&gt;, &lt;a href=&#34;http://picocms.org/&#34;&gt;Pico&lt;/a&gt;, &lt;a href=&#34;http://calepin.co/&#34;&gt;Calepin&lt;/a&gt;,  &lt;a href=&#34;http://www.droppages.com/&#34;&gt;DropPages&lt;/a&gt;, &lt;a href=&#34;https://pancake.io/&#34;&gt;Pancake&lt;/a&gt;, &lt;a href=&#34;http://anchorcms.com/&#34;&gt;Anchor CMS&lt;/a&gt;, &lt;a href=&#34;http://ringce.com/hyde&#34;&gt;Hyde&lt;/a&gt;, &lt;a href=&#34;https://sculpin.io/&#34;&gt;Sculpin&lt;/a&gt;, &lt;a href=&#34;http://www.htmly.com/&#34;&gt;HTMLy&lt;/a&gt;,&lt;a href=&#34;http://dropplets.com/&#34;&gt;Dropplets&lt;/a&gt;, &lt;a href=&#34;http://www.steve.org.uk/Software/chronicle/&#34;&gt;Chronicle&lt;/a&gt;. Esiste persino il venerabile (ha quasi 10 anni!) &lt;a href=&#34;http://www.dir2web.it/&#34;&gt;Dir2web&lt;/a&gt;, l&amp;rsquo;unico prodotto italiano che conosca.&lt;/p&gt;&#xA;&lt;p&gt;Non mancato anche i prodotti a pagamento come &lt;a href=&#34;http://getkirby.com/&#34;&gt;Kirby&lt;/a&gt; e &lt;a href=&#34;http://statamic.com/&#34;&gt;Statamic&lt;/a&gt;. O come &lt;a href=&#34;http://cactusformac.com/&#34;&gt;Cactus&lt;/a&gt;, che è pure specifico per il solo Mac.&lt;/p&gt;&#xA;&lt;p&gt;Per questi ultimi no grazie, il web nasce e deve rimanere multipiattaforma, sistemi sviluppati per uno specifico sistema operativo non mi vanno bene &lt;em&gt;a priori&lt;/em&gt;. E trovo pure irragionevole cercare di vendere questi prodotti: se devo pagare per Statamic, quanto dovrei dare agli sviluppatori di Apache? Sei uno sviluppatore e vuoi guadagnarci? Distribuisci gratis il prodotto, dimostra nei fatti che è buono, fai in modo che diventi il più popolare possibile e poi vendi il supporto. Cercare di vendere software come questi, che subiscono la concorrenza di sistemi equivalenti, gratuiti e di qualità analoga se non migliore, è veramente sciocco.&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>Ancora un ebook</title>
      <link>https://static.233.196.69.159.clients.your-server.de/it/2014/01/31/ancora-un-ebook/</link>
      <pubDate>Fri, 31 Jan 2014 10:00:00 +0000</pubDate>
      <guid>https://static.233.196.69.159.clients.your-server.de/it/2014/01/31/ancora-un-ebook/</guid>
      <description>&lt;p&gt;Dopo alcuni giorni di offerte &lt;em&gt;minori&lt;/em&gt;, anche oggi &lt;a href=&#34;http://www.packtpub.com/&#34;&gt;Packt Publishing&lt;/a&gt; offre (gratis) un ebook allettante per chi sviluppa o vuole sviluppare su iOS:&#xA;&lt;a href=&#34;https://app.packtpub.com&#34;&gt;iPhone JavaScript Cookbook&lt;/a&gt; di Arturo Fernandez Montoro, pubblicato nel 2011.&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;PS: La data di pubblicazione è importante perché gli strumenti di sviluppo cambiano così in fretta che un qualunque libro di questo tipo rischia dopo pochi anni di diventare obsoleto.&lt;/p&gt;&#xA;</description>
    </item>
  </channel>
</rss>
